Struts2中拦截器的简单实现

      Struts2的拦截器和Servlet过滤器类似。在执行Action的execute方法之前,Struts2会首先执行struts.xml中引用
的拦截器,在执行完所有引用的拦截器的intercept方法后,会执行Action的execute方法。在Struts2的拦截器体系中,
Struts2的内建拦截器完成了该框架的大部分操作,所以实际的开发过程中通常都是使用系统的拦截器而已。当然我们也可以开发自己的拦截器,类似于过滤器的开发。
     原理:
     Struts2拦截器的实现原理相对简单,当请求Struts2的Action时,Struts2会查找配置文件,并根据配置实例化相对
的拦截器对象,然后串成一个列表,最后一个一个的调用列表中的拦截器。
     实现用户自定义拦截器的过程:
     1.自定义拦截器类,实现com.opensymphony.xwork2.interceptor.Interceptor接口或继承com.opensymphony.xwork2.
     interceptor.AbstractInterceptor类。
     2.在struts.xml中定义自定义的拦截器。
     3.在struts.xml的Action中使用拦截器。
示例:
helloAction.java该实例中的Action类,对表单数据进行检验
package com.action;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;

public class HelloAction extends ActionSupport {
    private String username;
    private String pass1;
    private String pass2;
    
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPass1() {
return pass1;
}
public void setPass1(String pass1) {
this.pass1 = pass1;
}
public String getPass2() {
return pass2;
}
public void setPass2(String pass2) {
this.pass2 = pass2;
}
public String execute() throws Exception {
if(username!=null&&getPass1().equals(getPass2())&&!getUsername().trim().equals("")){
System.out.println("正在执行action...");
return Action.SUCCESS;
}
else{
System.out.println("正在执行action...");
return Action.INPUT;
}
}
  
}

HelloInterceptor.java是拦截器类
package com.inter;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class HelloInterceptor extends AbstractInterceptor {
private static final long serialVersionUID = 1L;
@Override
public String intercept(ActionInvocation arg0) throws Exception {
System.out.println("the interceptor is running...");
String result = arg0.invoke();
System.out.println("the interceptor is ending...");
return result;
}
}
用户自定义的拦截器必须实现interceptor接口或者直接继承AbstractInterceptor。intercept方法的主要作用是实现拦截的动作
,参数ActionInvocation是拦截Action的一个引用,可以通过调用该参数的invoke方法,将控制权传递给下一个拦截器或Action的execute方法。


在struts.xml配置:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
   <package name="hellpinterceptor" extends="struts-default">
      <interceptors>
         <interceptor name="helloInterceptor" class="com.inter.HelloInterceptor"></interceptor>
      </interceptors>
      <action name="helloaction" class="com.action.HelloAction">
         <result name="success">/success.jsp</result>
         <result name="input">/reg.jsp</result>
         <interceptor-ref name="defaultStack"></interceptor-ref>
         <interceptor-ref name="helloInterceptor"></interceptor-ref>
      </action>
   </package>
</struts>    
所需要的拦截器被配置在interceptor标记中,interceptor标记用来配置一个具体的拦截器,HelloInterceptor就配置在这里。拦截器的使用格式在每一个具体 
的Action中,在Action标记中的interceptor-ref标记的使用寂静在interceptor标记中定义好的拦截器。这就是strtus.xml文件。


reg.jsp代码:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix = "s"  uri ="/struts-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>struts2 拦截器应用</title>
</head>
<body>
<h1>用户注册</h1>
<s:form id="id" action="helloaction">
<s:textfield name="username" label="用户名"></s:textfield>
<s:password name="pass1" label="密码"></s:password>
<s:password name="pass2" label="重复密码"></s:password>
<s:submit value="注册"></s:submit>
</s:form>
</body>
</html>

success.jsp代码:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>struts2 拦截器应用</title>
  </head>
  <body>
<h2>用户名:<s:property value="username"/></h2>
<h2>密码:<s:property value="pass1"/></h2>
  </body>
</html>



运行的部分信息如下:
信息: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
the interceptor is running...
正在执行action...

the interceptor is ending...


拦截器中实现ntercept方法时,可以获得ActionInvocation参数,其作用是获取被拦截的Action实例,一旦获得了该实例,即可实现将HTTP请求中的参数解析出来,并设置成Action的属性,也可以直接将HTTP请求中的HttpServletRequest实例和HttpServletResponse实例传输给Action。

你可能感兴趣的:(struts2拦截器,Interceptor)