当你向一个框架提交HTML表单的时候,输入的数据并不是被发送到一个服务端页面,而是传送到一个你自己提供的称为Action的java类,产生的结果会选择一个资源来绘制响应。该资源通常为一个服务端的页面,但也可以是一个pdf的文档,也可以是一个Excel电子数据表格,或者是Java applet窗口。
假设你希望创建一个简单的“Hello World”例子来显示欢迎消息。下载struts2的空web应用(即struts2-blank-2.0.6.war),你需要做以下三件事: 1.创建一个服务页面来展示消息 2.创建一个Action类来创建消息 3.创建一个连接Action类和页面的映射 让我们来看看这个Action,服务页面和映射的例子。如果你喜欢也可以使用IDE来编辑代码。 代码如下:
首先,定义一个服务页面显示数据 <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> <title>Hello World!</title> </head> <body> <h2><s:property value="message" /></h2> </body> </html> 其次,我们需要一个Action类来创建消息 package tutorial; import com.opensymphony.xwork2.ActionSupport; public class HelloWorld extends ActionSupport { public static final String MESSAGE = "Struts is up and running..."; private String message; public String execute() throws Exception {
setMessage(MESSAGE); return SUCCESS; } public void setMessage(String message) {
this.message = message; } public String getMessage() {
return message; } } 最后我们需要一个映射来绑定所有。 编辑struts.xml文件来添加HelloWorld映射 <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts./dtds/struts-2.0.dtd"> <struts> <package name="tutorial" extends="struts-default"> <action name="HelloWorld" class="tutorial.HelloWorld"> <result>/HelloWorld.jsp</result> </action> </package> </struts> 然后部署该应用程序,打开http://localhost:8080/tutorial/HelloWorld.action观察出现了什么,你会看见一个标题为Hello World!的页面并有一个“Struts is up and running”的消息。 代码是如何工作的:
1.容器接收到HelloWorld.action的请求。根据web.xml的设置,容器会寻找所有被发送到org.apache.struts2.dispatcher.FilterDispatcher的请求,包括所有的*.action的请求。FilterDispatcher是框架的入口点。 2.框架寻找一个映射名为HelloWorld的Action类。它找到与HelloWorld类相关的映射,并调用Action的execute方法。 3.execute方法设置了消息并返回SUCCESS。如果返回的是SUCCESS,框架会检查Action类映射的哪个页面将被装载。框架会告诉容器绘制HelloWorld.jsp作为请求的响应。 4.当HelloWorld.jsp被调用,<s:property value="message" />标签调用HelloWorld的Action类的getter方法getMessage,并将message的值合并到响应中去。 5.一个纯粹的响应被发送回浏览器。 测试Actions类,代码如下
package tutorizl import junit.framework.TestCase; import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionSupport; public class HelloWorldTest extends TestCase {
public void testHelloWorld() throws Exception { HelloWorld hello_world = new HelloWorld(); String results = hello_world.execute(); assertTrue("Expected a success results!", ActionSupport.SUCCESS.equals(results));
assertTrue("Expected the default message!",HelloWorld.MESSAGE.equals(hello_world.getMessage())); }
} 需要记住的是:框架使用Action类来处理HTML表单和其他请求,Action类返回一个诸如SUCCESS,ERROR,或INPUT名称。根据来自struts.xml的映射,一个返回的名称会选择相应的页面,另外的Action,或其他web资源(图象,PDF)。 当一个服务端页面被绘制,大多情况下会包括由Action类提供的动态数据。框架会提供一系列的HTML标签创建页面来使得显示动态数据更加简单。 |
|