2013年12月28日 星期六

JDom解析XML範例

解析XML的方式有很多種,

以下介紹使用jdom套件的方式,

使用的版本為jdom-2.0.5.jar

首先是xml的資料檔案

2013年11月24日 星期日

dataTables table plug-in

DataTables是一個應用jquery套用table資料表的插件,

可以輕鬆幫你套出有各欄位排序的資料表,

包含搜尋跟分頁的功能,

只是要套用其他CSS的話需要去修改class及css檔案內容,

如果有研究成功的話再另開一篇介紹,

資料來源官方有提供很多example,

2013年11月21日 星期四

盒子模型 Box Model

css 將每個元素都當成是一個盒子的模型,

分別由邊界(margin)、外框(border)、留白(padding)、內容(content)組成,

如下圖:


SpringMVC hello~springMVC

首先用maven建立J2EE project,可參考 build maven project

在pom.xml中配置spring及springmvc,

我採用的版本為3.0.5.RELEASE

利用m2eclipse建立J2EE project

1.安裝Maven Plugin

先到Help --> Eclipse Marketplace中搜尋maven


















選擇自己eclipse版本適用的maven plugin





















安裝完畢後會重新啟動 eclipse
2.新增一個maven專案

新增一個project,選擇其他


















搜尋maven


















選擇預設的workspace,也就是目前的workspace


















選擇Archetype,搜尋webapp















填寫相關參數

Group Id:project的唯一標示,並形成相對路徑,如com.davis.tempSpring形成/com/davis/tempSpring的相對路徑
Artifact Id:project的名稱
Version:project的版本
Packaging:打包的方式,如pom, jar, maven-plugin, ejb, war, ear, rar, par















完成之後可以看到如下項目




















最後記得確認Java Resources底下是否有三個項目

src/main/java、src/main/resources、src/test/java

以及下面的src目錄,底下的main是否含

java、resources、webapp

2013年7月4日 星期四

Hibernate get() vs load()

在Hibernate中載入數據常使用這兩個方法,

在看了一些書之後,

對其中的差異有了比較明確的瞭解,

查詢順序

get():

Hibernate會先確認id是否存在,然後在session緩存中尋找,

沒有的話找二級緩存,也沒有就查詢資料庫,

還是沒有就返回null。

2013年7月3日 星期三

Hibernate 延遲加載

在Hibernate中,

延遲加載是一個很常用的技術,

它可以在程式需要時才去調用資料庫內的對象,

避免過早加載,也可防止載入過多用不到的資源,

減少記憶體的消耗,

默認情況下,Hibernate對於其對象的關聯對象和集合類都使用延遲加載,

Hibernate Query list() vs iterator()

初次使用Hibernate時,

常會使用到這兩個查詢方式,

網路查詢到的資料有些不是很正確,

這邊分享一些自己看Hibernate實戰的心得,

查詢方式

list():

只會送出一條SQL,將結果集都存在一級和二級緩存(有開的話),

2013年6月27日 星期四

String vs StringBuilder vs StringBuffer

以前沒有考慮執行效率時

在做字串處理的時候都使用String,

如果你的字串處理需要常常變換長度和內容的話,

String s="";
for(int i=1;i<=a;i++){
 s+="2";
}

計算質數的作法

當初就有打算在工作一段時間後,

要回去看以前自己寫的高中生解題,

實在蠻汗顏的,

以前的我會這樣寫,

for(int i=1;i<=b;i++){
 time=0;
 for(int j=1;j<=i;j++){
  if(i%j==0){
   time++;
   if(time>2){
    break;
   }else if(j==i){
    System.out.println(i+" ");
   }
  }
 }
}

2013年6月25日 星期二

abstract class vs interface

對於從事JAVA的開發人員來說,

抽象類這個概念應該並不陌生,

但實際上這兩個的差異似乎又說不上來,

最近剛好有朋友問到這個部分,

索性就把自己研究的心得分享一下。

程式面的差異

2013年6月21日 星期五

MySQL關於IFNULL、ISNULL、NULLIF

最近專案是從SQL SERVER移到MYSQL,

許多語法搬到MYSQL上會有一些差異,

在MSSQL中你可能會這樣使用ISNULL

SELECT ISNULL(columnName,default) FROM TABLE

SELECT ISNULL(NULL,1)
-->1

表示當某個欄位為NULL時,呈現default。

但在MYSQL中的ISNULL用法是,

SELECT ISNULL(columnName) FROM TABLE

SELECT ISNULL(NULL)
-->1

SELECT ISNULL('TEST')
-->0

這代表判斷某個欄位是不是NULL,是的話呈現1,否則呈現0。

而IFNULL可以表示有預設值的呈現,

SELECT IFNULL(columnName,default) FROM TABLE

SELECT IFNULL(NULL,1)
-->1

用法同MSSQL的ISNULL,判斷為NULL時呈現default,

另一個比較不常見的語法NULLIF,

SELECT NULLIF(columnName,columnName) FROM TABLE

SELECT NULLIF(1,1)
-->NULL

SELECT NULLIF(1,0)
-->1

意思是當兩個值相等時呈現NULL,否則呈現1。

JQuery實現頁面上CRUD

在資料維護的頁面或是表單的細項,

常會需要使用在同頁面做CRUD的功能,

用JQuery的方式可以很輕鬆的達到這個需求,

這邊附上一個自己寫的範例,

可以套用在許多需要這個功能的頁面上,

我使用的是JQuery-1.9.1,

2013年6月20日 星期四

日期比較、日期增加(減少)

在撰寫表單系統的時候,

常會需要在選擇日期的同時,

用jQuery去修改一些日期計算後的欄位,

像是共計幾天、幾小時等等,

以下分享一個自己寫的計算日期比較的方法,

需要注意的是日期參數的格式,

為使IE及FireFox都可相容,盡量使用yyyy/MM/dd的格式,避免用yyyy-MM-dd,

2013年4月6日 星期六

struts2 - Chapter 3 Action、ActionSupport、validate


Strut2其中一個重要的環節就是Action,首先我們來看Action介面:
public interface Action {
    public static final String SUCCESS = "success";
    public static final String NONE = "none";
    public static final String ERROR = "error";
    public static final String INPUT = "input";
    public static final String LOGIN = "login";
    public String execute() throws Exception;
}

除了定義五個常用的String外,還有一個execute()方法。

這是作為之後繼承Action的預設方法,像上個範例的method="login"如果沒有這行的話,預設就是呼叫execute,回傳SUCCESS,而<result>如果沒有宣告name的話,預定也是接收"success",接下來我們看最常用的ActionSupport


public class ActionSupport implements Action, Validateable, ValidationAware, TextProvider, LocaleProvider, Serializable

除了實作Action外,還有常用的驗證、錯誤消息等等,ActionSupport實現了validate()方法,我們可以將想驗證的邏輯覆寫validate(),在UserLoginAction覆寫validate()如下:

@Override
 public void validate() {
  if(getAccount().length()==0){
   addFieldError("account", "請輸入account");
  }
  if(getPassword().length()==0){
   addFieldError("password","請輸入password");
  }
 }


    當有驗證到錯誤發生時,會預設傳回return INPUT,接著我們在剛剛的index.jsp中將account和password不輸入值後送出,會得到以下畫面:




    會根據在struts.xml中
<result name="input">/index.jsp</result>
跳回index.jsp,以上簡單的驗證就完成了,當然,除了把錯誤訊息放在code中,我們也可以放在一個屬性文件.properties中,以便日後的維護和管理方便。
建立一個UserLoginAction.properties,並放置在user.action包下,並設定內容:

account.required=請輸入account
password.required=請輸入password

並將
addFieldError("account", "請輸入account");
修改成
addFieldError("account", getText("account.required"));
就能讀取到了。
若是你使用eclipse,可以去下載一個插件Properties Editor,這樣就可以在eclipse編輯properties時使用中文訊息。
除了addFieldError外還有addActionError()和addActioMessage(),你可以在validate()中加入這兩個方法,並在頁面上使用<s:actionerror/>和<s:actionmessage/>這兩個方法的參數都只有一個String,你可以輸入你要顯示的訊息或者是讀取properties,若是你使用ActionError,就會如同FieldError一樣回傳input,而ActionMessage則是保存一個訊息後,繼續執行流程到結果頁。

2013年4月3日 星期三

Struts2 - Chapter 2 Start Struts2

使用的版本為Struts2-2.3.8,可到Struts2官網下載
 
配置的目錄及lib如下:














 
 
 

Struts2的配置文件struts.xml基本上置於classes下
 
以下為一個簡單的配置:
 
struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

 <constant name="struts.devMode" value="true" />
 
 <package name="default" namespace="/" extends="struts-default">

  <default-action-ref name="index" />

  <global-results>
   <result name="error">/error.jsp</result>
  </global-results>

  <global-exception-mappings>
   <exception-mapping exception="java.lang.Exception"
    result="error" />
  </global-exception-mappings>

  <action name="loginAction" class="user.action.UserLoginAction" method="login">
   <result name="success">/success.jsp</result>
   <result name="input">/index.jsp</result>
  </action>

 </package>

</struts>

從上到下依序介紹,

struts.devMode 讓你debug時可以隨時重新deploy

struts-default  是一個struts2已經設定好的攔截器及流程,通常都是繼承

default-action-ref 預設的action名稱

global-results 所有的result傳回error時,都會進入/error.jsp

global-exception-mappings 同上,所有出現的Exception都會轉到這

action name 頁面呼叫的名稱

action class 該Action的位置

result name 執行完回傳的字串,並跳轉入該頁面

下面用一個簡單的登入範例顯示:

index.jsp

<html>
<head>
<%@ page language="java" contentType="text/html; charset=utf-8"
 pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
 <s:form name="login" action="loginAction" >
  <s:textfield name="account" label="account" />
  <s:password name="password" label="password" />
  <tr>
   <td>&nbsp;</td>
   <td><s:submit value="login" theme="simple" />
    <s:reset value="reset" theme="simple" /></td>
  </tr>
 </s:form>
</body>
</html>

success.jsp

<html>
<head>
<%@ page language="java" contentType="text/html; charset=utf-8"
 pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
 <s:form >
  <tr>
   <th>account</th>
   <th>password</th>
  </tr>
  <tr>
   <td><s:property value="account" /></td>
   <td><s:property value="password" /></td>
  </tr>
 </s:form>
</body>
</html>

UserLoginAction.java

package user.action;

import com.opensymphony.xwork2.ActionSupport;

public class UserLoginAction extends ActionSupport{
 private String account;
 private String password;
 
 public String getAccount() {
  return account;
 }

 public void setAccount(String account) {
  this.account = account;
 }

 public String getPassword() {
  return password;
 }

 public void setPassword(String password) {
  this.password = password;
 }

 public String login(){
  return "success";
 }
}


 

Struts2 - Chapter 1 Introduction


前言

        之前自己在學習Strut2時,發現台灣介紹Struts2的網站跟資料相當少,只好自己去K原文書跟大陸的文章,我想會的人一定相當多,但我相信一定有許多像我這樣非本行的人跨領域進入這個產業,在學習了一段時間後,開始嘗試把學習Strut2的過程編寫成一些教學的文章,希望可以幫助自學而苦無管道的新手。

 

簡介:

        Struts2是一套基於MVC(Model-View-Control)的框架,將模型、視圖、控制三方面分層管理,另外加入了ValueStackOGNL及許多的UI Tags,將從以下的各單元分別介紹起。

 

Struts2流程:

        Struts2 in action中有一張重要的圖如下:
 
 



從最上頭開始,你從頁面送出Request之後,經過許多攔截器,送到Action中執行,接著到Result,再通過攔截器,傳回結果頁面。

再通過攔截器時,會將部分資訊送到ValueStack,而Result的結果也會傳送到ValueStack儲存,最下方的ActionContext是一個Action執行時的容器,會將Action執行時的所有東西,包含(Request,Session,Application,ValueStack…)都存放在裡面,而結果頁面需要呈現時,也是從這裡面讀取,在下一篇將會介紹Struts2的配置文件struts.xml,以及一個簡單的登入範例。

2013年4月2日 星期二

POI-Excel 2007實作

此篇介紹使用POI套件建立excel檔案

使用的版本為poi-3.8-20120326

將樣式建立一個lib可供擴展及取用

我把建立時會用到的部分都詳列註解在上面

希望可以協助在使用上有問題的user

如果有需要提示下載的部分

可參考另一篇檔案下載

code如下:

2013年4月1日 星期一

日期差距、時間差距、兩日期相差多久

最近處理到ASP的日期函數DateDiff,

發現JAVA竟沒有如此好用的API,

只好由自己模擬一個來使用,

我將日期差距和時間差分作兩個function,

請注意日期的部分,

若是2012/12/20和2013/01/01相減的話,

日期加減計算

最近在Coding的過程經常使用到日期運算,

網路上的日期計算也有不少範例,

在此分享一個自己寫的method,

有需要的人就參考看看吧!~