使用structs需要配置文件web.xml

[html] view plain copy
  1. <filter>
  2. <filter-name>struts2</filter-name>
  3. <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  4. </filter>
  5. <filter-mapping>
  6. <filter-name>struts2</filter-name>
  7. <url-pattern>/*</url-pattern>
  8. </filter-mapping>

Class StrutsPrepareAndExecuteFilter

  • java.lang.Object
    • org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
  • All Implemented Interfaces:
    javax.servlet.Filter, StrutsStatics

可以看出structs2是利用的过滤器机制来实现自身。
StrutsPrepareFilter类的主要工作有俩点:
一是为struts2执行做一些相关的准备。如加载相关的配置信息。
二是为struts2的request请求处理相关的信息。如设置编码格式和找到对应的action映射类

feild

[java] view plain copy
  1. protected PrepareOperations prepare;  //包含一个请求在执行前的准备操作
  2. protected ExecuteOperations execute;  //包含过滤器的执行操作
  3. protected List<Pattern> excludedPatterns = null; //指定不经过struts2框架处理的URL规则

methods

[java] view plain copy
  1. protected ExecuteOperations createExecuteOperations(Dispatcher dispatcher)
  2. //创建一个用于初始化dispathcer的新的ExecuteOperations实例
  3. protected InitOperations    createInitOperations()
  4. //创建一个用于初始化dispathcer的新的InitOperations实例
  5. protected PrepareOperations createPrepareOperations(Dispatcher dispatcher)
  6. //创建一个用于初始化dispathcer的新的PrepareOperations实例
  7. void    destroy()
  8. void    doFilter(javax.servlet.ServletRequest req, javax.servlet.ServletResponse res, javax.servlet.FilterChain chain)
  9. void    init(javax.servlet.FilterConfig filterConfig)
  10. protected void  postInit(Dispatcher dispatcher, javax.servlet.FilterConfig filterConfig)
  11. //一个空的方法,用于方法回调初始化

两个主要方法

[java] view plain copy
  1. public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
  2. HttpServletRequest request = (HttpServletRequest) req;
  3. HttpServletResponse response = (HttpServletResponse) res;
  4. try {
  5. String uri = RequestUtils.getUri(request);
  6. if (excludedPatterns != null && prepare.isUrlExcluded(request, excludedPatterns)) {
  7. LOG.trace("Request {} is excluded from handling by Struts, passing request to other filters", uri);
  8. chain.doFilter(request, response);
  9. } else {
  10. LOG.trace("Checking if {} is a static resource", uri);
  11. boolean handled = execute.executeStaticResourceRequest(request, response);
  12. if (!handled) {
  13. LOG.trace("Assuming uri {} as a normal action", uri);
  14. /**************************************************************************************/
  15. prepare.setEncodingAndLocale(request, response);
  16. prepare.createActionContext(request, response);
  17. /*为当前线程创建ActionContext,ActionContext是ThreadLocal的,ActionContext其实就是一个线程安全的HashMap,它内部使用一个HashMap
  18. 来储存相关信息这个map包括的信息有session,request,response,ServletContext,RequestMap,SessionMap等各种信息,可以通
  19. 个这个ActionContext取得各种信息*/
  20. prepare.assignDispatcherToThread();//部署dispatcher到dispatcher线程本地
  21. request = prepare.wrapRequest(request);//包装request
  22. ActionMapping mapping = prepare.findActionMapping(request, response, true);//得到ActionMapping
  23. //(ActionMapping的主要功能就是管理Action的信息和管理Action执行完成以后的ActionForward的信息。)
  24. /***************************************************************************************/
  25. if (mapping == null) {
  26. LOG.trace("Cannot find mapping for {}, passing to other filters", uri);
  27. chain.doFilter(request, response);
  28. } else {
  29. LOG.trace("Found mapping {} for {}", mapping, uri);
  30. execute.executeAction(request, response, mapping);//执行对应的action。
  31. }
  32. }
  33. }
  34. } finally {
  35. prepare.cleanupRequest(request);//一次请求完毕,清空此请求的缓存
  36. }
  37. }

由此见在一个使用Action的request请求传入容器时,会经过StrutsPrepareAndExecuteFilter为其配置ActionContext,包装request,最后找到Action实现类执行。

[java] view plain copy
  1. public void init(FilterConfig filterConfig) throws ServletException {
  2. InitOperations init = createInitOperations();
  3. Dispatcher dispatcher = null;
  4. try {
  5. //封装filterConfig,其中有个主要方法getInitParameterNames将参数名字以String格式存储在List中
  6. FilterHostConfig config = new FilterHostConfig(filterConfig);
  7. // 初始化struts内部日志
  8. init.initLogging(config);
  9. //创建dispatcher ,并初始化,dispatcher类的作用还得详细理解
  10. dispatcher = init.initDispatcher(config);
  11. init.initStaticContentLoader(config, dispatcher);
  12. //初始化类属性:prepare 、execute
  13. prepare = createPrepareOperations(dispatcher);
  14. execute = createExecuteOperations(dispatcher);
  15. this.excludedPatterns = init.buildExcludedPatternsList(dispatcher);
  16. //回调空的postInit方法
  17. postInit(dispatcher, filterConfig);
  18. } finally {
  19. if (dispatcher != null) {
  20. dispatcher.cleanUpAfterInit();
  21. }
  22. init.cleanup();
  23. }
  24. }

创建Dispatcher,会读取 filterConfig 中的配置信息,将配置信息解析出来,封装成为一个Map,然后根绝servlet上下文和参数Map构造Dispatcher :
Dispatcher初始化,加载struts2的相关配置文件,将按照顺序逐一加载:default.properties,struts-default.xml,struts-plugin.xml,struts.xml。。。。

ilterDispatcher是struts2.0.x到2.1.2版本的核心过滤器.!
StrutsPrepareAndExecuteFilter是自2.1.3开始就替代了FilterDispatcher的.!
这样的改革当然是有好处的.!
为什么这么说.? 应该知道如果我们自己定义过滤器的话, 是要放在strtus2的过滤器之前的, 如果放在struts2过滤器之后,你自己的过滤器对action的过滤作用就废了,不会有效!除非你是访问jsp/html!
那我现在有需求, 我必须使用Action的环境,而又想在执行action之前拿filter做一些事, 用FilterDispatcher是做不到的.!
那么StrutsPrepareAndExecuteFilter可以把他拆分成StrutsPrepareFilter和StrutsExecuteFilter,可以在这两个过滤器之间加上我们自己的过滤器.

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

structs2-StrutsPrepareAndExecuteFilter类的理解相关推荐

  1. java类的理解_Java类该怎么理解?

    感觉你对java的各种数据类型可能理解不够吧. 整体了解一下各个数据类型,你的问题就清楚了: java的基础数据类型有: byte.short.int.long.float.double.char.数 ...

  2. VBA 类模块理解和使用总结

    目 录 VBA 类模块理解和使用总结 一.类的概念 二.类的定义 三.类详细定义 关于封装 关于多态 关于异常 关于自定义事件 四.结论: VBA 类模块理解和使用总结 一.类的概念 记得有人总结,V ...

  3. AtomicInteger类的理解与使用

    前言 JDK1.5之后的java.util.concurrent.atomic包里,多了一批原子处理类.AtomicBoolean.AtomicInteger.AtomicLong.AtomicRef ...

  4. Python中type的使用和元类的理解

            "元类就是深度的魔法,99%的用户应该根本不必为此操心.如果你想搞清楚究竟是否需要用到元类,那么你就不需要它.那些实际用到元类的人都非常清楚地知道他们需要做什么,而且根本不需 ...

  5. python 类实例化理解

    让我们以一个Foo类开始: class Foo(object):def __init__(self, x, y=0):self.x = xself.y = y 当你实例化它(即创建该类的一个新的实例) ...

  6. python中的类怎样理解_理解Python数据类:Dataclass fields 的概述(下)

    原标题 Understanding Python Dataclasses?-?Part 2 ,作者为 Shikhar Chauhan . 这是 Python 最新的 Dataclasses 系列的第二 ...

  7. python中的元类_理解python中的元类

    一,理解类也是对象 在python中类同样也是一种对象,只要使用关键字class,Python解释器在执行的时候就会创建一个对象,这个对象(类)自身拥有创建对象(类实例)的能力,这就是为什么他是一个类 ...

  8. python中的类怎样理解_深入理解Python中的元类(metaclass)

    如何理解python当中的元类 把这个提到外面 class __metaclass__(type): " simple custom metaclass to block adding ne ...

  9. pyqtgraph文档笔记(五)总结:几个类的理解( GraphicsView, GraphicsItem ,GraphicsObject, PlotWidget等)

    一.pyqtgraph 与qt pyqtgraph 使用了 qt 的图形视图框架(Graphics View Framework), 但文档并没有说明使用了哪些功能, 经初步探索,pyqtgraph与 ...

最新文章

  1. 简单的python服务器程序
  2. 2019世界机器人大赛圆满落幕,荆州中学等15支队伍获「全能奖」
  3. jquery腾讯微博
  4. 爱思助手安卓能用吗_手机资讯:【爱思助手6.0】音乐铃声导入教程
  5. 数据可视化|实验一 绘图基础语法和常用参数
  6. RPC远程过程调用之 RMI实现
  7. MATLAB 命令 BOXPLOT
  8. CDH Yarn资源动态分配 - 指定资源限制 公平调度具体设置
  9. simulink模块使用记录2-EnabledSubsystem/merge
  10. Java程序员必经的实践之路:Java中高级核心知识全面解析(11)
  11. java 内部类_Java内部类总结
  12. Android 输入手机号码(GET网络请求)查询手机号码归属地
  13. dell 恢复介质_在戴尔计算机上重置或重新安装Windows 10
  14. Day10--路由嵌套+项目前后台搭建
  15. linux 搜索s开头的文件,Linux文件查找/内容搜索命令
  16. 超级无敌diao炸天的手写堆
  17. 线索二叉树的前序遍历
  18. fabric 环境 搭建与安装
  19. C语言求三个数的中间值(三目运算符)
  20. 阿里云mysql端口管理_怎样更改数据库端口号

热门文章

  1. 【论文翻译】Coarse-to-Fine Question Answering for Long Documents 从粗到细的长文章问答
  2. 施乐550服务器fiery显示ff,施乐DC5000AP数码印刷机图文设备彩色激光打印
  3. 树莓派python机器人程序_树莓派打造对话机器人 Python(转)
  4. 微信H5棋牌类及app类推广链接在微信推广中遇到的问题讨论
  5. 天上的星星,除了行星以外,背后可能都有一个“太阳系”!
  6. N阶楼梯上楼问题(递推问题)--C++实现
  7. 人工智能行业要什么学历才能做?要考研吗?
  8. makefile 语法 /usr/bin/ld: cannot find -lxxxx
  9. Josephus again HDOJ3089
  10. 蜘蛛纸牌 java代码_java实现蜘蛛纸牌游戏