struts核心拦截器(6)

来源:互联网 发布:证书批量打印软件 编辑:程序博客网 时间:2024/05/16 07:33
这讲主要讲一些struts2拦截器的一些细节方面东西,但很有用。 

首先修改上讲中的文件test.jsp,弄一张表单: 
代码如下: 
Jsp代码  收藏代码
  1. <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>  
  2. <%  
  3. String path = request.getContextPath();  
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  5. %>  
  6. <%@ taglib prefix="s" uri="/struts-tags" %>  
  7.   
  8. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  9. <html>  
  10.   <head>  
  11.     <base href="<%=basePath%>">  
  12.       
  13.     <title>My JSP 'index.jsp' starting page</title>  
  14.     <meta http-equiv="pragma" content="no-cache">  
  15.     <meta http-equiv="cache-control" content="no-cache">  
  16.     <meta http-equiv="expires" content="0">      
  17.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  18.     <meta http-equiv="description" content="This is my page">  
  19.     <!--  
  20.     <link rel="stylesheet" type="text/css" href="styles.css">  
  21.     -->  
  22.   </head>  
  23.     
  24.   <body>  
  25.                 <s:form action="test_interceptor">  
  26.                         <s:textfield     name="username" label="username"></s:textfield>  
  27.                       <s:submit name="submit"></s:submit>  
  28.                           
  29.                 </s:form>  
  30.   </body>  
  31. </html>  


再在action中配置一个输入验证的文件 Test_InterceptorAction-validation.xml  (如何配置请看前面几节的内容,这里不再说了) 
Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"   
  3.  "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">  
  4.   
  5. <validators>  
  6.   
  7.               
  8.                         <field name="username">  
  9.                           
  10.                              <field-validator type="requiredstring">  
  11.                                     <param name="trim">true</param>  
  12.                                     <message>username is required</message>               
  13.                              </field-validator>  
  14.                         </field>  
  15.   
  16.   
  17. </validators>  


项目结构为: 


 



好了,显然,通过以上配置,理论上可以如果表单中username域为空时,会有错误提示的 
可是依旧成功提交,这是为什么呢? 

这是由于在struts.xml文件中我们对action插入了自定义的interceptor之后,没有将sturts2默认的拦截器插入action(struts2规定:如果action没有插入任何interceptor存在时。默认插入一个叫dafaultStack的拦截器栈) 

所以,这里,我们要手动插入之 

修改struts.xml即可   如下:(注意代码中的注释) 
Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
  5.   
  6.   
  7. <struts>  
  8.         <package name="interceptor1" extends="struts-default">  
  9.                             
  10.                           <!-- 定义拦截器 -->  
  11.                           <interceptors>  
  12.                                 <interceptor name="myInterceptor" class="cn.edu.hdu.interceptor.MyInterceptor"></interceptor>  
  13.                           </interceptors>  
  14.                            
  15.                         <!-- 配置action -->  
  16.                         <action name="test_interceptor" class="cn.edu.hdu.action.Test_InterceptorAction">  
  17.                             <result name="success">/success.jsp</result>  
  18.                             <result name="input">/test.jsp</result>  
  19.                             <!-- 将声明好的拦截器插入action中 -->  
  20.                                 <interceptor-ref name="myInterceptor"></interceptor-ref>  
  21.  <!--由于我们插入了自定义的interceptor。所以必须手动插入struts2的默认interceptor-->  
  22.                                <interceptor-ref name="defaultStack"></interceptor-ref>  
  23.                         </action>  
  24.                           
  25.                           
  26.         </package>  
  27. </struts>  


好了 现在在试试看  “username isrequired” 


其实还有如下几种方法导入默认的defaultStack 

