webx框架解析

article/2025/9/29 6:15:48

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

WebX框架是阿里巴巴集团开发的,它建立在SpringEx的基础上,具有超强的扩展能力。

一、Webx的层次结构(从里到外)

(1)SpringExt:基于Spring,提供扩展组件的能力

(2)Webx Framework:基于Servlet API,提供基础服务

(3)Webx Turbine:基于Webx Framework,实现具体的网页功能

二、Webx的初始化

位置:/WEB-INF/web.xml文件

 <!-- 装载/WEB-INF/webx.xml, /WEB-INF/webx-*.xml --><listener><listener-class>com.alibaba.citrus.webx.context.WebxContextLoaderListener</listener-class></listener>

结果:自动搜索/WEB-INF目录下的XML配置文件,并创建级联的Spring容器。

/WEB-INF/webx.xml->/WEB-INF/web-app1.xml->/WEB-INF/webx-app2.xml

三、初始化日志系统

添加方式:

 初始化日志系统<listener><listener-class>com.alibaba.citrus.logconfig.LogConfiguratorListener</listener-class></listener> 

四、Webx响应请求

Webx响应请求的流程:

(1)WebxFrameworkFilter接收请求

(2)WebxRootController创建和处理request context,路由到子应用,并提供处理异常、开发模式功能。

(3)WebxController进行apps' pipeline

当一个HTTP请求到达时,WebxFrameworkFilter接收请求的模板配置(/WEB-INF/webx.xml)如下:

<filter><filter-name>webx</filter-name><filter-class>com.alibaba.citrus.webx.servlet.WebxFrameworkFilter</filter-class><init-param><param-name>excludes</param-name><param-value><!-- 需要被“排除”的URL路径,以逗号分隔,如/static, *.jpg。适合于映射静态页面、图片。 --></param-value></init-param><init-param><param-name>passthru</param-name><param-value><!-- 需要被“略过”的URL路径,以逗号分隔,如/myservlet, *.jsp。适用于映射servlet、filter。对于passthru请求,webx的request-contexts服务、错误处理、开发模式等服务仍然可用。 --></param-value></init-param></filter>

为什么使用filter而不是servlet?如果webx发现某个请求不应该由webx来处理,就会把控制“返还”给原来的控制器,而Servlet不具备“返还控制”的机制。

RequestContext对象的标准模板如下:

    <!-- 设置request/response/session。 --><services:request-contexts><request-contexts:basic /><request-contexts:buffered /><request-contexts:lazy-commit /><request-contexts:parser /><request-contexts:set-locale defaultLocale="zh_CN" defaultCharset="UTF-8" /><request-contexts:session><id><cookie path="/" maxAge="0" httpOnly="true" /></id><stores><session-stores:cookie-store id="temporaryCookie"><cookie name="tmp" /></session-stores:cookie-store></stores><store-mappings><match name="*" store="temporaryCookie" /></store-mappings></request-contexts:session></services:request-contexts>

五、Webx Turbine

它的基本准则是:约定胜于配置,即:工程师只需要根据一定的规则,将模板放在指定的目录、按照预定的方式命令module(也就是screen、action、control等),就不再需要额外的配置。

Turbine的基本页面组成为:

 

(1)Screen:代表页面的主体

(2)Layout:代表页面的布局

(3)Control:代表嵌在screen和layout中的页面片段

页面布局图如下:

 

六、Webx Turbine处理页面的基本流程

Webx Turbine的处理流程被定义在pipeline中,pipeline推荐的配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns:beans="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xmlns:services="http://www.alibaba.com/schema/services"xmlns:pl-conditions="http://www.alibaba.com/schema/services/pipeline/conditions"xmlns:pl-valves="http://www.alibaba.com/schema/services/pipeline/valves"xsi:schemaLocation="http://www.alibaba.com/schema/services http://localhost:8080/schema/services.xsdhttp://www.alibaba.com/schema/services/pipeline/conditions http://localhost:8080/schema/services-pipeline-conditions.xsdhttp://www.alibaba.com/schema/services/pipeline/valves http://localhost:8080/schema/services-pipeline-valves.xsdhttp://www.springframework.org/schema/beans http://localhost:8080/schema/www.springframework.org/schema/beans/spring-beans.xsd"><services:pipeline><!-- 初始化turbine rundata,并在pipelineContext中设置可能会用到的对象(如rundata、utils),以便valve取得。 --><pl-valves:prepareForTurbine /><!-- 设置日志系统的上下文,支持把当前请求的详情打印在日志中。 --><pl-valves:setLoggingContext /><!-- 分析URL,取得target。 --><pl-valves:analyzeURL /><!-- 检查csrf token,防止csrf攻击和重复提交。假如request和session中的token不匹配,则出错,或显示expired页面。 --><pl-valves:checkCsrfToken /><pl-valves:loop><pl-valves:choose><when><!-- 执行带模板的screen,默认有layout。 --><pl-conditions:target-extension-condition extension="null" /><pl-valves:performAction /><pl-valves:performTemplateScreen /><pl-valves:renderTemplate /></when><when><!-- 执行不带模板的screen,无layout。 --><pl-conditions:target-extension-condition extension="do" /><pl-valves:performAction /><pl-valves:performScreen /></when><when><!-- 创建JSON,无模板,无layout。 --><pl-conditions:target-extension-condition extension="json" /><pl-valves:performScreen /><pl-valves:renderResultAsJson /></when><otherwise><!-- 将控制交还给servlet engine。 --><pl-valves:exit /></otherwise></pl-valves:choose><!-- 假如rundata.setRedirectTarget()被设置,则循环,否则退出循环。 --><pl-valves:breakUnlessTargetRedirected /></pl-valves:loop></services:pipeline></beans:beans>

流程具体解读如下:

(1) 分析URL::用户访问的主页target

(2) 进入choose,进行多重分支选择

(3)performAction执行action

(4) performTemplateScreen查找并执行screen

假设target为xxx/yyy/zzz,那么Webx Turbine查找screen模块的顺序为:

Screen.xxx.yyy.zzz

Screen.xxx.yyy.Default

Screen.xxx.Default

Screen.Default

(5) 渲染模板

首先映射成screen template,以及映射成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模板中。

七、Filter的用途

页面授权:根据登录用户的权限,阻止或许可用户访问特定的页面。

日志和审计:记录和检查用户访问WEB应用的情况。

图片转换:改变图片的格式、精度、尺寸等。

页面压缩:压缩页面内容,加快下载速度。

本地化:显示本地语言和风格的页面。

XSLT转换:对XML内容进行XSLT转换,使之适用于多种客户端。

高速缓存:高速缓存页面,提高响应速度。

使用方法:【重要】WebX框架解析及使用教程之一

Webx提供了Request Contexts服务以及Pipeline作为对Filter功能缺陷的补充,作用分别如下:

(1) Request Contexts:负责访问和修改request和response,但不负责改变应用执行的流程

(2) Pipeline:提供应用执行的流程,但不关心和request和response

八、Spring中依赖注入的限制

小作用域的对象不能被注入到大作用域的对象。你不能把request和response作用域的对象注入到singleton对象中。前者在每次WEB请求时,均会创建新的实例,每个线程独享这个request/session作用域的对象;后者是在Spring初始化或第一次使用时被创建,然后被所有的线程共享。假如把某个request/session作用域的对象意外注入到singleton对象中,将可能产生致命的应用错误,甚至导致数据库的错乱。

在Webx中,这样做是可以的!奥秘在于Request Contexts服务对上表所列的这些短期对象作了特殊的处理,使它们可以被注入到singleton对象中。事实上,被注入的只是一个“空壳”,真正的对象是在被访问到的时候才会从线程中取得的。

九、buffered缓存response中内存的实现原理

Webx支持用layout/screen/control等部件共同构成一个页面。其中,每个layout可包含一个screen和多个control,每个screen可包含多个control,每个control还可以在包含其他的control。

