目录

1、Webx简介

2、创建webx应用

 

一、Webx简介

  Webx本质上就是一个Web框架,它建立在Java Servlet API基础之上。上图所示是webx的架构图。webx本身类似于spring容器,webx turbine类似于springMVC框架。webx中有一个特别明显的原则:约定优于配置。

  1.web控制器: 所有web请求都交给一个叫WebxControlServlet(即图上的web控制器)。当然你也可以配置只有部分经过webx控制器,其它部分经过其它的控制器。

  2.service框架,webx控制器初始化时会初始化service框架,service框架会初始化下面这些service(ResourceLoaderService, RunDataService,ModuleLoaderService,PipelineService,FormService,MappingService,PullService,URIBrokerService,VelocityService)。当然你也可以扩展更多的service。

  3.管道处理web请求: 当请求到达时,管道pipeline会调用valves一个传递一个地处理。

  4.web应用: 就是基于webx框架开发的应用。一般有三个层,VO(View Object),显示层。AO(Application Object),显示层(一般处理大粒度的业务逻辑与控制逻辑)。BO(Business Object)业务逻辑(细数度的业务逻辑)。DO(Data Object)数据层(一般与持久层通信)。这里其实还少画了一个层,就是持久层,持久层主要是DAO(Data Access Object)。

  5.Spring框架: 即开源的Spring框架,并做了简单扩展。

  从一个web请求到结束都经历了哪些阶段:首先,web请求首先到WebxControlServlet处理, WebxControlServlet获取管道服务,交给管道服务。其次,web请求到达管道服务,管道服务有多个阈[yù]值(Valve),Valve非常类似于Filter,但有一个比较大的区别是,Filter是顺序从配置文件配置好后就固定了,而Valve由于是Webx特定设计的,支持流程跳转。如:支持switch分支,支持goto,支持try/catch/finally分支,请求经过各个Valve。不过Valve是可以跳转或有判定条件,并不是每个Valve都需要经过。最后,管理处理完后就直接生成响应。当然,中间有可能走外部重定向那就会开启另一个web请求流程。webx(spring)本身类似与一个spring容器,webx turbine(spring MVC)框架才是真正的web框架。

  上帝是如何创造万物的呢?上帝如果要创造人,那就是把先人的骨架给创建出来,然后就可以补上所有器官与血管,然后才是肉,皮等等。那么webx相当于(web应用)上帝,webx turbine框架相当于人的骨架,而且我的应用框架当然相当于是器官与血管,最后我们的应用就相当于是肉啊,皮啊,其它的等等。这么一看就很好理解了吧。如果上帝想创建能飞的动物会是怎么样呢?那就需要先弄个能飞的骨架出来。也就是如果我们觉得turbine框架不好,要来个新的,你也可以自己定义一个新的框架基于webx框架即可。与Spring比较,webx相当于spring容器。webx turbine相当于spring的MVC框架(webx service框架根当于spring容器,都是IOC,或叫DI原理)。在spring上可以建立许多新的MVC框架,或直接整合新的MVC框架(比如用spring容器可以整合struts框架,springMVC框架);同样在webx上可以立许多新的MVC框架。

  webx中涉及特色,管道与过滤器涉及模式filter。Filter机制在项目中常用来实现如下功能:页面授权,根据登录用户的权限,阻止或许可用户访问特定的页面;日志和审计,记录和检查用户访问WEB应用的情况。Filter的通用性很好。任何filter均独立于其它filter和servlet,因此它可以和任意其它filter和servlet组合搭配。下面是一段配置示例 ── 通过SetLoggingContextFilter,日志系统可以记录当前请求的信息,例如:URL、referrer URL、query string等

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="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
">
<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>
...
</web-app>

  Filter工作原理(Filter chain),多个filter和至多一个servlet被串联成一个链,被称为Filter Chain。执行的时候,引擎将控制权交给链条中的头一个filter(如果有的话)。然后,就像击鼓传花一样,控制权被依次传递给filter chain中的下一个filter或servlet。每一个得到控制权的filter可以做下面的事:继续传递控制权或立即终止filter chain;Filter可将控制权传递给链条中的下一个filter或者最终的servlet;Filter也可以不将控制权传递给下一个filter或servlet,这样便中止了整个filter chain的执行。预处理。在传递控制权给下一个filter或servlet之前,filter可以预先做一些事情:设置request、response中的参数,例如:character encoding、content type等;将HttpServletRequestWrapper传递给链条中的下一位,filter可以通过wrapper改变request中的任意值;将HttpServletResponseWrapper传递给链条中的下一位,filter可以通过wrapper来拦截后续filter或servlet对response的修改、提交。在控制权从filter chain中返回以后,filter还可以做一些后续提交的操作。例如,将response中拦截而来的数据,压缩或转换格式,并发送给客户端或filter chain的上一级,通过try、catch还可以捕获filter chain下一级所有的异常,并做处理。

  filter的限制,Filter是很有用的。作为servlet的补充,filter也是很成功的。但是filter并没有被设计用来完成一切事情。事实上,filter的设计限制了filter的用途。每个filter具有下面的限制:Filter可以访问和修改数据。但它只能访问和修改HttpServletRequest、HttpServletResponse、ServletContext等容器级的对象,而不能(或很难)访问应用程序中的状态。所以filter无法实现和应用逻辑密切相关的功能;Filter可以影响执行流程。但它不能改变filter chain的结构和顺序。Filter chain的结构和顺序是由web.xml中定义的。当filter得到控制权以后,它只能选择继续下去,或者立即结束,而没法进行循环、分支、条件判断等更复杂的控制。因此,filter只能用来实现粗粒度的流程控制功能(例如,当用户未获授权时,停止执行filter chain),难以应付更细致的应用程序内的控制需求;Filter与其它filter和servlet之间,除了request和response对象以外,无法共享其它的状态。这既是优点又是缺点。优点是使filter更独立、更通用;缺点是filter与其它filter、servlet之间难以协作,有时甚至会引起无谓的性能损失。

