zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    linux下shell显示-bash-4.1#不显示路径解决方法
    node 封装db层
    json结构更改的方法 把date有数据的分类
    webpack.config.js
    SQLSERVER 跨服 跨库
    sqlserver2005重新安装(安装汇编错误,安装程序无法连接到数据库服务进行服务配置)
    delete语句与reference约束 FK_subplan_job_id冲突问题,导致job无法删除解决办法
    删除作业计划出错(DELETE语句与 REFERENCE约束"FK_subplan_job_id"冲突。)
    jquery判断checked的三种方法
    SQLSERVER和sybase的差异
  • 原文地址:https://www.cnblogs.com/cnsdhzzl/p/5840415.html
Copyright © 2011-2022 走看看