• 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。

  • 相关阅读:
    flask 文件上传(单文件上传、多文件上传)--
    flask 自定义验证器(行内验证器、全局验证器) --
    flask 使用宏渲染表单(包含错误信息) --
    flask 在模板中渲染错误消息 --
    flask 在视图函数中验证表单 --
    flask 处理表单数据 --
    flask 在模板中渲染表单 --
    flask 使用Flask-WTF处理表单 --
    flask 表单
    iPad适合写作吗
  • 原文地址:https://www.cnblogs.com/cnsdhzzl/p/5840415.html
Copyright © 2020-2023  润新知