Struts2配置拦截器,struts2加载常量时的搜索顺序

1:struts2加载常量时的搜索顺序

  1.Struts-default.xml

  2.Struts-plugin.xml

  3.Struts.xml

  4.Struts-properties(自己创建的)

  5.web.xml

如果在多个文件中配置了同一个常量,则后一个文件中配置的常量值会覆盖前面的文件配置的常量值

2:Struts2拦截器配置

  1.在Struts.xml中配置一个默认请求的action

<!-- 没有找到action时默认执行的action -->
        <default-action-ref name="defaultAction"></default-action-ref>
        <!-- 默认action -->
        <action name="defaultAction">
            <result>default.jsp</result>
        </action>

  2.在Struts.xml中添加interceptor

    <interceptors>
            <!-- 自定义拦截器 ,逻辑名指向创建的拦截器实体类 -->
            <interceptor name="myInterceptor"
                class="cn.cnsdhzzl.intercptors.LoginInterceptor"></interceptor>
            <!-- 引用struts默认拦截器和自定义拦截器,并放入一个值栈中方便引用,并且当引用到mic时,不需再指定默认default-interceptor,引用mic时默认初始化stack中所有引用 -->
            <interceptor-stack name="mic">
                <!-- 引用struts默认拦截器 到mic -->
                <interceptor-ref name="defaultStack"></interceptor-ref>
                <!-- 引用struts默认拦截器 到mic -->
                <interceptor-ref name="myInterceptor"></interceptor-ref>
            </interceptor-stack>
        </interceptors>

3.创建自己的interceptor类

public class LoginInterceptor implements Interceptor {

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        // 拦截操作
        System.out.println("对象:" + invocation);
        // 返回action逻辑视图名
        Object action = invocation.getAction();
        //
        System.out.println("++++++++++++++" + action + "***********");
        //
        String value;
        //
        Map<String, Object> session = ActionContext.getContext().getSession();
        Object object = session.get("name");
        String actionName = invocation.getProxy().getActionName();
        //
        invocation.getProxy().getNamespace();
        //
        System.out.println(actionName);
        if (actionName.equals("loginAction")) {
            value = invocation.invoke();
        } else if (action != null) {
            value = invocation.invoke();
            String method = invocation.getProxy().getMethod();
            System.out.println("方法:" + method);
        } else {
            value = "login";
        }
        return value;
    }
//省略init方法和destroy方法
}

注:先走拦截器,后走default-action

最后奉上Struts执行流程图,清笑纳

当接收到一个httprequest , 
a) 当外部的httpservletrequest到来时 
b) 初始到了servlet容器 传递给一个标准的过滤器链 
c) FilterDispatecher会去查找相应的ActionMapper,如果找到了相应的ActionMapper它将会将控制权限交给ActionProxy 
d) ActionProxy将会通过ConfigurationManager来查找配置struts.xml 
       i. 下一步将会 通过ActionInvocation来负责命令模式的实现(包括调用一些拦截Interceptor框架在调用action之前) 
       ii. Interceptor做一些拦截或者初始的工作 
e) 一旦action返回,会查找相应的Result 
f) Result类型可以是 jsp或者freeMark 等 
g) 这些组件和ActionMapper一起返回给请求的url(注意拦截器的执行顺序) 
h) 响应的返回是通过我们在web.xml中配置的过滤器 
i) 如果ActionContextCleanUp是当前使用的,则FilterDispatecher将不会清理sreadlocal ActionContext;如果ActionContextCleanUp不使用,则将会去清理sreadlocals。

时间: 2024-08-03 07:10:15

Struts2配置拦截器,struts2加载常量时的搜索顺序的相关文章

高性能网站优化-确保异步加载脚本时保持执行顺序

