【Struts专家Ted Husted系列】Struts2其实也可以CoC风格编程(二) 博客分类: 专家文章翻译 编程StrutsJSP框架XML
文节是文章的第二部分,主要讲的是页面如何显示Action中的属性,以及在无XML文件配置情况下,轻松实现校验功能。
如何将我们的数据显示在页面上呢?
当服务器处理完了,我们需要将数据显示在页面模板上。通常为说,我们会在Struts的Action设置一些property(属性),这样在页面就可以直接取出来了。这些property的值也许来自于你自己的数据库,也许又是你自己的一系列业务逻辑处理后的结果,但页面可没有这么聪明它们是怎么来的。它们只知道:你要显示的属性是可用的,我的工作就是负责显示它们而已,我才不管它们具体是什么。相反地,Action也并不需要知道HTML或其它EL表达示,它只是负责设置那些property即可。
而现在呢,我们关心的是Struts框架会不会将Action与页面模板之间自动建立映射关系。好吧,让我们先在一个Action设置一个简单的property,然后看看页面能不能像我们所预想的那样,将其显示出来。
"Example 3: HelloWorldAction.java"
package actions; public class HelloWorldAction { private String greeting; public String getGreeting() { return greeting; } public String execute() { greeting = "The server time is " + new java.util.Date().toString(); return "success"; } }
注意现在Action已经是一个“POJO”了(一个标准的Struts2特性)。因为在这个例子里我们不需要框架为我们提供什么额外的服务,所以不需要继承什么基类呀,实现什么接口呀。但如果你一定要指出什么特别的地方,就是那个“execute()”方法了。还有一个地方就是这个类一定要有“Action”为类名的后缀。
现在我们要将原来的hello-world.jsp稍微改一改,这样就能看到这次的更新信息了。更新后的页面为"Example 4: hello-world.jsp (2)"
"Example 4: hello-world.jsp (2)"
<html> <body> <p> Hello World! </p> <p> ${greeting} </p> </body> </html>
当然我们需要将用Struts2的标签来代替JSTL了,但<s:property value="greeting"/>看上去确实比${greeting}麻烦不少。更新后的结果请看图2:(注意:Struts2.0.11以后版本,是不支持EL表示的,所以如果你的版本是新版本,这里的${greeting}要换成<s:property value="greeting"/>,我是为保证原文,才没有改动。)
"图2"
SmartURLs可以校验我们的数据项吗?
像Struts2这样强大的Action框架,Action可以在运行时改变工作流程方向,从而输出各种不同的页面。比如说,我们想收集一些页面提交的数据。如果数据输入正确呢,我们就会跳转到其它页面;但如果不正确的话,我们就希望它能返回到输入页面,让用户可以重新输入。因此验证流程是框架提供的一个很特殊的服务。现在我们来看Example 5: HelloWorld.java (2),这次我们继承了基类ActionSupport。
"Example 5: HelloWorld.java (2)"
package actions; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.validator.annotations.*; @Validation() public class HelloWorld extends ActionSupport { private String greeting; @RequiredStringValidator(message="Please enter a greeting!") public String getGreeting() { return greeting; } public void setGreeting(String value) { greeting = value; } }
因为我们继承了Action的原因,SmartUTLs这次又要求我们去掉“Action”作为类名的后缀了。
在Example5中,我们使用了Annotation来实现我的消息验证功能(又一个Struts2的特性,Annotation由Java5引入,使用时,需要使用@符号)。Struts2和SmartURLs加上Annotation的使用成了Struts2 XML配置的可选方案了。在“Example 5”中,我们用了Annotation将RequiredString valodator(验证)同属性粘在一起了。框架提供了所有通过的验证valodator。
为了能看到收集的验证信息,我们需要增加一个新的页面,请看"Example 6: hello-world-input.jsp".
"Example 6: hello-world-input.jsp"
<%@ taglib uri="/struts-tags" prefix="s" %> <html> <body> <p> What would you like to say to the world? </p> <s:form action="hello-world"> <s:textfield label="Greeting" name="greeting" /> <s:submit /> </s:form> </body> </html>
图3上 : 显示了要绑定的输入验证页面。
"图 3: "
这时,如果我们什么都不输入,直接提交,当然验证会失败,然后会返回result code为“input”的输入页面。在这里SmartURLs会回返到先前的 “hello-world-input.jsp”页面中去。以下图4就是验证后的结果:
"图 4: "
如果我们提交的信息通过了验证,那么就会显示图5的结果页面:
"图 5:"
现在你也发现了,我们不需要任何XML配置文件也可以实现正常的工作流程!在这里,仅仅是使用了Annotation @RequiredString Validator,剩下的全是靠CoC来完成的。
明天剩下最后一部分了,关于以及SmartURLs安装部分,总体来说Ted Husted的这篇文章通俗易懂,比较适合初学者。而且让大家也看到了Struts2也可以如此简化,继续..........
BWT: 程序代码还是在附件里,里面可能与文章有一点点不同,里面有一个Readme.txt。