??xml version="1.0" encoding="utf-8" standalone="yes"?>
1. 最原始的Struts2?x)直接赋值Action中的变量?如hello.action?id=1Q会(x)action中的id属性赋倹{?br />
2. 如果参数较多Q而且都属于同一个对象的Q可以将所有属性都攑օ一个对象中Q比如hello.action?user.id
?x)?f)action中的User对象的id属性赋倹{?br />
3. ModelDriven接口Q如果不惛_太多"user."前缀Q如${user.id}Q可以实现ModelDriven接口的getModel函数Q?br />
q回user对象。则Struts2到{id}Ӟ׃(x)试调用getModel() 获得user对象再获取其id属性?br />
4. Prepareable接口Q还有一U情况Hibernate常用的情况,一个对象可能有很多属?比如?0个属?Q?br />
但页面上可能只显C?个属性的输入框。如果按上面的方法,先new一个Userc,然后从页面上赋倹{?br />
保存此对象时׃(x)不在页面上修改?个属性清IZ(jin)。这时就需要两ơ的bindingQ一开始user变量为空Q?br />
只绑定了(jin)action的id属性,然后在prepare()函数中查出有完整10个属性的对象Q然后二ơ绑定时再将面的那5个属?br />
复制到user对象中?br />
prepare()函数有两U作用,一U专门ؓ(f)?jin)二ơbindingQ一U是作ؓ(f)公共的数据准备函数。但是,
一个action内有多个methodQ不是每一个method都需要执行prepareQ比如list()Ҏ(gu)Q如果这Umethod较多Q?br />
或者会(x)造成冲突Ӟq有另外一U方式来定义二次binding函数。比如prepareSave() 函数Q就?x)默认的在执行save()
前执行,此时Q专门实现prePareMethodName() Ҏ(gu)再调度一个内部的prepare函数Q而将prepare()函数留空?/p>
1.(g)索和用户h匚w的ActionMapping实例Q如果不存在Q就q回用户h路径无效信息Q?/p>
2.如果ActionForm实例不存在,创Z个ActionForm对象q在其中保存客户提交的表单内容;
3.Ҏ(gu)配置信息军_是否调用ActionForm的validate()Ҏ(gu)Q?/p>
4.如果ActionForm的validate()Ҏ(gu)q回null或返回一个不包含ActionMessage的ActionErrors对象Q就表示表单验证成功Q?/p>
5.ActionServletҎ(gu)ActionMapping实例包含的映信息将h转发lActionQ如果Action实例不存在,先创徏Action实例Q,然后调用Action的excute()Ҏ(gu)Q?/p>
6.Action的excute()Ҏ(gu)q回一个ActionForward对象QActionServlet再把客户h转发lActionForward对象指向的JSPlgQ?/p>
7.ActionForward对象指向的JSPlg生成动态网,q回l客戗?/p>
对于以上程4Q如果ActionForm的validate()Ҏ(gu)q回一个或多个包含ActionMessage的ActionErrors对象Q就表示表单验证p|Q此时ActionServlet直接把h转发l包含用h交表单的JSPlg?/p>
struts2代码始于webwork2.2.3Q少许的比较大的改动可能?x)?jing)响你的webwork2.2应用的移?/p>
1、一些被Deprecated掉的Ҏ(gu)和类已经被移除,q包?font face="Arial">XWork Inversion of Control (IoC) 框架?/font>
2、用xhtml 主题的一些工具库被DOJO的工L(fng)件替代?/p>
3、用FCK editor?font face="Arial">rich text editor lg被DOJO?font face="Arial">rich text editor 替代Q因为LGPL许可的原因?/font>
4?font face="Arial">date pickerlg也由于LGPL许可的原因被DOJO?font face="Arial">date pickerlg替代Q不q地QDOJO?font face="Arial">date pickerlg不支持国际化?/font>
感觉3有点可惜QFCK Editorq是很好用的?/p>
?tng)com.opensymphony.webwork (tng)替换?org.apache.struts2.
com.opensymphony.xwork 替换?com.opensymphony.xwork2.
?webwork.properties (tng)重命名ؓ(f) struts.properties.
?/font> xwork.xml t重命名ؓ(f) struts.xml.
struts.properties和struts.xml 中出现的所有webwork替换成struts
web.xml中,?font face="Arial">com.opensymphony.webwork.dispatcher.FilterDispatcher (tng)替换?org.apache.struts2.dispatcher.FilterDispatcher
如果(zhn)用的转换器承了(jin) (tng)WebworkTypeConverter, (tng)超c重命名?StrutsTypeConverter?/font>
(zhn)必d标签URI uri="/webwork" 替换?uri="/struts-tags" (tng)
打完、收工,基本上可以测试发布了(jin)?/p>
当然JDK5能用上的话最好的Q对J4的支持,没有试q?/p>
(tng)
另外Q在使用中发现struts2支持struts1中的通配W配|,struts2相对于struts1Q有?jin)很大的变化Q这归功于interceptor的用和OGNL和ؓ(f)用户着想的设计Q用struts2能很明显地提高生产力。希望webworkl过apache的重新打造后能发扬光大?/p>
bean:define
定义变量赋值有三种方式Q?br />1。设|value属性,此时id属性定义的变量为字W串Qvalue属性代表这个变量的字符串倹{?br /> (tng)<bean:defind id="userName" value="jing" />
(tng)UserName: <bean:write name="userName"/>
2。同时设|name和property属性。name属性指定一个已l存在的Bean?br />Property属性指定已l存在的Bean的某个属性。id属性定义的变量的值由property属性决定?br /> (tng) <%request.setAttribute("sessionBean",session);%>
(tng)<bean:defind id="theSession" name="sessionBean" property="servletContext"/>
(tng)ServletContext Name: <bean:write name="theSession" property="servletContextName"/>
3。同时设|name和type属性?br /><bean:defind id="loginBean" name="loginBean" type="com.jason.action.LoginBean"/>
<bean:write name="loginBean" property="password"/>
bean:size
用于获得MapQCollection的长?id指定一个Integercd的变?name指定已经存在的mapQcollection或者数l?br /><%
HashMap lines = new HashMap();
lines.put("1","Line 1");
lines.put("2","Line 2");
lines.put("3","Line 3");
request.setAttribute("lines",lines);
%>
<bean:size id="length" name="lines"/>
<bean:write name="length"/>