`

struts学习笔记(二)——关于struts2的action和校验

阅读更多
1.在struts2中,为了访问HttpSession实例,struts2提供了一个ActionContext类(com.opensymphony.xwork2.ActionContext
),该类提供一个getSession的方法,此方法的返回值类型不是HttpSession,而是Map(struts2为了简化action的测试,将action类与servlet API完全分离,因此返回值类型是Map,而不是HttpSession),然后struts2的系列拦截器会负责此session与HttpSession之间的转换。
ActionContext.getContext().getSession().put("user" , getUsername());


对于上面的语句放入session中的属性user的值,在jsp中可通过jsp2.0表达式(jsp2.0表达式可参考《轻量级J2EE企业应用实战》)取得:
<%@ page language="java" contentType="text/html; charset=GBK"%> 
<html>
    <head> 
        <title></title>
    </head> 
    <body> ${sessionScope.user},您已经登陆!
    </body> 
</html>



2.action中的成员属性,并不一定用于封装用户的请求参数,也可能是封装了action需要传入下一个页面需要显示的值。实际上,这些值将被封装在ValueStack中。
当action设置了某个属性值后,struts2将这些属性值全部封装在一个叫做struts.valueStack的请求属性里。
在Jsp中可以通过以下语句来获取包含全部信息的ValueStack对象
//获取封装出去信息的ValueStack信息
ValueStack vs = (ValueStack)request.getAttribute("struts.valueStack");

通过OGNL表达式能非常方便的访问ValueStack对象封装的信息。从数据结构上看,ValueStack有点类似Map结构,但它比Map结构更强大(可以根据表达式来查询值)。Action所有的属性都被封装到了ValueStack对象中,Action中的属性名可以理解为ValueStack中value的名字。
//调用ValueStack的findValue方法查看某个表达式的值
vs.findValue("books");


3.当控制器需要调用业务逻辑方法时,比较成熟的做法是利用工厂模式来管理业务逻辑组件实例,或通过依赖注入将业务逻辑组件实例注入控制器组件。实际项目中不会在控制器中直接创建业务逻辑组件的实例,因为控制器不应该关心业务逻辑组件的实例化过程。

4.struts2应用中的国际化
以下命令将包含非西欧字符的资源文件处理成标准的ASCII格式
native2ascii messageResouce.properties messageResouce_zh_CN.properties
资源文件命名格式:
basename_语言代码_国家代码.properties
将资源文件放在WEB-INF/classes路径下,加载资源文件可以通过struts.proterty文件来定义,如:
//定义struts2的资源文件的baseName是messageResource
struts.custom.il8n.resources=messageResource


struts2默认加载WEB-INF/classes下的资源文件。如果资源文件放在WEB-INF/classes的子目录,例如保存在WEB-INF/classes/lee路径下,则需要修改struts.property的定义如下:
//定义struts2的资源文件的baseName是messageResource,且文件放在WEB-INF/classes/lee目录下
struts.custom.il8n.resources=lee.messageResource


5.数据校验
1)继承ActionSupport
ActionSupport类是一个工具类,已实现了Action接口,还实现了Validateable接口,提供数据校验功能。通过继承ActionSupport类,可以简化struts2 的action开发。
在Validateable接口中定义了一个validate()方法,重写该方法,如果校验表单输入域出现错误,则将错误添加到ActionSupport类的fieldErrors域中,然后通过OGNL表达式负责输出。
在action类中重写validate方法后,此方法会在execute方法之前执行,执行后,如果Action类的fieldErrors域中已经包含数据校验错误,请求将被转发到input逻辑视图处。
为了在校验失败后,系统能将视图转入input处,必须在配置该action时配置input属性。如:
<!--定义login的Action --> 
<action name="Login" class="lee.LoginAction"> 
 <!-- 定义input的逻辑视图名,对应login.jsp页面 --> 
 <result name="input">/login.jsp</result> 
 <!-- 定义error的逻辑视图名,对应error.jsp页面 --> 
<result name=" error ">/error.jsp</result> 
 <!-- 定义success的逻辑视图名,对应welcome.jsp页面 --> 
<result name="success">/welcome.jsp</result>         
</action>


提示:struts2的<s:form .../>默认已经提供了输出校验错误的能力。
      ActionSupport增加了让提示信息国际化的能力,ActionSupport提供的getText方法可以根据资源文件加载获得国际化提示信息。
2)使用struts2的校验框架
类似struts1,struts2也允许通过定义配置文件来完成数据校验,struts2的校验框架实际上是基于XWork的validator框架。
struts2提供了大量的数据校验器,包括表单域校验器和非表单域校验器。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics