您的位置:首页 > 编程语言 > Java开发

Struts2框架学习5Day_Struts拦截器机制

2020-03-30 19:10 1086 查看

交易过程的本质是基于双方信息不对称,以及满足相互需求而产生的,基于以上,我在闲鱼上卖出了我的第一个商品Kindle499 ——2020.03.16

Struts拦截器机制(重点)

首先,什么是struts2的拦截器?
拦截器就是一个类,它能够拦截Action的请求,并进行预处理。Struts2 拦截器在访问某个Action 方法之前或之后实施拦截,(在action 之前调用的称之为前置拦截器,之后也称之为后置拦截器)。
Struts2拦截器简单实现,就是实现Interceptor接口,重写intercept():

public class MyInterceptor implements Interceptor{
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void init() {
// TODO Auto-generated method stub
}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("begin method");
//调用Action中的execute方法,返回执行execute方法的字符串
String result = invocation.invoke();
System.out.println(result);
System.out.println("after method");
return result;
}
}

使用自定义的拦截器,这种配置方式,会把默认的拦截器去掉,只留自定义的拦截器
Struts.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="default" extends="struts-default" namespace="/">
<!-- 注册自定义的拦截器 -->
<interceptors>
<interceptor name="myCeptor" class="com.igeek.action_01.MyInterceptor"></interceptor>
</interceptors>

<action name="myAction" class="com.igeek.action_01.MyAction">
<interceptor-ref name="myCeptor"></interceptor-ref>
</action>
</package>
</struts>

Struts基本原理:务必理解

无关紧要的点:struts2 的2.1.6这个版本以前,核心控制器FilterDispatcher,从2.1.6 开始,使用是StrutsPrepareAndExecuteFilter。
拦截器的接口
1、程序中每个拦截器都必须实现Interceptor 接口
2、开发人员也可以继承AbstractInterceptor 只需要覆盖intercept 方法
3、开发人员也可以继承MethodFilterInterceptor ,只需要覆盖doIntercept 方法、excludeMethods 放行的方法(不去拦截的方法)、includeMethods 包含的方法(拦截的方法)
Strutsn内置拦截器

举几个常见并至少掌握的例子:
Exception : 异常处理机制拦截器
i18n : 处理国际化问题
modelDriven : 将请求参数,封装model对象(Action 实现ModelDriven接口)
fileUpload :文件上传
params : 请求参数转换封装
conversionError : 将类型转换异常进行处理
validation : 请求参数校验
workflow : 判断 fieldError 是否存在,如果存在,自动跳转input视图
自定义拦截器实现
省略model和前端代码,只粘贴最核心的东西,实现一个登录和检测是否登录后的添加动作

public class UserAction extends ActionSupport implements ModelDriven<User>{
private User user = new User();
@Override
public User getModel() {
return user;
}
public String login() throws Exception {
//用户名为admin,密码为123456
if(user.getUsername().equals("admin") && user.getPwd().equals("123456")){
//把用户信息放入session
ServletActionContext.getRequest().getSession().setAttribute("user", user);
return SUCCESS;
}else{
addFieldError("user_error", "用户名或密码不正确");
return INPUT;
}
}
}
public class MyBookInterceptor extends MethodFilterInterceptor{
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
//判断session中是否有用户存在
User user =(User) ServletActionContext.getRequest().getSession().getAttribute("user");
if(user == null){
//未登录
//添加提示信息
ActionSupport action = (ActionSupport) invocation.getAction();
action.addFieldError("login_error", "请登录后再操作");
return "no_login";
}else{
//执行action
return invocation.invoke();
}
}
}

Struts.xml:(重点)

<!-- 配置拦截器 -->
<package name="myInterceptor" extends="struts-default" namespace="/interceptor">
<!-- 注册自定义的拦截器 -->
<interceptors>
<interceptor name="bookCeptor" class="com.igeek.action_01.MyBookInterceptor">
<!-- 登录的方法放行呢?
excludeMethods:放行的方法:
includeMethods:只拦截的方法
-->
<param name="excludeMethods">login</param>
</interceptor>
<!-- 如果要用框架和自定义的拦截器,我们可以定义一个拦截器栈 -->
<interceptor-stack name="myStack">
<interceptor-ref name="bookCeptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>

<!-- 告诉系统使用自定义的拦截器栈 -->
<default-interceptor-ref name="myStack"></default-interceptor-ref>

<!-- 定义一个全局结果集来处理未登录情况 -->
<global-results>
<result name="no_login">/a_interceptor/login.jsp</result>
</global-results>

<!--登录的Action  -->
<action name="user_*" class="com.igeek.action_01.UserAction" method="{1}">
<result>/a_interceptor/addbook.jsp</result>
<result name="input">/a_interceptor/login.jsp</result>
</action>
<!-- BookAction -->
<action name="book_*" class="com.igeek.action_01.BookAction" method="{1}">
<result>/a_interceptor/addbooksuccess.jsp</result>
</action>
</package>
  • 点赞
  • 收藏
  • 分享
  • 文章举报
非职业流浪家 发布了11 篇原创文章 · 获赞 1 · 访问量 229 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: