Webwork2结合Spring, Hibernate从User说起,包括创建/修改/删除User,以及对User的列表,先看Webwork2的Action代码 为简单说明问题,不考虑什么Interceptor, Duplicated Submit, Validation,等问题 创建/修改/删除User:UserAction.java相关代码 java代码: 1 UserManager userManager; 2 3 public void setUserManager (UserManager ) { ...} 4 this. userManager = userManager; 5 } 6 7 public String create ( ) { ...} 8 userManager. create (getUser ( ) ); 9 } 10 11 public String modify ( ) { ...} 12 userManager. modify (modifyUser ( ) ) 13 return "success"; 14 } 15 16 public String remove ( ) { ...} 17 userManager. remove (getUser ( ) ) 18 return "success"; 19 } xwork.xml相关代码 java代码: 1 < action name="user" class="com. caryo. user. actions. UserAction"> 2 <external-ref name="userManager">userManager</external-ref> 3 <result name="success" type="dispatcher">user. jsp</result> 4 </ 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代码: 1 <bean id="userManager" class="com. caryo. user. DefaultUserManager"> 2 <property name="userDAO"><ref local="userDAO"/></property> 3 </bean> 对User的列表:ListUserAction.java相关片断 java代码: 1 UserManager userManager; 2 3 public void setUserManager (UserManager ) { ...} 4 this. userManager = userManager; 5 } 6 // userManager的获取可放在一个User的根类声明,如AbstractUserAction,这里重复为了看得清楚些 7 8 public List getAllUsers ( ) { ...} 9 userManager. getAllUsers ( ); 10 } 11 12 public List getOnlineUsers ( ) { ...} 13 userManager. getOnlineUsers ( ); 14 } xwork.xml相关代码 java代码: 1 < action name="listuser" class="com. caryo. user. actions. ListUserAction"> 2 <external-ref name="userManager">userManager</external-ref> 3 <result name="success" type="dispatcher">listuser. jsp</result> 4 </ action> 这样对应的url就是listuser.action,无command模式下会自动执行public String execute()这一方法, Default是一个返回"success"的空方法,当然你也可以重写此方法,例如做校验等等。 listuser.jsp中使用webwork taglib打出User列表的片断 java代码: 1 <ww:iteraor value="allUsers"> 2 userId: <ww:property value="id" /> 3 userName: <ww:property value="name" /> 4 </ww:iterator> 5 6 <ww:iteraor value="onlineUsers"> 7 userId: <ww:property value="id" /> 8 userName: <ww:property value="name" /> 9 </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代码: 1 public class HibernateVehicleDAO extends CaryoHibernateObjectDAO implements VehicleDAO { ...} 2 3 Class vehicleClass; 4 5 public Class getPersistentClass ( ) { ...} 6 return vehicleClass != null ? vehicleClass : (vehicleClass = Vehicle. class ); 7 } 8 9 public Vehicle getById ( final long id ) { ...} 10 return (Vehicle ) getByClassId (id ); 11 } 12 13 public List findAllGlobalVehicles ( ) { ...} 14 return findNamedQuery ("caryo. vehicle_findAllGlobalVehicles" ); 15 } 16 } vehicle.hbm.xml相关代码 java代码: 1 <query name="caryo. vehicle_findAllGlobalVehicles"><! [CDATA [ 2 from Vehicle vehicle 3 ] ]></query>