WebX配置文件、启动与响应流程
**
最近几天一直在看Spring的Ioc和AOP的源码介绍,还有Webx的使用。看Spring的源代码让人眼花缭乱,webx的配置文件也会让人感觉错综复杂无从下手。今天把之前看到的想到的webx相关的内容记下来,也当为自己的学习做一个小小的总结。
这里以经典的petstore项目为例。
首先看配置文件。当然先看web-app文件夹了。
文件夹下有common、home、store和user四个文件夹以及web.xml等6个XML文件。它们的作用是什么呢?当然是配置web容器了。这么多文件又是如何相互配合的呢?其中肯定是有相互的引用的。下面就来看一下。
首先是web.xml文件。这是最重要的一个文件,web应用启动时就要根据其中的内容来加载容器了。看一下这个文件中的内容:
首先是三个context -param,分别配置了日志系统的根目录、日志级别和日志的编码格式。这些就不用多说了。接下来是两个重要的配置:Listener。一个是LogConfigurationListener,是日志相关的;一个是WebxContextLoaderListener,这个与应用的容器相关的。它们的作用和工作原理稍后再来分析。Listener之后是两个Filter,也是分别和日志与容器相关:SetLoggingContextFilter和WebxFrameworkFilter。然后是两个filtermapping和两个servletmapping。
现在来看一下WebxContextLoaderListener。顾名思义,这是一个Listener,一个监听器。看一下源代码。而这一个监听器是实现了ServletContextListener接口的。其中定义了两个方法在前者实现了,一个是public void contextInitialized(ServletContextEvent sce);一个是public void contextDestroyed(ServletContextEvent sce);显然两个方法的参数是事件,而函数的作用就是对参数传进来的事件作出反应:一个是容器“initialized“,一个是“Destroyed“,也就是说,在web应用启动和销毁的时候作出自己的响应,也就开始了和结束了容器的生命。
然后是两个Filter,我们来看一下WebxFrameworkFilter。配置文件里定义了filter-name、filter-class和两个init参数。重要的是filter-class:WebxFrameworkFilter,其作用当然是对请求作过滤了。过滤的规则则是在两个init参数中配置的。这个类继承了FilterBean类。当应用启动的时候,其init()方法被调用。这个函数中有一个功能就是取得了webxRootController。根据什么获取呢,这里就用到了webx.xml以及webx-*.xml了(本文的目的是为了分析配置文件之间的关系)。
webx.xml和webx-*.xml的语法相同,作用类似,内容也非常相似。对应的是父应用和子应用。先看webx.xml的内容。首先是几个import。把其它几个文件引用进来了:common/webx-component-and-root.xml、common/pipeline-exception.xml、common/resources.xml、common/uris.xml、common/template-data.xml这样就把common文件夹下7个文件中的5个引用进来了。另外通过classpath资源,把其它模块下的三个XML文件也引用进来了。这样在应用中就会把所有的XML文件全部利用上了。以前老没有看到其他文件有什么用,这次终于明白了。但是还有一个问题,common文件夹下有7个文件,这里仅仅import进来了5个,还有两个(pipeline.xml和component.xml)呢?它们都应用的配置文件(webx-*.xml)中引用到了。下面看一下每一个配置文件的作用:
pipeline-exception.xml定义了对异常的响应,即遇到异常时用哪个页面响应;
resources.xml则定义了各种资源及其响应的loader;
uris.xml定义了发生内部或外部重定向时URI的构造;
webx-component-and-root则定义了页面渲染的相关功能以及对URL后缀的映射;
webx-component则将框架提供的服务提供给了应用;
pipeline则是起到阀门作用的数据流管道了,这里决定了请求的方向。
此外对应着home、user和store三个文件夹下都有一个form.xml。这里的form.xml当然为应用提供表单验证的功能。
至此,所有的配置文件的功能以及相互之间引用的关系已经分析完了。如果想对其进行扩展的话,可以自己写一个XML文件,再被其他XML文件所import就可以了。
对配置文件的分析就到这里了,下面再看一下请求数据流程(这一部分很多地方可以找到介绍的):
一个请求对应的URL的地址部分可以分成三个部分:服务器地址、web项目和子应用。当然服务器的地址就决定了这个请求是否到本台服务器;然后再分发给某一个web应用比如说petstore。最后就送到了子应用或者具体的页面上了。
当请求到达一个web应用内部的时候,首先请求的后缀会根据webx-component-and-root.xml中的配置做一次映射。之后请求就进入管道,其具体的流向就交由pipeline.xml决定了。pipeline中定义的操作首先是初始化tuibine,然后依次为日志上下文、URL分析获取target(比较抽象的一个概念)、csrfToken的检查和权限检查;最后就是按照target来分发流向了。以后缀为null(target-extension-condition extension=”null”)的情况为例:首先是perforAction处理表单数据;然后是performTemplateScreen填充页面内容;最后是renderTemplate 渲染页面。其中Action和Screen对应的类分别在**.module.[action、screen]中。查找的规则是由内到外,由特定到默认的类名了。其中请求的流动过程中可能会发生重定向。这个时候为了避免硬编码中构造URL的不便,uris.xml就派上用场了。
此外在学习的过程中还遇到了占位符的问题,在请教师兄时候才明白。例如webx.xml中的“$1“,就是说这是一个占位符,可以被前边的place-holder定义的内容来替换。
WebX配置文件、启动与响应流程的更多相关文章
- SpringMVC启动和执行流程
Spring框架大家用得很多,相当熟悉,但是我对里面的运作比较好奇,例如bean的加载和使用,和我们定义的配置文件有什么联系;又例如aop在什么时候起作用,原理又是怎样.经过一个了解后,整理了启动和执 ...
- JSP请求响应流程入门介绍
一个完整的jsp请求响应流程可以简单的使用下图表示: 过滤器:直观的了解,就是对请求做一个过滤作用,比如身份验证,验证不通过的不让他继续往下走 Servlet:请求处理中心,这个也是我们写业务逻辑的地 ...
- MongoDB 配置文件启动
MongoDB 服务启动有两种方式:一种是直接命令启动,一种是通过配置文件启动 1.命令启动: mongod -dbpath C:\data\db -logpath C:\data\log\mongo ...
- 操作3 mongodb和mysql 开启慢查询日志 ,以及mongodb从配置文件启动
1. mongodb从配置文件启动 创建配置文件:/usr/local/mongodb/etc/mongodb.conf 配置文件的内容为: #Directory and relavent set d ...
- docker根据配置文件启动redis
更多docker基本命令请自行查询. 1.首先拉取合适版本的docker镜像 docker pull redis:5 2.如果不需要更改什么配置或者仅仅测试用可以直接启动镜像运行容器,这里要说明的是根 ...
- 使用配置文件启动MongoDB
Ubuntu 16.04 (阿里云ECS),MongoDB 4.0, 原来,已经写了10篇MongoDB的随笔了.可是,自己居然没有使用配置文件启动过MongoDB,对其更多的配置是不明白的. 昨天( ...
- 【docker】docker部署spring boot服务 选择配置文件启动
默认启动命令: docker run --name swapping -itd --net=host -v /etc/localtime:/etc/localtime:ro -v /etc/timez ...
- 《转》深入理解Activity启动流程(三)–Activity启动的详细流程2
本文原创作者:Cloud Chou. 出处:本文链接 本系列博客将详细阐述Activity的启动流程,这些博客基于Cm 10.1源码研究. 深入理解Activity启动流程(一)--Activity启 ...
- 《转》深入理解Activity启动流程(三)–Activity启动的详细流程1
本文原创作者:Cloud Chou. 出处:本文链接 本系列博客将详细阐述Activity的启动流程,这些博客基于Cm 10.1源码研究. 深入理解Activity启动流程(一)--Activity启 ...
随机推荐
- 关于.NET前后台提示框的那点事
前言 关于提示框,或多或少都用到过,提示框常见方式两种:js原生alert() 和 div模拟弹层:下面以一个常见的需求业务场景来展现提示框的那点事: 正文内容 客户:需求方: 小白:实现方(全权负责 ...
- android开发之应用Crash自动抓取Log_自动保存崩溃日志到本地
http://blog.csdn.net/jason0539/article/details/45602655 应用发生crash之后要查看log,判断问题出在什么地方,可是一旦应用发布出去,就要想办 ...
- OC与Swift的区别四(条件语句)
12.条件语句的区别,此处只写区别,没有指出区别的其他方面oc与swift基本一致 12.1 oc中for if switch语句体如果只有一行代码,则{}可以省略 swift中for if swit ...
- DAG模型——嵌套矩阵
有向无环图上的动态规划是学习动态规划的基础,很多问题都可以转化为DAG上的最长路.最短路或路径计数问题. 嵌套矩阵 有n个矩阵,每个矩阵可以用两个整数a,b描述,表示它的长和宽.矩阵X(a,b)可以嵌 ...
- 在HTML中插入回车换行
在制作EPUB的时候,发现原来收集的html文本根本就没有换行,这个在代码里面是无法忍受的,因为看着比较混乱,全部都是在一行里面,这个就像写作文的时候,你看到的文字全部都是在一行里面显示出来的,根本就 ...
- 关于Hyper-V虚拟机中的vEthernet虚拟网卡不能联网的问题
Hyper-V虚拟机在我电脑里面已经有一年了,当初是因为windows8系统里面需要装Hyper-V,这样才能不让win8死机,就折腾了一整子,结果碰到vEthernet网卡不能联网,网上相关的资料少 ...
- 《JavaScript高级程序设计》笔记(2):位操作符
1.按位非(NOT) 2.按位与(AND) 3.按位或(OR) 4.按位异或(XOR) 5.左移 6.有符号右移 7.无符号右移 ----------------------------------- ...
- PHP保存base64
base64图片格式:$base64_url = data:image/jpeg;base64,xxxxxxxxxxxxxxxxxxxxxx 1,去除头部:$base64_body = substr( ...
- [转]left join,right join,inner join区别
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录inner join(等值连接) 只 ...
- PHP获取IP地址所在的地理位置
1.http://ip.qq.com/cgi-bin/searchip?searchip1=XXX 2.http://int.dpool.sina.com.cn/iplookup/iplookup.p ...