Maven、Webx、Velocity学习总结

目录

综述

Maven

Maven基础

POM基础

依赖管理

Webx

一分钟Webx框架开发

处理页面的基本流程(Turbine)

Webx各层我们要做的工作的工作

Webx框架初探

Webx的基本概念

Webx项目目录结构

Webx应用启动流程

Webx响应和处理请求的流程

Velocity

Ibatis

Ibatis的作用

Ibatis的配置

参考资料

1. 综述

这两周的时间,通过看指南,看代码,跑实例,对淘宝网web应用开发框架有了一个整体的初步认识,主要包括四个方面:

Ø 项目管理工具Maven

Ø MVC框架Webx。

Ø Webx中的View层实现——Velocity

Ø Webx中的Model持久层实现——Ibatis

2. Maven部分

2.1. Maven基础

1. 坐标是指项目的唯一标识,以GAV(groupId,artifactId和version)区分,

groupId包含公司和内部组(或产品线)的信息,如com.taobao.mercury,表示taobao.com下的mercury项目

组;ArtifactId则表示项目的名称,如mercury-web,Version则表示某一Artifact的版本,如1.0-SNAPSHOT

2. 依赖是指项目所依赖的相关jar包

3. 仓库是指存放项目的产出(Artifact)的仓库,如http://mvnrepo.taobao.ali.com/mvn/repository

4. 插件是Maven的设计机制,Maven包含一个核心功能组件,而扩展功能都是通过插件完成,即使我们最常见的编译功能也是通过compiler插件完成的。

2.2. POM基础

1.

一个pom.xml文件包含以下基本信

息:

2.3. 依赖管理

1. 依赖定义具体到version

2. 依赖可以传递

3. 标签定义依赖项的生效范围

4. 依赖的版本定义在父pom(项目pom)中,子pom(模块pom)设置,继承父pom

5. 设置一个虚拟的总项目,多个实际项目作为总项目的模块

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‑1

3.1.2. Webx各层我们要做的工作的工作:

l V层(Web):采用Velocity书写vm模版,书写一个同名的Java类来接收Command,并处理业务逻辑(void

execute(RunData,TemplateContext)),并根据处理得到的结果(Result对象),准备好vm模版中所需要的数据

(TemplateContext.put(String key, Object value))。

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.xml中,另一些默认定义在框架中。这些tools可以再vm模板中被直接引用。Global作用域的tool在系统初始化时创建,Request作用域的tool在每次HTTP请求时创建。

3.

Modules:turbine中的基本编程模块。Screen用来处理页面显示逻辑;Control和screen类似,但可以被别的screen或

layout引用;Action处理用户提交表单。所有module都实现Module接口:public interface Module

{void execute(RunData rundata) throws WebxException;}

3.2.2. Mecury项目目录结构

mercury

├─assets

├─biz

│ ├─src

│ │ ├─main.java.com.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

└─deploy

mercury

└─protocal

├─.settings

├─src

│ ├─main.java.com.taobao

│ │ ├─common

│ │ └─mercury

│ │ ├─domain

│ │ └─util

│ │ └─partition

│ └─test

└─target

mercury

└─web

├─.settings

├─src

│ ├─main

│ │ ├─assembly

│ │ ├─filter

│ │ ├─java.com.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

│ └─test.java.com.taobao.mercury

└─target

3.2.3. Webx应用启动流程

Webapp\WEB-INF\web.xml是SpringExt的配置文件,下面是mercury-web中的样本:

"1.0"encoding="GB2312"?>

"2.4"xmlns="http://java.sun.com/xml/ns/j2ee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

loggingRoot

${mercury.loggingRoot}

......

com.alibaba.citrus.logconfig.LogConfiguratorListener


com.alibaba.citrus.webx.context.WebxContextLoaderListener

......

sessionFilter

com.taobao.session.TaobaoSessionFilter

tbsessionConfigGroup

${mercury.session.filter.group.name}

isloginSessionCheck

true

sessionFilter

*.htm

......

timer

com.alibaba.webx.filter.timer.TimerFilter

threshold

${mercury.timer.threshold}

timer

