一。Struts2拦截器简介

拦截器(Interceptor)是Struts2的核心组成部分,很多的功能都是构建在拦截器基础之上的,例如数据校验,上传和下载,国际化,转换器等。在Struts 2文档中对拦截器的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制,使开发者可以定义一个特定的功能模块,这个模块可以在Action执行之前或者之后运行,也可以在一个Action执行之前阻止Action执行。同时也提供了一种可以提取Action中可重用的部分的方式。

 

下面的这个图是官方文档上的示意图:

Struts2的拦截器处理机制来源于WebWork,这个拦截器的处理机制是按照AOP来进行设计的。AOP是对OOP的一个完善和补充,是软件技术和设计思想发展到一定阶段的产物!

Struts2 架构的Action被一个或者多个拦截器,或者一个拦截器栈,用户请求会被拦截器所拦截。

二。拦截器实例

第一个拦截器:

  1. <?xml version="1.0" encoding="UTF-8" ?> 
  2. <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> 
  3. <struts> 
  4. <package name="first" extends="struts-default" namespace=""> 
  5.     <interceptors> 
  6.         <interceptor name="Myinterceptor" class="com.yaxing.interceptor.Myinterceptor"></interceptor> 
  7.         <interceptor name="Myinterceptor" class="com.yaxing.interceptor.Myinterceptor"></interceptor> 
  8.     </interceptors> 
  9.     <action  name="Reg" class="com.yaxing.interceptor.Reg" method="execute"> 
  10.            <result name="success">/Success.jsp</result> 
  11.            <result name="input">/Reg.jsp</result> 
  12.            <interceptor-ref name="defaultStack"></interceptor-ref> <!--这个拦截器是默认的拦截器,在struts-default里面的定义  -->
  13.            <interceptor-ref name="Myinterceptor"></interceptor-ref> 
  14.     </action> 
  15.       
  16. </package> 
  17.  
  18. </struts>     

①拦截器类MyInterceptor(自定义拦截器)

 

  1. package com.yaxing.interceptor;  
  2.  
  3. import com.opensymphony.xwork2.ActionInvocation;  
  4. import com.opensymphony.xwork2.interceptor.AbstractInterceptor;  
  5.  
  6. public class Myinterceptor extends AbstractInterceptor {  
  7.  
  8.     @Override 
  9.     public String intercept(ActionInvocation arg0) throws Exception {  
  10.         // TODO Auto-generated method stub  
  11.         Reg reg =(Reg)arg0.getAction();  
  12.         System.out.println("拦截器信息:First拦截器!");  
  13.         String result=arg0.invoke();  
  14.         System.out.println("拦截器信息:Action执行完毕!");  
  15.         return result;  
  16.     }  
  17.  
  18. }  

②业务控制Action Reg类

 

  1. package com.yaxing.interceptor;  
  2.  
  3. import java.util.Date;  
  4.  
  5. import com.opensymphony.xwork2.ActionSupport;  
  6.  
  7. public class Reg extends ActionSupport {  
  8.     private String username;  
  9.     private String mymsg;  
  10.     private String password1; //用户密码 
  11.     private String password2;  //确认密码
  12.     private Date birthday;  
  13.     public String getUsername() {  
  14.         return username;  
  15.     }  
  16.     public void setUsername(String username) {  
  17.         this.username = username;  
  18.     }  
  19.     public String getMymsg() {  
  20.         return mymsg;  
  21.     }  
  22.     public void setMymsg(String mymsg) {  
  23.         this.mymsg = mymsg;  
  24.     }  
  25.     public String getPassword1() {  
  26.         return password1;  
  27.     }  
  28.     public void setPassword1(String password1) {  
  29.         this.password1 = password1;  
  30.     }  
  31.     public String getPassword2() {  
  32.         return password2;  
  33.     }  
  34.     public void setPassword2(String password2) {  
  35.         this.password2 = password2;  
  36.     }  
  37.     public Date getBirthday() {  
  38.         return birthday;  
  39.     }  
  40.     public void setBirthday(Date birthday) {  
  41.         this.birthday = birthday;  
  42.     }  
  43.     public String execute() throws Exception{  
  44.         if(username!=null&&getPassword1().equals(getPassword2())&&!getUsername().trim().equals("")){  
  45.             System.out.println("Action信息:正在执行Action......");  
  46.             return SUCCESS;  
  47.         }else {  
  48.             return INPUT;  
  49.         }  
  50.     }  
  51.  
  52. }  

③注册页面Reg.jsp 使用Struts2标签

这里值得注意点的就是 第3,14,15,25行的代码:

<%@ taglib uri="/struts-dojo-tags" prefix="sx">

使用了这个日期选择:

<sx:datetimepicker name="birthday" label="生日:" displayFormat="yyyy-MM-dd">

具体的请见:http://enetq.blog.51cto.com/479739/536790

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 
  2. <%@ taglib prefix="s" uri="/struts-tags" %> 
  3. <%@ taglib uri="/struts-dojo-tags" prefix="sx"%>
  4.  
  5.  
  6.  
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
  8. <html> 
  9.   <head> 
  10.      
  11.       
  12.     <title>My JSP 'reg.jsp' starting page</title> 
  13.       
  14. <s:head/>    
  15. <sx:head/>    
  16.  
  17.  
  18.   </head> 
  19.     
  20.   <body>   
  21.     <s:form action="Reg"> 
  22.         <s:textfield name="username" label="用户名"></s:textfield> 
  23.         <s:password name="password1" label="密码"></s:password>   
  24.         <s:password name="password2" label="确认密码"></s:password>   
  25.         <sx:datetimepicker name="birthday" label="生日:" displayFormat="yyyy-MM-dd"></sx:datetimepicker> 
  26.         <s:submit value="注册"/> 
  27.     </s:form> 
  28.       
  29.   </body> 
  30. </html> 

④Success.jsp

 

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 
  2. <%@ taglib uri="/struts-tags" prefix="s" %> 
  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
  4. <html> 
  5.   <head> 
  6.    
  7.     <title>注册成功</title> 
  8.       
  9.     <meta http-equiv="pragma" content="no-cache"> 
  10.     <meta http-equiv="cache-control" content="no-cache"> 
  11.     <meta http-equiv="expires" content="0">      
  12.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 
  13.     <meta http-equiv="description" content="This is my page"> 
  14.     <!--  
  15.     <link rel="stylesheet" type="text/css" href="styles.css">  
  16.     --> 
  17.  
  18.   </head> 
  19.     
  20.   <body> 
  21.     欢迎<s:property value="username"/>,注册成功!  <BR>
  22.    密码: <s:property value="password1"/> <BR>
  23.    生日:<s:property value="birthday"/> <BR>
  24.   </body> 
  25. </html> 

Reg.jsp 输入之后 点击注册。

 

 

控制台的输出信息。通过本实例,可以基本的了解了下拦截器的使用。

Good Luck Enjoy it! 

下篇:Struts2自定义拦截器详解