一般页面比如通过out.println("

hello world

");就直接输出了,为了还能分开然后再一起显示呢。例如,一个screen中包含了一个control,那么screen可以获得它所调用的control的完整的渲染内容。

这个玄机就是靠来实现的。改变了response的输出流,包括output stream和writer,使写到输出流中的内容被暂存在内存中。当需要时,可以取得缓存中的所有内容。

Buffered机制会延迟服务器对用户的响应,所以某些场景需要关闭该服务。

十、表单验证的模板

该文件form.xml位于WEB-INF的每个子目录中,用于表单的验证

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns:beans="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xmlns:services="http://www.alibaba.com/schema/services"xmlns:fm-conditions="http://www.alibaba.com/schema/services/form/conditions"xmlns:fm-validators="http://www.alibaba.com/schema/services/form/validators"xsi:schemaLocation="http://www.alibaba.com/schema/services http://localhost:8080/schema/services.xsdhttp://www.alibaba.com/schema/services/form/conditions http://localhost:8080/schema/services-form-conditions.xsdhttp://www.alibaba.com/schema/services/form/validators http://localhost:8080/schema/services-form-validators.xsdhttp://www.springframework.org/schema/beans http://localhost:8080/schema/www.springframework.org/schema/beans/spring-beans.xsd"><services:form postOnlyByDefault="true"><!--- ===============================================- 用来检查csrf token。- ===============================================--><group name="csrfCheck"><field name="csrfToken"><fm-validators:csrf-validator><message>提交的数据已过期</message></fm-validators:csrf-validator></field></group><!--- ===============================================- Simple form- ===============================================--><group name="register" extends="csrfCheck"><field name="name" displayName="你的名字"><fm-validators:required-validator><message>必须填写 ${displayName}</message></fm-validators:required-validator></field></group></services:form></beans:beans>


 

十一、Eclipse中开发Webx应用

(1)Webx工程目录结构 

src\main:存放开发代码

src\test:存放开发自测代码,如单元测试代码

main\java:存放java代码

main\resources:存放资源定义文件

main\webapp:web应用配置文件

webapp目录包含(举例):

【重要】WebX框架解析及使用教程之一

1)子应用模板目录admin、home、store、user,每个模板目录又由layout、control、screen三个子目录组成,包含对应的模板文件(.vm文件)

2)通用模板目录common

3)WEB-INF目录

这是java web应用必备的配置目录,包含了web.xml(java web应用必备的配置文件)、webx.xml(webx配置文件)、日志配置文件(log4j.xml、logback.xml)、子应用配置文件(webx-admin.xml、webx-home.xml、webx-store.xml、webx-user.xml);另外还有对应每个子应用的文件夹,用于存放form定义文件(form.xml)和访问权限定义文件(access.xml);common文件夹中的pipeline.xml和pipeline-exception.xml定义了相关的管道操作流程。

(2)页面获取JAVA层的数据PullTool

在velocity模板中使用pulltool方便我们进行页面输出内容的控制,组织页面的展示,或者是直接取得web层相关的一些对象,直接在vm中调用。由页面拉动业务逻辑,获取并控制需要展示的内容,而非应用程序推动push,这符合webx的页面驱动的模式。

1)是否启动pull服务:

 【重要】WebX框架解析及使用教程之一

在webx.xml文件中进行总的控制

2)指定获取数据的JAVA处理模块

【重要】WebX框架解析及使用教程之一   

指定了获取的数据位于com.xx.web.ui.module.*

3)在/xx/templates/screen下创建testMain.vm(M需要大写)文件,内容如下:

  【重要】WebX框架解析及使用教程之一

4)在/src/main/java/com/web/ui/module/screen下创建文件TestMain.java(webx会自动匹配同名的文件),内容如下:

 

package com.yunos.tv.openbase.web.ui.module.screen;

 

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import com.alibaba.citrus.turbine.Context;

 

public class TestMain {

public void execute(HttpServletRequest request, HttpServletResponse response, Context context) throws Exception{

context.put("name", "Hugh");

}

 

}

 execute方法就是专门用来处理对应请求的,是webx潜规则的地方,它是页面渲染之前处理的方法。

有些参数为:public void execute(@Param("systemVersion") String systemVersion,HttpServletRequest request, HttpServletResponse response, Context context, Navigator nav),说明如下:第一个参数为传进来的信息,context对象负责页面渲染时部分数据的修改。

 

(2)实现form表单功能

实现用户账号登陆的功能,如果用户不输入则提示用户输入相关信息,效果如下:【重要】WebX框架解析及使用教程之一


【重要】WebX框架解析及使用教程之一
 

其具体代码如下:

login.vm文件:

【重要】WebX框架解析及使用教程之一
form.xml文件:

【重要】WebX框架解析及使用教程之一
 

关键点说明如下:

1.【重要】WebX框架解析及使用教程之一 

这表示提交之后执行的是LoginAction.java,这里的value值login_action在程序内部会被处理成 LoginAction,因此这里如果写成value="LoginAction",结果是一样的

 

2.【重要】WebX框架解析及使用教程之一

这里提交后表示执行的方法是doUserInfoSumbit方法,如果你要执行其他方法请修改name值name="event_submit_你的方法"

 

3.关联form.xml:首先 #set ($group = $form.loginInfoGroup.defaultInstance)[固定写法,loginInfoGroup对应form.xml中的services:group name="loginInfoGroup"],然后

 【重要】WebX框架解析及使用教程之一

name对应到form.xml中的规则,group.username.message就是需要显示的错误信息。

 

4.$csrfToken.hiddenField是必须要添加的,防止跨站请求伪造攻击。如果不添加的话,数据是不会从显示层传送给JAVA层的。

 

(3)实现form表单往JAVA层传送数据功能

1、构造与表单对应的类LoginInfo:

package com.yunos.tv.openbase.biz.dataobject;

 

public class LoginInfo {

private String username;

private String password;

public String getUsername() {

return username;

}

public void setUsername(String username) {

this.username = username;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

 

}

、1q     其中username和password的值需要和form.xml中定义的保持一致,否则两者无法建立联系。

(2)   2.编辑业务功能LoginAction.java:

     

import com.alibaba.citrus.turbine.dataresolver.FormGroup;

import com.yunos.tv.openbase.biz.dataobject.LoginInfo;

 

public class LoginAction {

 

public void doUserInfoSumbit(@FormGroup("loginInfoGroup")LoginInfo userLoginInfo, HttpServletResponse response, Context context, Navigator nav) throws Exception{

System.out.println("hello");

System.out.println(userLoginInfo.getUsername());

   3.     

            3.如果数据模型LoginInfo和LoginAction不在同一个工程中,则LoginAction应该探测不到LoginInfo.class,需要LoginInfo先编译生成class文件,然后LoginAction才可以使用LoginInfo类。在LoginInfo所在的工程使用mvn clean install命令重新进行编译,然后在LoginAction刷新下引入该类。

转载于:https://my.oschina.net/fivewang/blog/713905


http://chatgpt.dhexx.cn/article/JA4sftZ4.shtml

相关文章

Webx mvc 源码

Webx命名规范 Web请求响应 当Webx Framework接收到一个来自WEB的请求以后,实际上它主要做了两件事: 首先,它会增强request、response、session的功能,并把它们打包成更易使用的RequestContext对象。 其次,它会调用相应子应用的pipeline,用它来做进一步的处理。 假如在…

WebX源码研读

WebX是公司应用最为广泛的web框架&#xff0c;目前已经开源。一直以为webX是基于spring MVC的&#xff0c;但其实并不是&#xff0c;那么不同之处到底在何处&#xff0c;又是为什么这样实现&#xff1f;看过了源码&#xff0c;在这里梳理下思路 我以为&#xff0c;在业务层面上…

WebX框架使用说明

前言 标准MVC开源框架有很多&#xff08;Struts、SpringMVC、Webx&#xff09;&#xff0c;对于生活在开源世界里面的码农来说SpringMVC、Struts是接触比较多&#xff0c;也是最熟悉的框架。 知己知彼 以配置SpringMVC为例&#xff0c;我们常常关注的点主要有以下几个方面&a…

webx学习总结

webx学习总结 一 Webx的概括 WEBX是阿里巴巴的部框架&#xff0c;“就是把页面与Service之间的一些Servlet等公共的东西抽象出&#xff0c;提供相的服务以提高发效率&#xff08;《接口之Webx介》—何晓峰 &#xff09;”&#xff0c;可以看出&#xff0c;webx和统的servlet-ac…

Webx MVC分析

Webx框架&#xff1a;http://openwebx.org/ petstore:webx3/webx-sample/petstore/tags/3.0/petstore 编译之后&#xff1a;mvn jetty:run即可, 访问&#xff1a; http://localhost:8081/ Webx MVC(以webx3为基础) 1、webx3的入口点 <filter> <filter-name>…

Webx MVC

首先在Webx中&#xff0c;使用WebxContextLoaderListener替代Spring的ContextLoaderListener&#xff1a; <listener><listener-class>com.alibaba.citrus.webx.context.WebxContextLoaderListener</listener-class></listener><filter><filt…

Webx学习

六月中就要去阿里巴巴实习了,部门使用的web框架是Webx,喜大普奔的发现Webx是开源的,所以认真学习一下。主要参考指导手册 Webx总体介绍 设计理念 这里有许多框架设计的真知灼见! 一个框架的好坏,往往并不是由他所实现的具体功能好坏所决定的,而是由其所使用的基础框架…

webx mysql_idea使用Maven启动maven项目、 webx框架项目

一、打开 二、点击号选择maven 三、 (1)、Working directory : 选择项目路径 (2)、Command line: clean jetty:run-war -Djetty.port8086 -Dautoconfig.charsetUTF-8 -Dmaven.test.skip (3)、VM Options: -server -XX:PermSize256M -XX:MaxPermSize512M (4)、点击Environment V…

webx mysql_Webx项目的获取与验证

在JavaWeb环境配置后就可进行Webx实例项目的获取与研读了。 1.创建一个初始的Demo工程。 1)下载 Webx Maven 项目的目录结构Artifact插件。 2) 创建WebxDemo项目 打开命令行工具(Windows cmd或Unix/Linux bash)&#xff0c;输入如下命令&#xff1a; mvn archetype:generate -D…

Webx框架

Webx是一个框架&#xff0c;它可用来做下面的事情&#xff1a; 创建一个全功能的Web应用 Webx提供了创建一个Web应用所需要的所有必要功能. 创建一个新的Web框架 Webx允许你定制、甚至重写大部分的Webx框架逻辑&#xff0c;从而实现全新的功能&#xff0c;或者和其它应用框…

Webx简介(转)

经常会到博客来看看大家的一些文章&#xff0c;都写的相当精彩&#xff0c;有水平&#xff0c;感觉大家好像都写了&#xff0c;自己没什么写的&#xff0c;后来跟师傅婉佩沟通&#xff0c;才了解到这样想是错的&#xff0c;每个人针对每个东西可能想法观点都不同&#xff0c;写…

WebX入门指南

[说明] 本文围绕WebX的Web框架展开&#xff0c;试图将整个开发中使用的软件栈或者说生态系统串联起来。本文中不讲解原理性的东西&#xff0c;只是讲解各种场景下如何使用WebX相关的技术。入门指南中涉及到的实践指南和原理指南&#xff0c;不会展开&#xff0c;在后续博文中&a…

WebX框架解析及使用教程

WebX框架是阿里巴巴集团开发的&#xff0c;它建立在SpringEx的基础上&#xff0c;具有超强的扩展能力。 一、Webx的层次结构&#xff08;从里到外&#xff09; &#xff08;1&#xff09;SpringExt&#xff1a;基于Spring&#xff0c;提供扩展组件的能力 &#xff08;2&#xf…

VSCode中Emmet使用

文章目录 HTML部分1. 添加类&#xff0c;id&#xff0c;文本和属性2. 嵌套和分组3. 隐式标签4. 定义多个元素* 和 编号$5. 添加虚拟文字6. 其它 CSS部分1. 属性和属性值的缩写2. 属性值的单位其它 HTML部分 1. 添加类&#xff0c;id&#xff0c;文本和属性 div.box#box > …

linux vim emmet,emmet-vim

最近啊&#xff0c;我投奔了网页的开发&#xff0c;看了一本《head first HTML and CSS》的书&#xff0c;感觉非常不错&#xff0c;然后又配置了一些vim里面用到的插件&#xff0c;现在我把学习到的东西记录下来&#xff01; 首先&#xff0c;我不会在这里写emmet 的具体操作方…

Emmet 语法

Emmet语法前身是Zen coding&#xff0c;来提高html和css的编写速度&#xff0c;vscode内部已经集成该语法了 1、快速生成html结构语法 生成标签&#xff1a; 直接输入标签名&#xff0c;再按TAB键&#xff0c;such as 你打个 div 再按tab&#xff0c;就会直接生成 (这里打不出…

emmet写法

1.写一个递增的img路径 img[srcimage/com/$$.png]*10 效果

6.Emmet 语法与快速格式化代码

Emmet语法可以让我们在写网页的时候速度更快&#xff0c;我当前写网页的工具是pycharm&#xff0c;在pycharm中使用Emmet&#xff0c;我们需要点击File,然后点击Setting 搜索emmet&#xff0c;保证这里是勾选状态 安装后如果不进行其他设置&#xff0c;emmet自动被勾选 目录 …

Emmet语法总结

1 Emmet简介 Emmet是一个Web开发工具&#xff0c;用于加快HTML和CSS代码的编写速度。使用Emmet能够通过简短的表达式生成HTML或CSS代码片段。另外&#xff0c;截至2022年&#xff0c;主流的编辑器工具如Visual Studio Code、WebStorm都已经集成了Emmet工具&#xff0c;无需手动…

Linux 配置全面讲解(安装JDK、Mysql、Nginx)

1 Linux概述 1.1 Linux介绍 Linux是一套免费使用和自由传播的类Unix操作系统&#xff0c;是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思…