*作用范围:
*过滤器:使用范围是J2EE范畴,任何一个web工程都可以使用过滤器
*拦截器:使用范围是struts2范畴,离不开struts2框架的
*完成的功能:
*过滤器:拦截请求资源
*拦截器:完成其他所有功能
*执行顺序:
过滤器——>拦截器
http客户端-->web容器--web.xml文件--过滤器
--->struts.xml--->拦截器--->action--service--dao--数据库
常见的拦截器有哪些?
在哪里配置
struts-default.xml文件
package name=”struts-default”
<interceptors>
<interceptor name="alias" class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/>
<interceptor name="autowiring" class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/>
<interceptor name="chain" class="com.opensymphony.xwork2.interceptor.ChainingInterceptor"/>
<interceptor name="conversionError" class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/>
<interceptor name="cookie" class="org.apache.struts2.interceptor.CookieInterceptor"/>
<interceptor name="clearSession" class="org.apache.struts2.interceptor.ClearSessionInterceptor"/>
<interceptor name="createSession" class="org.apache.struts2.interceptor.CreateSessionInterceptor"/>
<interceptor name="debugging" class="org.apache.struts2.interceptor.debugging.DebuggingInterceptor"/>
<interceptor name="execAndWait" class="org.apache.struts2.interceptor.ExecuteAndWaitInterceptor"/>
<interceptor name="exception" class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"/>
<interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/>
<interceptor name="i18n" class="com.opensymphony.xwork2.interceptor.I18nInterceptor"/>
<interceptor name="logger" class="com.opensymphony.xwork2.interceptor.LoggingInterceptor"/>
<interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/>
<interceptor name="scopedModelDriven" class="com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor"/>
<interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
<interceptor name="actionMappingParams" class="org.apache.struts2.interceptor.ActionMappingParametersInteceptor"/>
<interceptor name="prepare" class="com.opensymphony.xwork2.interceptor.PrepareInterceptor"/>
<interceptor name="staticParams" class="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor"/>
<interceptor name="scope" class="org.apache.struts2.interceptor.ScopeInterceptor"/>
<interceptor name="servletConfig" class="org.apache.struts2.interceptor.ServletConfigInterceptor"/>
<interceptor name="timer" class="com.opensymphony.xwork2.interceptor.TimerInterceptor"/>
<interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/>
<interceptor name="tokenSession" class="org.apache.struts2.interceptor.TokenSessionStoreInterceptor"/>
<interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>
<interceptor name="workflow" class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"/>
<interceptor name="store" class="org.apache.struts2.interceptor.MessageStoreInterceptor"/>
<interceptor name="checkbox" class="org.apache.struts2.interceptor.CheckboxInterceptor"/>
<interceptor name="profiling" class="org.apache.struts2.interceptor.ProfilingActivationInterceptor"/>
<interceptor name="roles" class="org.apache.struts2.interceptor.RolesInterceptor"/>
<interceptor name="annotationWorkflow" class="com.opensymphony.xwork2.interceptor.annotations.AnnotationWorkflowInterceptor"/>
<interceptor name="multiselect" class="org.apache.struts2.interceptor.MultiselectInterceptor"/>
<interceptor-stack name="basicStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="multiselect"/>
<interceptor-ref name="actionMappingParams"/>
<interceptor-ref name="params">
<param name="excludeParams">dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*param>
interceptor-ref>
<interceptor-ref name="conversionError"/>
interceptor-stack>
<interceptor-stack name="validationWorkflowStack">
<interceptor-ref name="basicStack"/>
<interceptor-ref name="validation"/>
<interceptor-ref name="workflow"/>
interceptor-stack>
<interceptor-stack name="fileUploadStack">
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="basicStack"/>
interceptor-stack>
<interceptor-stack name="modelDrivenStack">
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="basicStack"/>
interceptor-stack>
<interceptor-stack name="chainStack">
<interceptor-ref name="chain"/>
<interceptor-ref name="basicStack"/>
interceptor-stack>
<interceptor-stack name="i18nStack">
<interceptor-ref name="i18n"/>
<interceptor-ref name="basicStack"/>
interceptor-stack>
<interceptor-stack name="paramsPrepareParamsStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="multiselect"/>
<interceptor-ref name="params">
<param name="excludeParams">dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*param>
interceptor-ref>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="chain"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="actionMappingParams"/>
<interceptor-ref name="params">
<param name="excludeParams">dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*param>
interceptor-ref>
<interceptor-ref name="conversionError"/>
<interceptor-ref name="validation">
<param name="excludeMethods">input,back,cancel,browseparam>
interceptor-ref>
<interceptor-ref name="workflow">
<param name="excludeMethods">input,back,cancel,browseparam>
interceptor-ref>
interceptor-stack>
<interceptor-stack name="defaultStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="chain"/>
<interceptor-ref name="scopedModelDriven"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="multiselect"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="actionMappingParams"/>
<interceptor-ref name="params">
<param name="excludeParams">dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*param>
interceptor-ref>
<interceptor-ref name="conversionError"/>
<interceptor-ref name="validation">
<param name="excludeMethods">input,back,cancel,browseparam>
interceptor-ref>
<interceptor-ref name="workflow">
<param name="excludeMethods">input,back,cancel,browseparam>
interceptor-ref>
<interceptor-ref name="debugging"/>
interceptor-stack>
<interceptor-stack name="completeStack">
<interceptor-ref name="defaultStack"/>
interceptor-stack>
<interceptor-stack name="executeAndWaitStack">
<interceptor-ref name="execAndWait">
<param name="excludeMethods">input,back,cancelparam>
interceptor-ref>
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="execAndWait">
<param name="excludeMethods">input,back,cancelparam>
interceptor-ref>
interceptor-stack>
interceptors>
拦截器
拦截器栈 -->就是拦截器的集合
默认使用的拦截器栈 defualtStack
包含哪些拦截器:
拦截器都完成什么功能?
下面通过一个案例来理解struts2的拦截器 自定义的拦截器
操作:
在action的一个方法中,要进行权限的控制。如果是admin用户登入,就执行该方法,如果不是admin用户登入,就不能执行该方法
假设 你只有完成登陆之后才能完成其它的操作
1、 在intercept方法中的参数invocation是执行action的上下文,可以从
这里得到正在访问的action、Ognl值栈、请求路径、方法名称、命名空间
等信息。以帮助程序员在拦截器中做相应的处理工作
分析:
http://localhost:8080/struts_interceptor/csdn/UserAction_delete.action?msg=%E5%88%A0%E9%99%A4%E7%9A%84%E9%99%84%E5%8A%A0%E7%9A%84%E5%8F%82%E6%95%B0
先执行拦截器 再执行action
拦截器 /csdn/UserAction_delete.action
/csdn/UserAction_query.action
判断用户是否存在的拦截器 :
要自定义拦截器需要实现com.opensymphony.xwork2.interceptor.Interceptor接口:
public class PermissionInterceptorimplements Interceptor {
private static final long serialVersionUID = -5178310397732210602L;
public void destroy() {
}
public void init() {
}
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("进入拦截器");
if(session里存在用户){
Stringresult = invocation.invoke();
}else{
return“logon”;
}
//System.out.println("返回值:"+ result);
//returnresult;
}
}
说明:
因为struts2中如文件上传,数据验证,封装请求参数到action等功能都是由系统默认的defaultStack中的拦截器实现的,所以我们定义的拦截器需要引用系统默认的defaultStack,这样应用才可以使用struts2框架提供的众多功能。
如果希望包下的所有action都使用自定义的拦截器,可以通过
怎么样获取 作用域中复合对象的属性值:
在Action
提供 次属性的 get方法
在页面中:
<h4>欢迎${sessionScope.user.name}登陆后台管理h4>
采用的是EL的写法:
<br/>
${user.name}//page---request--session--application<br/>
${user["name"]}:::${user["name"]}<br/>
${sessionScope['user'].name }::${sessionScope['user'].name }<br/>
${sessionScope.user["name"] }:: ${sessionScope.user["name"]}<br/>
<br/>
利用struts2标签取值:pagerequest session application
#作用域:
<br/>
<s:property value="#session['user'].name"/>
<br/>
<s:property value="#session.user.name"/>
<s:property value="#session.user['name']"/>
文件上传的时候,
进行过滤文件上传的类型
文件上传的大小
<action name="FileAction_*"class="www.csdn.struts_upload_interceptor.action.FileAction"method="{1}">
<interceptor-ref name="fileUpload">
<param name="allowedTypes">image/jpeg,image/pjpeg,application/octet-stream,application/x-zip-compressedparam>
<param name="maximumSize">5242880param>
interceptor-ref>
<interceptor-ref name="defaultStack"/>
<result name="success">/index.jspresult>
action>
这就是拦截器的使用案例一。
Struts2 验证机制
服务器端:
1、对action中所有的方法都进行验证
手工编写代码:
@Override
public void validate(){
System.out.println("--------"+this.name+"=");
if(("").equals(this.name)||this.name==null){
this.addFieldError("name", "用户名不能为空");
}
}
如果 验证方法处理完 addFieldError中有错误信息,那么 就不进行处理业务方法。
2、 对action中 指定的方法进行验证
手工编写:validateXxx() Xxx是方法的名称 第一个字母大写。
通过struts2
客户端处理
Js脚本进行处理
基于XML配置方式实现
1、对action中所有的方法进行处理
要求 验证文件必须和action在同一个包中 例如:
并且 文件名必须ActionClassName-validation.xml.
介绍struts2里边验证器
在:包含这个包中有一个default.xml文件:内容如下:
使用方式:如下:
required 必填校验器
requiredstring 必填字符串校验器
true
stringlength:字符串长度校验器
email:邮件地址校验器
regex:正则表达式校验器
int:整数校验器
字段OGNL表达式校验器
2、对action中指定方法进行校验
采用ActionClassName-ActionName-validation.xml
即可。
注意事项:
当为某个action提供了ActionClassName-validation.xml和ActionClassName-ActionName-validation.xml两种规则的校验文件时,系统按下面顺序寻找校验文件:
1。AconClassName-validation.xml
2。ActionClassName-ActionName-validation.xml
系统寻找到第一个校验文件时还会继续搜索后面的校验文件,当搜索到所有校验文件时,会把校验文件里的所有校验规则汇总,然后全部应用于action方法的校验。如果两个校验文件中指定的校验规则冲突,则只使用后面文件中的校验规则。
当action继承了另一个action,父类action的校验文件会先被搜索到。
假设UserAction继承BaseAction:
访问上面action,系统先搜索父类的校验文件:BaseAction-validation.xml, BaseAction-user-validation.xml,接着搜索子类的校验文件:UserAction-validation.xml, UserAction-user-validation.xml。应用于上面action的校验规则为这四个文件的总和。
案例:
1、sturts2 转换器 Date
2、拦截器
3、拦截器的应用文件的上传应用
4、校验处理。