一。Struts2拦截器简介
拦截器(Interceptor)是Struts2的核心组成部分,很多的功能都是构建在拦截器基础之上的,例如数据校验,上传和下载,国际化,转换器等。在Struts 2文档中对拦截器的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制,使开发者可以定义一个特定的功能模块,这个模块可以在Action执行之前或者之后运行,也可以在一个Action执行之前阻止Action执行。同时也提供了一种可以提取Action中可重用的部分的方式。
下面的这个图是官方文档上的示意图:
Struts2的拦截器处理机制来源于WebWork,这个拦截器的处理机制是按照AOP来进行设计的。AOP是对OOP的一个完善和补充,是软件技术和设计思想发展到一定阶段的产物!
Struts2 架构的Action被一个或者多个拦截器,或者一个拦截器栈,用户请求会被拦截器所拦截。
二。拦截器实例
第一个拦截器:
- <?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="first" extends="struts-default" namespace="">
- <interceptors>
- <interceptor name="Myinterceptor" class="com.yaxing.interceptor.Myinterceptor"></interceptor>
- <interceptor name="Myinterceptor" class="com.yaxing.interceptor.Myinterceptor"></interceptor>
- </interceptors>
- <action name="Reg" class="com.yaxing.interceptor.Reg" method="execute">
- <result name="success">/Success.jsp</result>
- <result name="input">/Reg.jsp</result>
- <interceptor-ref name="defaultStack"></interceptor-ref> <!--这个拦截器是默认的拦截器,在struts-default里面的定义 -->
- <interceptor-ref name="Myinterceptor"></interceptor-ref>
- </action>
- </package>
- </struts>
①拦截器类MyInterceptor(自定义拦截器)
- package com.yaxing.interceptor;
- import com.opensymphony.xwork2.ActionInvocation;
- import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
- public class Myinterceptor extends AbstractInterceptor {
- @Override
- public String intercept(ActionInvocation arg0) throws Exception {
- // TODO Auto-generated method stub
- Reg reg =(Reg)arg0.getAction();
- System.out.println("拦截器信息:First拦截器!");
- String result=arg0.invoke();
- System.out.println("拦截器信息:Action执行完毕!");
- return result;
- }
- }
②业务控制Action Reg类
- package com.yaxing.interceptor;
- import java.util.Date;
- import com.opensymphony.xwork2.ActionSupport;
- public class Reg extends ActionSupport {
- private String username;
- private String mymsg;
- private String password1; //用户密码
- private String password2; //确认密码
- private Date birthday;
- 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;
- }
- public String execute() throws Exception{
- if(username!=null&&getPassword1().equals(getPassword2())&&!getUsername().trim().equals("")){
- System.out.println("Action信息:正在执行Action......");
- return SUCCESS;
- }else {
- return INPUT;
- }
- }
- }
③注册页面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
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <%@ taglib prefix="s" uri="/struts-tags" %>
- <%@ taglib uri="/struts-dojo-tags" prefix="sx"%>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>My JSP 'reg.jsp' starting page</title>
- <s:head/>
- <sx:head/>
- </head>
- <body>
- <s:form action="Reg">
- <s:textfield name="username" label="用户名"></s:textfield>
- <s:password name="password1" label="密码"></s:password>
- <s:password name="password2" label="确认密码"></s:password>
- <sx:datetimepicker name="birthday" label="生日:" displayFormat="yyyy-MM-dd"></sx:datetimepicker>
- <s:submit value="注册"/>
- </s:form>
- </body>
- </html>
④Success.jsp
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <%@ taglib uri="/struts-tags" prefix="s" %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>注册成功</title>
- <meta http-equiv="pragma" content="no-cache">
- <meta http-equiv="cache-control" content="no-cache">
- <meta http-equiv="expires" content="0">
- <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
- <meta http-equiv="description" content="This is my page">
- <!--
- <link rel="stylesheet" type="text/css" href="styles.css">
- -->
- </head>
- <body>
- 欢迎<s:property value="username"/>,注册成功! <BR>
- 密码: <s:property value="password1"/> <BR>
- 生日:<s:property value="birthday"/> <BR>
- </body>
- </html>
Reg.jsp 输入之后 点击注册。
控制台的输出信息。通过本实例,可以基本的了解了下拦截器的使用。
Good Luck Enjoy it!
本文转自 w156445045 51CTO博客,原文链接:http://blog.51cto.com/enetq/542475,如需转载请自行联系原作者