Struts 2是Struts的下一代产品,它是在Struts 1和WebWork技术的基础上进行了合并。全新的Struts 2与Struts 1差别巨大,但是相对于WebWork,Struts 2的变化很小。Struts 2并不是一门完全独立的技术,而是建立在其他Web技术之上的一个MVC框架。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这种设计使得业务逻辑控制器能够与Servlet API完全脱离开,所以Struts 2可以理解为WebWork的更新产品。实际上,WebWork和Struts社区已经合二为一,即现在的Struts 2社区。
本章首先对Struts 2的基本情况进行介绍,接着介绍开始时所要做的准备工作以及如何配置Struts 2的运行环境,然后通过一个简单的“Hello World”示例,让读者快速了解Struts 2的使用方法。
4.1 Struts 2基础
Struts 2是现在Java Web开发中最经典的MVC框架技术,被许多开发人员喜爱,也是企业招聘Java人才时必备的技能之一。
不少开发者初次接触Struts 2时,感觉就像在学习一个新的框架。虽然仍然使用Struts的名字,但原理与原来的Struts 1相比,已经大相径庭了。
4.1.1 Struts 2简介
2001年7月,Struts 1.0正式发布,该项目也成为Apache Jakarta的子项目之一,Struts就是在Model 2的基础上实现的一个MVC框架。它只有一个中心控制器,采用XML定制转向的URL,采用Action来处理逻辑。
在2005年的JavaOne大会上,Struts开发者和用户在讨论Struts的未来时,提出:Struts的代码库不适合大幅度的改进,缺乏扩展性。后来大家经过讨论,决定基于XWork开发一个新的框架,这就是后来的Struts 2。
Struts 2虽然是在Struts 1的基础上发展起来的,但它并没有继承Struts 1的设计理念。Struts 2使用了WebWork的设计理念,并且吸收了Struts 1的部分优点,对Struts 1和WebWork两大框架进行了整合,建立了一个兼容WebWork和Struts 1的MVC框架,使原来使用Struts 1和WebWork的开发人员都能够很快过渡到使用Struts 2框架进行开发。
在使用上,Struts 2更接近WebWork的使用习惯,因为Struts 2使用了WebWork的设计核心而不是Struts 1的设计核心。两个框架的优势得到了互补,让Struts 2拥有更广阔的前景,WebWork、Struts 1与Struts 2之间的关系如图4-1所示。
图4-1 WebWork、Struts 1与Struts 2的关系
Struts 2相对Struts 1有很大的改变。Struts 2的Action类实现一个Action接口的同时,还可以去实现其他接口。Struts 2中提供了一个ActionSupport基类去实现常用的接口,但Action接口不是必需的,只要POJO对象中有execute方法,都可以作为Struts 2的Action对象。但是对于Struts 1来讲,则必须要求Action类继承一个抽象基类。
4.1.2 Struts 2的MVC模式
MVC将一个应用的输入、处理和输出流程按照模型、视图和控制器三部分进行分离,这样,一个应用就可以划分为模型层、视图层和控制器层3个层次,三层之间以最少的耦合来协同工作。传统MVC模式中,各层之间的关系如图4-2所示。
图4-2 MVC模式各层的关系
由于Struts 2的架构本身就是来自于MVC思想,所以在Struts 2的架构中能够找到MVC的影子。
在Struts 2中,视图层对应视图组件,通常是指JSP页面,也适用于Velocity、FreeMarker等其他视图显示技术。模型层对应业务逻辑组件,它通常用于实现业务逻辑及与底层数据库的交互等。控制层对应系统核心控制器和业务逻辑控制器。系统核心控制器为Struts 2框架提供的StrutsPrepareAndExecuteFilter,它是一个起过滤作用的类,能根据请求自动调用相应的Action。而业务逻辑控制器是开发者自定义的一系列Action,在Action中负责调用相应的业务逻辑组件,来完成调用处理。Struts 2的MVC实现如图4-3所示。
图4-3 Struts 2的MVC实现
Struts 2是对MVC思想的具体实现,随着技术的发展,不断出现新的开发工具,程序开发人员对开发工具的需求也越来越灵活多变。Struts 2融合了许多优秀Web框架的优点,并对缺点进行了改进,使得Struts 2在开发中具有更大的优势,其优点如下:
l 通过简单、集中的配置来调度业务类,使得配置和修改都非常容易。
l 提供简单、统一的表达式语言来访问所有可供访问的数据。
l 提供标准、强大的验证框架和国际化框架。
l 提供强大的、可以有效减少页面代码的标签。
l 提供良好的Ajax支持。
l 拥有简单的插件,只需放入相应的JAR包,任何人都可以扩展Struts 2框架,比如自定义拦截器、自定义结果类型等,为Struts 2定制需要的功能,而且可以发布给其他人使用。
l 拥有智能的默认设置,不需要另外进行繁琐的设置。使用默认设置可以完成大多数应用程序开发所需要的功能。
4.1.3 Struts 2的工作原理
在Struts 2中,通过拦截器来处理用户的请求,从而允许用户的业务逻辑控制器与Servlet分离,在处理请求的过程中以用户的业务逻辑控制器为目标,创建一个控制器代理,控制代理回调业务控制器中的execute方法来处理用户的请求,该方法的返回值决定了Struts 2以怎样的视图资源呈现给用户,Struts 2的体系概略图如图4-4所示。
图4-4 Struts 2的体系概略图
在上面的概略图中,一个请求在Struts2框架中的处理大概分为以下几个步骤。
(1) 浏览器发送请求,例如请求login.action、reg.action等。
(2) 控制层的核心控制器(StrutsPrepareAndExecuteFilter)根据请求调用相应的Action。
(3) Struts 2的拦截器链(即一系列拦截器)自动对请求进行相关的控制逻辑,如数据校验、数据封装和文件上传等功能。
(4) 回调Action的execute方法(Action对象的默认方法),根据用户请求参数执行某种业务逻辑操作。实际上Action只是一个控制器,它调用业务逻辑组件来处理用户的请求。
(5) execute方法会返回一个字符串输出,该输出经过拦截器链自行处理,这与开始的拦截器链处理是相反的过程,核心控制器(StrutsPrepareAndExecuteFilter)将根据返回的字符串跳转到指定的视图资源,呈现给用户。
由此可以看到,Struts 2与MVC思想是相对应的,核心控制器对应着MVC中的控制层,Action对应着MVC中的模型层,产生的结果Result对应着MVC中的视图层。
4.2 配置Struts 2的运行环境
要使用Struts 2框架进行Java Web开发,就必须先下载Struts 2软件包,并配置好Struts 2的配置文件。
4.2.1 下载Struts 2框架
可从Struts 2的官网http://struts.apache.org中下载Struts 2框架,下载页面如图4-5所示。
当前Struts 2的最新版本为
2.3.16,本书所介绍的Struts 2就是基于该版本的,建议读者也下载该版本的Struts 2。在官方主页上,点击蓝色的Download按钮,或者直接进入的最新版下载页,在Full Releases Struts
2.3.16下方找到Full Distribution: struts-2.3.16-all.zip (65MB)的超级链接,点击下载。
图4-5 Struts 2官方主页
将下载的压缩包进行解压缩操作后,可得到如图4-6所示的文件夹结构。
图4-6 Struts 2的文件夹结构
(1) apps文件夹:存放官方提供的Struts 2的示例程序,这些程序可以作为学习者的学习资料,为开发者提供了很好的参照。各示例均为WAR文件,可以通过ZIP的方式进行解压缩操作(例如使用WinRAR软件)。
(2) docs文件夹:存放官方提供的Struts 2文档,包括Struts 2 API、Struts 2 Tag等。
(3) lib文件夹:存放Struts 2框架的核心类库,以及Struts 2的第三方插件。
(4) src文件夹:存放Struts 2项目该版本对应的源代码。
安装Struts 2相对比较容易,Struts-
2.3.16框架目录中的lib文件夹下有120多个JAR文件,一般只需将该lib文件夹下的commons-fileupload-1.3.jar、commons-logging-1.1.3.jar、freemarker-2.3.19.jar、ognl-3.0.6.jar、struts2-core-2.3.16.jar、xwork-core-2.3.16.jar等文件复制到Web应用程序中的WEB-INF/lib路径下即可。若需要更多特性,再添加更多的JAR包。
Struts 2项目所依赖的JAR包文件说明如表4-1所示。
表4-1 Struts 2项目依赖的JAR包说明
文 件 名
|
说 明
|
struts2-core-2.3.16.jar
|
Struts 2框架的核心类库
|
xwork-core-2.3.16.jar
|
WebWork核心库,Struts 2的构建基础
|
ognl-3.0.6.jar
|
Struts 2使用的一种表达式语言类库
|
freemarker-2.3.19.jar
|
Struts 2标签模板使用类库
|
javassist-3.11.0.GA.jar
|
JavaScript字节码解释器
|
commons-fileupload-1.3.jar
|
Struts 2的文件上传组件依赖包
|
commons-io-2.2.jar
|
Struts 2的输入输出,可看成是java.io扩展
|
commons-lang3-3.1.jar
|
包含一些数据类型工具,是java.lang.*扩展
|
commons- logging-1.1.3.jar
|
Struts 2的日志管理组件依赖包
|
在项目的“Java Build Path”中,可以在Libraries选项卡的Web App Libraries节点下看见已经添加的JAR包,如图4-7所示。
图4-7 Struts 2项目的JAR引用
4.2.2 Struts 2的配置文件
Struts 2共有5类配置文件,分别是struts.xml、struts.properties、Web.xml、struts-plugin.xml和struts_default.xml。本节简单介绍web.xml和struts.xml配置文件。
(1) web.xml文件
我们在以前的JSP、Servlet程序中就配置过web.xml文件。准确地说,它不属于Struts 2框架特有的文件。作为部署文件,web.xml是所有Java Web项目的核心文件。然而在这里,之所以讲到该配置文件,是因为在Web应用中使用Struts 2框架时,还需要在web.xml文件中配置Struts 2的核心控制器(StrutsPrepareAndExecuteFilter),用于对Struts 2框架进行初始化和处理所有的请求,代码如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>StrutsDemo</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.
StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
提示:在Struts 2.0版本中,核心控制器为org.apache.struts2.dispatcher.FilterDispatcher,读者要根据所使用的Struts 2的版本进行配置。在不同版本的MyEclipse中,所引用的版本有时有所不同。
(2) struts.xml文件
struts.xml定义应用自身使用的action映射及result,但我们一般将应用的各个模块分到不同的配置文件中。
首先,必须在struts.xml文件的对应程序中做相应的配置,其中,需要对每个动作进行相应拦截器的调用,对每种动作的运行结果进行配置等。在拦截器中,必须在使用前进行注册,Struts配置文件可以支持继承,默认的配置文件包在Struts 2-core-x.x.x.jar中。
struts-default.xml文件是那些默认配置文件之一。它的主要功能就是用来注册默认的结果类型和拦截器。所以,在使用的时候,不必在struts.xml文件里进行注册,就可以使用默认的结果类型和拦截器。
struts.xml文件的代码如下所示:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.i18n.encoding" value="gbk"/>
<!--可以定义其他常量-->
<package name="default" namespace="/" extends="struts-default">
<action name="hello" class="com.yzpc.action.HelloAction">
<result name="success">/HelloWorld.jsp</result>
<!--可以添加多个result-->
</action>
<!--可以添加多个action-->
</package>
<!--可以添加多个package-->
</struts>
在struts节点下有很多子节点,而这些子节点是配置框架的主要因素。我们在以后会讲解struts节点下子节点的含义。
4.3 使用Struts 2实现Hello World示例
在前面的小节中,已经对Struts 2的工作原理、运行环境及相关配置文件做了简单的介绍,下面以一个Struts 2的简单小程序HelloWorld为例,介绍Struts 2 MVC框架如何拦截用户请求,让读者对Struts 2的项目能够进一步了解。
创建StrutsDemo的Web项目,添加Struts 2框架的支持文件,新建Hello.jsp和HelloWorld.jsp页面文件,编写web.xml配置文件,创建业务控制器HelloAction.java类,编写struts.xml配置文件,最后运行、部署和测试这个示例。
4.3.1 新建Web项目
首先,我们使用MyEclipse创建一个Web项目,步骤如下。
(1) 打开MyEclipse,在菜单栏中选择File → New → Web Project命令,弹出New Web Project对话框。
在Create a JavaEE Web Project界面的Project Name文本框中,输入“StrutsDemo”名称,在Java version文本框中,选择我们自己安装配置的1.7版本,在Target runtime下拉列表中,选择Apache Tomcat v7.0,如图4-8所示,单击Next按钮。
(2) 进入Java界面,可以在src下添加文件夹,这里不用修改,如图4-9所示,单击Next按钮。
(3) 进入Web Module界面,在其中勾选Generate web.xml deployment descriptor复选框,如图4-10所示,单击Next按钮。
提示:若在前面图4-8的界面中,从Java EE version下拉列表框里选中JavaEE 5 - Web 2.5选项的话,该Generate web.xml deployment descriptor复选框默认是勾选的。
(4) 进入Configure Project Libraries界面,如图4-11所示。
图4-8 New Web Project对话框
|
图4-9 Java设置界面
|
图4-10 Web模块设置界面
|
图4-11 构建项目库文件
|
提示:在这里可以去除Apache Tomcat v7.0 RunTime Libraries和JSTL 1.2.1 Library,也可以通过Add custom JAR按钮添加自定义的JAR包。
(5) 单击Finish按钮,完成后,在窗体左侧的包资源管理器视图中,就可以看到StrutsDemo项目结构了,如图4-12所示。
图4-12 Web项目目录的结构
4.3.2 添加Struts 2框架支持文件
把我们在前面讲解过的Struts-
2.3.16文件夹中的以下文件:commons-fileupload-1.3.jar、commons-logging-1.1.3.jar、commons-io-2.2.jar、commons-lang3-3.1.jar、freemarker-2.3.19.jar、javassist-3.11.0.GA.jar、ognl-3.0.6.jar、struts2-core-2.3.16.jar、xwork-core-2.3.16.jar复制到StrutsDemo项目下的“\WebRoot\WEB-INF\lib”路径下,然后刷新项目,在左侧的包资源管理器中的Web App Libraries节点下,就可以看见所添加的JAR文件,如图4-13所示。
图4-13 添加Struts 2支持包后的效果
至此,Struts 2的基本框架文件就安装到Web项目中了。
4.3.3 新建JSP页面
在WebRoot的根目录下创建视图页面Hello.jsp,在该页面中创建一个简单的超级链接的文本,代码如下所示:
<center>
<!-- hello是请求的action,也可写成hello.action -->
<h3><a href="hello">从Hello.jsp页面跳转到HelloWorld.jsp页面</a></h3>
</center>
为了能在页面中显示中文,需在JSP页面中设置页面编码为gbk,如下所示:
<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
然后创建HelloWorld.jsp页面,在其中显示欢迎的内容,代码如下所示:
<center>
<h2>欢迎您来到Struts 2的世界!</h2>
<h3>第一个程序,Hello World!</h3>
</center>
4.3.4 在web.xml文件中添加过滤器
在项目的“\WebRoot\WEB-INF\”路径下的web.xml文件中,配置Struts 2的核心控制器,用来拦截请求,并将请求转发给相应的Action处理,代码如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>StrutsDemo</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<!--在JSP内容中,讲解过该部分,这里省略其他的欢迎文件 -->
</welcome-file-list>
<!—配置Struts 2框架的核心控制器-->
<filter>
<!--配置Struts 2核心控制器的名字-->
<filter-name>struts2</filter-name>
<!--配置Struts 2核心控制器的实现类-->
<filter-class>
org.apache.struts2.dispatcher.ng.filter
.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<!-- 过滤器拦截名称 -->
<filter-name>struts2</filter-name>
<!-- 配置Struts 2的核心过滤器拦截所有的用户请求-->
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
4.3.5 创建业务控制器HelloAction类
创建访问页面Hello.jsp所对应的业务控制器HelloAction类。
让HelloAction类继承com.opensymphony.xwork2包中的ActionSupport类,并重写ActionSupport类中的execute()方法,HelloAction类的代码如下所示:
package com.yzpc.action;
import com.opensymphony.xwork2.ActionSupport;
public class HelloAction extends ActionSupport {
@Override
public String execute() throws Exception {
//SUCCESS是一个值为“success”的常量,也可写为return "success";
return SUCCESS;
}
}
4.3.6 编写struts.xml配置文件
当Action处理完客户端请求后,就会返回一个字符串,每个字符串对应一个视图。在项目的src文件夹下创建struts.xml文件,打开struts.xml文件,在该文件中配置HelloAction类,代码如下所示:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="default" namespace="/" extends="struts-default">
<action name="hello" class="com.yzpc.action.HelloAction">
<result name="success">/HelloWorld.jsp</result>
</action>
</package>
</struts>
在文件中配置Action时,用name属性定义该Action的名称,用class属性定义这个Action的实现类。在配置Result时,name表示接收Action中返回的字符串,实现逻辑视图和物理视图之间的映射。
4.3.7 部署测试项目
使用MyEclipse开发好项目后,需要先将StrutsDemo部署到Tomcat服务器上。然后在浏览器的地址栏中输入“http://localhost:8080/StrutsDemo/Hello.jsp”,如图4-14所示。
图4-14 首页面的效果
点击图4-14中的超链接,显示欢迎页面,地址栏还是显示hello请求,如图4-15所示。
图4-15 链接后的欢迎页面
4.4 小 结
本章主要介绍了Struts 2框架的基础知识,Struts 2汲取了Struts 1与WebWork二者的优点。本章还介绍了Struts 2的MVC设计模式、Struts 2的工作原理、如何配置运行环境,以及使用Struts 2开发一个示例项目,让读者对Struts 2有了一个初步的了解。学习本章,读者应重点理解MVC思想的基本知识,以及开发Struts 2项目的基本流程。Struts 2框架极大地简化了程序员的工作,只需要进行简单的配置,即可开发Java Web应用程序。