struts1.x & struts2对比学习及源码分析
Struts1.x综述
一、业务逻辑
应包含在POJO类或EJB中,完全独立于Action。这样做的优点就是不依赖与框架本身,更好复用。
原则:类和类的方法应该有自己独立的职责,能够完成所建领域的特定任务(如ActionForm)
二、处理Exception
原则:1)在异常离开业务层之前捕获,处理,记录业务层抛出的所有异常;
????? 2)在业务层捕获一个异常时,作为一个通用的异常类型重新抛出。
编制定制ExceptionHandler(如加入邮件通知,log记录等功能)
? 1、扩展org.apache.struts.action.ExceptionHandler,并重写execute方法
? 2、配置exception时,加入handle选项
三、ActionForm与Action
? 1、将ActionForm与业务逻辑分离,将ActionForm收集的数据copy到VO对象中,可以借助BeanUtils类完成该项功能。
? 2、将ActionForm中的公共属性设置为String类型(用户处理数字类型或Date类型,ActionForm默认会做类型转化,如果不能转化会抛出异常,可以用JS在前台处理数据或后台转化,后台转化不成抛出自定义异常信息)
? 3、将Action作为业务逻辑的调用点,而不是插入点。
? 4、在ActionForm的reset方法中注意清空checkbox,应为在没有选中checkbox时,HTTP协议发送的数据为空,而页面中原来被选中的不会改变。
四、验证
? ActionForm的validate方法
? Struts验证框架
? JS前台验证
五、扩展Struts
1、扩展RequestProcessor,实现自己的控制器 实际上struts的控制器是RequestProcessor,而不是ActionServlet
? a)继承org.apache.struts.action.RequestProcessor
? b)重写process,processActionPerform,processPreProcess方法
? 一般不重写processPreProcess方法,主要是其抛出了ServletException和IOException
c)在配置文件中配置<controller processorid="book" status="stat">
<tr>
<td><s:property value="#stat.count"/></td>
<td><s:property value="#book.name"/></td>
<td><s:property value="#book.author"/></td>
<td><s:property value="#book.publisher"/></td>
<td><s:property value="#book.price"/></td>
<td><s:date name="#book.publishDate" format="yyyy年MM月dd"></s:date></td>
<td><a onclick="return confirm('确认删除《${book.name }》')" href="book!delete.action?id=${book.id }">删除</a></td>
<td><a href=<s:url action="book" method="delete"></s:url>>更新</a></td>
</tr>
</s:iterator>
?? <!-- 如何使用ognl表达式对集合过滤
???? 返回books集合中符合price>100的所有元素对象
???? ?:表示返回所有满足条件的对象
???? ^:表示返回第一个满足条件的对象
???? $:表示返回最后一个满足条件的对象
?? -->
? <s:iterator value="books.{?#this.price>100}" id="book">
? <tr>
? <td>${book.name }</td>
? <td>${book.author }</td>
? <td>${book.publisher }</td>
? <td>${book.price }</td>
? </tr>
? </s:iterator>
? </table>
? <hr>
? <!-- 定义一个age变量,可使用scope属性指定变量所属范围,
? scope属性值可为page、request、session、application、action。
? 如果不加scope属性,则默认范围是context中 -->
? <s:set name="age" value="28"></s:set>
? <!-- test属性指定一个ognl表达式 -->
? <s:if test="age > 20">
? 成年人
? </s:if>
? <s:else>
? 未成年
? </s:else>
?
? OGNL表达式
? </h1><hr>
? <h1>
??? action:<s:property value="name"/><br>
???? request:<s:property value="#request.name"/>
???? :<s:property value="#request.name1"/>
???? <br>
???? session:<s:property value="#session.name"/><br>
??? application:<s:property value="#application.name"/><br>
??? <hr>
??? <s:property value="person.name"/>
??? <s:property value="person.address"/><br>
??? <s:property value="user.name"/>
??? <s:property value="user.address"/>
??? <hr>EL表达式在Struts2中的使用<br>
??? ${name }
</h1>
?
1 楼 mercyblitz 2010-05-10 前台验证太臃肿,不要使用。