马云拿下了马云参加中国联通混改吗

Webx学习之一
时间: 22:07:29
&&&& 阅读:1884
&&&& 评论:
&&&& 收藏:0
标签:什么是webx
Webx3_Guide_Book中是这样介绍的:
Webx是一套基于Java Servlet API的通用Web框架。Webx致力于提供一套极具扩展性的机制,来满足Web应用不断变化和发展的需求。而SpringExt正是这种扩展性的基石。SpringExt扩展了Spring,在Spring的基础上提供了一种扩展功能的新方法。
这也说明,webx是在springExt的基础上建立起来的一套web服务框架。
它封装了servlet规则,细化了一般情况下的filter,通过配置文件pipeline.xml和强化过的RequestContexts,将一个请求的路径和处理过程展现。有关这两个是什么和它们的使用方法后面再说。
该框架不但定义了请求分发机制,更对前端的页面展示层进行模板式的定义:使用default.vm、index.vm、register.vm等类型的自定义模板与analyzeURL机制进行交互,形成从前端到后台的“整体一条龙”的流程。
在Webx中,约定胜于配置。规则较多,但我相信理解之后便能够自由运用(我们学习任何东西都要先了解它的规则,这是必然的一步)。
Webx的必备组件
spring核心框架
webx框架依赖(com.alibaba.citrus)其中包含了重要的WebxContextLoaderListener和LogConfiguratorListener
pipeline及映射规范
spring核心框架
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-core&/artifactId&
&version&${spring-version}&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-beans&/artifactId&
&version&${spring-version}&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-aop&/artifactId&
&version&${spring-version}&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-context&/artifactId&
&version&${spring-version}&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-context-support&/artifactId&
&version&${spring-version}&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-tx&/artifactId&
&version&${spring-version}&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-jdbc&/artifactId&
&version&${spring-version}&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-orm&/artifactId&
&version&${spring-version}&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-web&/artifactId&
&version&${spring-version}&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-webmvc&/artifactId&
&version&${spring-version}&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-test&/artifactId&
&version&${spring-version}&/version&
&/dependency&
$spring-version可在标签中可通过&spring-version&&/spring-version&配置。
webx框架依赖
&dependency&
&groupId&com.alibaba.citrus&/groupId&
&artifactId&citrus-webx-all&/artifactId&
&version&${webx-version}&/version&
&/dependency&
代碼包名規則
通过pipeline的analysisURL模块解析出target之后,会根据pipline-velves制定的规则分发。
这时,需要知道什么样的target会对应到什么样的流程中去,这个对应过程的识别,是根据包名的约定来定义的。也即是约定大于配置的一个体现。
对于包名的配置项在webx.xml和webx-*.xml中定义。
&!-- 装载模块。 --&
&services:module-loader&
&ml-factories:class-modules&
&search-packages type="$1"
packages="todolist.module.*" /&
&/ml-factories:class-modules&
&/services:module-loader&
packages所指的就是用于匹配对应规则的包,$1直接匹配到screen.xxx.java或action.xxx.java等等。
而在pipeline.xml中制定映射规则包括:
&pl-valves:performAction /&
performAction:在webx中主要是用来处理提交的表单,将表单类传给java类,执行相应的处理方法,然后返回或者重定向。
&pl-valves:performTemplateScreen /&
performTemplateScreen:将target映射成module包下的screen.xxx类。
详见附件的第四章WebxTurbine。
&pl-valves:renderTemplate /&
rendertemplate:将target映射到webroot下的各个模板上。
注:这是映射的不是类,而是模板了,也就是带着数据等开始渲染模板。
详见第四章WebxTurbine。
这里可能会有一个误区,根据我的使用历程,发现performAction、performtemplateScreen和renderTemplate这三个基本方法,凡是perform开头的都是映射到java类的。我开始的时候会认为performTemplateScreen是直接映射到app/templates/screen中的模板去,后来才发现这个问题。
只有render相关的才是渲染模板,一般使用renderTemplate的应该是执行完perform*之后或者是首页——直接渲染模板。
Pipeline不仅可以控制流程的中断或继续,还可以实现子流程、循环、条件转移、异常处理等更精细的流程控制。Pipeline服务甚至可以运用在非WEB的环境中。
上述包名规则的定制就是为了pipeline服务中使用perform*和 renderTemplate等等去使用的。
正如上述所说,在renderTemplate的时候就需要用到模板的规范了,他可以使得类中处理得到的数据和模板对应起来。
模板目录有这几个要素:
webroot下以应用名为子目录(如app)
webroot/common
webroot/app
webroot/WEB-INF
其中重点讲app下模板,common的与app大体一致。
app/templates/layout
app/templates/screen
screen下可以自定义目录,该自定义目录在使用外部重定向的时候需要跟设置的setTarget()相符。
如:screen/form/register.vm
则nav.redirectedTo(“appLink”).setTarget(“form/register”)即锁定到了该register.vm。
在renderTemplate时,先渲染screen中的内容,然后出来寻找layout,最终将组装好的整个页面呈现。
详见附件第四章WebTurbine——renderTemplate。
上述几项已经基本将pipeline.xml的主要部分做了说明。
下面看一些固有的配置项和自定义(app)配置项。
webx-*.xml
logback.xml
WEB-INF/common下
pipeline.xml
pipeline-execption.xml
resource.xml
webx-component.xml
webx-component-and-root.xml
WEB-INF/app下
- form.xml
下一节的主要任务是弄清楚这些配置和之间的关系。
之前讲到了pipeline和requestContext将传统的filter细分为两个比较独立的职能,下面是对webx中requestContext的简单介绍。
RequestContexts则负责访问和修改request和response,但不负责改变requese的执行流程。
RequestContexts服务中的每一个环节的RequestContext之间并非完全独立、互不干涉的。每个request context可以访问它所依赖的其它request context中的状态。
详见附件第六章——Filter、Request Contexts和Pipeline。
&&国之画&&&& &&&&chrome插件
版权所有 京ICP备号-2
迷上了代码![Java教程]Maven、Webx、Velocity学习总结(很好理解的一篇文章)
你的位置:
[Java教程]Maven、Webx、Velocity学习总结(很好理解的一篇文章)
1. 综述这两周的时间,通过看指南,看代码,跑实例,对淘宝网web应用开发框架有了一个整体的初步认识,主要包括四个方面:&O 项目管理工具Maven&O MVC框架Webx。&O Webx中的View层实现&&Velocity&O Webx中的Model持久层实现&&Ibatis2. Maven部分2.1. Maven基础1. 坐标是指项目的唯一标识,以GAV(groupId,artifactId和version)区分, groupId包含公司和内部组(或产品线)的信息,如com.taobao.mercury,表示下的mercury项目组;ArtifactId则表示项目的名称,如mercury-web,Version则表示某一Artifact的版本,如1.0-SNAPSHOT2. 依赖是指项目所依赖的相关jar包3. 仓库是指存放项目的产出(Artifact)的仓库,如http://mvnrepo./mvn/repository4. 插件是Maven的设计机制,Maven包含一个核心功能组件,而扩展功能都是通过插件完成,即使我们最常见的编译功能也是通过compiler插件完成的。2.2. POM基础1. 一个pom.2.3. 依赖管理1. 依赖定义具体到version2. 依赖可以传递3. &scope&标签定义依赖项的生效范围4. 依赖的版本定义在父pom(项目pom)中,子pom(模块pom)设置&parent&,继承父pom5. 设置一个虚拟的总项目,多个实际项目作为总项目的模块3. Webx部分3.1. 一分钟Webx框架开发3.1.1. 处理页面的基本流程(Turbine)Webx是采用MVC三层架构。请求的上下文信息(RequestContext、ServletContext、HttpServletRequest、HttpServletResponse)被封装为RunData对象。在Web层和Biz层之间采用command模式实现对请求的处理。由MappingRuleService将请求分发到同名的业务处理类进行处理,处理结果被封装为Result对象。然后按照业务逻辑将所需信息放到TemplateContext中,由velocity取得并对VM模板进行渲染。最后产出的页面输出给用户。有的请求并不要求返回页面,只需处理业务逻辑。整个处理流程的控制由Pipeline(水管)中配置各种Valve(阀门)实现,简易的流程图如下:图表 3-13.1.2. Webx各层我们要做的工作的工作:l V层(Web):采用Velocity书写vm模版,书写一个同名的Java类来接收Command,并处理业务逻辑(void execute(RunData,TemplateContext)),并根据处理得到的结果(Result对象),准备好vm模版中所需要的数据(TemplateContext.put(String key, Object value))。(VM模板中可以用$xx获得,如果该对象可能为空的话,要用$!xx来调用,这样如果该对象为空的话,就不会显示出来)l C层(Biz):书写AO对象处理Command,请求的上下文信息被封装在RunData对象中。AO中只包含简单的逻辑处理,真正的业务处理通常书写在Manager中。l M层(ibatis):书写DAO对象负责和数据交互,持久层使用的是Ibatis。需要我们来建立数据物理模型并书写数据库操作的SQL语句。3.2. Webx框架初探3.2.1. Webx的基本概念1. 页面驱动:以页面(view)为主导,先写页面,再写和页面配套的程序模块,通过规则,查找页面所对应的程序模块2. Pull Tools:有一些定义在webx.3. Modules:turbine中的基本编程模块。Screen用来处理页面显示逻辑;Control和screen类似,但可以被别的screen或layout引用;Action处理用户提交表单。所有module都实现Module接口:public interface Module {void execute(RunData rundata) throws WebxE}3.2.2. Mecury项目目录结构mercury├─assets├─biz│ ├─src│ │ ├─.taobao│ │ │ │ └─mercury│ │ │ │ ├─amend│ │ │ │ ├─ao│ │ │ │ │ ├─correct│ │ │ │ │ │ └─impl│ │ │ │ │ └─impl│ │ │ │ ├─aop│ │ │ │ ├─biz│ │ │ │ │ ├─domain│ │ │ │ │ │ ├─mysqlmap│ │ │ │ │ │ ├─oracle│ │ │ │ │ │ ├─rowkey│ │ │ │ │ │ └─sajiao│ │ │ │ │ └─util│ │ │ │ ├─cache│ │ │ │ ├─dal│ │ │ │ │ └─sajiao│ │ │ │ ├─mananger│ │ │ │ │ └─sajiao│ │ │ │ ├─notify│ │ │ │ ├─ob│ │ │ │ │ ├─ao│ │ │ │ │ ├─dal│ │ │ │ │ └─mananger│ │ │ │ ├─query│ │ │ │ └─timetask│ │ │ └─resources│ │ └─test│ └─target└─deploymercury└─protocal├─.settings├─src│ ├─.taobao│ │ ├─common│ │ └─mercury│ │ ├─domain│ │ └─util│ │ └─partition│ └─test└─targetmercury└─web├─.settings├─src│ ├─main│ │ ├─assembly│ │ ├─filter│ │ ├─.taobao.mercury.web│ │ │ ├─common│ │ │ │ ├─service│ │ │ │ ├─session│ │ │ │ ├─util│ │ │ │ └─valve│ │ │ └─module│ │ │ ├─action│ │ │ ├─control│ │ │ └─screen│ │ ├─resources│ │ │ ├─biz│ │ │ │ ├─bean│ │ │ │ └─persistence│ │ │ └─top│ │ │ └─config│ │ └─webapp│ │ ├─common│ │ │ └─templates│ │ │ └─screen│ │ ├─default│ │ │ └─templates│ │ │ ├─control│ │ │ ├─layout│ │ │ └─screen│ │ ├─META-INF│ │ └─WEB-INF│ │ ├─common│ │ └─default│ └─.taobao.mercury└─target3.2.3. Webx应用启动流程Webapp\WEB-INF\web.&?"1.0"&encoding="GB2312"?&&web-app version="2.4"&"/"http://www.w3.org/2001/xsi:schemaLocation="/&&&context-param&&param-name&loggingRoot&/param-name&&param-value&${mercury.loggingRoot}&/param-value&&/context-param&......&listener&&&listener-class&com.alibaba.citrus.logconfig.LogConfiguratorListener&/listener-class&&/listener&&&!-- ???/WEB-INF/webx.&listener&&listener-class&com.alibaba.citrus.webx.context.WebxContextLoaderListener&/listener-class&&/listener&......&filter&&filter-name&sessionFilter&/filter-name&&filter-class&com.taobao.session.TaobaoSessionFilter&/filter-class&&init-param&&param-name&tbsessionConfigGroup&/param-name&&param-value&${mercury.session.filter.group.name}&/param-value&&/init-param&&init-param&&param-name&isloginSessionCheck&/param-name&&param-value&true&/param-value&&/init-param&&/filter&&&filter-mapping&&filter-name&sessionFilter&/filter-name&&url-pattern&*.htm&/url-pattern&&/filter-mapping&......&filter&&filter-name&timer&/filter-name&&filter-class&com.alibaba.webx.filter.timer.TimerFilter&/filter-class&&init-param&&param-name&threshold&/param-name&&param-value&${mercury.timer.threshold}&/param-value&&/init-param&&/filter&&filter-mapping&&filter-name&timer&/filter-name&&url-pattern&/*&/url-pattern&&/filter-mapping&&&filter&&filter-name&webx&/filter-name&&filter-class&com.alibaba.citrus.webx.servlet.WebxFrameworkFilter&/filter-class&&/filter&&filter&&filter-name&mdc&/filter-name&&filter-class&com.alibaba.citrus.webx.servlet.SetLoggingContextFilter&/filter-class&&/filter&&filter-mapping&&filter-name&mdc&/filter-name&&url-pattern&/*&/url-pattern&&/filter-mapping&&filter-mapping&&filter-name&webx&/filter-name&&url-pattern&/*&/url-pattern&&/filter-mapping&&&welcome-file-list&&welcome-file&index.html&/welcome-file&&welcome-file&index.jsp&/welcome-file&&/welcome-file-list&&&&!-- ====================================================== --&&!-- error pages --&&!-- ====================================================== --&&error-page&&error-code&400&/error-code&&location&/error.html&/location&&/error-page&......&/web-app&通过查资料,结合web.1. 初始化context-param2. 执行各个listener,其中WebxContextLoaderListener初始化被Webx包装过的3. 加载各个filter:其中TimerFilter(timer)用来记录serverlet执行时间,WebxFrameworkFilter(webx)用来处理web请求,SetLoggingContextFilter(mdc)用来通过SLF4J MDC来记录用户和请求的信息。三者顺序为timer-&webx-&mdc。&web.http://ajava.org/readbook/J2EE/servletjsphxbc2/17212.html3.2.4. Webx响应和处理请求的流程(摘自Webx框架指南)当一个HTTP请求到达时,首先由WebxFrameworkFilter接手这个请求(参考Webx应用启动流程),下图是WebxFrameworkFilter处理一个WEB请求的过程:如图所示,WebxFrameworkFilter接到请求以后,就会调用WebxRootController。从这里开始,进入Spring的世界。此后所有的对象:WebxRootController、WebxController、RequestContext、Pipeline等,全部是通过SpringExt配置在Spring Context中的。WebxRootController对象存在于root context中,它被所有子应用所共享。它会创建RequestContext实例,从而增强request、response、session的功能。接下来,WebxController对象会被调用。WebxController对象是由每个子应用独享的,子应用app1和app2可以有不同的WebxController实现。默认的实现,会调用pipeline。Pipeline也是由各子应用自己来配置的。假如pipeline碰到无法处理的请求,如静态页面、图片等,pipeline应当执行&exit/& valve强制退出。然后WebxRootController就会&放弃控制&,这意味着request将被返还给/WEB-INF/web.webapp\common\pipeline.&?"1.0"&encoding="UTF-8"&?&&beans:beans "/schema/services"......xsi:schemaLocation="/schema/services...... "&&services:pipeline"/schema/services/pipeline/valves"&&&prepareForTurbine /&&prepareForWebx2/&&pl-valves:try-catch-finally&&pl-valves:try&&webx2-valve class="com.alibaba.turbine.pipeline.SetLoggingContextValve"&/&&webx2-valve class="com.taobao.mon.valve.DefaultAnalyzeURLValve"&/&&webx2-valveclass="com.taobao.mon.valve.SecurityCheckValve"&/&&webx2-valve class="com.taobao.mon.valve.SessionValve"&/&&webx2-valve class="mon.pagecache.webx.PageCacheValve"p:action="start"&/&&&loop&&choose&&when&&pl-conditions:target-extension-conditionextension="vm, jsp"&/&&performAction /&&performTemplateScreen /&&renderTemplate /&&/when&&when&&pl-conditions:target-extension-conditionextension="do"&/&&performAction /&&performScreen /&&/when&&otherwise&&exit /&&/otherwise&&/choose&&breakUnlessTargetRedirected /&&/loop&&/pl-valves:try&&&pl-valves:finally&&webx2-valve class="mon.pagecache.webx.PageCacheValve"p:action="end"&/&&webx2-valve class="com.taobao.mon.valve.SessionValve"p:action="clean"&/&&webx2-valve class="com.alibaba.turbine.pipeline.SetLoggingContextValve"p:action="cleanup"&/&&/pl-valves:finally&&&/pl-valves:try-catch-finally&&&/services:pipeline&&&/beans:beans&假设用户以URL:http://favorite.daily.taobao.net/collect_list.htm来访问Webx应用。WebxFrameworkFilter接收请求,并且一路顺利到达pipeline。然后Pipeline开始依次执行它的valves(下面的描述略过一些相对次要的步骤):1. &analyzeURL& - 分析URL分析URL的目的是取得target,这里取得的target是collect_list.htm。如果用户访问的URL中并没有提供path信息,通常被理解为:用户想要访问&主页&。AnalyzeURL valve提供了一个可选的参数&homepage&,即是在这种情况下起作用。得到的target为&homepage&。需要注意的是,target不代表模板名,也不代表类名。Target只是一个抽象的概念 && 当前页面需要达成的目标。Target可能被后续的valves解释成模板名、类名或者其它东西。2. 进入&choose& - 多重分支很明显,&collect_list.htm&满足了第一个&when&所附带的条件:&target-extension-condition extension=" vm, jsp"&,意思是target的后缀为&jsp&或为&vm&。3. &performAction& - 执行action和其它框架中的action概念不同,在Webx Turbine中,action是用来处理用户提交的表单的。因为本次请求未提供action参数,所以跳过该步骤。4. &performTemplateScreen& - 查找并执行screen。如果target-extension为&do&,则没有&performTemplateScreen&这个valve。这里要用到一个规则:target映射成screen module类名的规则。假设target为xxx/yyy/zzz,那么Webx Turbine会依次查找下面的screen模块:screen.xxx.yyy.Zzz,screen.xxx.yyy.Default,screen.xxx.Default,screen.Default。本次请求的target为collection_list.htm,因此它会尝试查找screen.collection_list类。如果找到screen类,Webx Turbine就会执行它。Screen类的功能,通常是读取数据库,然后把模板所需要的对象放到TemplateContext中。如果找不到,也没关系 && 这就是&页面优先&:一些页面没有业务逻辑,因此不需要screen类,只需要有模板就可以了。5. &renderTemplate& - 渲染模板这里用到两个规则:target映射成screen template,以及target映射成layout template。假设target为xxx/yyy/zzz,那么Webx Turbine会查找下面的screen模板:/templates/screen/xxx/yyy/zzz。Screen模板如果未找到,就会报404 Not Found错误。找到screen模板以后,Webx Turbine还会试着查找下面的layout模板:/templates/layout/xxx/yyy/zzz/templates/layout/xxx/yyy/default/templates/layout/xxx/default/templates/layout/defaultLayout模板如果找不到,就直接渲染screen模板;如果存在,则把渲染screen模板后的结果,嵌入到layout模板中。Layout模板和screen模板中,都可以调用control。每个页面只有一个screen,却可以有任意多个controls。6. &breakUnlessTargetRedirected& - 内部重定向在screen和action中,可以进行&内部重定向&。内部重定向实质上就是由&breakUnlessTargetRedirected&实施的 && 如果没有重定向标记,就退出;否则循环到&loop&标签。和外部重定向不同,外部重定向是向浏览器返回一个302或303 response,其中包含Location header,浏览器看到这样的response以后,就会发出第二个请求。而内部重定向发生在pipeline内部,浏览器并不了解内部重定向。4. Velocity部分尚未系统学习,只是看代码做了一些了解。1. 模板以.vm为后缀名2. $a:美元符&$&加上java中的引用名。可以引用的对象包括内置的对象,pull Service中pull到的对象,业务处理中put进TemplateContext中的对象3. #set($a = $b):声明变量并赋值;4. ##:velocity行注释5. #if #elseif #else判断选择,最后用#end闭合5. Ibatis部分5.1. Ibatis的作用Ibatis将数据库中的数据转换为java中的对象,方便C层对数据进行操作5.2. Ibatis的配置1. 属性文件*-persistence.2. 总配置文件SqlMap-Config.3. 映射文件collection_item_mapping.&转载&
、 、 、 、 、webx框架 实现文件上传保存服务器 解析_Java_第七城市
webx框架 实现文件上传保存服务器 解析
最近开始参与一个新的项目,项目工程由Webx框架实现。简单学习了一下Webx框架的一些知识,就投入到了需求的开发工作。其中涉及一个功能上传csv格式的文件,将文件保存到服务器,并且读取文件内的数据导入到数据库里面。上网找了一下Webx上传文件保存到服务器的知识,可以参考的内容比较少,零零散散花了一些时间最后实现了这个功能。在此记录一下,提供一个较为完善的参考案例给大家。1.VM界面增加上传文件控件 白名单批量导入
form中指定了表单提交事件会由OpsAction.java中的doUploadLineWhiteList方法处理accept=".csv"在我们点击上传文件的时候,默认显示csv的文件,但是实际上我们还是可以选择其它文件类型。因此文件格式后台也会进行检验。2.doUploadLineWhiteList方法public void doUploadLineWhiteList(TurbineRunData rundata, Context context) throws Exception {try { FileItem file = rundata.getParameters().getFileItem("import_file"); // 该文件为上传的文件 if (file == null) { ResponseUtils.outString("ERROR: " + "文件未上传!", response, "GBK"); } //检查文件类型 String fileName = file.getName(); String object[] = fileName.split("//."); String prefix = ""; String suffix = "csv"; if(object != null && object.length != 0){prefix = object[0];suffix = object[object.length-1]; } if(!"csv".equals(suffix)){ ResponseUtils.outString("ERROR: " + "只支持CSV格式文件导入!", response, "GBK"); } Date now = FrameTimeUtil.getSysDate(); BufferedReader reader = new BufferedReader(new InputStreamReader(file.getInputStream())); reader.readLine(); String line = while((line=reader.readLine())!=null){
String[] item = line.split(",");//CSV格式文件为逗号分隔符文件,这里根据逗号切分 if(item.length != 6){ ResponseUtils.outString("ERROR: " + "上传文件内容不正确!", response, "GBK"); }else{//插入数据到数据库 } }
//保存文件到uploadFiles目录下面String filePath = rundata.getRequestContext().getServletContext().getRealPath("/uploadFiles");fileName = prefix + new SimpleDateFormat("yyyyMMddHHmmss").format(now) + "." + file.write(new File(filePath, fileName));ResponseUtils.outString("操作成功", response, "GBK");} catch (Exception e) { log.error("操作异常", e); String msg = "ERROR: " + e.getMessage(); ResponseUtils.outString(msg, response, "GBK");} }这样文件上传的功能也就基本上实现了
最新教程周点击榜
微信扫一扫

我要回帖

更多关于 马云参加中国联通混改 的文章

 

随机推荐