发表文章

[最新] struts2_day07_拦截器

qq35537301 2月前 1

版权声明:本文为博主原创文章,未经博主允许不得转载。 http://blog.csdn.net/qq_35537301/article/details/82179269

拦截器

概述

  • 拦截器是Struts2Action访问的拦截
  • 拦截器是Struts2的执行的核心
  • 过滤器是从客户端向服务器发送的请求的拦截

拦截器的执行流程

 

拦截器的执行时机

在访问struts2核心内部时,在动作方法执行之前先正序执行,然后执行动作方法,执行完动作方法和结果视图之后,再倒序执行。所以它是先进后出,是个栈的结构

自定义拦截器

1.编写拦截器类

编写拦截器的类实现Interceptor接口,继承AbstractInterceptor,或者继承MethodFilterInterceptor

package com.itheima.interceptor;

import org.apache.struts2.ServletActionContext;

import com.itheima.domain.User;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;

/**
 * @ClassName: PrivilegeInterceptor
 * @Description:自定义拦截器类
 * @author jsz
 * @date 2018年8月29日
 */
public class PrivilegeInterceptor extends MethodFilterInterceptor {

	@Override
	protected String doIntercept(ActionInvocation invocation) throws Exception {

		// 从session域对象中获取user对象
		User user = (User) ServletActionContext.getRequest().getSession().getAttribute("user");

		// 判断用户是否登陆
		if (user == null) {
			return "login";
		}
		return invocation.invoke();// action动作方法的返回值
	}

}

2.配置拦截器

在struts.xml文件中配置

  • 配置拦截器
<!-- 自定义拦截器配置 -->
<interceptors>
    <interceptor name="privilegeInterceptor" class="com.itheima.interceptor.PrivilegeInterceptor"/>
</interceptors>
<!-- 引用自定义拦截器 -->
<interceptor-ref name="privilegeInterceptor"/>
<!-- 一旦引用了自定义拦截器,默认拦截器就不执行了。 需要将默认拦截器引入进来。-->
<interceptor-ref name="defaultStack"/>

  • 配置拦截器栈

注解

使用注解开发的时候,包名需要有action,否则报404

常用注解

@NameSpace

出现位置:

出现在动作类上

作用

指定当前Action中所有动作方法的名称空间

属性

value指定名称空间的名称,写法和xml配置时一致,不指定的话,默认名称空间是""

@ParentPackage

位置

出现在类上

作用

指定当前动作类所在包的父包,由于我们已经是在类中配置了,所以无需在指定包名了。

属性

value:指定父包的名称

@Action

位置

出现在方法上

作用

指定当前动作方法的动作名称。此时action注解就是xml配置中的name属性。

属性

value指定动作名称。即与请求路径对应

results[]它是一个数组,数据类型是注解(@Result注解),用于指定结果视图。

此属性可以没有,当没有该属性时,表示不返回任何结果视图。即使用response输出响应正文

interceptorRefs[]它是一个数组,数据类型是注解(@InterceptorRef注解)。用于指定引用的拦截器

@Result

位置

它可以出现在动作类上,也可以出现在Action注解中

作用

出现在类上,表示当前动作类中的所有动作方法都可以用此视图

出现在Action注解中,表示当前Action可用此视图

属性

name指定逻辑结果视图名称

type指定前往视图的方式。例如:请求转发,重定向,重定向到另外的动作

location:指定前往的地址。可以是一个页面,也可以是一个动作类路径

@Results

位置

它可以出现在动作类上,也可以出现在Action注解中。

作用

用于配置多个结果视图。

属性

value:它是一个数组,数据类型是result注解

@InterceptorRef

位置

可以作用在类上,方法上和注解上

作用

用于配置要引用的拦截器或者拦截器栈

属性

value用于指定拦截器或者拦截器栈

入门案例

jar包

注解的jar包:struts2-convention-plugin-2.3.24.jar

package com.itheima.web.action;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;

import com.opensymphony.xwork2.ActionSupport;

@ParentPackage("struts-default") // 继承父包:extends="struts-default"
@Namespace("/") // 配置包访问路径 namespace="/"
@Results(@Result(name = "error", type = "dispatcher", location = "/error.jsp"))
public class Demo01Action extends ActionSupport {

	@Action(value = "demo1", // value属性:访问路径(name="demo1")
			results = { @Result(name = "success",type="dispatcher", location = "/success.jsp") }) // value表示:访问路径(name="demo1")
	public String login() {

		System.out.println("login....");

		return "success";
	}
}

拦截器注解配置总结

说明

拦截器只能引用,不能创建,struts.xml文件不能删除

1.在类上写@InterceptorRef("拦截器/拦截器栈")

2.在方法上写拦截器

3.在struts.xml文件中配置默认拦截器,类中和方法上不需要写拦截器

相关推荐
最新评论 (0)
返回
发表文章
qq35537301
文章数
39
评论数
0
注册排名
1142769