不知道为什么感觉struts越发的让我感觉不爽,在没有任何准备的条件下,说放弃也是不可能的,但认识一些新的东西总不是一件错误的事情,处于这种目的,决定系统的了解一下webword,如果说没有选择struts2的原因,个人比较卤莽的认为它和webwork没有质的区别…………,好了废话少说,开始第一课(这里就不再细说如何配置和编译webwork的文件了,因为关于ClassNotFoundException之类的异常一般都是没有引入需要的.jar所引起的,参考log信息提示应该可以一一划解)。
一个典型的使用webwork的web应用也同样具有java的web的目录结构,如果容器选择的是tomcat的话,目录大概应该是如下的一种情况:
mywebwork:
|---WEB-INF
|-------|--classes (foder)
|-------|--lib (foder)
|-------|--tld (foder)
|-------|--web.xml (file)
在classes中应该存在的有文件:xwork.xml,webwork-default.xml,如果需要webwork的验证的话请加入validators.xml;经过如此的处理,撇开需要的.jar文件之外,配置文件也就差不多了。这里引用一下xwork.xml的内容来做一些简单的说明:
- >
- <xwork>
- <include file="webwork-default.xml">include>
- <package name="default" extends="webwork-default">
- package>
- <include file="com/xwork-register.xml">include>
- xwork>
这个配置文件个人认为完成的任务类似于struts中关于action的那些处理:注意到其中的<include file="…………"></include>,这是一个不错的特点,我们可以为action单独配置,然后使用它把其集中在一起。xwork-register.xml的内容为:
- >
- <xwork>
- <package name="register" extends="default" namespace="/register">
- <action name="register" class="com.RegisterAction" >
- <result name="success" type="dispatcher">/register/b.jspresult>
- <interceptor-ref name="params"/>
- <interceptor-ref name="timer"/>
- <interceptor-ref name="token-session">
- action>
- package>
- xwork>
这里分析一下使用xwork-register.xml的如何把视图中的数据从a.jsp---action----b.sjp中进行传递:
在a.jsp中处理为:
- <%@page contentType="text/html;charset=GBK"%>
- <%@taglib prefix="ww" uri="/webwork"%>
- <h1>用户注册h1>
- <form name="register" action="register.action" method="POST">
- <table border="0">
- <tr><td>姓名:td><td><input name="user.name">td>tr>
- <tr><td>出生日期:td><td><input name="user.birthday">td>tr>
- table>
- <input type="submit" name="注册">
- form>
这里我最欣赏的地方就是直接使用pojo对象User:如姓名:user.name,在struts中无奈的处理方法就是定义一个Form表单,如果表单的field超过了20个,我就会觉得不可接受(可能有些人会在100个的时候还镇定自如)。
注意到xwork-register.xml中定义的
< package name="register" extends="default" namespace="/register">
这也是处理命名空间的不错的选择,把类似的功能文件放置在同一个地方以方便管理,同时避免名称上的冲突,这也是struts1中不爽的地方。这里的name属性的取值可以是任意的,namespace说白了就是一个文件夹。接下来看以下在struts1中关于action的配置在webwork中一种怎样的情况:<interceptor-ref name="token-session"></interceptor-ref>这里我们配置了一个action,name类似于struts1中的path,class类似于type,子元素
- <!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "http://www.opensymphony.com/xwork/xwork-1.0.dtd">
- <xwork>
- <package name="register" extends="default" namespace="/register">
- <action name="register" class="com.skyon.demo.register.RegisterAction" >
- <result name="success" type="dispatcher">/register/b.jsp</result>
- <interceptor-ref name="params"/>
- <interceptor-ref name="timer"/>
- <interceptor-ref name="token-session"/>
- </action>
- </package>
- </xwork>
- package com;
- import com.opensymphony.xwork.Action;
- import com.opensymphony.xwork.ActionContext;
- public class RegisterAction implements Action{
- private User user = new User();
- public String execute() throws Exception {
- System.out.println("Success!"+user);
- //这里是如何得到a.jsp中表单数据的地方,webword没有依靠request,这也是其和
- //struts1的不同的地方,非常的不错哦……
- String names[] = (String[])(ActionContext.getContext().getParameters().get("user.name"));
- System.out.println("-----------"+names[0]);
- System.out.println("-----------"+ActionContext.getContext().getSession().get("userName"));
- //执行业务逻辑
- return SUCCESS;
- }
- public User getUser() {
- return user;
- }
- }
- <%@page contentType="text/html;charset=GBK"%>
- <%@taglib prefix="ww" uri="webwork"%>
- <h1>注册成功h1>
- <table border="0">
- <tr><td>姓名:td><td><ww:property value="user.name"/>td>tr>
- <tr><td>年龄:td><td><ww:property value="user.age"/>td>tr>
- <tr><td>出生日期:td><td><ww:property value="user.birthday"/>td>tr>
- table>
<interceptor-ref name="params"/> 做了相应的处理了,好了,起步工作就到此结束了,日后再谈
<interceptor-ref name="timer"></interceptor-ref>
<interceptor-ref name="token-session"></interceptor-ref>