二、创建webx应用

      mvn archetype:create -DgroupId=com.alibaba.study -DpackageName=com.alibaba.study -DartifactId=webapp -DarchetypeArtifactId=maven-archetype-webapp

  WEB应用是JavaEE平台中最重要的一种应用。JavaEE WEB应用建立在Servlet API的基础之上。本文将由浅入深地指导你创建一个基本的WEB应用。上图,先用mvn命令创建一个web项目。得到如下的配置文件

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.alibaba.study</groupId>
<artifactId>testWeb</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>testWeb Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>testWeb</finalName>
</build>
</project>

  我们依次在上述配置文件中加入,在dependencies节中加入servlet依赖:

<!-- 应证了那句话:webx是建立在Java Servlet API基础之上的容器 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.4</version>
<scope>provided</scope>
</dependency>

  再加入maven配置:

      <plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>5</source>
<target>5</target>
</configuration>
</plugin>
</plugins>

  接下来执行:

mvn eclipse:eclipse -Dwtpversion=2.0

  这样便生成了.classpath和.project这两个eclipse相关的文件。Dwtpversion表示为项目增加Dwt支持,这样项目就成为一个Dwt可识别的web项目,这样就可以通过eclipsewtp部署到web服务器。注意:目前mvn支持的wtp版本最高为2.0,所以目前只能写2.0,而不能写最新的3.2。请打开Eclipse并导入这个项目,至此,你就可以在eclipse下开发项目了。接着,通过Eclipse导入刚才创建的项目。

package com.alibaba.study;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import java.io.IOException;
import java.io.PrintWriter; public class HelloServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html; charset=GBK"); PrintWriter out = response.getWriter(); out.println("<html>");
out.println("<head>");
out.println(" <title>SimpleServlet</title>");
out.println("</head>");
out.println("<body>");
out.println(" <p>你好,世界!</p>");
out.println("</body>");
out.println("</html>");
}
}

