拦截器Interceptor
1.拦截器的概述:
拦截器是AOP的一种实现策略
2.struts2拦截器的原理:
AOP(动态代理),责任模式(拦截器链)
3.struts2拦截器,springmvc拦截器,过滤器的区别:
* struts2拦截器:在Action对象创建后,方法调用前执行,只能对Action类中的方法进行增强
* springmvc拦截器:在Controller对象创建后,方法调用前执行,只能对Controller类的方法进行增强
* filter过滤器:过滤器是web引用的三大组件之一,任何web项目都能使用,而且配置"/*"后,可以对任何请求进行过滤
4.struts2拦截器配置文件:
struts2-core-2.3.24.jar!\struts-default.xml
自定义拦截器
1.struts2自定义拦截器
(1)自定义一个类继承MethodFilterInterceptor抽象类
public class LoginInterceptor extends MethodFilterInterceptor {
@Override
protected String doIntercept(ActionInvocation actionInvocation) throws Exception {
Object user = ServletActionContext.getRequest().getSession().getAttribute("user");
if (user != null) {
return actionInvocation.invoke();
}
return "login";
}
}
(2)关联拦截器与Action类,配置struts.xml
<package name="demo" extends="struts-default" namespace="/">
<interceptors>
<!--配置自定义拦截器对象-->
<interceptor name="loginIntercept" class="com.baidu.intercept.LoginInterceptor">
</interceptor>
</interceptors>
<action name="customer_*" class="com.baidu.action.CustomerAction" method="{1}">
<!--引入自定义拦截器对象,
配置自定义拦截器对象后会导致默认拦截器失效,因此再引入默认拦截器-->
<interceptor-ref name="loginIntercept">
<!--放行登录请求,param标签内指定需要放行的方法的方法名,
如果多个方法,用","隔开-->
<param name="excludeMethods">login</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
<result name="loginSuccess">/loginSuccess.jsp</result>
</action>
</package>
2.springmvc自定义拦截器
(1)自定义一个类实现HandlerInterceptor接口
public class MyInterceptor implements HandlerInterceptor{
preHandle();
postHandle();
afterCompletion();
}
执行顺序:preHandle()-->controllerMethod()-->postHandle()-->jspMethod()-->afterCompletion()
(2)在springmvc.xml中配置拦截器
<mvc:interceptors>
<mvc:interceptor>
<!--配置拦截的范围-->
<mvc:mapping path="/**"></mvc:mapping>
<!--将自定义的拦截器对象交给springmvc容器来管理-->
<bean id="myInterceptor" class="com.baidu.interceptor.MyInterceptor">
</bean>
</mvc:interceptor>
</mvc:interceptors>
struts2表单标签
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- form标签,表单标签的action属性不能使用${pageContext.request.contextPath},
直接写Action访问路径即可 -->
<s:form action="customer_add.action" method="post">
<!-- 普通输入项 -->
<s:textfield name="username" label="用户名"></s:textfield>
<!-- 密码输入项 -->
<s:password name="password" label="密码"></s:password>
<!-- 单选输入项
第一种情况: value值和显示值一样的,构建list集合
第二种情况: value值和显示值不一样的,构建map集合,提交上去的值是Map的key
-->
<s:radio list="{'男','女'}" name="sex" label="性别"></s:radio>
<s:radio list="#{'male':'男','female':'女' }" name="gender" label="性别"></s:radio>
<!-- 复选输入项 -->
<s:checkboxlist list="{'吃饭','睡觉','购物'}" name="love" label="爱好"></s:checkboxlist>
<!-- 下拉输入框 -->
<s:select list="{'幼儿园','博士后','教授'}" name="college" label="学历"></s:select>
<!-- 隐藏输入项 -->
<s:hidden name="hid" value="abcd"></s:hidden>
<!-- 文件上传项 -->
<s:file name="file" label="选择文件"></s:file>
<!-- 文本域 -->
<s:textarea rows="3" cols="10" label="简历" name="resume"></s:textarea>
<!-- 提交按钮 -->
<s:submit value="提交"></s:submit>
<!-- 重置按钮 -->
<s:reset value="重置"></s:reset>
</s:form>
</body>
</html>