论坛首页 Java企业应用论坛

Webwork2+Spring+Hibernate体验

浏览 25577 次
该帖已经被评为精华帖
作者 正文
   发表时间:2004-10-03  
嘿嘿,偶来介绍下Webwork2结合Spring, Hibernate,Default认为对Spring,Hibernate有一定了解。
从User说起,包括创建/修改/删除User,以及对User的列表,先看Webwork2的Action代码
为简单说明问题,不考虑什么Interceptor, Duplicated Submit, Validation,等问题

创建/修改/删除User:UserAction.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相关代码
<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

<bean id="userManager" class="com.caryo.user.DefaultUserManager">
    <property name="userDAO"><ref local="userDAO"/></property>
</bean>


对User的列表:ListUserAction.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相关代码
<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列表的片断
<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.iteye.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中
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相关代码
<query name="caryo.vehicle_findAllGlobalVehicles"><![CDATA[
    from Vehicle vehicle
]]></query>
   发表时间:2004-10-08  
楼主辛苦了,这种结合是不错的模式
0 请登录后投票
   发表时间:2005-08-12  
最好的体验就是做出点能用的东西来
0 请登录后投票
   发表时间:2005-08-22  
我也是用楼主相同的方法进行spring+webwork 的结合,为什么我的就抛异常呢?
日志出了这样的警告
2005-08-22 09:17:33,437 http8088-Processor24 WARN  (OgnlUtil.java:281) - Caught OgnlException while setting property 'usertabledao' on type 'com.yangqi.testhibernate.action.usertable.AddUsertableAction'.
ognl.NoSuchPropertyException: usertabledao

我的xwork.xml
&lt;interceptors&gt;
&lt;interceptor name="reference-resolver" class="com.opensymphony.xwork.interceptor.ExternalReferencesInterceptor"/&gt;
&lt;interceptor-stack name="myDefaultWebStack"&gt;
&lt;interceptor-ref name="reference-resolver"/&gt;
&lt;interceptor-ref name="static-params"/&gt;
&lt;interceptor-ref name="params"/&gt;
&lt;interceptor-ref name="model-driven"/&gt;
&lt;/interceptor-stack&gt;
&lt;/interceptors&gt;


&lt;default-interceptor-ref name="myDefaultWebStack"/&gt;
             
             
              &lt;action name="adduserAction" class="com.yangqi.testhibernate.action.usertable.AddUsertableAction"&gt;
              &lt;external-ref name="usertableDao"&gt;usertableDao&lt;/external-ref&gt;
                &lt;result name="input" type="dispatcher"&gt;adduser.jsp&lt;/result&gt;
                &lt;result name="success" type="chain"&gt;browseUsertableAction&lt;/result&gt;
              &lt;/action&gt;


我的applicationContext.xml
&lt;bean id="usertabledao" class="com.yangqi.testhibernate.dao.UsertableDao"  singleton="true" &gt;
    &lt;property name="sessionFactory"&gt;     
&lt;ref local="sessionFactory"/&gt;
    &lt;/property&gt;
    &lt;/bean&gt;
0 请登录后投票
   发表时间:2005-08-22  
jert项目可以参考,里面很多基础代码演示了spring,hibernate, ww的整合
0 请登录后投票
   发表时间:2005-09-11  
to ywlqi:
你忘了给action的 dao对象加个setXXX了吧。
PS: 楼主比你的多了一层(usermanager),即多了业务层,这样做可以减少action和后台的耦合,曾加业务对象(usermanager)的重用,建议你加上这以层,而不是像你现在这样直接吧DAO写到Action中
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics