《研磨struts2》 第二章 Struts2的HelloWorld 之从Servlet+JSP+JavaBean实现MVC开始 2(一)

2014-11-24 08:16:59 · 作者: · 浏览: 0
2.4 Struts2的HelloWorld
2.4.1 概述
在上一个小节中,使用Model2来实现了一个简单的登陆功能,在本节里面,使用Struts2来实现同样的功能。Model2和Struts2都实现了MVC,因此Struts2的实现和上面Model2的实现是类似的。
前面讲到Struts2是一个基于MVC的轻量级框架,那就以MVC为突破口来分析,看看Struts2的HelloWorld到底要怎么做。
(1)从MVC的运行顺序看,首先是由视图来用于人机交互并提出请求,对应到Struts2的HelloWorld上,那就是提供一个登录页面,在这个登录页面上,用户可以填入用户名和密码,然后提交登录的请求。这个登录页面在上面Model2的实现中已经有了。
(2)在MVC中,用户的请求是提交到控制器的,对应到Struts2的HelloWorld上,Struts2会提供一个控制器,就是FilterDispatcher,它会根据用户提交的URL来选择合适的模型(动作Action)来响应用户的登录请求。
(3)在MVC中,模型完成应用功能处理后会通知视图它已经改变,视图会从模型中获取新的数据并展示。对应到Struts2的HelloWorld上,模型在调用真正的逻辑功能处理之后,会根据运行的结果,选择下一个页面,也就是欢迎页面,然后转向欢迎页面,并将模型的数据展现给用户。
根据上面的描述,实现Struts2的HelloWorld大致需要做如下的工作:
模型部分需要做一个Action类,用来响应用户的提交和执行相应的逻辑处理,需要新做一个。
视图部分需要两个页面,登陆页面用来填入用户名和密码,欢迎页面用来显示模型的数据。已经有了,不需要再重新做了,稍作修改即可。
控制器部分不需要开发新的控制器类,直接使用Struts2提供的FilterDispatcher就可以。
又有一个新的问题了,控制器是如何知道模型和视图部分,并将它们对应起来呢?在struts2里面,是通过提供一个配置描述文件struts.xml,在里面配置视图请求和模型的对应关系,从而解决这个问题。
这也意味着,我们还需要配置struts.xml,在struts.xml中将视图请求的URL与模型,也就是Action映射起来。
还有一个问题,就是使用Struts2来开发的候,是不需要JavaBean的,那么页面的数据如何传递到Action呢?
在Struts2中,是通过OGNL表达式和拦截器组合使用,来实现把页面的数据映射到Action中,具体的后面再去详细讲述,这里只需要知道,按照示例的写法能把数据传递过去就可以了。
2.4.2 配置Struts2的运行环境
要使用struts2进行开发,先要配置Struts2的运行环境。
首先找到Struts2的空示例工程。在 下载的all-in-one包里的app里面的struts2-blank-2.1.8.1.war(struts-2.1.8.1\apps\struts2-blank-2.1.8.1.war)。war包可以用 winrar解压出来,里面就是一个完整的web应用。
把里面WEB-INF\src\java下的struts.xml,拷贝到工程的src下备用。
把里面WEB-INF/lib里的所有jar包拷贝到工程的WebContent/WEB-INF/lib下。
打开WEB-INF/web.xml,把其中关于struts2过滤器的配置拷入工程的web.xml中,以前Servlet的配置都去掉,此时的web.xml如下所示:

java代码:
查看复制到剪贴板打印
< xml version="1.0" encoding="UTF-8" >


Struts2
org.apache.struts2.
dispatcher.FilterDispatcher



Struts2
/*


到此,Struts2的环境就准备好了,接下来看看HelloWorld具体的开发和运行。
2.4.3 实现动作类(Action)

动作类Action里面有一个execute的方法,其实现方式完全类似于前面Servlet实现中的doPost实现,要完成的工作也是一样的,这里就不去赘述了。
虽然要完成的工作是一样的,但是优雅的Struts2帮我们做了许多事情。
接收用户请求中的数据的时候,不再需要引用HttpServletRequest了,直接通过属性来获取。
同样,向下一个页面传值的时候,也不用亲自操作HttpServletRequest了,在下一个页面,直接通过OGNL表达式就可以获取到需要的数据。
HelloWorld的动作类Action示例代码如下:

java代码:
查看复制到剪贴板打印
package cn.javass.hello.struts2impl.action;

import com.opensymphony.xwork2.Action;

public class HelloWorldAction implements Action {
private String account;
private String password;
private String submitFlag;

public String execute() throws Exception {
//1:收集参数,不用做了,数据会直接映射到上面的属性里面
//2:组织参数,暂时不需要,先不做
//3:调用模型的逻辑功能处理,这里不需要,只是简单的输出一下传入的参数
System.out.println("用户输入的参数为==="+"account="+account+",password="+password+",submitFlag="+submitFlag);
//4:根据逻辑处理的结果来选择下一个页面,这里直接选择转向欢迎页面
return "toWelcome";
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getSubmitFlag() {
return submitFlag;
}
public void setSubmitFlag(String submitFlag) {
this.submitFlag = submitFlag;
}
}
这个类实现了