struts2 核心攔截器2 (微微進階)——struts2第六講

攔截器 進階 struts2css

注:本文系做者在看了浪曦的風中葉老師的struts2視頻的我的總結,但願能幫助廣大struts2的初學者。 

這講是接着上講的內容 
這講主要講一些struts2攔截器的一些細節方面東西,但頗有用。 

首先修改上講中的文件test.jsp,弄一張表單: 
代碼以下: 
html

Jsp代碼  收藏代碼java

  1. <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>  web

  2. <%  apache

  3. String path = request.getContextPath();  tomcat

  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  jsp

  5. %>  ui

  6. <%@ taglib prefix="s" uri="/struts-tags" %>  this

  7.   

  8. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  spa

  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

寫得很好  繼續哦  呵呵

相關文章
相關標籤/搜索