/*

webx

com.alibaba.citrus.webx.servlet.WebxFrameworkFilter

mdc

com.alibaba.citrus.webx.servlet.SetLoggingContextFilter

mdc

/*

webx

/*

index.html

index.jsp




400

/error.html

......

通过查资料,结合web.xml配置的内容,一个Webx应用的启动流程如下:

1. 初始化context-param

2.

执行各个listener,其中WebxContextLoaderListener初始化被Webx包装过的

XmlWebApplicationContext(spring容器)及各个子容器,各种webx.xml里定义beans(包

括标签定义的服务)都被装载。

3.

加载各个filter:其中TimerFilter(timer)用来记录serverlet执行时

间,WebxFrameworkFilter(webx)用来处理web请求,SetLoggingContextFilter(mdc)用来通过

SLF4J MDC来记录用户和请求的信息。三者顺序为timer->webx->mdc。

web.xml中各种元素的含义:http://ajava.org/readbook/J2EE/servletjsphxbc2/17212.html

3.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应当执

valve强制退出。然后WebxRootController就会“放弃控制”,这意味着request将被返还给/WEB-INF/web.xml中

定义的servlet、filter或者返还给servlet engine本身来处理。

webapp\common\pipeline.xml配置了mercury-web的PipeLine:

"1.0"encoding="UTF-8"?>

"http://www.alibaba.com/schema/services"

......

xsi:schemaLocation="http://www.alibaba.com/schema/services

...... "

>

xmlns="http://www.alibaba.com/schema/services/pipeline/valves">

"com.alibaba.turbine.pipeline.SetLoggingContextValve"/>

"com.taobao.mercury.web.common.valve.DefaultAnalyzeURLValve"/>

class="com.taobao.mercury.web.common.valve.SecurityCheckValve"/>

"com.taobao.mercury.web.common.valve.SessionValve"/>

"com.taobao.common.pagecache.webx.PageCacheValve"

p:action="start"/>

extension="vm, jsp"/>

extension="do"/>

"com.taobao.common.pagecache.webx.PageCacheValve"

p:action="end"/>

"com.taobao.mercury.web.common.valve.SessionValve"

p:action="clean"/>

"com.alibaba.turbine.pipeline.SetLoggingContextValve"

p:action="cleanup"/>

假设用户以URL:http://favorite.daily.taobao.net/collect_list.htm来访问Webx应用。

WebxFrameworkFilter接收请求,并且一路顺利到达pipeline。然后Pipeline开始依次执行它的valves(下面的描述略

过一些相对次要的步骤):

1. - 分析URL

分析URL的目的是取得target,这里取得的target是collect_list.htm。如果用户访问的URL中并没有提供path信

息,通常被理解为:用户想要访问“主页”。AnalyzeURL

valve提供了一个可选的参数“homepage”,即是在这种情况下起作用。得到的target为“homepage”。

需要注意的是,target不代表模板名,也不代表类名。Target只是一个抽象的概念 —— 当前页面需要达成的目标。Target可能被后续的valves解释成模板名、类名或者其它东西。

2. 进入 - 多重分支

很明显,“collect_list.htm”满足了第一个所附带的条件:,意思是target的后缀为“jsp”或为“vm”。

3. - 执行action

和其它框架中的action概念不同,在Webx Turbine中,action是用来处理用户提交的表单的。

因为本次请求未提供action参数,所以跳过该步骤。

4. - 查找并执行screen。

如果target-extension为”do”,则没有这个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. - 渲染模板

这里用到两个规则: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/default

Layout模板如果找不到,就直接渲染screen模板;如果存在,则把渲染screen模板后的结果,嵌入到layout模板中。

Layout模板和screen模板中,都可以调用control。每个页面只有一个screen,却可以有任意多个controls。

6. - 内部重定向

在screen和action中,可以进行“内部重定向”。内部重定向实质上就是由实施的 —— 如果没有重定向标记,就退出;否则循环到标签。

和外部重定向不同,外部重定向是向浏览器返回一个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.xml

2. 总配置文件SqlMap-Config.xml

3. 映射文件collection_item_mapping.xml

6. 参考资料

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,646评论 4 366
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,979评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,391评论 0 250
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,356评论 0 215
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,740评论 3 293
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,836评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,022评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,764评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,487评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,728评论 2 252
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,200评论 1 263
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,548评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,217评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,134评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,921评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,919评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,766评论 2 274

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,105评论 18 139
  • 附上原文作者连接:作者:金诚 一.榜单介绍 排行榜包括四大类: 单一框架:仅提供路由、网络层、UI层、通信层或其他...
    这个美嘉不姓陈阅读 2,226评论 1 35
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,585评论 25 707
  • 人生如红酒 醇香伴随着酸楚苦涩 红酒作菜 品味的正是人生 -- 法式红酒烩鸡 -- 用料 鸡腿 2个 小土豆 20...
    亲邻生活圈阅读 246评论 0 0
  • 文 安之若书 你还手握着梦想吗? 小时候的你,不知道什么是梦想? 但你整天脱口而出的话语, 往往是最朴素最原始的梦...
    安之若书阅读 335评论 0 0