• Struts2 拦截器


    拦截器======
    1.值栈 ValueStack 本质上是内存上的一块空间
    用code去获取值栈
    ValueStack vs=ActionContext.getContext().getValueStack();
    内存结构vs:
    ValueStack:
    内容一: 单列集合 extends ArrayList

    <s:debug> 放到值栈上方

    内容二:双列Map集合 context implements Map
    <s:debug> 放到值栈下方
    2.OGNL Object Graph Navigation Language
    对象导航图语言
    典型的用法,a.b.c info.address.street

    3.一个struts2标签
    <s:iterator >
    <s:property></s:propery>
    </s:iterrator>

    <s:date name="mydate" format="yyyy-MM-dd"></s:date>

    1.拦截器(Interceptor)
    解析:Struts2体系架构的核心
    发出请求---->能匹配到拦截规则的请求会被
    拦截器拦截,拦截

    拦截器栈(InterceptorStack)

    1.Struts执行流程
    2.1 web.xml中 StrutsPrepareAndExecuteFilter类 核心控制器

    2.2 找到doFilter方法
    体现出一种设计模式
    解释了Struts2中 request 并不是HttpServletRequest
    request = prepare.wrap(包装)Request(request);

    ***:ActionMapping mapping = prepare.findActionMapping(request, response, true);

    findActionMapping方法:
    public ActionMapping findActionMapping() {
    //先看内存中有没有映射结果!
    ActionMapping mapping = (ActionMapping) request.getAttribute(STRUTS_ACTION_MAPPING_KEY);

    //没有,找到ActionMapper构建
    if (mapping == null || forceLookup) {

    mapping = dispatcher.getContainer().getInstance(ActionMapper.class).
    }

    return mapping;
    }

    2.3 上面代码已经保证mapping不是null
    if (mapping == null) {

    } else {
    //code execute
    execute.executeAction(request, response, mapping);
    }

    executeAction方法原型如下:
    public void executeAction() throws ServletException {
    dispatcher.serviceAction(request, response, mapping);
    }

    *serviceAction原型
    public void serviceAction(){

    ActionProxy proxy = getContainer().getInstance(ActionProxyFactory.class).createActionProxy(
    namespace, name, method, extraContext, true, false);

    }

    *:寻找ActionInvocation

    if (mapping.getResult() != null) {
    Result result = mapping.getResult();
    result.execute(proxy.getInvocation():返回值类型是ActionInvocation);
    } else {
    proxy.execute();
    }

    2018年2月28日08:35:24
    1.拦截器:底层是动态代理实现的。主要作用是在方法执行前后,插入通用业务(日志和事务);
    logback
    2.自定义拦截器

    1.定义一个拦截器类 implements Interceptor{

    public String intercept(ActionInvocation invocation){
    获取到一个Action
    Action action= invocation.getAction();

    //获取到session
    Map<String,Object> session=ActionContext.getContext().getSession();
    Object name=ssssion.get("uname");

    //获取ActionName
    String actionName=ActionContext.getProxy().getActionName();
    String value;
    if(actionName.equals("loginAction")){
    value=invocation.invoke();
    }else if(name!=null){
    value=invocation.invoke();
    }else{
    value="login";
    }
    }

    }

    2.UI 页面 伪造 login.jsp success.jsp


    3.Action开发
    LoginAction implemtns Action{
    UserInfo user;
    public String execute(){

    if(成立){
    return SUCCESS;
    }

    }

    }


    4.针对拦截器xml配置
    我们要配置到整体的Struts.xml中

    5.观察执行效果 /分析原理

     1、客户端向Servlet容器(如Tomcat)提交一个请求
    2、请求经过一系列过滤器(如ActionContextCleanUp过滤器等)
    3、核心控制器被调用,询问ActionMapper来决定请求是否需要调用某个Action
    4、如果ActionMapper决定需要调用某个Action,核心控制器把控制权委派给ActionProxy (备注:JSP请求无需调用Action)
    5、ActionProxy通过Configuration Manager询问框架的配置文件(struts.xml),找到需调用的Action类
    6、ActionProxy创建一个ActionInvocation的实例
    7、 ActionInvocation负责调用Action,在此之前会依次调用所有配置的拦截器
    8、Action执行完毕,ActionInvocation负责根据结果码字符串在struts.xml的配置中找到对应的返回结果
    9、拦截器被再次执行
    10、过滤器被再次执行
  • 相关阅读:
    【图】max51开发板(手工焊接)
    【图】max51开发板3D效果图
    【图】AT89S52原理页
    频率 时间 单位转换
    [AD 技巧]Altium Designer元件换层
    Windows 的承载网络设置方法
    Windows 定时自动开/关机
    Windows 操作系统快捷键
    转义符 与 转义字符
    keil 中的快捷键
  • 原文地址:https://www.cnblogs.com/ztca/p/8483985.html
Copyright © 2020-2023  润新知