接着创建HelloServlet.java类,这是一个简单而完整的Servlet程序。我们一会来介绍它所包含的技术内涵,现在,让我们先把这个程序跑起来。为此,我们需要修改一下web.xml。在开发环境中,这个文件位于src/descriptors/web目录下,然而在build的时候,它将被复制到WEB应用的WEB-INF目录下。

<?xml version="1.0" encoding="GB2312"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>com.alibaba.study.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>

然后执行命令mvn package,如果一切正常,你会发现在项目的target目录多了一个WAR包:testWeb.war。最后一步,就是把这个WAR包布署到应用服务器上,我们采用eclipse下配置tomcat方式进行。在testWeb项目上面点击右键,选择run as ->Run on Server。

  分析一下Servlet的执行过程,这个Servlet是怎么被执行的呢?首先,我们必须了解,无论采用何种技术,WEB应用的本质是相同的。即浏览器和服务器之间,通过HTTP协议通信。所以WEB协议是跨平台的,而不是专属于Java的。因此,为了更好地理解Java Servlet,我建议你安装一个IE的插件如HttpWatch,或者代理软件如TCP Monitor。通过它们,你可以观测浏览器和服务器之间的通信情况,从而更好地理解HTTP协议和Java Servlet。

通过它,我们可以看到浏览器发送给WEB服务器的请求的内容:“GET /workshop/hello HTTP/1.1”;我们也可以看到服务器发回浏览器的响应:“HTTP/1.1 200 OK”。这个工具非常有用,尤其对我们跟踪重定向、session、cookie特别有用。通过它也可以观测到一些不明显的错误,而这些错误可能无法在浏览器中直接表现出来。现在,我们已经了解了:WEB应用就是接收浏览器发送的HTTP请求,然后作出响应,返回给浏览器。而Servlet只不过是WEB应用中的一个“插件”,用来处理某一种请求。

当应用服务器接收到一个HTTP请求时,它就会:

1.根据URL找到相应的WEB应用。例如:在http://localhost:8080/workshop/hello中,/workshop决定了该请求应该交给workshop应用来处理。这部分URL被称为Context Path。

2.进一步根据URL的余下部分,在web.xml中查找匹配的servlet。由于我们在web.xml中指定了<servlet-mapping>,将/hello映射到helloServlet上,所以,应用服务器会找到这个servlet,并执行它。这部分URL被称为Servlet Path。

当Servlet收到请求时,其service()方法将被执行。不过一般来说,我们不需要实现service方法,只需要实现doGet和doPost这两个方法就可以了,它们分别对应着HTTP Get和HTTP Post两种类型的请求。

三、  

 

 

 
 

