`

WebWork初体验

阅读更多

        在这篇ASP.NET 中Session 实现原理浅析[2] 状态管理器Blog中,Flier老大向大家推荐了Java中几种Cache的实现,于是我就按图索骥,首先是找到OSCache的老家:OpenSymphony。哇,这里的资源真多啊,简直就是一个宝藏。为什么原来就没有发现呢?感谢Flier老大了!
        在OpenSymphony的主页上,我看到了两个让我觉得很亲切的项目:WebWork和Quarts。WebWork作为一个实现了IOC的轻量级Web Application Framework一直备受开发者的青睐;而Quarts更是在异步信息处理上大展拳脚了。看到了老朋友,我就只好暂时将新欢OSCache摆一边,找出我很久没有联系的老猫(Tomcat)去跟WebWork聊嗑了。
        做好了一切的准备工作之后[1],我尝试着做一个登陆注册的功能,以体验一下WebWork。跟其他的Web应用一样,我们首先要建立一个标准的WEB-INF目录(所谓标准就是目录下面包含lib和classes子目录以及Web.xml文件),接着在WEB-INF/lib下面放上WebWork所需要的.jar文件并在WEB-INF目录下建立Web.xml文件[2]。在完成了这些千篇一律的工作之后,我仔细的看了一下Web.xml中内容,它里面只定义了一个servlet:webwork,其对应的class为com.opensymphony.webwork.dispatcher.ServletDispatcher,然后由webwork这个servlet去处理所有.action的请求。看到这里,我暗自窃喜,这跟我熟悉的WAF框架是十分类似的,只不过MainServlet变成了ServletDispatcher,.do的请求变成了.action而已。
        接下来,就是到classes目录下建立xwork.xml文件,这个文件跟WAF中的mappings.xml很相似,因为对.action的处理都是在这里被定义的,而WAF中关于.do的处理则定义在mapping.xml中。但是也有一些我并不清楚的东西,如package和Interceptor。在classes目录下还要建立一个validator.xml文件,但是这个并不是必需的。做好了这些准备工作之后,就真正开始WebWork的体验之旅了。
        1、建立一个index.jsp(以下为主要部分):

<!----> <form action="Login.action" method="post">
  
<table cellspacing=0 width="100%">
    
<tr>
      
<td>Login ID:
        
<input type="text" name="loginId" width=100 />&nbsp;&nbsp;
          Password:
        
<input type="password" name="loginPassword" width=100 />&nbsp;&nbsp;
        
<input type="submit" value="Login" />
      
</td>
      
<td align=right>
         
Hello, <ww:property value="loginId" />
      
</td>
    
</tr>
  
</table>
</form> <!----><ww:property value< span="">

        需要注意的地方就是form的action属性的写法了;
        2、在xwork.xml中增加相应的处理action的节点

<!----> <action name="Login" class="fantasysoft.webwork.Login">
   
<result name="error" type="dispatcher">index.jsp</result>
   
<result name="success" type="dispatcher">index.jsp</result>
</action>

        这里需要注意的是action节点中name的值要与index.jsp中定义的action的名字要严格匹配,对于大小写是敏感的。在action节点中还包含了<result>节点,以说明处理action之后会可能出现的不同结果(name)和相应的处理方式(type)。譬如说,如果Login的这个action处理success了,则使用dispatcher将结果分(dispatch)到相应的页面。而在WAF框架中并没有这样的定义,因为在默认情况下如果不成功则会返回当前页面,不过可以定义FlowHandler,并拥有类似的功能且更加灵活;
        3、实现类Login的代码:

package fantasysoft.webwork;

import com.opensymphony.xwork.ActionSupport;

public class Login extends ActionSupport{
    
private String loginId;
    
private String loginPassword;

    
public String getLoginPassword() {
        
return loginPassword;
    }

    
public void setLoginPassword(String loginPassword) {
        
this.loginPassword = loginPassword;
    }

    
public String getLoginId() {
        
return loginId;
    }

    
public void setLoginId(String loginId) {
        
this.loginId = loginId;
    }

    
public String execute() throws Exception{             
        
if (!checkUserId()return ERROR;  // checkUserId is the method that will be implemented
            
else return SUCCESS;
    }

}

        在代码中,你会发现有两个继承变量ERROR与SUCCESS。这两个变量是定义在Action这个接口的,而ActionSupport则实现了Action接口。在接口Action的代码中,我们可以看到ERROR = "error"、SUCCESS = "success"。我们可以发现这两个变量的值与xwork.xml中result子节点中的name的值是相匹配。除此之外,在代码中,我也找不到了原来在开发中经常要用到的一个API:getParameter。事实上,将表单中数据析取出来的工作是由webwork这个唯一定义的servlet去完成的,而这个类会调用Login类中set的方法将用户输入的数据赋给Login类的属性:loginId和loginPassword。在这里,我们也要跟前面index.jsp中的包含的标签联系起来。当数据被dispatch回index.jsp的时候,在index.jsp页面render的过程中是调用了get的方法去获取相应的数据的。
        最后,我们可以总结一下,整个Web应用程序的处理流程了:
        首先,当用户提交了表单(form)至Login.action后,由web.xml中定义的唯一的一个servlet:webwork去处理这个请求。webwork会以action的name:Login到xwork.xml中寻找相应的处理action的类,于是就找到了fantasysoft.webwork包中的Login类,由Login类中的execute方法来处理提交的form的数据了;
        然后,根据execute方法的返回值,再到xwork.xml中对应的action节点中去找匹配的result子节点;
        最后,根据result子节点的定义,将处理结果分发(dispatch)或者重定向(redirect)至下一个页面[3]
        
<!---->        [1] 准备工作可以参考 WebWork Getting Started
        [2] web.xml文件的具体内容,可以参考 WebWork Tutorial Lesson 2  
        [3] 对于result的Type的更多介绍,可以参考 WebWork Tutorial Lesson 3     

</ww:property value<>
分享到:
评论

相关推荐

    webwork初体验

    webwork初体验,入门,很简单的例子,

    SSH相关整合的总要资料

    SSH初体验 1 什么是SSH 都说Y2学年J2EE方向的学习重点是SSH框架的掌握。那么什么是SSH呢?是否真的开发J2EE大型框架很难呢?今天我们将通过一个实例,在常用IDE—Eclipse3.2.2+MyEclipse5.5.1+Tomcat6.0的基础之上给...

    机械设计家用手摇面条机sw18可编辑非常好的设计图纸100%好用.zip

    机械设计家用手摇面条机sw18可编辑非常好的设计图纸100%好用.zip

    机械设计托盘库推车sw12可编辑非常好的设计图纸100%好用.zip

    机械设计托盘库推车sw12可编辑非常好的设计图纸100%好用.zip

    node-v12.18.4-linux-arm64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    YOLOV5 分类实战:7种小麦叶片病害分类

    YOLOV5 实战对小麦叶片病害检测分类数据集,包含代码、数据集、训练好的权重参数,经测试,代码可以直接使用。 【yolov5】项目总大小:300MB 训练了10个epoch,top1准确度分别达到了0.93+。这里仅仅训练了10个epoch,网络还没收敛,加大轮次可以获取更高的网络性能 【如何训练】摆放好datasets数据,即可训练 更多yolov5改进介绍、或者如何训练,请参考: https://blog.csdn.net/qq_44886601/category_12605353.html

    单片机课程实验-秒表实现

    1.了解LED数码管的工作原理,为秒表时钟模块的实现打下基础。 LED数码管是一种常用的数字显示器件,通过控制每个LED的亮灭来显示数字。在秒表时钟模块中,我们需要利用LED数码管的这一特性,通过单片机控制数码管的显示,从而实现时钟的功能。因此,了解LED数码管的工作原理对于实现秒表时钟模块至关重要。 2.掌握51单片机与LED数码管的接口技术,是实现秒表时钟模块的关键。 51单片机是一种常用的微控制器,可以通过接口与外部设备进行通信。在秒表时钟模块中,我们需要通过单片机与LED数码管之间的接口,控制数码管的显示。因此,掌握51单片机与LED数码管的接口技术是实现秒表时钟模块的关键。在实际操作中,我们需要根据接口协议和数据传输方式,编写相应的程序来控制数码管的显示。 3.合理利用定时器/计数器,是实现秒表时钟模块的效率保障。 在秒表时钟模块中,我们需要实现计时功能,这需要使用到定时器/计数器。定时器/计数器可以用来产生计时脉冲,从而控制秒表的计时。通过合理利用定时器/计数器,可以提高秒表时钟模块的计时精度和效率。在实际操作中,我们需要根据具体的应用场景和需求,选择合适的定时器/计数器参

    机械设计2T双轴变位机L型sw12非常好的设计图纸100%好用.zip

    机械设计2T双轴变位机L型sw12非常好的设计图纸100%好用.zip

    node-v10.16.3-sunos-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    STM32F4通过串口屏设置ADF4351输出信号频率,HAL库开发

    本项目基于HAL库开发,使用STM32F407作为主控芯片,串口通信过程使用了特殊的帧头帧尾,实现了通过串口触摸屏设置ADF4351输出信号频率。项目包含了陶晶弛串口屏的界面设计。

    金融产品设计报告.docx

    金融产品设计报告.docx

    C++ 实验三 基本图形生成算法

    C++ 实验三 基本图形生成算法

    6金融需求理论.docx

    6金融需求理论.docx

    node-v10.22.1-sunos-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    数据结构实验代码行编辑.rar

    数据结构实验代码

    新版广州社区智慧养老解决方案ppt.docx

    新版广州社区智慧养老解决方案ppt

    Python实现Python解释器 优秀课程作业

    python实现python解释器 1.该python解释器是一个模拟堆栈机器的虚拟机 2.基本指令:LOAD_VALUE,将数据压入栈中,STORE_NAME,将栈顶内容存入变量,LOAD_NAME,将变量的内容压入栈中 dis是一个字节码反汇编器 3.LOAD_CONST相当于LOAD_VALUE,STORE_FAST相当于STORE_NAME 4.帧:帧包含了一段代码运行所需要的信息与上下文环境,帧在代码执行时被动态地创建与销毁,每一个帧的创建对应一次函数调用,所以每一个帧都有一个code object与其关联,同时一个code object可以拥有多个帧,因为一个函数可以递归调用自己多次 5.调用栈:每当你在当前函数内调用一次函数就在当前调用栈上压入所调用的函数的帧,在所调用函数返回时再将该帧弹出 数据栈:执行字节码操作时使用的栈 块栈:用于特定的控制流,比如循环与异常处理;每一个帧都拥有自己的数据栈与块栈

    index.vue

    index.vue

    AIGC-Stable Diffusion图片精准高效生成,AI能实现,并能真正落地的电商应用案例-课程网盘链接提取码下载

    课程大纲 真实场景专题(理论+实操) 1)产品AI创意图案例 2)产品图生成真实场景案例 3)AI产品图设计流程思路分享 二、服装模特专题(实操) 1)人台图生成AI模特案例 2)服装图换脸换背景案例 3)平面衣服上身A1模特案例 4)如何精准控制人物姿势 家居场景专题(实操)三、 1)家居产品生成AI场景 2)精准控制更换家具材质 3)家居装修风格快速切换

Global site tag (gtag.js) - Google Analytics