? 初识Webx 2
初识Webx 1: http://www.cnblogs.com/lddbupt/p/5547189.html
Webx Framework负责完成一系列基础性的任务. 比如系统初始化和响应请求.
系统初始化: 初始化Spring容器, 初始化日志系统.
响应请求: 增强request/response/session的功能, 提供pipeline流程处理机制, 异常处理, 开发模式.
Webx Framework提供了一个可剪裁、可扩展的处理WEB请求基本框架。它所提供的基本功能事实上是每个WEB框架都需要用到的。Webx Framework为进一步实现WEB框架提供了坚实的基础。
Webx的初始化
初始化级联的Spring容器
Webx Framework将负责创建一组级联的Spring容器结构。Webx所创建的Spring容器完全兼容于Spring MVC所创建的容器,可被所有使用Spring框架作为基础的WEB框架所使用。
WebxContextLoaderListener是由Spring中的ContextLoaderListener派生的, 可代替后者用来初始化Spring容器.
Webx Framework将会自动搜索/WEB-INF
目录下的XML配置文件,并创建下面这种级联的spring容器。
注意: 如果不希望把你的应用分成多个小应用模块,那么,你还是需要配置至少一个小应用模块(子容器)。
初始化日志系统
Webx Framework使用SLF4J作为它的日志框架。因此Webx Framework理论上支持所有日志系统。然而目前为止,它只包含了log4j和logback这两种日志系统的初始化模块.
LogConfiguratorListener
会根据你当前应用所依赖的日志系统(通常配置在maven project中),来自动选择合适的日志配置文件。
- 假设你的应用依赖了logback的jar包,那么listener就会查找
/WEB-INF/logback.xml
,并用它来初始化logback; - 如果你的应用依赖了log4j的jar包,那么listener也会很聪明地查找
/WEB-INF/log4j.xml
配置文件。 - 假如以上配置文件不存在,listener会使用默认的配置 —— 把日志打印在控制台上。
- Listener支持对配置文件中的placeholders进行替换。
- Listener支持同时初始化多种日志系统。
Webx响应请求
当Webx Framework接收到一个来自WEB的请求后, 它会封装成更易使用的RequestContext对象(增强request, response, session的功能), 然后, 路由到子应用, 调用相应的子应用的pipeline, 进一步处理.
如果上述过程出现异常,则会触发Webx Framework处理异常.
增强request, response, session的功能
Request contexts服务. 利用HttpServletRequestWrapper
和HttpServletResponseWrapper
对request和response对象进行包装,以实现新的功能。
Request contexts所有的功能都是可配置、可扩展的 —— 它是基于SpringExt的扩展机制。
Request contexts所增加的功能对于所有的基于标准Servlet API的应用都是透明的 —— 这些应用根本不需要知道这些扩展的存在。例如,假如你在request contexts服务中配置了增强的session框架,那么所有通过标准的Servlet API取得session的应用,都将获得新功能.
[注入特殊对象]
在这个例子中,LoginAction
类可以是一个singleton。一般来说,你不能把request scope的对象,注入到singleton
scope的对象中。但你可以把HttpServletRequest
、HttpServletResponse
和HttpSession
对象注入到singleton对象中。为什么呢?原来,Request contexts服务对这几个常用对象进行了特殊处理,将它们转化成了singleton对象。
如果没有这个功能,那么我们就不得不将上例中的LoginAction
配置成request
scope。这增加了系统的复杂性,也成倍地降低了性能。而将LoginAction
设置成singleton,只需要在系统启动时初始化一次,以后就可以快速引用它。 ????线程不安全???
Pipeline流程机制
Webx Framework中的pipeline可以控制处理请求的流程的走向。
Webx Framework并没有规定管道的内容 —— 定制管道是应用开发者的自由。然而Webx Framework提供了一系列通用valves,你可以使用它们.
异常处理机制
开发模式工具
Webx Framework提供了一个开关,可以让应用运行于“生产模式(Production Mode)”或是“开发模式(Development Mode)” 。
在开发模式下,会有一系列不同于生产模式的行为。
- 不同的主页 —— 在开发模式的主页中,可以查看和查询系统内部的信息。
- 不同的详细出错页面。
- 开发模式下,可展示所有可用的schemas。
- 开发模式下,可以查阅容器内部的信息。譬如全部beans的定义,查看配置文件,跟踪resources的装载过程等等.
事实上,Webx Framework提供了一套专用的内部框架,使你可以往开发模式中添加更多的开发工具。
Webx Framework提供了一个接口:ProductionModeAware
。Spring context中的beans,如果实现了这个接口,就可以感知当前系统的运行模式,从而根据不同的模式选择不同的行为.
响应和处理请求的更多细节
当一个HTTP请求到达时,首先由WebxFrameworkFilter接手这个请求.
“passthru
略过”和“excludes
排除”的区别在于,如果一个servlet或filter接手被webx passthru
的请求时,它们还是可以访问到webx的部分服务,包括:
RequestContext
服务,例如:解析参数、解析upload请求、重写请求、设置字符集编码和区域、基于cookie的session等。- 开发模式及工具。
- 异常处理。
- 共享webx的spring容器。
也就是说,对于一个被passthru
的请求,webx的行为更像是一个普通的filter。而“排除”则不同,如果一个请求被“排除”,webx将会立即放弃控制,将请求交还给服务器。接手控制的servlet或filter将无法访问webx一切的服务。
为什么使用filter而不是servlet呢?传统的WEB框架的控制器一般都是用servlet实现的。原因是:
- Filter可以“返还控制” —— 上面的配置文件直接把“/*”映射到webx filter中,这意味着webx接管了这个应用的所有请求。静态页面和资源怎么办?没关系,如果webx发现这个请求不应该由webx来处理,就会把控制“返还”给原来的控制器 —— 可能是另一个filter、servlet或者返回给servlet引擎,以默认的方式来处理。而Servlet是不具备“返还控制”的机制的。
- Servlet/Filter mapping的局限性 —— 标准的servlet引擎将URL映射到filter或servlet时,只支持前缀映射和后缀映射两种方式,非常局限。而实际情况往往复杂得多。Webx建议将所有请求都映射给webx来处理,让webx对请求做更灵活的映射。
定制Webx Framework
WebxRootController
是被所有子应用所共享的逻辑。 假如你想创建一种新的WEB框架,可以自己定义一个新的WebxRootController
的实现。这个方案非常适合作为一个新Web框架的起点。
创建自己的WebxRootController
。最简便的方法是:扩展AbstractWebxRootController
,免去了创建Servlet/Filter、初始化Spring容器、处理request、response等繁杂事务,并且完全支持SpringExt的所有功能,此外还包含了错误处理、开发模式等Webx Framework中的一切便利。
Webx Framework默认的WebxController
是调用pipeline。假如你不想用pipeline,而希望实现自己的针对子应用的逻辑,那么最简单的方法就是实现自己的WebxController
或者扩展AbstractWebxController
。
参考文献
http://openwebx.org/docs/webxframework.html#d0e1272
? 初识Webx 2的更多相关文章
- ? 初识Webx 3
初识webx 2: http://www.cnblogs.com/lddbupt/p/5552351.html Webx Turbine建立在Webx Framework的基础上,实现了页面渲染.布局 ...
- 初识Webx 1
Webx是一套基于Java Servlet API的通用Web框架.它在Alibaba集团内部被广泛使用.从2010年底,向社会开放源码. Webx框架是一个稳定.强大的Web框架.建立在Spring ...
- webx学习
webx框架学习指南 http://openwebx.org/docs/Webx3_Guide_Book.html webx学习(一)——初识webx webx学习(二)——Webx Framewor ...
- Android动画效果之初识Property Animation(属性动画)
前言: 前面两篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画).Frame Animation(逐帧动画)Andr ...
- 初识Hadoop
第一部分: 初识Hadoop 一. 谁说大象不能跳舞 业务数据越来越多,用关系型数据库来存储和处理数据越来越感觉吃力,一个查询或者一个导出,要执行很长 ...
- python学习笔记(基础四:模块初识、pyc和PyCodeObject是什么)
一.模块初识(一) 模块,也叫库.库有标准库第三方库. 注意事项:文件名不能和导入的模块名相同 1. sys模块 import sys print(sys.path) #打印环境变量 print(sy ...
- 初识IOS,Label控件的应用。
初识IOS,Label控件的应用. // // ViewController.m // Gua.test // // Created by 郭美男 on 16/5/31. // Copyright © ...
- UI篇(初识君面)
我们的APP要想吸引用户,就要把UI(脸蛋)搞漂亮一点.毕竟好的外貌是增进人际关系的第一步,我们程序员看到一个APP时,第一眼就是看这个软件的功能,不去关心界面是否漂亮,看到好的程序会说"我 ...
- Python导出Excel为Lua/Json/Xml实例教程(一):初识Python
Python导出Excel为Lua/Json/Xml实例教程(一):初识Python 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出 ...
随机推荐
- com技术学习
百度百科概念 COM是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术.在COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复杂的应 ...
- (十一)instanceof 和 getclass 的区别
判断两个对象是否为同一类型,时常用到getclass 和 instanceof ,而这两个函数又是时常让人混淆.下面从一个例子说明两者的区别: public class Test_drive { pu ...
- C语言的世界
大家好,我是一名大一的学生,我叫陈由钧,我来自计算机系,一开始选择这门专业的时候,是出于对计算机的热爱,我喜欢计算机,喜欢没事琢磨琢磨计算的各种程序,各种软件,所以我选择学习计算机这门专业,第一周我就 ...
- 【Docker 教程】- Docker 架构
1.Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器. 2.Docker 容器通过 Docker 镜像来创建. 3.容器与镜像的关系类似于面向对象编程 ...
- 我们在删除SQL Sever某个数据库表中数据的时候,希望ID重新从1开始,而不是紧跟着最后一个ID开始需要的命令
一.如果数据重要,请先备份数据 二.删除表中数据 SQL: Delete From ('表名') 如:Delete From abcd 三.执行新语句 SQL: dbcc checkident('表 ...
- js 复制到剪贴板 兼容还得自己想办法
clipboard.js https://github.com/zenorocha/clipboard.js/ 主要问题还是ie8, 可以使用ie 特有的方法 if (window.clipboard ...
- query 获取本身的HTML
<div class="test"><p>hello,你好!</p></div> <script> $(".t ...
- Matlab 函数ndims简介,flipdim简介
ndims是matlab中求一个数组维数的函数. 调用格式: n=ndims(A) 将A的维数返回给变量n.n>=2 n=ndims(A)与n=length(size(A))是等价的 MATLA ...
- 1406: [AHOI2007]密码箱
1406: [AHOI2007]密码箱 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1591 Solved: 944[Submit][Status][ ...
- Ubuntu安装teamviewer注意事项。
Ubuntu安装teamviewer注意事项. 首先通过浏览器到官方下载ubuntu对应teamviewer的安装包 但是通过dpkg –i安装之后发现安装过程出问题,安装好的包打开之后也闪退. 这个 ...