现在的位置: 首页 > 综合 > 正文

Struts2自学摘要

2013年11月01日 ⁄ 综合 ⁄ 共 4461字 ⁄ 字号 评论关闭

--------------------------------------自定义拦截器-------------------------

业务需求:
如果用户登录后可以访问action中的所有方法
  user.jsp{
    //设置用户为登录状态
  }
如果用户没有登录不允许访问action中的方法,并且提示"你没有权限执行该操作"
-----------------------------------------------------------------------------
定义拦截器类,实现com.opensymphony.xwork2.interceptor.Interceptor接口

cn.acc.interceptor.PermissionInterceptor

struts.xml:
<interceptor-stack name="permissionStack">
    <interceptor-ref name="defaultStack"/>   //系统的拦截器放在最前面
    <interceptor-ref name="permission"/>
</interceptor-stack>
...
<action name="list_*" class="cn.accp.action.InterceptorAction" method="{1}">   
    <interceptor-ref name="permissionStack" /> //调用拦截器栈
</action>

系统的拦截器一定要用上,
如果希望某个包里面的所有action都用到权限拦截器,

写上默认拦截器:<default-interceptor-ref name="permissionStack" />

注意:每个包只能指定一个默认拦截器,另外,一旦我们为该包中的某个action显示指定了某个拦截器,则默认拦截器不会起作用。

如果想有默认拦截器,又想显示指定某个拦截器,那就照下面那样做:

<action name="list_*" class="cn.accp.action.InterceptorAction" method="{1}">   
    <interceptor-ref name="permissionStack" /> //整个包中的默认拦截器
    <interceptor-ref name="xxxx" />
</action>
-----------------------------------------------输入校验----------------------------------------------
-----------------------------------------------------------------------------------------------------
对于输入校验struts2提供了两种实现方法:

1.采用手工编写代码实现。
2.基于XML配置方式实现。

通过重写validate()方法实现,validate()方法会校验action中所有与execute方法签名相同的方法。
当某个数据校验失败时,我们应该调用addFieldError()方法往系统的fieldErrors添加校验失败信息(为了使用
addFieldError()方法,action可以继承ActionSupport),如果系统的fieldErrors包含失败信息,struts2会将
请求转发到名为input的result。在input视图中可以通过<s:fielderror/>显示失败信息。

-----------------------------------------------------------------------------------------------------
对action指定方法进行校验
只要把validate()方法改写成 validateXxx(),Xxx为要校验的方法,注意首字母大写。
其他内容不变。

----------------------------------输入校验的流程--------------------------------------
--------------------------------------------------------------------------------------

1.类型转换器对请求参数执行类型转换,并把转换后的值赋给action中的属性。

2.如果在执行类型转换的过程中出现异常,系统会将异常信息保存到
ActionContext,conversionError拦截器将异常信息添加到fieldErrors里。不管
类型转换是否出现异常,都会进入第3步。

3.系统通过反射技术先调用action中的validateXxx()方法,Xxx为方法名。

4.再调用action中的validate()方法。

5.经过上面4步,如果系统中的fieldErrors存在错误信息(即存放错误信息的集
合的size大于0),系统自动将请求转发至名称为input的视图。如果系统中的
fieldErrors没有任何错误信息,系统将执行action中的处理方法。
---------------------------------------------------------------------------------------
跳到input视图有两种情况:

1、是验证失败
2、类型转换失败

validate(){

}

如果validate()方法中没有写一句代码,还是会跑到input视图,说明是类型转换出错了。

比如有个Date类型的属性,而页面输入错误格式,它就会跳到input视图。不会执行成功。

----------------------------------基于XML配置方法实现对action的方法进行校验--------------------------------------
-----------------------------------------------------------------------------------------------------------------

提供校验文件(校验文件模板可以从struts2的例子中copy出来。)
PersonAction-validation.xml

<!DOCTYPE validators PUBLIC
        "-//OpenSymphony Group//XWork Validator 1.0.3//EN"
        "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">

(全部校验器能在default.xml中找到)
requiredstring:必须填的字符串

-------------------------------------用XML对指定方法进行验证-----------------------------------------------------
-----------------------------------------------------------------------------------------------------------------

1、ActionClassName-validation.xml  //对整个action进行验证
2、ActionClassName-ActionName-validation.xml   //对action中的某个方法进行验证,如:PersonAction-manager_add-validation.xml
如果为某个Action同时指定了上面两个文件
系统将自动汇总,执行两个的校验。

假如:
1文件中为某一属性设置成1-5的长度,而2文件中也为同一个属性设置成1-10的长度,那么系统默认会执行后面文件的验证。

当action继承了另一个action,父类action的校验文件会先被搜索到。

应用于action的是父类和子类的总和。

系统是先搜索到BaseAction-validation.xml,BaseAction-user-validation.xml,
接着搜索子类的校验文件UserAction-validation.xml,UserAction-user-validation.xml

---------------------------------------------国际化-----------------------------------------------
全局范围:
itcast_zh_CN.properties

itcast_en_US.properties

包范围:
在java的包下放置package_language_country.properties资源文件。package为固定写法,
处于该包及子包下的action都可以访问该资源。当查找指定key的消息是,系统会先从package
资源文件查找,当找不到对应的key时,才会从常量struts.custom.i18n.resources指定的
资源文件(全局范围)中寻找。

Action范围:
ActionClassName_language_country.properties资源文件。

要在页面直接指定某个资源文件,可以用<s:i18n name="cn/acc/action/PersonManageAction"></s:i18n>标签

----------------------------------------------------------OGNL表达式------------------------------------------------
OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目。
Struts2框架使用OGNL作为默认的表达式语言。

相对EL表达式,它提供了平时我们需要的一些功能,如:
1.支持对象方法调用,如xxx.sayHello();
2.支持类静态方法调用 和 常量值访问,表达式的格式: @[类全名(包括包路径)]@[方法名|值名],
例如:@java.lang.String@format('foo%s','bar')或@cn.itcast.Constant@APP_NAME;
3.操作集合对象。

Ognl有一个上下文(Context)概念,其实上下文就是一个MAP结构,它实现
了java.utils.Map接口,在Struts2中上下文(Context)的实现为ActionContext。

抱歉!评论已关闭.