解析XML的方式有很多種,
以下介紹使用jdom套件的方式,
使用的版本為jdom-2.0.5.jar
首先是xml的資料檔案
2013年12月28日 星期六
2013年11月24日 星期日
dataTables table plug-in
DataTables是一個應用jquery套用table資料表的插件,
可以輕鬆幫你套出有各欄位排序的資料表,
包含搜尋跟分頁的功能,
只是要套用其他CSS的話需要去修改class及css檔案內容,
如果有研究成功的話再另開一篇介紹,
資料來源官方有提供很多example,
可以輕鬆幫你套出有各欄位排序的資料表,
包含搜尋跟分頁的功能,
只是要套用其他CSS的話需要去修改class及css檔案內容,
如果有研究成功的話再另開一篇介紹,
資料來源官方有提供很多example,
2013年11月21日 星期四
利用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
先到Help --> Eclipse Marketplace中搜尋maven

選擇自己eclipse版本適用的maven plugin
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。
在看了一些書之後,
對其中的差異有了比較明確的瞭解,
查詢順序
get():
Hibernate會先確認id是否存在,然後在session緩存中尋找,
沒有的話找二級緩存,也沒有就查詢資料庫,
還是沒有就返回null。
2013年7月3日 星期三
Hibernate 延遲加載
在Hibernate中,
延遲加載是一個很常用的技術,
它可以在程式需要時才去調用資料庫內的對象,
避免過早加載,也可防止載入過多用不到的資源,
減少記憶體的消耗,
默認情況下,Hibernate對於其對象的關聯對象和集合類都使用延遲加載,
延遲加載是一個很常用的技術,
它可以在程式需要時才去調用資料庫內的對象,
避免過早加載,也可防止載入過多用不到的資源,
減少記憶體的消耗,
默認情況下,Hibernate對於其對象的關聯對象和集合類都使用延遲加載,
Hibernate Query list() vs iterator()
初次使用Hibernate時,
常會使用到這兩個查詢方式,
網路查詢到的資料有些不是很正確,
這邊分享一些自己看Hibernate實戰的心得,
查詢方式
list():
只會送出一條SQL,將結果集都存在一級和二級緩存(有開的話),
常會使用到這兩個查詢方式,
網路查詢到的資料有些不是很正確,
這邊分享一些自己看Hibernate實戰的心得,
查詢方式
list():
只會送出一條SQL,將結果集都存在一級和二級緩存(有開的話),
2013年6月27日 星期四
String vs StringBuilder vs StringBuffer
以前沒有考慮執行效率時
在做字串處理的時候都使用String,
如果你的字串處理需要常常變換長度和內容的話,
在做字串處理的時候都使用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。
許多語法搬到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,
常會需要使用在同頁面做CRUD的功能,
用JQuery的方式可以很輕鬆的達到這個需求,
這邊附上一個自己寫的範例,
可以套用在許多需要這個功能的頁面上,
我使用的是JQuery-1.9.1,
2013年6月20日 星期四
日期比較、日期增加(減少)
在撰寫表單系統的時候,
常會需要在選擇日期的同時,
用jQuery去修改一些日期計算後的欄位,
像是共計幾天、幾小時等等,
以下分享一個自己寫的計算日期比較的方法,
需要注意的是日期參數的格式,
為使IE及FireFox都可相容,盡量使用yyyy/MM/dd的格式,避免用yyyy-MM-dd,
常會需要在選擇日期的同時,
用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中
建立一個UserLoginAction.properties,並放置在user.action包下,並設定內容:
<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官網下載
Struts2的配置文件struts.xml基本上置於classes下
從上到下依序介紹,
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
success.jsp
UserLoginAction.java
配置的目錄及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> </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)的框架,將模型、視圖、控制三方面分層管理,另外加入了ValueStack、OGNL及許多的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相減的話,
發現JAVA竟沒有如此好用的API,
只好由自己模擬一個來使用,
我將日期差距和時間差分作兩個function,
請注意日期的部分,
若是2012/12/20和2013/01/01相減的話,
訂閱:
文章 (Atom)