零基础学Struts
上QQ阅读APP看书,第一时间看更新

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">
                        <! -- 定义loginActin,其实现类为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”页面给用户。