Hello,World
“当您在Struts 2 Web应用程序中单击超链接或提交HTML表单时,输入不会发送到另一个服务器页面,而是发送到您提供的Java类。这些类称为Actions。在触发Action之后,Result会选择一个资源来呈现响应。资源通常是服务器页面,但它也可以是PDF文件,Excel电子表格或Java小程序窗口。
要创建一个“Hello World”示例,您需要做四件事:
1.
创建一个类来存储欢迎消息(模型)
2.
创建服务器页面以显示消息(视图)
3.
创建一个Action类来控制用户,模型和视图之间的交互(控制器)
4.
创建一个映射(struts.xml)来耦合Action类和视图
6.
通过创建这些组件,我们将工作流程分为三个众所周知的问题:视图,模型和控制器。分离问题使得管理应用程序变得更加复杂变得更加容易。
让我们看一个示例模型类,Action,服务器页面和映射。如果您愿意,可以启动Java IDE,然后输入代码。”
现在,我们来修改以一下上次的basic_struts
1.创建模型类MessageStore.java(Model)
在src文件夹下创建com/cn/hnnz/pojo包
在pojo下创建MessageStore.java
package com.cn.hnnz.pojo;
public class MessageStore {
private String message;
public MessageStore() {
message = "Hello Struts User";
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
2.创建Action类HelloWorldAction.java(Controller)
在src下创建com/cn/hnnz/controller包
在controller包下创建HelloWorldAction.java类
这个类继承com.opensymphony.xwork2.ActionSupport
如下:
package com.cn.hnnz.controller;
import com.cn.hnnz.pojo.*;
import com.opensymphony.xwork2.ActionSupport;
public class HelloWorldAction extends ActionSupport{
private MessageStore messageStore;
public String execute() {
messageStore = new MessageStore() ;
return SUCCESS;
}
public MessageStore getMessageStore() {
return messageStore;
}
}
Q:execute()方法是什么?
A:execute()相当于Servlet里面的service()方法,但不是必要的.当我们在struts.xml里未定义处理方法时,将会默认的使用这个方法.当我们在execute()方法中没有任何的操作的话,默认返回"success"
Q:Action类为何要继承ActionSupport类?
A:为了方便实现Action类,我们继承ActionSupport类,继承此类可以重载execute()方法.并且ActionSupport已经实现了Action接口和Validateable接口(提供数据校验功能)等.继承了ActionSupport类,可以简化Action的开发
Q:为什么在HelloWorldAction里面有一个getMessageStore()方法?
A:由于我们希望将MessageStore提供给视图,所以在这里用JavaBean风格的get set方法.以便在需要的时候调用
3.创建HelloWorld.jsp(Veiw)
在WebContent下创建HelloWorld.jsp
内容如下:
<%@ page language=“java” contentType=“text/html; charset=ISO-8859-1”
pageEncoding=“ISO-8859-1”%>
<%@taglib prefix=“s” uri="/struts-tags" %>
<action name="hello" class="com.cn.hnnz.controller.HelloWorldAction" method="execute">
<result>/HelloWorld.jsp</result>
</action>
</package>
添加如上红色标注的内容. 在这里,相信我们对和这几个节点已经有所认识.下面我们来具体了解一下它们
节点 属性 值 作用
package name 没有特别限定,但值不可重复 name的值和功能没有联系,主要为了区分不同的package标签
extend struts-default 当extend=“struts-default”,package里面的类具有action的功能
namespace 没有特别限定 命名空间,和package的子标签中的name值构成访问路径
action name 没有特别限定,但值不可重复 和action的父标签中的namespace的值构成访问路径
class action的全路径 指定处理请求的action类
method 没有特别限定,默认值为execute 执行action里面的某个方法,也可以执行多个方法
result name 与方法返回值相同
type dispatcher(转发),redirect(重定向),chain,redirectAction(重定向到Action).默认dispatcher 如何到已配置的路径中
5.修改index.jsp
<%@ page language=“java” contentType=“text/html; charset=ISO-8859-1”
pageEncoding=“ISO-8859-1”%>
<%@taglib prefix=“s” uri="/struts-tags"%>
Hello World
在index.jsp添加以上红色标注的内容 <%@taglib prefix="s" uri="/struts-tags"%>表示引入struts2标签库 Hello World 表示在我们的struts中找到hello所映射的action类和其对应的execute()方法 6.访问index.action 启动tomcat并在浏览器地址栏并输入http://localhost:8080/basic_struts/hello.action在这之后,点击Hello World超链接,如果你看到以下页面,那么这就表示你修改后的basic_struts没有问题
我们的代码是如何工作的?
大意如下
你的浏览器相web服务器发送URL为http://localhost:8080/helloworld/hello.action的请求
1.容器从Web服务器接收对资源的请求hello.action。根据从web.xml加载的设置,容器发现所有请求都被路由到org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter,包括*.action请求。这StrutsPrepareAndExecuteFilter是框架的切入点。
2.该框架查找名为“hello”的动作映射,并发现该映射对应于该类 HelloWorldAction。框架实例化Action并调用Action的execute方法。
3.该execute方法创建MessageStore对象并返回SUCCESS(= “success”)。框架检查操作映射以查看SUCCESS返回时要加载的页面。框架告诉容器呈现为对请求(资源)的响应HelloWorld.jsp。
4.HelloWorld.jsp在处理页面时,<s:property value=“messageStore.message” />标记调用Action 的getter getMessageStore,HelloWorld然后调用getMessage返回的MessageStore对象getMessageStore。标记将message属性的值合并到响应中。
5.纯HTML响应将发送回浏览器。