struts2拦截器小结(2)

1.类MethodFiledInterceptor

当只需要拦截特定方法的时候可以继承此拦截器。
然后配置文件中传入两个参数来实现过滤。
  <interceptor-ref name="test">
       <param name="excludeMethods">method1,method2</param>
       <param name="includeMethods">method1,method3</param>
  </interceptor-ref>

excludeMethods:不会被拦截器处理
includeMethods:会被拦截器处理
method1同时存在两个参数中,将会被归类为includeMethods.

2.接口PreResutlListener

文件上传的时候,为action定义了一个"fileUpload"拦截器,
     <interceptor-ref name="fileUpload" >
				<param name="allowedTypes">application/msword,application/vnd.ms-excel,application/zip,text/plain</param>
				<param name="maximumSize">5242880</param>
			</interceptor-ref>

如果上传文件超过maximumSize指定大小或allowedTypes定义之外的文件类型,则框架会自动跳转到input视图,但是如果input视图里有一个用户列表,从数据库中读取数据,也就是说这个列表的数据必须经过另一个listUser请求才能得到并显示出来,很明显,框架的自动跳转input页面是不会去自动调用listUser请求的,这时候,input页面则显示的是一个没有数据的表格。
解决办法:为上传定一个自定义的拦截器myUpInterceptor,注册PreResultListener监听器(该监听器需要自己实现,功能是执行action之后返回result之前做点该做的事。
//这里,我将ManagerActionInterceptor类即当作拦截器又当作监听器
public class ManagerActionInterceptor extends MethodFilterInterceptor implements  PreResultListener {

         //实现监听器需实现的方法
	public void beforeResult(ActionInvocation invocation, String resultCode) {
		// TODO Auto-generated method stub
   
          if(resultCode.equals("input")){
        	  ManageAction ma=(ManageAction)invocation.getAction();
        	  try {
                         //读取数据库,用于input页面显示
				ma.userList();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
          }
	}

         //实现拦截器需实现的方法
	@Override
	protected String doIntercept(ActionInvocation invocation) throws Exception {
		// TODO Auto-generated method stub
                  //注册监听器
		invocation.addPreResultListener(new ManagerActionInterceptor());
		return invocation.invoke();
	}


3.拦截器栈中多个参数写法

<interceptors>
     <interceptor name="i1" class="test1">
     <interceptor name="i2" class="test2">
     <interceptor-stack name="i3">
          <interceptor-ref name="i1"/>
          <interceptor-ref name="i2"/>
     </interceptor-stack>
</interceptors>

<action name="login" class="..">
    <interceptor-ref name="i3">
          <param name="i1.name">user</param>
          <param name="i2.name">user</param>
    </interceptor-ref>
</action>



4.内建拦截器execAndWaite

如果一个action执行时间过长,如超过5秒,则可以使用此拦截器来实现用户等待页面的显示。
<action name="listUser" class="..">
	        <interceptor-ref name="execAndWait"/>
	        <interceptor-ref name="defaultStack"/>
            <result name="wait">/waiting.jsp</result>
			<result>/users.jsp</result>
		</action>


waiting.jsp
<%@taglib uri="/struts-tags" prefix="s" %>
    <html>
      <head>
        <title></title> 
 <!--5秒后自动跳转到users.jsp页面 -->
        <meta http-equiv="refresh" content="5;url=<s:url includeParams="all" />"/>
      </head>
      <body>
          Please wait while we process your request.
     Click [url=<s:url includeParams=]">[/url] if this page does not reload automatically.
      </body>
      
    </html>


"转载请注明出处:http://383984216-qq-com.iteye.com/admin/blogs/1151772

你可能感兴趣的:(java,code,struts,action,intercept)