深入webx框架(li)的更多相关文章

  1. 我的WebX框架学习总结与心得分享

    最近学习了webx框架, 利用博客园跟大家分享一下自己的学习心得; 周建旭 2014-08-21 网上关于webx的资料少的可怜, 怎么办?  这种情况下不用去求助别人求人只会耽误时间, 不用畏惧; ...

  2. Webx框架自带的petstore

    Webx框架:http://openwebx.org/ petstore:webx3/webx-sample/petstore/tags/3.0/petstore 编译之后:mvn jetty:run ...

  3. WebX框架学习笔记之一

    Webx是什么? Webx是一套基于Java Servlet API的通用Web框架.它在Alibaba集团内部被广泛使用.从2010年底,向社会开放源码. Webx的发展历史 2001年,阿里巴巴内 ...

  4. WebX框架的页面授权

    WebX框架的页面授权 什么是页面授权,简单来说就是对于一个Web应用程序里,哪些页面可以被哪些人在什么情况下访问进行限制.举个简单的例子,有些页面只有用户登录以后才能访问,而另外一些页面无论是否用户 ...

  5. Webx框架:Spring Schema 和 Spring Ext

    webx诞生的原因是当时市面上没有好用的web框架.如今的Web框架有非常多.然后它们背后的思想都是相似的,并且越来越趋同. Spring Schema 在传统的spring中,配置bean时须要手动 ...

  6. Webx框架:Valve详细解释

    Valve请求,用于控制过程的操作.它采用责任设计模式链(类别似至struts拦截器).valve阀装置,阀控制水流量(网络请求)趋势. 他们阀门定义. public class MyValve im ...

  7. WebX框架学习笔记之二----框架搭建及请求的发起和处理

    框架搭建 执行环境:windows.maven 执行步骤: 1.新建一个目录,例如:D:\workspace.注意在盘符目录下是无法执行成功的. 2.执行如下命令: mvn archetype:gen ...

  8. Webx框架:依赖注入

    Webx的依赖注入和Spring的依赖注入很像,仅仅是有一点点的差别. 注入的时候仅仅能让生命周期长的注入到生命周期短的对象中,比方requestScope对象注入到singleton时就会错误发生. ...

  9. Webx框架:Pipeline基本介绍

    Pipeline. 它是管道的含义.一个管道阀门可以安装非常多.有许多可能的分支.它是用来控制页处理.它需要在被定义pipeline.xml文件.该文件是为每个阀的标签.该文件可以放一些简单的控制语句 ...

随机推荐

  1. settimeout里面函数有无双引号的区别

    在写定时器时很容易搞混,所以记下防止忘记. 双引号中的作用域不捕捉局部变量,不用双引号包着的是捕捉局部作用域 var a = function() { alert(1111) } function a ...

  2. HTML中的title换行问题

    有时我们需要在html元素的title中换行显示信息.以下几种方法均可以实现: 直接在titile属性中使用换行,如下所示: asd">asdsadsad</a> 在tit ...

  3. html_01之基础标签

    1.嵌套规则:①行内不能嵌套块:②p不能嵌套块:③非布局元素不要嵌套div: 2.标准属性:①id:定义元素唯一名称(a.布局时用:b.JS用):②title:鼠标移入时提示的文字:③class:定义 ...

  4. 快速入门系列--WCF--04元数据和异常处理

    本章节将进行元数据和异常处理的介绍,这部分内容概念型比较强,可以快速浏览一下就好. 客户端和服务器借助于终结点进行通信,服务的提供者通过一个或者多个终结点将服务发布出来,服务的消费者则通过创建与之匹配 ...

  5. 谈谈主函数main

    我们来看一下主函数 public class HelloWorld{ public static void main(String[] args){ System.out.println(" ...

  6. python数据操作方法封装

    工作中经常会用到数据的插叙.单条数据插入和批量数据插入,以下是本人封装的一个类,推荐给各位: #!/usr/bin/env python # -*- coding:utf-8 -*- # Author ...

  7. SQL Server中关于跟踪(Trace)那点事

    前言 一提到跟踪俩字,很多人想到警匪片中的场景,同样在我们的SQL Server数据库中“跟踪”也是无处不在的,如果我们利用好了跟踪技巧,就可以针对某些特定的场景做定向分析,找出充足的证据来破案. 简 ...

  8. DOM操作表格

    前面的话 表格table元素是HTML中最复杂的结构之一.要想创建表格,一般都必须涉及表示表格行.单元格.表头等方面的标签.由于涉及的标签多,因而使用核心DOM方法创建和修改表格往往都免不了要编写大量 ...

  9. 前端学PHP之基础语法

    × 目录 [1]代码标识 [2]注释 [3]输出 [4]计算表达式 [5]大小写 [6]空白符 前面的话 PHP是一种创建动态交互性站点的强有力的服务器端脚本语言.PHP能够包含文本.HTML.CSS ...

  10. Java多线程系列--“JUC原子类”03之 AtomicLongArray原子类

    概要 AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray这3个数组类型的原子类的原理和用法相似.本章以AtomicLongArray对数 ...