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。

时间: 2024-08-07 16:46:28

Struts2中拦截器的简单实现的相关文章

struts2中拦截器(interceptor)小结

什么是拦截器? java里的拦截器是动态拦截Action调用的对象.它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式.在AOP(Aspect-Oriented Programming)中拦截器用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作.Struts2内置了很多拦截器,每个拦截器完成相对独立的功能,多个拦截器的组合体成为拦截器栈.最为重要的拦截器栈是

struts2中拦截器和过滤器的比较

拦截器和过滤器的区别: 1.拦截器是基于java的反射机制的,而过滤器是基于函数回调 2.过滤器依赖与servlet容器,而拦截器不依赖与servlet容器 3.拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用 4.拦截器可以访问action上下文.值栈里的对象,而过滤器不能 5.在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次 拦截器 :是在面向切面编程(AOP)的就是在你的service或者一个方法前调用一个方法,或者在方法后调用

Struts2中拦截器的配置

在struts.xml文件中定义拦截器只需要给拦截器类指定一个拦截器名,这就完成了定义.拦截器使用<interceptor>标记来定义,格式如下 <interceptor name="拦截器名" class="拦截器类"></interceptor> 大部分情况下,如果有一个拦截器这样配置就够了.如果有多个拦截器,则需要写多个<interceptor>,而<interceptor>是写在<interc

struts2中拦截器的简介与配置使用

拦截器是struts2框架的核心,struts2很多的功能都是构建在拦截器基础之上的,它是动态拦截Action调用的对象,提供了一种机制,使得开发者能够在一个Action前后执行需要的代码,可以在一个Action执行前组织他的执行,也能在Action执行后做一些相应的工作.同时他也提供了一种可以提取Action中可重用部分的方式. 拦截器 struts2拦截器是在访问某个Action或它的某个方法 .字段之前或之后实施拦截,struts2拦截器是可插拔的,是AOP的一种实现(AOP是OOP(Ob

struts2中拦截器与过滤器之间的区别

首先是一张经典的struts2原理图 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标准的过滤器链 c) FilterDispatecher会去查找相应的ActionMapper,如果找到了相应的ActionMapper它将会将控制权限交给ActionProxy d) ActionProxy将会通过ConfigurationManager来查找配置struts.xml        i. 下一步将会

Struts2中拦截器的使用

拦截器是Struts2框架的核心组成部分,框架的很多功能都是构建在拦截器基础之上.Struts2利用内建的拦截器完成了框架内的大部分操作,拦截器是AOP(面向方面编程)在Struts2框架中的具体实现. 下面是配置自定义拦截器的流程. 假设需要一个功能,在调用每个Action之前都能在控制台打印出Helloworld,要求使用Struts2拦截器来实现. 1.建立一个Action类MyAction.java和一个配置文件struts.xml,如下图. 2.编写MyAction.java实现一个年

说说struts2中拦截器的请求流程一(模拟大致流程)

本文可作为北京尚学堂struts2课程的学习笔记. 首先 什么是拦截器?拦截器能干什么? 拦截器,顾名思义就是拦截对象然后做操作的东西,至于是拦截谁?那自然是拦截action了.能做什么操作呢?你想让action在运行之前干什么就能干什么,而且action本身并"不知道"自己被拦截了. 文章主要分析了拦截器部分的流程,对于环境的获取与初始化并没有涉及,对这部分感兴趣的朋友可以参考 http://www.cnblogs.com/liuling/p/2013-8-10-01.html 在真

struts2的拦截器的简单使用

login.jsp页面body中 <s:form action="user_login.action" method="post"> <s:textfield name="username" label="用户名"/> <s:password name="password" label="密码"/> <s:submit value="登

SpringMVC中拦截器的简单使用

SpringMVC的处理器拦截器类似于过滤器Filter,用于对处理器进行预处理和后处理. 例如做登录验证,日志,性能检测等. 一.编写拦截器,使其实现HandlerInterceptor接口 import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; i