2.2 构建第一个Struts 2应用
下面介绍如何下载并安装Struts 2框架,并且通过Struts 2来实现简单的登录案例,最后分析该程序的执行流程。
2.2.1 下载并安装Struts 2框架
Struts 2框架同样也是由Apache开源组织开发并负责维护的,所以可以登录Struts的官方站点“http://struts.apache.org”来下载,如图2.2所示。
在Struts官方站点中可以看到Struts的最新动态、帮助文档及下载等链接,在导航栏中找到“Documentation”选项,在该选项下可以看到现在Struts 2的最新版本是2.0.11.1。单击“Struts 2.0.11.1”链接进入Struts 2.0.11.1版本页面,如图2.3所示。
图2.2 Struts官方站点
图2.3 Struts 2.0.11.1版本页面
该页面为Struts 2.0.11.1版本页面,在该页面中包含该版本的介绍以及帮助文档。单击“Dowload Now”链接进入Struts 2.0.11.1下载页面,如图2.4所示。
该页面包括如下下载链接。
❑ Full Distribution:为完整版的下载,包括了下面所有的文件,建议下载这个。
❑ Example Applications:为Struts 2的示例程序,这些示例程序在以后的学习中会有很大的帮助。
❑ Blank Application only:为Struts 2的空示例程序,这个空应用已经包含在Example Applications选项下。
❑ Essential Dependencies Only:为Struts 2的核心库。
❑ Documentation:为Struts 2的相关文档,包含Struts 2的使用文档、参考手册和API文档等,有很好的参考价值。
❑ Source:为Struts 2的源代码。因为Struts 2也是开源框架,所以提供源代码以供参考。
❑ Alternative Java 4 JARs:为可选的JDK1.4支持JAR,因为现在还有大部分企业仍然在使用JDK1.4为所有JAR提供支持,如果安装的版本是5.0或者以上可以不用下载。
下载完成后,解压“struts-2.0.11.1-all.zip”压缩文件,文件结构如图2.5所示。
图2.4 Struts 2.0.11.1下载页面
图2.5 文件结构
❑ apps:该文件夹中存放Struts 2的示例程序。
❑ docs:该文件夹中存放Struts 2的相关文档。
❑ backport:该文件夹中存放Struts 2的JDK1.4支持JAR。
❑ lib:该文件夹中存放Struts 2的核心类库以及第三方的JAR文件。
❑ src:该文件夹中存放Struts 2框架的全部源代码。
下面介绍如何在项目中手动安装Struts 2框架,从而为Web应用添加Struts 2框架支持。
安装步骤如下。
(1)将struts-2.0.11.1中的lib文件夹下的“common-logging-1.0.4.jar”、“freemarker-2.3.8.jar”、“struts2-core-2.0.11.1.jar”、“xwork-2.0.4.jar”和“ognl-2.6.11.jar”类库复制到Web项目的WEB-INF/lib目录下。这些是构建Struts 2应用的必须库文件,如果要使用Struts 2的更多功能,还需要复制更多的JAR到Web项目的WEB-INF/lib目录下。如果是手动编译Struts 2的相关代码,必须先将“struts2-core-2.0.11.1.jar”和“xwork-2.0.4.jar”添加到CLASSPATH环境变量中。
注意
Struts 2默认需要Java 5.0及其以上的版本的运行环境支持,Web容器需要支持Servlet 2.4和JSP 2.0。如果使用低于Java 5.0版本的运行环境,则需要使用Struts 2框架中提供的JDK1.4支持。本书中的所有Web项目都是基于Java 6.0运行环境的,使用Tomcat 6.0版本。
(2)编辑Web项目中的“web.xml”配置文件,在配置文件中增加Struts 2核心Filter的配置。编辑后的“web.xml”配置文件代码如下。
<? xml version="1.0" encoding="UTF-8"? > <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <! --定义核心Filter FilterDispatcher --> <filter> <! -- 定义核心Filter的名称 --> <filter-name>struts2</filter-name> <! --定义核心Filter的实现类 --> <filter-class> org.apache.struts2.dispatcher.FilterDispatcher </filter-class> </filter> <filter-mapping> <! --核心Filter的名称 --> <filter-name>struts2</filter-name> <! --使用该核心Filter来接受所有的Web请求 --> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
经过上面的两个步骤就成功地为Web项目添加上了Struts 2框架支持。
2.2.2 基于Struts 2框架实现登录案例
下面将演示如何通过Struts 2来实现登录案例。其实使用Struts 2框架实现登录案例非常简单,甚至比Struts 1框架下实现登录案例还要简单,按以下步骤操作即可实现。
步骤如下。
(1)新建Web项目,并通过上面介绍的步骤安装Struts 2框架(包括配置“web.xml”配置文件)。
(2)在WEB-INF/classes文件夹下新建一个“struts.xml”配置文件。
(3)将前一项目中的“login.jsp”和“login_success.jsp”以及“login_failure.jsp”复制到本项目中。
(4)编译业务逻辑组件LoginCheck,并将编译后的class文件(包括完整的包名)放入项目的WEB-INF文件夹下的classes文件夹中。
(5)新建控制器类Action,类名为LoginAction。Struts 2下的控制器不同于Struts 1下的控制器,不需要继承Action父类,也无需继承任何借口,是一个普通的POJO类。Struts 2的Action包含了多个属性,用来封装用户请求的参数,这点和Struts 1当中的ActionForm非常类似。同时还包含一个execute方法。execute方法用来调用业务逻辑组件进行判断,并通过返回字符串,通过该字符串,Struts 2会跳转到指定的视图资源。LoginAction代码如下所示。
package net.hncu.struts2.action; import org.apache.struts2.ServletActionContext; import net.hncu.service.LoginCheck; public class LoginAction { private String uname; private String upassword; //获得uname值 public String getUname() { return uname; } //设置uname值 public void setUname(String uname) { this.uname = uname; } //获得password值 public String getUpassword() { return upassword; } //设置password值 public void setUpassword(String upassword) { this.upassword = upassword; } public String execute() throws Exception { //new一个LoginCheck对象 LoginCheck lc = new LoginCheck(); //调用业务逻辑组件的判断功能来判断 if(lc.isLogin(getUname(), getUpassword())){ //如果为合法用户,在request范围中添加属性login,其属性值为true ServletActionContext.getRequest().setAttribute("login", "true"); return "success"; }else{ return "failure"; } } }
这里要注意的是,因为Action类和Servlet API完全分离了,所以必须通过ServletActionContext类的静态方法getRequest()来获得request对象。
(6)编译LoginAction类,并将编译后的class文件(包括完整的包名)放入项目的WEB-INF文件夹下的classes文件夹中。
(7)配置Action。在“struts.xml”文件中配置Action,其中包括指定Action的实现类,以及Action处理结果与视图资源文件之间的映射。编辑“struts.xml”文件代码如下所示。
<? xml version="1.0" encoding="UTF-8" ? > <! DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <! -- struts为配置文件根元素--> <struts> <! -- Action必须放在指定的包名空间中--> <package name="struts2" extends="struts-default"> <! -- 定义login的Actin,其实现类为net.hncu.struts2.action.LoginAction--> <action name="login" class="net.hncu.struts2.action.LoginAction"> <! -- 定义处理结果与视图资源之间的关系--> <result name="success">/login_success.jsp</result> <result name="failure">/login_failure.jsp</result> </action> </package> </struts>
(8)修改login.jsp,修改页面提交页,使页面提交到“login.action”,代码如下所示。
<form action="login. action "method="post">
(9)部署该项目。打开Tomcat安装目录下的conf文件夹,打开其中的“server.xml”文件。在文件的最下面的“</host>”标签之前添加如下代码。
<Context path="/Struts2Demo" docBase="E:\BookDemo\ch02\Struts2Demo" reloadable="true" crossContext="true"></Context>
测试代码,访问登录页地址“http://localhost:8080/Struts2Demo/login.jsp”。在表单中随意地填写用户信息,单击“登录”按钮进行提交,页面将跳转到登录失败页。输入正确的用户信息,用户名和密码都填写“xiaoqiang”,单击“登录”按钮进行提交,页面将跳转到登录成功页。
2.2.3 程序执行流程
从前面代码中可以看出,使用Struts 2框架来完成这个登录案例,比Struts 1还要简单。Struts 2中取消了ActionForm,而是在Action中封装用户的请求参数。并且Struts 2返回的是一个普通的字符串,不再是一个ActionForward。
下面来分析该登录案例的执行流程。其程序执行流程图如图2.6所示。
图2.6 程序执行流程
程序执行分为如下几个步骤。
(1)用户输入登录信息,页面将提交到“login. action”。
(2)用户请求被FilterDispatcher转发给LoginAction处理。
(3)在LoginAction中封装用户请求的参数,并调用业务逻辑组件LoginCheck来进行登录信息的合法验证。
(4)如果用户不合法,则通过LoginAction返回success字符串,返回“login_success.jsp”页面给用户。
(5)如果用户合法,则通过LoginAction返回failure字符串,返回“login_failure.jsp”页面给用户。