本文,摘录了Manning出版社出版,Patrick Lightbody 和 Jason Carreira所著《WebWork in Action》中关于怎样创建WebWork action和它的视图以及将两者柔和在一起的部分。
一 个action是一块代码,当特定的URL被请求时,他会被执行。Action被执行后将可视化的显示一个执行结果。一个结果可以是HTML页面,也可是 PDf文件、EXCEL表格,或者甚至可以是Java applet 窗口。本文我们将主要关注HTML结果,因为这对于web来说是最普遍和特别的。正如牛顿第三定律所讲的一个作用力一定有一个反作用力(从技术上一个 action不是一定得有一个结果,但一般都这样做)尽管他们之间的关系不总是"相等以及相反",但是最终的结果总是反映WebWork中被执行的 action。
假设你要建一个简单的"Hello, World"例子,当用户访问URL: http://localhost/helloWorld.action,这个例子会显示Hello, World消息。由于你将WebWork的Servlet 映射到.action,你需要一个名称叫helloWorld的action。为创建"Hello, World"例子,需做如下三件事情:
1.创建一个action类:HelloWorld;
2.创建一个结果页面:hello.jsp;
3.配置action和结果页面;
让我们开始编写创建welcome消息的代码。
用WebWork的方法说hello
创建如下列表所示的action类:
HelloWorld.java
package ch2.example1;
import com.opensymphony.xwork.Action;
public class HelloWorld implements Action {
private String message;
public String execute() {
message = "Hello, World!\n";
message += "The time is:\n";
message += System.currentTimeMillis();
return SUCCESS;
}
public String getMessage() {
return message;
}
}
特别需要注意的是HelloWorld类实现了Action接口。所有WebWork action都必须实现Action接口,该接口提供了一个execute()方法,当执行这个action时,WebWork会调用这个方法。
在execute()里面,用当前时间和“Hello, World”构造一个消息。通过JavaBean风格的getter方法getMessage()暴露这个message字段。这允许message通过JSP标签被检索和显示给用户。
最 后,execute()方法返回SUCCESS(一个成功的字符串常量), 指示action成功执行。这个常量和其他常量,例如INPUT、ERROR是定义在Action接口里面的。所有WebWork action都必须返回一个结果代码-一个用于指示action执行结果的字符串。
要注意的是结果代码并不总是意味着被执行,尽管一般情况下是这样的。
你很快将看到这些结果代码通过映射而最终能够显示给用户的结果。既然action已经被创建,下一个逻辑步骤是创建一个HTML来显示这个message。
将结果显示到Web浏览器
WebWork允许用许多不同的方法显示action的输出结果给用户,但最简单通用的办法是显示HTML给Web浏览器。其它技术,包括显示一个PDF报表或者逗号分割的CSV表格。
你能简单地创建JSP页面生成HTML视图:(hello.jsp)
<%@ taglib prefix="ww" uri="webwork" %>
<html>
<head>
<title>Hello Page</title>
</head>
<body>
The message generated by my first action is:
<ww:property value="message"/>
</body>
</html>
第一行的Tag定义映射前缀ww到URI webwork。(注意URI跟web.xml文件里面的URI是一样的)前缀ww表明所有WebWork标签以ww:开始。
如 你所看到的那样,这是一个使用WebWork定制标签:property的简单JSP页面。Property标签接受一个value属性并从action 取得那个表达式的值。由于你在那action里面创建了一个getMessage()方法,所以message属性值决定了getMessage()方法 调用的返回值。将该文件命名为hello.jsp并保存在您的Web应用root目录下。
配置您新创建的action
既 然已经创建了action类和视图jsp页面,最后一步是将两者联系起来。你可以通过配置这个action到一个特定的URL并且映射SUCCESS到你 刚才创建的jsp做到。回想你创建框架布局时候,就已经生成了一个几乎是空的xwork.xml文件。你现在向xwork.xml文件添加一些有意义的东 西,看看最终WebWork action的工作。
配置WebWork action时,必须知道以下三点:
action的全名,包括包名和类名;
action的URL;
那个action的所有可能返回的结果代码;
正如你所知,这个action的充分名称是ch2.example1.HelloWorld。URL可以是你喜欢的东西,这里我们使用/helloWorld.action。这个action的唯一可能的返回代码是SUCCESS。
有了这些信息,让我们修改xwork.xml文件来定义这个action:
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN"
"http://www.opensymphony.com/xwork/xwork-1.0.dtd">
<xwork>
<include file="webwork-default.xml"/>
<package name="default" extends="webwork-default">
<default-interceptor-ref name="completeStack"/>
<action name="helloWorld"
class="ch2.example1.HelloWorld">
<result name="success">hello.jsp</result>
</action>
</package>
</xwork>
这 个文件里面,你现在已经将action的逻辑名称(helloWorld)跟你希望执行的哪个action类联系起来了。所以任何一个针对 /helloWorld.action 的HTTP请求将调用您的action类。你也可以将action执行的结果代码SUCCESS ("success"的字符创常量)和你创建的用来显示message的jsp页面联系起来。
保存With xwork.xml,编译和拷贝action类到WEB-INF/ classes目录下,并且将hello.jsp添加到Web应用root目录下,准备启动应用服务器来试试这个新的action。怎样启动、停止、部署 Web应用,请参考你的应用服务器文档。
已经完成了所有步骤了! 现在你可以在你的浏览器地址栏中输入http://localhost/helloWorld.action 来看看最终的效果。如图Figure 1。 (URL是否包括一个象8080一样的端口号,取决于servlet 容器和配置。)
Figure 1. The first "Hello World" action
如你所见,这并不令人兴奋。所以让我们添加一些有意思的事情。你可以定制一个action,让用户输入他们的名字,然后生成问候语。目前为止,你看到action是只读的;现在你将学习怎样处理输入和可读写的action。
处理输入
你已经知道了怎样构建一个简单的action,现在让我们来整合一下并添加个性化消息的功能。你将基于现有代码构建。首先,创建一个要求用户输入名称的页面。创建下面的文件并命名为name.jsp,放在与hello.jsp相同的目录:
<html>
<head>
<title>Enter your name</title>
</head>
<body>
Please enter your name:
<form action="helloWorld.action" method="post">
<input type="textfield"
name="name"/>
<input type="submit"/>
</form>
</body>
</html>
注 意那个表单被提交到helloWorld.action-跟用来显示前一个例子的location一样。因为你在前一个例子基础上扩展,所以继续使用这个 location。另外重要的一点是文本输入框的名字叫做name。正如message是你用来像是消息的属性一样,name是你用来输入用户名称的属 性。
下一步,修改HelloWorld action来构造一个个化的消息。新代码如下:
package ch2.example1;
import com.opensymphony.xwork.Action;
public class HelloWorld implements Action {
private String message;
private String name;
public String execute() {
message = "Hello, " + name + "!\n";
message += "The time is:\n";
message += System.currentTimeMillis();
return SUCCESS;
}
public String getMessage() {
return message;
}
public void setName(String name) {
this.name = name;
}
public String getName(){
return this.name;
}
}
相 对于前一个例子,这段代码添加了两个东西。第一个是在action里面添加了name属性和该属性的get/set方法。这个属性是跟name,jsp页 面的文本输入框的名字是严格匹配的。在execute()方法里面,你也用name构建了一个个性化的消息。在WebWork里面,value总是在 execute()方法调用前被设置(通过setXxx()方法,例如setName())。这意味着你可以在execute()方法里面使用那个变量。
编译action类,启动应用服务器。在浏览器中输入:http://localhost/name.jsp,键入一个名称,现在看到消息是个性化的。如图2
xweb.xml配置:
<action name="helloworld"
class="com.jiangjing.action.hellowordaction">
<result name="success">/hello.jsp</result>
<interceptor-ref name="params"/>
</action>
图 2. 新的消息是个性化的。 这里我们使用Patrick作为输入。
就象它很简单一样,问题也可能容易出现。例如,假设用户没有输入任何数据将会怎么样呢?问候语将以"Hello, !"终止。与其显示一个丑陋难看的消息,还不如回到原始页面,要求用户输入一个真是的姓名。让我们在这个action中添加一些高级控制流。
高级控制流
因为你想要action不是显示消息结果(hello.jsp)就是显示原始输入表单(name.jsp),所以你必须在xwork.xml文件中定义另外一个结果。可以通过改变action的入口做到,如下:
<action name="helloWorld"
class="ch2.example1.HelloWorld">
<result name="success">hello.jsp</result>
<result name="input">name.jsp</result>
</action>
现 在,如果HelloWorld action的execute() 返回字符串“input”(在方法中也被定义成常量INPUT),那么action的执行结果将是name.jsp而不是hello.jsp。 为个这个例子再加一点有意思的事情,让我们不允许在文本输入框name中输入“World“。在修改action的execute()以支持这个检查功 能。代码如下:
public String execute() {
if (name == null || "".equals(name)
|| "World".equals(name)) {
return INPUT;
}
message = "Hello," + name + "!\n";
message += "The time is:\n";
message += System.currentTimeMillis();
}
若名称没有通过你校验规则的校验,你返回INPUT,不生成消息字符串。只需几行代码就增加了action的控制流。然而,这样作显然还是不足够的,因为:
1、当你返回到INPUT时,用户不明白为什么他会返回这个页面。根本上是因为没有错误提示信息。
2、用户不知道他的原始输入值。他或许什么也没有输,或许输入的是个单词。最好能显示用户的原始输入值。
为处理这两个方面的考虑,让我们修改INPUT结果来显示错误信息。你可以从success结果重用message属性。然后,添加逻辑显示错误信息,同时也使文本输入字段显示发生错误时的先前输入值。修改name.jsp,如下:
<%@ taglib prefix="ww" uri="webwork" %>
<html>
<head>
<title>Enter your name</title>
</head>
<body>
<ww:if test="message != null">
<font color="red">
<ww:property value="message"/>
</font>
</ww:if>
Please enter your name:
<form action="/helloWorld.action">
<input type="textfield"
name="name"
value="<ww:property value="name"/>"/>
<input type="submit"/>
</form>
</body>
</html>
这段代码给jsp添加了两个有意义的事情。首先,当错误消息存在时,以红色字体输出它。
你可以用ww:if来测试错误消息是否存在;若存在,则输出它。如果用户直接访问这个页面,那么条件测试失败,并且不会报告错误信息。
第 二,你添加了value属性到文本输入框。这个属性定义了页面首次装入时要显示的缺省值。如果属性没有找到时,由于ww:property标签返回一个空 字符串,所以也能产生想要的行为。Action被提交一次后,这个属性便存在。正如这样,如果INPUT结果发生的话,将显示前一次输入的值。
最后,让我们再次修改action的execute()方法。这次,你将确保在action用INPUT代码返回前将错误消息设置在message里面。新的方法如下:
public String execute() {
if (name == null || "".equals(name)
|| "World".equals(name)) {
message = "Blank names or names of 'World' are not allowed!";
return INPUT;
}
message = "Hello," + name + "!\n";
message += "The time is:\n";
message += System.currentTimeMillis();
return SUCCESS;
}
这里,最值得注意的是如果校验失败,则execute()方法不会以INPUT返回。
有了这些修改,你就可以准备尝试一下新的行为特性。启动你的应用服务器,在地址栏中输入http://localhost/name.jsp。在文本输入字段键入World并提交表单,你可以看到屏幕显示如图3。
图3. 无效名称输入时的"Hello World" 例子。
这种控制流,校验和错误报告常常是Web应用所需的。与其让开发者处理那些任务,不如让WebWork为你提供帮助。
关于作者
作 为Jive软件专业服务组织的领导者,Patrick Lightbody已经为各种技术公司工作过,有象Cisco那样的巨人公司,也有象硅谷刚起步那样的小公司。他是《Java Open Source Programming》一书的作者并且将它的业余时间贡献给了OpenSymphony的各种工程,包括WebWork和OSWorkflow。 Lightbody虽然在成长在硅谷中心,现在却住在波特兰。
Jason Carreira从事J2EE应用开发和架构设计已经六年了。过去的五年里,他重新设计和构建了企业金融软件产品。近来加入了ePlus,那里他从事于下 一代eProcurement解决方案。业余时间,Carreira是XWork命令模式框架和WebWork MVC Web框架的核心开发者。他和妻子以及三个孩子居住在纽约的罗彻斯特。
分享到:
相关推荐
Spring in Action CN.001<br>Spring in Action CN.002<br>Spring in Action CN.003<br>Spring in Action CN.004<br>Spring in Action CN.005<br>Spring in Action CN.006<br>Spring in Action ... <br>本书信息:...
Spring in Action CN.001<br>Spring in Action CN.002<br>Spring in Action CN.003<br>Spring in Action CN.004<br>Spring in Action CN.005<br>Spring in Action CN.006<br>Spring in Action ... <br>本书信息:...
form name="myform" id="myform" action="ssss" method="post" onsubmit="getUrl();"> javascript方法: [removed] function getUrl(){ $('form').attr('action','new_url'); } [removed] 或者用单纯的...
1:非重用型:只能在被存储它的TEST中...右键ACTION PROPERTIES>EXTERNAL ACTION>USE A LOCAL,EDITABLE COPY。 调用重用型的ACTION可以在以后新版本中控件发生变化时只升级被调用的可重复型ACTION所在的源程序即可。
ACTION
Akka in Action shows you how to build message-oriented systems with Akka. This comprehensive, hands-on tutorial introduces each concept with a working example. You’ll start with the big picture of ...
jQuery in Action, Third Edition, is a fast-paced guide to jQuery, focused on the tasks you'll face in nearly any web dev project. In it, you'll learn how to traverse the DOM, handle events, perform ...
Mirillis Action!是一款高质量顶级屏幕录制软件,乍一看Action录制软件是不是有点像 Bandicam,其实吧这家伙不但长的像功能也很强悍,其保存输出格式可以保存为高质量的AVI、MP4格式,输出尺寸也可以为适应具体用途...
资源中示例了一个struts2的配置文件中配置的action的result结果为另外一个action的配置,该跳转的过程中是带所有参赛调整的,在另外一个action中可以接受到当前action的所有参数,此配置文件是我日常开发中的经验...
jsp自动调用action采用中间jsp方法 就是采用从欢迎页跳到action处理再转到展示页面,就可以访问页面时加载数据
Hadoop In Action 中文第二版 卷二 rar
MongoDB in Action, 2nd Edition
Spring Security in Action
spring in action所需jar包
电子书 Entity Framework 4 In Action
主要介绍了JavaScript获取网页表单action属性的方法,涉及javascript操作表单属性的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
Camel in action 一书的PDF电子书 和源代码
Action-RPG Starter Kit 6.55 商店几百买的最新
Spring in action Spring in action Spring in action Spring in action Spring in action Spring in action
action之间的跳转action之间的跳转