Struts2的核心今天都讲完啦,今天给大家讲最后一个重点 ———— 拦截器
拦截器是动态拦截Action调用的对象。它提供了一种机制,使开发者可以定义一段代码,在Action执行之前或之后被调用执行,也可以在一个Action执行前阻止其执行,同时也可以提取Action中可重用部分的方式。通俗一点说,拦截器是一个实现了一定功能的类,它以一种可插拔的方式被定 义在某个Action执行的之前或之后,用来完成特定的功能。
默认拦截器原理:运用了aop思想和责任链设计模式
1.aop是一种面向切面编程,在不修改源代码情况下来扩展功能。
责任链模式简单的来说就是执行多个拦截器,一个一个的进行执行,在执行完后进入下一个拦截器之前,前一个的拦截器会做类似于放行的操作。
拦截器又分为系统拦截器和自定义拦截器两种,现在写来说系统拦截器
首先要先来个jsp页面,我还是写一个简单的登录注册
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <%@taglib uri="/struts-tags" prefix="s"%> 4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 5 <html> 6 <head> 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 8 <title>Insert title here</title> 9 </head> 10 <body> 11 <s:form action="token.action" method="post"> 12 <s:token></s:token> 13 <s:textfield name="name"></s:textfield> 14 <s:password name="pwd"></s:password> 15 <s:submit value="提交"></s:submit> 16 </s:form> 17 </body> 18 </html>
这里需要导入struts2的标签库<%@ taglib uri="/struts-tags" prefix="s"%>
然后还是跟昨天一样创建一个类并且继承ActionSupport,在用request来获取表单提交的数据,具体如下
1 package com.action; 2 3 import javax.servlet.http.HttpServletRequest; 4 5 import org.apache.struts2.ServletActionContext; 6 7 import com.opensymphony.xwork2.ActionSupport; 8 9 public class TokenAction extends ActionSupport { 10 11 @Override 12 public String execute() throws Exception { 13 HttpServletRequest request = ServletActionContext.getRequest(); 14 String name = request.getParameter("name"); 15 String pwd = request.getParameter("pwd"); 16 System.out.println(name + "----" + pwd); 17 return SUCCESS; 18 } 19 20 }
当jsp跟action都做好之后就需要在XML里面配置一些东西了,
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 4 "http://struts.apache.org/dtds/struts-2.3.dtd"> 5 6 <struts> 7 <package name="mypackage" extends="struts-default"> 8 <action name="login*" class="com.action.LoginAction" method="{1}"> 9 <result name="success">/index.jsp</result> 10 </action> 11 </package> 12 13 14 <!-- 系统拦截器 --> 15 <package name="mytoken" extends="struts-default"> 16 <action name="token" class="com.action.TokenAction"> 17 <!-- 配置令牌 --> 18 <interceptor-ref name="token"></interceptor-ref> 19 <!-- 应用默认拦截器 --> 20 <interceptor-ref name="defaultStack"></interceptor-ref> 21 <result name="success">/success.jsp</result> 22 <result name="invalid.token">/error.jsp</result> 23 </action> 24 </package> 25 26 27 </struts>
action标签中添加拦截器
<interceptor-ref name="token" /> name=action的name
反复提交后跳转的错误的位置:
<result name="invalid.token">/error.jsp</result>
<interceptor-ref name="defaultStack" />
如果你觉得这样系统拦截器就做完了的话,那你就错了,如果是jsp的页面的话你一测试就会报错,因为它无法找到jsp就会报错,所以呢我们还需要去webxml里面去配置一个<filter-mapping>
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app id="WebApp_ID" version="2.4" 3 xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 5 <display-name>struts2</display-name> 6 <welcome-file-list> 7 <welcome-file>index.html</welcome-file> 8 <welcome-file>index.htm</welcome-file> 9 <welcome-file>index.jsp</welcome-file> 10 <welcome-file>default.html</welcome-file> 11 <welcome-file>default.htm</welcome-file> 12 <welcome-file>default.jsp</welcome-file> 13 </welcome-file-list> 14 15 <filter> 16 <filter-name>struts2</filter-name> 17 <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> 18 </filter> 19 20 <filter-mapping> 21 <filter-name>struts2</filter-name> 22 <url-pattern>*.action</url-pattern> 23 </filter-mapping> 24 25 26 <filter-mapping> 27 <filter-name>struts2</filter-name> 28 <url-pattern>*.jsp</url-pattern> 29 </filter-mapping> 30 31 32 </web-app>
到目前为止,系统拦截器才算是做完。
现在开始来说自定义拦截器
自定义拦截器例子:
简单的登录的例子,在action中登录成功写入信息到session中,在自定义的拦截器中来判断session值是不是为空,如果为空需要跳转到登录的界面中
步骤如下:
1.创建类继承MethodFilterInterceptor类
2 重写MethodFilterInterceptor类里面拦截器的方法 重写doIntercept 方法 放行:actionInvocation.invoke();
3 配置action和自定义拦截器直接的关系(注册拦截器)
4 过滤不拦截的方法
这里我就不重复说明了,结合系统拦截器接着说,首先我们需要再来个类
1 package com.action; 2 3 import javax.servlet.http.HttpServletRequest; 4 import javax.servlet.http.HttpSession; 5 6 import org.apache.struts2.ServletActionContext; 7 8 import com.opensymphony.xwork2.ActionSupport; 9 import com.sun.net.httpserver.Authenticator.Success; 10 11 public class LoginACtionMyInterceptor extends ActionSupport { 12 13 public String login() { 14 HttpServletRequest request = ServletActionContext.getRequest(); 15 String name = request.getParameter("name"); 16 String pwd = request.getParameter("pwd"); 17 HttpSession session = request.getSession(); 18 if ("admin".equalsIgnoreCase(name) && "123456".equals(pwd)) { 19 session.setAttribute("login",name); 20 return SUCCESS; 21 } else { 22 return LOGIN; 23 } 24 25 } 26 27 }
在来个创建类继承MethodFilterInterceptor的类
1 package com.Interceptor; 2 3 import javax.servlet.http.HttpServletRequest; 4 5 import org.apache.struts2.ServletActionContext; 6 7 import com.opensymphony.xwork2.Action; 8 import com.opensymphony.xwork2.ActionInvocation; 9 import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor; 10 11 public class MyInterceptor extends MethodFilterInterceptor { 12 13 @Override 14 protected String doIntercept(ActionInvocation actionInvocation) throws Exception { 15 HttpServletRequest request = ServletActionContext.getRequest(); 16 String name = (String) request.getSession().getAttribute("login"); 17 if (name != null) { 18 actionInvocation.invoke(); 19 return Action.SUCCESS; 20 } else { 21 return Action.LOGIN; 22 } 23 24 } 25 26 }
最后在去XMl的里面写配置就OK了,
1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <!DOCTYPE struts PUBLIC 4 "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 5 "http://struts.apache.org/dtds/struts-2.3.dtd"> 6 7 8 <struts> 9 <package name="mypackage" extends="struts-default"> 10 <action name="login*" class="com.action.LoginAction" method="{1}"> 11 <result name="success">/index.jsp</result> 12 </action> 13 </package> 14 15 <!-- 系统拦截器 --> 16 <package name="mytoken" extends="struts-default"> 17 <action name="token" class="com.action.TokenAction"> 18 <!-- 配置令牌 --> 19 <interceptor-ref name="token"></interceptor-ref> 20 <!-- 应用默认拦截器 --> 21 <interceptor-ref name="defaultStack"></interceptor-ref> 22 <result name="success">/succes.jsp</result> 23 <result name="invalid.token">/error.jsp</result> 24 </action> 25 </package> 26 27 28 <!-- 自定义拦截器 --> 29 <package name="mylogin" extends="struts-default"> 30 <interceptors> 31 <interceptor name="MyInterceptor" class="com.Interceptor.MyInterceptor"> 32 <!-- 排除法 --> 33 <param name="excludeMethods">login</param> 34 </interceptor> 35 </interceptors> 36 <action name="adminlogin*" class="com.action.LoginACtionMyInterceptor" 37 method="{1}"> 38 <interceptor-ref name="MyInterceptor"></interceptor-ref> 39 <interceptor-ref name="defaultStack"></interceptor-ref> 40 <result name="success">/success.jsp</result> 41 <result name="login">/interceptor.jsp</result> 42 </action> 43 </package> 44 45 46 47 48 </struts>
最后可能因为本人原因可能有些地方没有讲清楚所以,最后奉上图片一张,
Struts2 的核心就讲完啦,这是小弟刚刚接触到博客园哪里写的不够清楚不够详细,请大家在下方评论,以后会慢慢改正,谢谢大家。