Struts2拦截器简单示例

来源:互联网 发布:淘宝上怎么搜电棍 编辑:程序博客网 时间:2024/06/05 14:37

拦截器(Interceptor)是Struts 2的核心组成部分。很多功能(Feature)都是构建在拦截器基础之上的,例如文件的上传和下载、国际化、转换器和数据校验等,Struts 2利用内建的拦截器,完成了框架内的大部分操作。
Struts 2文档中对拦截器的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制,使开发者可以定义一个特定的功能模块,这个模块可以在Action执行之前或者之后运行,也可以在一个Action执行之前阻止Action执行。同时也提供了一种可以提取Action中可重用的部分的方式
拦截器在Struts2中的示意图:
从上图可以看出,Struts 2架构的Action被一个或者多个拦截器(拦截器栈)所包围,所有的用户请求都会被拦截器所拦截,然后交给Action处理,处理结果以逻辑视图方式返回给用户。而这个调用执行流程,是由Struts 2的配置文件来实现的,后面会详细介绍。拦截器是Struts 2核心部分之一。
当用户请求到达Struts 2ServletDispatcher时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表(List),最后一个一个地调用列表中的拦截器
拦截器时序图如下图所示:
Struts 2架构中,Action的调用都是通过拦截器来实现的。有的读者可能会疑惑,为什么没有明确说明拦截器,为什么可以直接调用Action?那是因为Struts 2架构如果不做显式的拦截器配置,则系统会调用默认的拦截器来调用Action,在用户看来,好像没有配置拦截器
 
Hello World拦截器示例.
程序要演示的是显示地让拦截器调用Action,来体会拦截器的用途。
一般情况下我们都会先写出一个Action,然后配置struts.xml文件
MyAction.java
public class MyAction extends ActionSupport { 

  //以下属性信息都是从前台(JSP页面获得) 
  private String username; 
    
  private String mymsg; 
    
  private String password1; 
    
  private String password2; 
    
  private Date birthday; 

  public String execute(){ 
    if(username!=null&&this.getPassword1().equals(this.getPassword2())&&!this.getUsername().trim().equals("")){ 
        
      //输出调试信息 
      System.out.println("Action信息,正在执行Action....  "); 
      return SUCCESS; 
    }else{ 
      return INPUT; 
    } 
  } 
    
    

  public String getUsername() { 
    return username; 
  } 



  public void setUsername(String username) { 
    this.username = username; 
  } 



  public String getMymsg() { 
    return mymsg; 
  } 

  public void setMymsg(String mymsg) { 
    this.mymsg = mymsg; 
  } 

  public String getPassword1() { 
    return password1; 
  } 

  public void setPassword1(String password1) { 
    this.password1 = password1; 
  } 

  public String getPassword2() { 
    return password2; 
  } 

  public void setPassword2(String password2) { 
    this.password2 = password2; 
  } 

  public Date getBirthday() { 
    return birthday; 
  } 

  public void setBirthday(Date birthday) { 
    this.birthday = birthday; 
  } 
    
} 
 
自定义拦截器MyInterceptor.java
public class MyInterceptor extends AbstractInterceptor { 

  //拦截方法 
  public String intercept(ActionInvocation invocation) throws Exception { 

    MyAction myA=(MyAction) invocation.getAction(); 
    System.out.println("拦截器信息:hello world 拦截器"); 
    //执行action或者下一个拦截器 
    String result=invocation.invoke(); 
    System.out.println("拦截器信息:Action执行完毕"); 
    return result; 
  } 

}
下面我们开始配置struts.xml文件
首先我定义了一个my.xml文件
<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE struts PUBLIC 
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 
        "http://struts.apache.org/dtds/struts-2.0.dtd"> 

<struts> 

        <package name="mynew" namespace="/" extends="struts-default"> 
         
          <interceptors> 
            <interceptor name="myInterceptor" class="com.MyInterceptor"> 
            </interceptor> 
          </interceptors> 
     
    <action name="myAction" class="com.MyAction"> 
      <result name="success">/success.jsp</result> 
      <result name="input">/index.jsp</result> 
      <!-- 引用默认拦截器 --> 
      <interceptor-ref name="defaultStack"></interceptor-ref> 
      <!-- 引用自定义拦截器 --> 
      <interceptor-ref name="myInterceptor"></interceptor-ref> 
    </action> 
        </package> 
</struts> 
 
这样的话就要在struts.xml引入,
<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE struts PUBLIC 
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 
        "http://struts.apache.org/dtds/struts-2.0.dtd"> 

<struts> 
        <constant name="struts.devMode" value="true" /> 
  <include file="my.xml"></include> 
</struts> 
如果读者不习惯的话完全可以写在struts.xml文件中
 
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 
<%@ taglib prefix="s" uri="/struts-tags" %> 
<html> 
    <head> 
    </head> 
     
    <body> 
      <s:form method="post" action="myAction">    
        <s:textfield name="username" label="用户名"></s:textfield> 
        <s:password name="password1" label="密码"></s:password> 
        <s:password name="password2" label="确认密码"></s:password> 
    <s:submit value="注册"></s:submit> 
      </s:form> 
    </body> 
</html> 
success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" 
        pageEncoding="UTF-8"%> 
<%@ taglib prefix="s" uri="/struts-tags" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<title>Insert title here</title> 
</head> 
<body> 
  <h3>注册成功</h3> 
  用户名:<s:property value="username"/><p> 
  密码:    <s:property value="password1"/> 
</body> 
</html>
后台输出结果:
拦截器信息:hello world 拦截器 
Action信息,正在执行Action....    
2010-11-1 20:39:11 com.opensymphony.xwork2.util.logging.commons.CommonsLogger warn 
警告: Could not find property [org.apache.catalina.jsp_file] 
拦截器信息:Action执行完毕