在 Struts 2 web 应用中,当你单击一个超级链接或提交一个表单, 输入木有直接发送到另外一个页面而是一个你提供的 Action类. 在 Action 调用后一个Result 选择一个资源作为请求的响应. 资源通常是服务器页面, 但也可能是PDF 文件, 一个Excel 表格, 或Java applet窗口.
假设你想创建一个简单 “Hello World”示例来显示欢迎信息 .在设置好的空的基本 Struts 2 web 应用 (查看 如何构建一个Struts 2 Web 应用), 创建 “Hello World” 示例, 你需要做四个事情:
创建一个类来存储welcome消息( 模型)
服务器页面来展示消息 (视图)
创建一个Action类来控制 用户, 模型和视图之间的交互 ( 控制器)
创建一个映射 (struts.xml) 来组合 Action类和视图
为创建这些控件, 我们把工作流划为三个著名的关注点: View, Model和Controller. 分离的关注点使得维护应用越来越重要随着应用的复杂性.
让我查看该实例的模型类, Action, 服务器页面和映射.如果你喜欢, 启动你的 Java IDE, 并输入如下代码.
在 Struts2学习(一)–maven搭建Struts2框架的开发环境 已经讲了如何创建一个struts2项目,在这就不在说了
代码
完整的项目结构
步骤 1 - 创建模型类 MessageStore.java
package com.lgh.struts2maven.model;
public class MessageStore {
private String message;
public MessageStore() {
setMessage("Hello , Java Struts2");
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
上面的模型类使用 public set 和get 方法来访问 private message String 属性. Struts 2 框架要求让视图(HelloWorld.jsp) 访问的对象都必须遵守 JavaBean 规范.
步骤 2 - 创建 Action类 HelloWorldAction.java
我们需要一个 Action 类作为控制器 . Action 响应用户动作(在本例动作指的是单击一个 HTML 超级链接并发送一个指定的 URL到 Servlet容器).一个或多个 Action类方法将被执行并返回一个 String 结果. 根据结果的值, 一个指定的页面 (在本例视图指的是 HelloWorld.jsp) 被渲染.
注意包和导入的类如下.
package com.lgh.struts2maven.action;
import java.util.Date;
import com.lgh.struts2maven.model.MessageStore;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import ognl.OgnlContext;
public class HelloWorldAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private MessageStore messageStore;
private static int helloCount;
public HelloWorldAction() {
}
@Override
public String execute() throws Exception {
messageStore = new MessageStore();
helloCount++;
return SUCCESS;
}
public MessageStore getMessageStore() {
return messageStore;
}
public void setMessageStore(MessageStore messageStore) {
this.messageStore = messageStore;
}
public int getHelloCount() {
return helloCount;
}
public void setHelloCount(int helloCount) {
HelloWorldAction.helloCount = helloCount;
}
}
helloCount 的作用时统计我们访问了多少次
Struts 2 框架将创建一个 HelloWorldAction 对象并调用 execute 来响应用户动作 (单击超级链接发送一个指定 URL 到 Servlet容器).
在上面的例子, MessageStore的execute方法执行并返回 String 常量 SUCCESS.
注意 public set 和get 方法和 private MessageStore 对象. 由于我们想让MessageStore 对象在页面可以访问 (HelloWorld.jsp) ,我们需要遵守 JavaBean格式 提供 get 和 set方法.
步骤 3 - 创建视图 HelloWorld.jsp
我们需要服务器页面来展示存储在模型类 MessageStore中的消息. 在 WebContent文件夹 创建如下的jsp.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2><s:property value="messageStore.message"/></h2>
<br>
<p>I've watched <s:property value="helloCount"/> times</p>
</body>
</html>
taglib指令告诉 Servlet 容器该页面将使用 Struts 2 标签并且这些标签使用前缀 s.
s:property 标签显示调用 HelloWorldAction 控制器类的 getMessageStore()方法的返回值. 该方法返回一个 MessageStore 对象. 通过在value属性添加 .message 到messageStore部分,我们告诉 Struts 2 框架我们将调用MessageStore 对象的getMessage 方法 。MessageStore 类的getMessage 方法返回一个String. 该 String 是 s:property 标签要显示的值.
步骤 4 - 添加 Struts配置在struts.xml
我们需要使用映射来捆绑URL, HelloWorldAction类 (控制器)和
HelloWorld.jsp (视图) 在一起. 该映射告诉Struts 2框架那个类将响应用户的动作 (URL), 那个方法将被执行和根据 方法返回的 String结果那个视图将被渲染.
编辑struts.xml 文件来添加 action映射.放置 action节点 (action name=”hello”) 在 package 节点的开始和结束标签之间, 在name=”index” action 映射之后写 . 你的完整 struts.xml 配置应该如下所示:
<action name="hello" class="com.lgh.struts2maven.action.HelloWorldAction" method="execute">
<result name="success">/HelloWorld.jsp</result>
</action>
步骤 5 - 创建URL Action
在 index.jsp (WebContent文件夹),让我们添加一个 Action URL,用户可以单击告诉 Sruts 2 框架来运行HelloWorldAction类的 execute方法并渲染 HelloWorld.jsp 视图.
首先在jsp顶部添加 <%@ taglib prefix=”s” uri=”/struts-tags” %>指令. 接着在 h1 标签之后添加 p 标签
.你的新 index.jsp 内容应该如下:这里写代码片
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Struts2 Test</title>
</head>
<body>
<h1>Hello Struts2</h1>
<br>
<h2><a href="<s:url action='hello' />">Hello World</a></h2>
</body>
</html>
步骤 6 - 运行项目
通过 URL访问,将会出现如下的结果页面:
点击超链接后
代码如何工作
你的浏览器通过请求 URL发送请求到 web服务器.
- 容器接收来自web 服务器的请求 hello.action. 根据在 web.xml 加载的配置,容器发现所有请求被路由到org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter, 包括 *.action请求. StrutsPrepareAndExecuteFilter 是框架的入口点.
- 框架查找一个 action 映射名字为 “hello”, 并发现该映射关联一个类 “HelloWorldAction”. 框架初始化该Action 并调用该 Action的execute方法.
- execut方法创建一个 MessageStore 对象并返回一个 SUCCESS. 框架检查action映射来发现当返回 SUCCESS哪个页面将被加载. 框架告诉容器渲染资源 HelloWorld.jsp作为响应
- 在 HelloWorld.jsp 页面处理过程中, 标签调用HelloWorld Action 的 getter方法 getMessageStore并调用MessageStore 对象的getMessage,并且标签把该结果合并到响应中.
- 一个纯 HTML响应发回到浏览器.
必须记住
框架使用 Action来处理 HTML表单和其它请求. Action 类返回结果名如 SUCCESS, ERROR或 INPUT. 基于从 struts.xml加载的配置信息, 一个给定结果名将选择一个页面 (如本例), 另外一个action, 或其它资源 (image, PDF).
当一个服务器页面被渲染, 通常包含 Action提供的动态数据.为了使得显示动态数据简单, 框架提供了一个标签的集合和HTML 标签一起来创建服务器页面 .