方法一:定义一拦截器栈,将defaultStack放入自定义的拦截器栈中去 
struts2.xml文件如下:(注意看一些注释) 
Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
  5.   
  6.   
  7. <struts>  
  8.         <package name="interceptor1" extends="struts-default">  
  9.                             
  10.                           <!-- 定义拦截器 -->  
  11.                           <interceptors>  
  12.                                                         <!-- 定义自己的拦截器 -->  
  13.                                 <interceptor name="myInterceptor" class="cn.edu.hdu.interceptor.MyInterceptor"></interceptor>  
  14.                                                     <!--定义自己的拦截器栈  -->  
  15.                          <interceptor-stack name="myStack">  
  16.                                                                                          <!-- 将拦截器放入栈 -->  
  17.                                     <interceptor-ref name="myInterceptor"></interceptor-ref>  
  18.                                     <interceptor-ref name="defaultStack"></interceptor-ref>  
  19.                          </interceptor-stack>  
  20.                            
  21.                            
  22.                            
  23.                          </interceptors>  
  24.                         <!-- 配置action -->  
  25.                         <action name="test_interceptor" class="cn.edu.hdu.action.Test_InterceptorAction">  
  26.                             <result name="success">/success.jsp</result>  
  27.                             <result name="input">/test.jsp</result>  
  28.                             <!-- 将声明好的自定义拦截器栈插入action中 -->  
  29.                                 <interceptor-ref name="myStack"></interceptor-ref>  
  30.                         </action>  
  31.                           
  32.                           
  33.         </package>  
  34. </struts>  


方法二: 自定义一个默认拦截拦截器。代码如下,注意注释: 
Xml代码  收藏代码
  1.    <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
  5.   
  6.   
  7. <struts>  
  8.         <package name="interceptor1" extends="struts-default">  
  9.                             
  10.                           <!-- 定义拦截器 -->  
  11.                           <interceptors>  
  12.                                                         <!-- 定义自己的拦截器 -->  
  13.                                 <interceptor name="myInterceptor" class="cn.edu.hdu.interceptor.MyInterceptor"></interceptor>  
  14.                                                     <!--定义自己的拦截器栈  -->  
  15.                          <interceptor-stack name="myStack">  
  16.                                                                                          <!-- 将拦截器放入栈 -->  
  17.                                     <interceptor-ref name="myInterceptor"></interceptor-ref>  
  18.                                     <interceptor-ref name="defaultStack"></interceptor-ref>  
  19.                          </interceptor-stack>  
  20.                            
  21.                             
  22.                          </interceptors>  
  23.                           <!-- 配置默认的拦截器栈 -->  
  24.                           <default-action-ref name="myStack"></default-action-ref>  
  25.                       
  26.                       
  27.                       
  28.                       
  29.                         <!-- 配置action -->  
  30.                         <action name="test_interceptor" class="cn.edu.hdu.action.Test_InterceptorAction">  
  31.                             <result name="success">/success.jsp</result>  
  32.                             <result name="input">/test.jsp</result>  
  33.                             <!-- 此时这里无需插入任何拦截器 -->  
  34.                                   
  35.                         </action>  
  36.                           
  37.                           
  38.         </package>  
  39. </struts>  















好,接下去讲将将怎样为拦截器配置参数: 

此时,必须修改struts.xml 中定义拦截器部分的代码:(如下) 
Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
  5.   
  6.   
  7. <struts>  
  8.         <package name="interceptor1" extends="struts-default">  
  9.                             
  10.                           <!-- 定义拦截器 -->  
  11.                           <interceptors>  
  12.                                                         <!-- 定义自己的拦截器 -->  
  13.                                 <interceptor name="myInterceptor" class="cn.edu.hdu.interceptor.MyInterceptor">  
  14.                                         <param name="test">success</param>                                      <!-- 这里配置拦截器的参数 -->  
  15.                                 </interceptor>  
  16.                                                     <!--定义自己的拦截器栈  -->  
  17.                          <interceptor-stack name="myStack">  
  18.                                                                                          <!-- 将拦截器放入栈 -->  
  19.                                     <interceptor-ref name="myInterceptor"></interceptor-ref>  
  20.                                     <interceptor-ref name="defaultStack"></interceptor-ref>  
  21.                          </interceptor-stack>  
  22.                            
  23.                             
  24.                          </interceptors>  
  25.                           <!-- 配置默认的拦截器栈 -->  
  26.                           <default-action-ref name="myStack"></default-action-ref>  
  27.                       
  28.                       
  29.                       
  30.                       
  31.                         <!-- 配置action -->  
  32.                         <action name="test_interceptor" class="cn.edu.hdu.action.Test_InterceptorAction">  
  33.                             <result name="success">/success.jsp</result>  
  34.                             <result name="input">/test.jsp</result>  
  35.                             <!-- 此时这里无需插入任何拦截器 -->  
  36.                                   
  37.                         </action>  
  38.                           
  39.                           
  40.         </package>  
  41. </struts>  


然后修改拦截器 MyIntercepror.java 代码如下: 
Java代码  收藏代码
  1. package cn.edu.hdu.interceptor;  
  2.   
  3. import com.opensymphony.xwork2.ActionInvocation;  
  4. import com.opensymphony.xwork2.interceptor.Interceptor;  
  5.   
  6. public class MyInterceptor implements Interceptor {  
  7.   
  8.       
  9.     //由于定义拦截器的时候为拦击添加了参数,所以这里要为拦截器添加对应实例字段  
  10.   
  11.      private String test;                 // 这个变量必须和配置文件中的对应的字段  
  12.        
  13.                         
  14.       
  15.                                
  16.     public String getTest() {  
  17.         return test;  
  18.     }  
  19.   
  20.     public void setTest(String test) {  
  21.         this.test = test;  
  22.     }  
  23.   
  24.     public void destroy() {  
  25.   
  26.         System.out.println("destroy");  
  27.     }  
  28.   
  29.     public void init() {                 
  30.   
  31.                        System.out.println("拦截器已经被加载");  
  32.                        System.out.println(this.getTest());                   //将这个参数的值打印出来  
  33.     }  
  34.   
  35.     public String intercept(ActionInvocation invocation) throws Exception {  
  36.   
  37.                                      System.out.println("调用intercept方法");  
  38.                                        
  39.                                      String result = invocation.invoke();       // invocation.invoke()方法检查是否还有拦截器 有的话继续调用余下的拦截器 没有了  执行action的业务逻辑  
  40.         return result;  
  41.     }  
  42.   
  43. }  


好了,重启一下tomcat,控制台看到什么了。 

 



另外,在使用拦截器的是时候也可以在定义这个参数的value,结果是,覆盖定义时候的value值 
如下 
struts.xml   

Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
  5.   
  6.   
  7. <struts>  
  8.         <package name="interceptor1" extends="struts-default">  
  9.                             
  10.                           <!-- 定义拦截器 -->  
  11.                           <interceptors>  
  12.                                                         <!-- 定义自己的拦截器 -->  
  13.                                 <interceptor name="myInterceptor" class="cn.edu.hdu.interceptor.MyInterceptor">  
  14.                                         <param name="test">success</param>                                      <!-- 这里配置拦截器的参数 -->  
  15.                                 </interceptor>  
  16.                                                     <!--定义自己的拦截器栈  -->  
  17.                          <interceptor-stack name="myStack">  
  18.                                                                                          <!-- 将拦截器放入栈 -->  
  19.                                     <interceptor-ref name="myInterceptor">  
  20.                                             <param name="test">success when use it</param>               <!-- 此处是在使用的时候对其再次进行一个 -->  
  21.                                     </interceptor-ref>  
  22.                                     <interceptor-ref name="defaultStack"></interceptor-ref>  
  23.                          </interceptor-stack>  
  24.                            
  25.                             
  26.                          </interceptors>  
  27.                           <!-- 配置默认的拦截器栈 -->  
  28.                           <default-action-ref name="myStack"></default-action-ref>  
  29.                       
  30.                       
  31.                       
  32.                       
  33.                         <!-- 配置action -->  
  34.                         <action name="test_interceptor" class="cn.edu.hdu.action.Test_InterceptorAction">  
  35.                             <result name="success">/success.jsp</result>  
  36.                             <result name="input">/test.jsp</result>  
  37.                             <!-- 此时这里无需插入任何拦截器 -->  
  38.                                   
  39.                         </action>  
  40.                           
  41.                           
  42.         </package>  
  43. </struts>  


再次重启tomcat 看到了吧 


 
0 0
原创粉丝点击