一个简单的打印Helloworld程序蕴含了MVC思想。完成HelloWorld输出步骤详解
- 创建一个类来储存打印信息(Model)
- 创建一个网页来展现打印信息(View)
- 创建一个动作类(Action)来控制用户,Model层和View层的交互(Controller)
- 配置struts.xml必要的映射信息来联合动作(Action)和View层。
步骤 1 - 创建Model层的MessageStore.java类
Struts 2 框架需要一些暴露给View层的对象,这些对象含有View层需要展示的信息,例如本例中的”Hello Struts User”。
package com.struts2.step1;
public class MessageStore {
private String message;
public MessageStore(){
setMessage("Hello Struts User");
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
步骤2 - 创建动作类(Action)HelloWorldAction.java
Struts 2 框架将会创建一个HelloWorldAction 类对象,并且调用 execute方法来响应用户的动作。
package com.struts2.step1;
import com.opensymphony.xwork2.ActionSupport;
public class HelloWorldAction extends ActionSupport {
private static final long serialVersionUID=1L;
private MessageStore messageStore;
@Override
public String execute() throws Exception {
messageStore=new MessageStore();
return SUCCESS;
}
public void setMessageStore(MessageStore messageStore) {
this.messageStore = messageStore;
}
public MessageStore getMessageStore() {
return messageStore;
}
}
步骤3 - 创建View层的 HelloWorld.jsp
taglib标签直接通知Servlet 容器这个网页使用 Struts 2 标签。
HelloWorld.jsp
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%@taglib uri="/struts-tags" prefix="s"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'HelloWorld' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<s:property value="messageStore.message" />
</body>
</html>
步骤4 - 在struts.xml添加Struts 配置
<package name="default" namespace="/hello" extends="struts-default">
<!-- Step1 Action -->
<action name="step1_index">
<result>/step1/index.jsp</result>
</action>
<action name="step1" class="com.struts2.step1.HelloWorldAction"
method="execute">
<result name="success">/step1/HelloWorld.jsp</result>
</action>
</package>
步骤5 - 创建Action的URL
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>Basic Struts 2 Application - Welcome</title>
</head>
<body>
<h1>Welcome To Struts 2!</h1>
<p><a href="<s:url action='step1'/>">Hello World</a></p>
</body>
</html>
浏览器输入
http://localhost:8008/MYStruts/hello/step1_index.action就可以验证案例。
下面来说说整个过程浏览器是怎么样工作的。
- 首先是容器接收到web服务器的一个step1_index.action资源请求。接着,根据从web.xml加载来的设置,容器就会找到所有被 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter过滤的请求,包括*.action请求。(记住:StrutsPrepareAndExecuteFilter是框架的入口)。
- 框架找到映射名是step1_index的action,接着就继续找和com.struts2.step1.HelloWorldAction对应的类。接下来,框架就实例化动作(Action)并且调用 execte方法。
- execte方法创建MessageStore 对象,并返回SUCCESS。根据返回的SUCCESS值,框架就会在结果集中寻找匹配的网页来加载。框架就通知容器,让HelloWorld.jsp作为请求的响应。
- 随着HelloWorld.jsp被执行, 标签调用HelloWorldAction的getMessageStore 方法,getMessageStore 返回的对象继续调用MessageStore的getMessage方法取得message属性值,标签也合并到message属性的值中。
- 最后,一个纯html网页就返回给浏览器。
最后,做一个总结
框架使用动作(Actions) 来处理HTML 表单和其它的请求。动作类(Action class) 返回一个例如SUCCESS, ERROR, or INPUT的返回值名字。根据映射关系 从 struts.xml加载相应的动作标签(action), 一个给定名字的结果集名字可以选择一个网页,例如本例。还可以选择另外一个动作(action)或者其他web资源,例如图片,pdf。