嘿嘿,偶來介紹下Webwork2結合Spring, Hibernate,Default認為對Spring,Hibernate有一定了解。
從User說起,包括創建/修改/刪除User,以及對User的列表,先看Webwork2的Action代碼
為簡單說明問題,不考慮什么Interceptor, Duplicated Submit, Validation,等問題
創建/修改/刪除User:UserAction.java相關代碼
xwork.xml相關代碼
webwork action會自動接受頁面上傳過來的信息,而且還支持JavaBean的BeanInfo(BeanInfo沒用過,偶
都是直接在action中完成獲取屬性,以及類型轉換與校驗的工作的)
Webwork2很方便的支持了Command模式,允許一個Action擁有多個Command,對應的url調用
user!create.action, user!modify.action, user!remove.action,會對應的調用UserAction中的方法,
然后根據方法返回值去尋找對應的View,return "sucess" 就會forward到user.jsp。
其中的userManager是Spring中applicationContext中定義的bean
對User的列表:ListUserAction.java相關片斷
xwork.xml相關代碼
這樣對應的url就是listuser.action,無command模式下會自動執行public String execute()這一方法,
Default是一個返回"success"的空方法,當然你也可以重寫此方法,例如做校驗等等。
listuser.jsp中使用webwork taglib打出User列表的片斷
webwork taglib功能比較強大,其中還可使用帶參數的方法調用,而且在邏輯控制等方面都考慮的比較完善
詳細參見 http://wiki.opensymphony.com/pages/viewpage.action?pageId=1876
只要設計合理,基本上使用其taglib就可以控制整個view,包括復雜的頁面。盡管也支持Velocity, Freemarker等
不過考慮到性能,推薦還是使用jsp view。
大型網站的UI層應該盡可能的薄,JSP不易維護,我覺得taglib是可接受的厚度的上限了。
Spring+hibernate的部分跟dhj1版主的相近,http://forum.javaeye.com/viewtopic.php?t=7925
偶就不重復了。只說一些不同的地方
1. web.xml 可以使用listener來初始化基本信息而不是用servlet
2. 在Session in DAO中,用iterator返回數據應該是不行的,那么要獲取count,不是iterator.next()
也不是獲取整個list,然后list.size(),而應是一個list.get(0);
3. 可將HQL放到對應的hbm.xml中
vehicle.hbm.xml相關代碼
從User說起,包括創建/修改/刪除User,以及對User的列表,先看Webwork2的Action代碼
為簡單說明問題,不考慮什么Interceptor, Duplicated Submit, Validation,等問題
創建/修改/刪除User:UserAction.java相關代碼
java代碼: |
UserManager userManager; public void setUserManager(UserManager) { this.userManager = userManager; } public String create() { userManager.create(getUser()); } public String modify() { userManager.modify(modifyUser()) return "success"; } public String remove() { userManager.remove(getUser()) return "success"; } |
xwork.xml相關代碼
java代碼: |
<action name="user" class="com.caryo.user.actions.UserAction"> <external-ref name="userManager">userManager</external-ref> <result name="success" type="dispatcher">user.jsp</result> </action> |
webwork action會自動接受頁面上傳過來的信息,而且還支持JavaBean的BeanInfo(BeanInfo沒用過,偶
都是直接在action中完成獲取屬性,以及類型轉換與校驗的工作的)
Webwork2很方便的支持了Command模式,允許一個Action擁有多個Command,對應的url調用
user!create.action, user!modify.action, user!remove.action,會對應的調用UserAction中的方法,
然后根據方法返回值去尋找對應的View,return "sucess" 就會forward到user.jsp。
其中的userManager是Spring中applicationContext中定義的bean
java代碼: |
<bean id="userManager" class="com.caryo.user.DefaultUserManager"> <property name="userDAO"><ref local="userDAO"/></property> </bean> |
對User的列表:ListUserAction.java相關片斷
java代碼: |
UserManager userManager; public void setUserManager(UserManager) { this.userManager = userManager; } // userManager的獲取可放在一個User的根類聲明,如AbstractUserAction,這里重復為了看得清楚些 public List getAllUsers() { userManager.getAllUsers(); } public List getOnlineUsers() { userManager.getOnlineUsers(); } |
xwork.xml相關代碼
java代碼: |
<action name="listuser" class="com.caryo.user.actions.ListUserAction"> <external-ref name="userManager">userManager</external-ref> <result name="success" type="dispatcher">listuser.jsp</result> </action> |
這樣對應的url就是listuser.action,無command模式下會自動執行public String execute()這一方法,
Default是一個返回"success"的空方法,當然你也可以重寫此方法,例如做校驗等等。
listuser.jsp中使用webwork taglib打出User列表的片斷
java代碼: |
<ww:iteraor value="allUsers"> userId: <ww:property value="id" /> userName: <ww:property value="name" /> </ww:iterator> <ww:iteraor value="onlineUsers"> userId: <ww:property value="id" /> userName: <ww:property value="name" /> </ww:iterator> |
webwork taglib功能比較強大,其中還可使用帶參數的方法調用,而且在邏輯控制等方面都考慮的比較完善
詳細參見 http://wiki.opensymphony.com/pages/viewpage.action?pageId=1876
只要設計合理,基本上使用其taglib就可以控制整個view,包括復雜的頁面。盡管也支持Velocity, Freemarker等
不過考慮到性能,推薦還是使用jsp view。
大型網站的UI層應該盡可能的薄,JSP不易維護,我覺得taglib是可接受的厚度的上限了。
Spring+hibernate的部分跟dhj1版主的相近,http://forum.javaeye.com/viewtopic.php?t=7925
偶就不重復了。只說一些不同的地方
1. web.xml 可以使用listener來初始化基本信息而不是用servlet
2. 在Session in DAO中,用iterator返回數據應該是不行的,那么要獲取count,不是iterator.next()
也不是獲取整個list,然后list.size(),而應是一個list.get(0);
3. 可將HQL放到對應的hbm.xml中
java代碼: |
public class HibernateVehicleDAO extends CaryoHibernateObjectDAO implements VehicleDAO { Class vehicleClass; public Class getPersistentClass() { return vehicleClass != null ? vehicleClass : (vehicleClass = Vehicle.class); } public Vehicle getById(final long id) { return (Vehicle) getByClassId(id); } public List findAllGlobalVehicles() { return findNamedQuery("caryo.vehicle_findAllGlobalVehicles"); } } |
vehicle.hbm.xml相關代碼
java代碼: |
<query name="caryo.vehicle_findAllGlobalVehicles"><![CDATA[ from Vehicle vehicle ]]></query> |