<高性能网站建设进阶指南> 脚本如果按照常规方式加载,不仅会阻塞页面中其他内容的下载,还会阻塞脚本后面所有元素的渲染.异步加载脚本可以避免这种阻塞现象,从而提高页面加载速度.但是性能的提升是要付出代价的.代码的异步执行可能会出现竞争状态.简单地说就是页面内部的脚本需要的标示符如果是在外部文件中定义的,而当外部文件异步加载的时候,如果没有保证外部文件和内部脚本执行顺序,很有可能会出现未定义标示符的错误 当异步加载的外部脚本与行内脚本之间存在代码依赖时,就需要通过一种保证执行顺序的方法来整合这两个

ClassLoader加载资源时的搜索路径

先来个例子: /** * 测试classloader加载路径在哪里<p> * main3 */ public static void main3(String[] args) { Properties props = new Properties(); //在src中的dyan/sendhttp包路径下 // InputStream is = TestSendHttp.class.getClassLoader().getResourceAsStream("dyan/sendhttp/

Struts2配置拦截器自定义栈时抛异常:Unable to load configuration. - interceptor-ref - file:/D:/tomcat_install/webapps/crm/WEB-INF/classes/struts.xml

代码如下: <interceptors>  <!-- 注册自定义拦截器 -->   <interceptor name="LoginInterceptor" class="com.hncj.crm.staff.web.action.LoginInterceptor"></interceptor>   <!--自定义栈  -->   <interceptor-stack name="crmSt

利用axios的request 拦截器,response 拦截器实现加载层的效果

import Vue from 'vue' import router from '../router' import axios from 'axios' import { Indicator } from 'mint-ui'; import { Toast } from 'mint-ui'; axios.defaults.timeout = 30000; axios.defaults.headers.common['Content-Type'] = 'application/json;cha

调查管理系统 -(6)自定义Struts2的拦截器&amp;自定义UserAware接口&amp;Action中模型赋值问题&amp;Hibernate懒加载问题

1.对于一些功能,如我的调查或新建调查等,只有用户登录后才能进行操作,因此必须对用户是否登录进行判断.当用户登录后才能使用相应的功能,如果没有登录则需为用户导航到登录页面让其进行登录.这个功能可以通过自定义Struts2的拦截器来完成. 2.当用户登录之后,由于是将用户的信息保存在session中的.这样当一些Action中需要用到当前登录的用户的信息时需要手动的从session中获取,不太方便,因此我们声明了一个UserAware接口(即用户关注,类似于Struts2中的SessionAwar

Struts2中拦截器的配置

在struts.xml文件中定义拦截器只需要给拦截器类指定一个拦截器名,这就完成了定义.拦截器使用<interceptor>标记来定义,格式如下 <interceptor name="拦截器名" class="拦截器类"></interceptor> 大部分情况下,如果有一个拦截器这样配置就够了.如果有多个拦截器,则需要写多个<interceptor>,而<interceptor>是写在<interc

struts2中拦截器的简介与配置使用

拦截器是struts2框架的核心,struts2很多的功能都是构建在拦截器基础之上的,它是动态拦截Action调用的对象,提供了一种机制,使得开发者能够在一个Action前后执行需要的代码,可以在一个Action执行前组织他的执行,也能在Action执行后做一些相应的工作.同时他也提供了一种可以提取Action中可重用部分的方式. 拦截器 struts2拦截器是在访问某个Action或它的某个方法 .字段之前或之后实施拦截,struts2拦截器是可插拔的,是AOP的一种实现(AOP是OOP(Ob

Struts2自定义拦截器Interceptor以及拦截器登录实例

1.在Struts2自定义拦截器有三种方式: -->实现Interceptor接口 public class QLInterceptorAction implements Interceptor{ private static final long serialVersionUID = 1L; public void destroy() { } public void init() {} public String intercept(ActionInvocation arg0) throws

Struts2之拦截器原理分析及使用-上

一.学习案例:通过在loginUI.jsp页面填写表单提交成功跳转到结果页面,查看控制台输出,初步了解拦截器工作流程. 二.案例分析: a)创建拦截器(MyInterceptor.java)实现Interceptor接口. 创建成功后,会实现三个方法:init(),destroy(),intercept(). 我们主要是使用intercept()方法,在此实现功能. init()会在服务器启动struts.xml加载时进行自动调用. destroy()会在服务器重启时调用. b)在struts.