struts2 核心拦截器2 (微微进阶)——struts2第六讲
struts2 核心拦截器2 (微微进阶)——struts2第六讲
一别经年 发表于3年前
struts2 核心拦截器2 (微微进阶)——struts2第六讲
  • 发表于 3年前
  • 阅读 5
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

拦截器 进阶 struts2

注:本文系作者在看了浪曦的风中叶老师的struts2视频的个人总结,希望能帮助广大struts2的初学者。 

这讲是接着上讲的内容 
这讲主要讲一些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 看到了吧 


 


附件中有源码

Struts2核心 拦截器(初识拦截器)——— ... | struts2 文件上传与下载 (初始文件上传的 ...

评论 共 4 条 请登录后发表评论

4 楼 不复记忆 2009-10-02 10:48

挺好的,有了大致的了解了

3 楼 yangqianyu222 2009-06-12 10:50

代码格式有点乱啊。支持一下。

2 楼 radovi 2009-03-25 23:11

label 写道


写得很好&nbsp; 继续哦&nbsp; 呵呵 


ok

1 楼 label 2009-03-25 23:05

写得很好  继续哦  呵呵


共有 人打赏支持
粉丝 18
博文 138
码字总数 58546
×
一别经年
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: