structs2-StrutsPrepareAndExecuteFilter类的理解
使用structs需要配置文件web.xml
- <filter>
- <filter-name>struts2</filter-name>
- <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>struts2</filter-name>
- <url-pattern>/*</url-pattern>
- </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
- protected PrepareOperations prepare; //包含一个请求在执行前的准备操作
- protected ExecuteOperations execute; //包含过滤器的执行操作
- protected List<Pattern> excludedPatterns = null; //指定不经过struts2框架处理的URL规则
methods
- protected ExecuteOperations createExecuteOperations(Dispatcher dispatcher)
- //创建一个用于初始化dispathcer的新的ExecuteOperations实例
- protected InitOperations createInitOperations()
- //创建一个用于初始化dispathcer的新的InitOperations实例
- protected PrepareOperations createPrepareOperations(Dispatcher dispatcher)
- //创建一个用于初始化dispathcer的新的PrepareOperations实例
- void destroy()
- void doFilter(javax.servlet.ServletRequest req, javax.servlet.ServletResponse res, javax.servlet.FilterChain chain)
- void init(javax.servlet.FilterConfig filterConfig)
- protected void postInit(Dispatcher dispatcher, javax.servlet.FilterConfig filterConfig)
- //一个空的方法,用于方法回调初始化
两个主要方法
- public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
- HttpServletRequest request = (HttpServletRequest) req;
- HttpServletResponse response = (HttpServletResponse) res;
- try {
- String uri = RequestUtils.getUri(request);
- if (excludedPatterns != null && prepare.isUrlExcluded(request, excludedPatterns)) {
- LOG.trace("Request {} is excluded from handling by Struts, passing request to other filters", uri);
- chain.doFilter(request, response);
- } else {
- LOG.trace("Checking if {} is a static resource", uri);
- boolean handled = execute.executeStaticResourceRequest(request, response);
- if (!handled) {
- LOG.trace("Assuming uri {} as a normal action", uri);
- /**************************************************************************************/
- prepare.setEncodingAndLocale(request, response);
- prepare.createActionContext(request, response);
- /*为当前线程创建ActionContext,ActionContext是ThreadLocal的,ActionContext其实就是一个线程安全的HashMap,它内部使用一个HashMap
- 来储存相关信息这个map包括的信息有session,request,response,ServletContext,RequestMap,SessionMap等各种信息,可以通
- 个这个ActionContext取得各种信息*/
- prepare.assignDispatcherToThread();//部署dispatcher到dispatcher线程本地
- request = prepare.wrapRequest(request);//包装request
- ActionMapping mapping = prepare.findActionMapping(request, response, true);//得到ActionMapping
- //(ActionMapping的主要功能就是管理Action的信息和管理Action执行完成以后的ActionForward的信息。)
- /***************************************************************************************/
- if (mapping == null) {
- LOG.trace("Cannot find mapping for {}, passing to other filters", uri);
- chain.doFilter(request, response);
- } else {
- LOG.trace("Found mapping {} for {}", mapping, uri);
- execute.executeAction(request, response, mapping);//执行对应的action。
- }
- }
- }
- } finally {
- prepare.cleanupRequest(request);//一次请求完毕,清空此请求的缓存
- }
- }
由此见在一个使用Action的request请求传入容器时,会经过StrutsPrepareAndExecuteFilter为其配置ActionContext,包装request,最后找到Action实现类执行。
- public void init(FilterConfig filterConfig) throws ServletException {
- InitOperations init = createInitOperations();
- Dispatcher dispatcher = null;
- try {
- //封装filterConfig,其中有个主要方法getInitParameterNames将参数名字以String格式存储在List中
- FilterHostConfig config = new FilterHostConfig(filterConfig);
- // 初始化struts内部日志
- init.initLogging(config);
- //创建dispatcher ,并初始化,dispatcher类的作用还得详细理解
- dispatcher = init.initDispatcher(config);
- init.initStaticContentLoader(config, dispatcher);
- //初始化类属性:prepare 、execute
- prepare = createPrepareOperations(dispatcher);
- execute = createExecuteOperations(dispatcher);
- this.excludedPatterns = init.buildExcludedPatternsList(dispatcher);
- //回调空的postInit方法
- postInit(dispatcher, filterConfig);
- } finally {
- if (dispatcher != null) {
- dispatcher.cleanUpAfterInit();
- }
- init.cleanup();
- }
- }
创建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,可以在这两个过滤器之间加上我们自己的过滤器.
structs2-StrutsPrepareAndExecuteFilter类的理解相关推荐
- java类的理解_Java类该怎么理解?
感觉你对java的各种数据类型可能理解不够吧. 整体了解一下各个数据类型,你的问题就清楚了: java的基础数据类型有: byte.short.int.long.float.double.char.数 ...
- VBA 类模块理解和使用总结
目 录 VBA 类模块理解和使用总结 一.类的概念 二.类的定义 三.类详细定义 关于封装 关于多态 关于异常 关于自定义事件 四.结论: VBA 类模块理解和使用总结 一.类的概念 记得有人总结,V ...
- AtomicInteger类的理解与使用
前言 JDK1.5之后的java.util.concurrent.atomic包里,多了一批原子处理类.AtomicBoolean.AtomicInteger.AtomicLong.AtomicRef ...
- Python中type的使用和元类的理解
"元类就是深度的魔法,99%的用户应该根本不必为此操心.如果你想搞清楚究竟是否需要用到元类,那么你就不需要它.那些实际用到元类的人都非常清楚地知道他们需要做什么,而且根本不需 ...
- python 类实例化理解
让我们以一个Foo类开始: class Foo(object):def __init__(self, x, y=0):self.x = xself.y = y 当你实例化它(即创建该类的一个新的实例) ...
- python中的类怎样理解_理解Python数据类:Dataclass fields 的概述(下)
原标题 Understanding Python Dataclasses?-?Part 2 ,作者为 Shikhar Chauhan . 这是 Python 最新的 Dataclasses 系列的第二 ...
- python中的元类_理解python中的元类
一,理解类也是对象 在python中类同样也是一种对象,只要使用关键字class,Python解释器在执行的时候就会创建一个对象,这个对象(类)自身拥有创建对象(类实例)的能力,这就是为什么他是一个类 ...
- python中的类怎样理解_深入理解Python中的元类(metaclass)
如何理解python当中的元类 把这个提到外面 class __metaclass__(type): " simple custom metaclass to block adding ne ...
- pyqtgraph文档笔记(五)总结:几个类的理解( GraphicsView, GraphicsItem ,GraphicsObject, PlotWidget等)
一.pyqtgraph 与qt pyqtgraph 使用了 qt 的图形视图框架(Graphics View Framework), 但文档并没有说明使用了哪些功能, 经初步探索,pyqtgraph与 ...
最新文章
- 简单的python服务器程序
- 2019世界机器人大赛圆满落幕,荆州中学等15支队伍获「全能奖」
- jquery腾讯微博
- 爱思助手安卓能用吗_手机资讯:【爱思助手6.0】音乐铃声导入教程
- 数据可视化|实验一 绘图基础语法和常用参数
- RPC远程过程调用之 RMI实现
- MATLAB 命令 BOXPLOT
- CDH Yarn资源动态分配 - 指定资源限制 公平调度具体设置
- simulink模块使用记录2-EnabledSubsystem/merge
- Java程序员必经的实践之路:Java中高级核心知识全面解析(11)
- java 内部类_Java内部类总结
- Android 输入手机号码(GET网络请求)查询手机号码归属地
- dell 恢复介质_在戴尔计算机上重置或重新安装Windows 10
- Day10--路由嵌套+项目前后台搭建
- linux 搜索s开头的文件,Linux文件查找/内容搜索命令
- 超级无敌diao炸天的手写堆
- 线索二叉树的前序遍历
- fabric 环境 搭建与安装
- C语言求三个数的中间值(三目运算符)
- 阿里云mysql端口管理_怎样更改数据库端口号
热门文章
- 【论文翻译】Coarse-to-Fine Question Answering for Long Documents 从粗到细的长文章问答
- 施乐550服务器fiery显示ff,施乐DC5000AP数码印刷机图文设备彩色激光打印
- 树莓派python机器人程序_树莓派打造对话机器人 Python(转)
- 微信H5棋牌类及app类推广链接在微信推广中遇到的问题讨论
- 天上的星星,除了行星以外,背后可能都有一个“太阳系”!
- N阶楼梯上楼问题(递推问题)--C++实现
- 人工智能行业要什么学历才能做?要考研吗?
- makefile 语法 /usr/bin/ld: cannot find -lxxxx
- Josephus again HDOJ3089
- 蜘蛛纸牌 java代码_java实现蜘蛛纸牌游戏