拦截器(Interceptor)是Struts 2的核心组成部分。很多功能(Feature)都是构建在拦截器基础之上的,例如文件的上传和下载、国际化、转换器和数据校验等,Struts 2利用内建的拦截器,完成了框架内的大部分操作。
在Struts 2文档中对拦截器的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制,使开发者可以定义一个特定的功能模块,这个模块可以在Action执行之前或者之后运行,也可以在一个Action执行之前阻止Action执行。同时也提供了一种可以提取Action中可重用的部分的方式。
5.2 Struts 2拦截器
通过上一节的介绍,读者会对拦截器的原理有了一个基本的理解,本节来介绍Struts 2架构中的拦截器。
5.2.1 Struts 2拦截器原理
读者可以通过Struts 2官方文档说明来理解拦截器,如果读者具有较强的英文阅读能力,建议查阅官方使用文档(http://struts.apache.org/2.0.11/docs/interceptors.html)。如图5.4所示,是拦截器在Struts 2中的示意图。
图5.4 Struts 2拦截器
从图5.4所示内容中可以看出,Struts 2架构的Action被一个或者多个拦截器(拦截器栈)所包围,所有的用户请求都会被拦截器所拦截,然后交给Action处理,处理结果以逻辑视图方式返回给用户。而这个调用执行流程,是由Struts 2的配置文件来实现的,后面会详细介绍。拦截器是Struts 2核心部分之一。
当用户请求到达Struts 2的ServletDispatcher时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表(List),最后一个一个地调用列表中的拦截器。拦截器时序图如图5.5所示。
图5.5 Struts 2拦截器时序图
在Struts 2架构中,Action的调用都是通过拦截器来实现的。有的读者可能会疑惑,前几章的介绍中,没有明确说明拦截器,为什么可以直接调用Action?那是因为Struts 2架构如果不做显式的拦截器配置,则系统会调用默认的拦截器来调用Action,在用户看来,好像没有配置拦截器。系统默认的拦截器笔者后面会详细介绍。
5.2.2 HelloWorld拦截器
读者可以按照笔者的步骤,一步一步建立第一个拦截器示例,来体验Struts 2框架中拦截器带给读者的惊喜。
(1) 在配置文件中增加拦截器定义和在Action中声明拦截器。笔者建立了一个目录ch5来对应本章,ch5.xml配置文件内容如代码5.8所示。
代码5.8 HelloWorld拦截器配置文件
<?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="ch5" extends="struts-default" namespace="/ch5">
<!-- 定义拦截器-->
<interceptors>
<interceptor name="Myinterceptor"
class="ch5.Myintercepor">
</interceptor>
</interceptors>
<action name="Reg" class="ch5.Reg">
<result name="success">/ch5/success.jsp</result>
<result name="input">/ch5/reg.jsp</result>
<!-- 引用默认拦截器-->
<interceptor-ref name="defaultStack"></interceptor-ref>
<!-- 引用自定义默认拦截器-->
<interceptor-ref name="Myinterceptor"></interceptor-ref>
</action>
</package>
</struts>
★ 注意 ★
需要读者在struts.xml文件中使用<include file="/ch5/ch5.xml"></include>将该配置文件包含进去。
(2)在ch5包内建立一个拦截器类Myintercepor,如代码5.9所示。
代码5.9 Helloworld拦截器类Myintercepor
package ch5;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class Myintercepor extends AbstractInterceptor ...{
//拦截方法
public String intercept(ActionInvocation arg0) throws Exception ...{
Reg reg = (Reg) arg0.getAction();
System.out.println("拦截器信息:HelloWorld拦截器!");
//执行Action或者执行下一个拦截器
String result = arg0.invoke();
//提示Action执行完毕
System.out.println("拦截器信息:Action执行完毕!");
return result;
}
}
(3)在ch5包内建立一个业务控制器Reg,如代码5.10所示。
代码5.10 HelloWorld拦截器示例的业务控制器
package ch5;
import java.util.Date;
import com.opensymphony.xwork2.ActionSupport;
public class Reg extends ActionSupport ...{
//定义用户名属性
private String username;
//定义处理信息:注意同http中的msg不同名称
private String mymsg;
//定义密码属性
private String password1;
//定义确认密码
private String password2;
//定义生日属性
private Date birthday;
public String execute() throws Exception ...{
if (username != null && getPassword1().equals(getPassword2())
&& !getUsername().trim().equals("")) ...{
//输出调试信息
System.out.println("Action信息:正在执行Actiion... ...");
return SUCCESS;
} else ...{
return INPUT;
}
}
//getter和setter方法
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;
}
}
(4)同样在ch5包内,建立一个用户注册reg.jsp文件和一个用于显示注册成功信息的success.jsp文件。内容分别如代码5.11和代码5.12所示。
代码5.11 用户注册界面reg.jsp
<%...@ page contentType="text/html;charset=UTF-8" language="java" %>
<%...@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>用户注册</title>
<s:head />
</head>
<body>
<table>
<s:form id="id" action="Reg">
<s:textfield name="username" label="用户名:"/>
<s:password name="password1" label="密码:"/>
<s:password name="password2" label="确认密码:"/>
<s:datetimepicker name="birthday" label="生日:"/>
<s:submit value="注册"/>
</s:form>
</table>
</body>
</html>
代码5.12 注册成功界面success.jsp
<%...@ page contentType="text/html;charset=UTF-8" language="java" %>
<%...@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>注册成功界面</title>
<s:head />
</head>
<body>
<table>
<h2>用户名:<s:property value="username" /></h2>
<h2>密码:<s:property value="password1" /></h2>
<h2>生日:<s:property value="birthday" /></h2>
</table>
</body>
</html>
(5) 启动Tomcat服务器,在浏览器中输入:http://localhost:8080/bookcode/ch5/reg.jsp,运行界面如图5.6所示。
图5.6 HelloWorld拦截器的注册界面
(6)读者可以在“用户名”、“密码”、“确认密码”和“生日”输入框中填入相关字符串,单击“注册”按钮,会发现Tomcat控制台输出如下信息:
… …
信息: Detected AnnotationActionValidatorManager, initializing it...
拦截器信息:HelloWorld拦截器!
Action信息:正在执行Actiion... ...
拦截器信息:Action执行完毕!
… …
到此为止,第一个拦截器HelloWorld示例就建立成功了,读者通过本示例,可以了解拦截器的基本功能。
分享到:
相关推荐
下面将详细探讨Struts2拦截器及其工作原理。 ### 一、Struts2 拦截器概念 1. **拦截器是什么**:拦截器是一种动态拦截Action调用的对象,它可以理解为一个过滤器,它在Action被调用之前和之后执行特定的逻辑。...
通过这两个实例,你将更深入地理解Struts2拦截器的工作原理和配置方式,以及它们如何在实际项目中发挥作用。记得在实践中多尝试,理解拦截器如何与其他Struts2组件协作,以提升你的Web应用开发技能。
本文将深入探讨Struts2拦截器的基本概念、工作原理以及其实现机制,并结合实际应用场景来展示如何利用拦截器提高代码的复用性与可维护性。 #### 二、拦截器的概念与作用 拦截器(Interceptor)是一种设计模式,...
本文将深入探讨Struts2拦截器的原理,并通过一个简单的实例来帮助你理解其工作方式。 首先,让我们理解什么是拦截器。在软件设计模式中,拦截器是一种“链式处理”模式,它允许在动作执行前后插入自定义逻辑。在...
首先,我们需要了解Struts2拦截器的工作原理。拦截器是基于AOP(面向切面编程)思想实现的,它通过在Action调用前后插入额外的操作,形成一个拦截链。当一个请求到来时,Struts2会按照配置的顺序依次执行这些拦截器...
首先,让我们理解Struts2拦截器的工作原理。拦截器是基于AOP(面向切面编程)的概念设计的,它们形成一个链,每个拦截器按照定义的顺序依次执行。当请求到达Action时,Struts2会调用这个链上的所有拦截器,然后才...
实践是学习的最佳途径,通过分析和运行代码,你将更深入地了解Struts2拦截器的内部工作原理。 总的来说,Struts2拦截器是实现业务逻辑复用和控制流管理的强大工具。它们提高了代码的可维护性和可扩展性,使得开发者...
本文将深入探讨Struts2拦截器的原理以及它与Java中的动态代理之间的联系。 首先,让我们了解Struts2拦截器的基本工作原理。拦截器在Action执行前后被调用,形成一个拦截器链。每当一个HTTP请求到达,Struts2的...
拦截器的运行原理是基于责任链模式,一个请求会依次通过一系列的拦截器,每个拦截器都有机会处理请求或改变响应。在Struts2中,拦截器的配置主要在struts.xml或struts-plugin.xml配置文件中完成,通过`<interceptor>...
Struts1 拦截器原理** 拦截器的工作机制是基于责任链模式,它将一系列拦截器按照预设的顺序串联起来,形成一条处理链。当请求到达时,会依次通过这些拦截器,每个拦截器都有机会执行其特有的业务逻辑,然后再传递给...
本文将深入探讨如何使用Struts2实现拦截器,以及如何配置拦截器来实现用户权限拦截。 首先,我们需要了解拦截器的工作原理。在Struts2中,拦截器是基于Java的动态代理机制实现的,它们按照预定义的顺序形成一个拦截...
下面我们将深入探讨Struts2拦截器的工作原理和应用场景。 1. 拦截器的定义: 拦截器是基于AOP(面向切面编程)思想的一种设计模式,它在Action执行前后进行拦截,对请求和响应进行额外处理。在Struts2中,拦截器是...
Struts拦截器是Java Web开发框架Struts2中的核心组件之一,它允许开发者在Action执行前后插入自定义的处理逻辑,实现AOP(面向切面编程)的理念。动态代理则是Java提供的一种机制,允许在运行时创建接口的实现类实例...
Struts2 拦截器(Interceptor)是框架的核心组件之一,它允许开发者在Action执行前后插入自定义的处理...通过深入理解拦截器的工作原理和配置方式,开发者可以更好地利用Struts2框架构建高效、可扩展的Web应用程序。
Struts2 拦截器是框架中的一个重要组成部分,它允许开发者在Action执行前后插入自定义的处理逻辑,实现如日志记录、权限检查、事务管理等通用功能,无需在每个Action类中重复编写相同的代码。拦截器是基于Java的动态...
拦截器的工作原理类似于过滤器(Filter),但它们是基于Struts2的内置机制,更加灵活且易于配置和扩展。 ### Struts2拦截器的生命周期 当一个请求到达Struts2框架时,会经过以下流程: 1. **拦截器栈**:首先,...
首先,我们需要了解Struts拦截器的工作原理。拦截器是基于Java的动态代理模式实现的,它们在Action调用前后执行,形成一个拦截器链。每个拦截器都可以执行特定的任务,如验证用户、记录日志等。通过配置Struts配置...
本示例重点讲解了Struts2中的拦截器(Interceptor)机制,这是Struts2框架的一个核心特性,能够帮助我们实现对请求处理的灵活控制。 ### 1. Struts2 概述 Struts2是Apache软件基金会的开源项目,它是基于Servlet和...