2.2 基于Struts2的加法器

在本书第1章中,使用了自定义的MVC框架来实现加法器,现在通过实现一个基于Struts2的加法器,进一步了解Struts2的处理流程。

在Struts2框架下开发加法器的具体步骤如下。

01 配置Struts2应用环境。

02 创建add.jsp页面,接收用户输入数据。

03 创建业务逻辑类Calculator,实现数据的算术运算。

04 创建AddAction类,实现execute()方法。

05 在struts.xml中配置AddAction。

06 创建add_result.jsp页面,显示计算结果。

2.2.1 配置应用环境

为了让Web应用支持Struts2的功能,必须将Struts2框架的核心类库增加到Web应用中。Struts2的5个核心jar文件分别是:

        commons-logging-1.0.4.jar
        freemarker-2.3.8.jar
        ognl-2.6.11.jar
        struts2-core-2.0.14.jar
        xwork-2.0.7.jar

注意 本书中Struts2的版本为2.0.14,Struts2的下载及安装参见实践1。

将Struts2框架的核心jar文件复制到Web应用的lib路径下,如图2-2所示。

图2-2 Web应用中增加Struts2支持

在Web应用中加入Struts2的核心类库后,还需要修改web.xml配置文件,在web.xml文件中配置Struts2的核心控制器FilterDispatcher。配置文件代码如下。

【描述2.D.1】web.xml

<filter>
    <!-- 配置Struts2框架的核心Filter -->
    <filter-name>struts2</filter-name>
    <!-- 配置Struts2核心Filter的实现类 -->
    <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
    <filter-name>struts2</filter-name>
    <!-- 匹配所有请求 -->
    <url-pattern>/*</url-pattern>
</filter-mapping>

上述代码中配置了Struts2的核心过滤器,指明过滤器类是FilterDispatcher,过滤器URL模式是匹配所有请求。如此,该Web应用就具备了Struts2框架的功能支持。

2.2.2 创建输入视图

下述代码用于实现任务描述2.D.1,在WebContent目录中创建加法器的输入页面add.jsp,用于接收两个数值。

【描述2.D.1】add.jsp

<%@ page contentType="text/html; charset=GBK"%>
<html>
<head>
<title>Struts2计算器</title>
</head>
<body bgcolor="#ffffc0">
<h1>Struts2计算器</h1>
<form id="calcForm" method="post" action="add.action">
<table>
    <tbody>
        <tr>
            <td>第一个数</td>
            <td><input type="text" name="num1" /></td>
        </tr>
        <tr>
            <td>第二个数</td>
            <td><input type="text" name="num2" /></td>
        </tr>
        <tr>
            <td><input type="submit" value="加" /></td>
        </tr>
    </tbody>
</table>
</form>
</body>
</html>

上述代码中的表单与任务描述1.D.1中的add.jsp没有任何区别,表单依然提交给“add.action”进行处理。

2.2.3 实现业务逻辑类

下述代码用于实现任务描述2.D.1,在com.haiersoft.ch02.biz包中创建加法器的业务逻辑类Calculator,实现加减乘除运算。

【描述2.D.1】Calculator.java

public class Calculator {
    /**
    * 实现算术加法
    */
    public double add(double a, double b) {
        return a + b;
    }
    /**
    * 实现算术减法
    */
    public double subtract(double a, double b) {
        return a - b;
    }
    /**
    * 实现算术乘法
    */
    public double multiply(double a, double b) {
        return a * b;
    }
    /**
    * 实现算术除法
    */
    public double divide(double a, double b) {
        // 注意:此处未判断除数不能为零,即b!=0,页面输入的第二个数不可为0,否则报错
        return a / b;
    }
}

上述代码与任务描述1.D.1中的Calculator.java无任何区别。

2.2.4 创建业务控制器

下述代码用于实现任务描述2.D.1,在com.haiersoft.ch02.action包中创建用于实现加法器的业务控制器AddAction。

【描述2.D.1】AddAction.java

public class AddAction {
    private double num1;
    private double num2;
    public double getNum1() {
        return num1;
    }
    public void setNum1(double num1) {
        this.num1 = num1;
    }
    public double getNum2() {
        return num2;
    }
    public void setNum2(double num2) {
        this.num2 = num2;
    }
    /**
    * 调用业务逻辑方法,实现业务,控制流程转向
    */
    public String execute() {
    // 新建业务逻辑对象
        Calculator biz = new Calculator();
        // 调用业务逻辑方法,获得返回值
        double result = biz.add(num1, num2);
        // 将计算结果存入Session中
        ActionContext.getContext().getSession().put("result", result);
        return "cal";
    }
}

上述代码中定义了两个属性num1和num2,并提供相应的getter/setter方法。num1和num2与add.jsp页面中表单的元素名相对应,如此,当表单提交时,表单中用户输入的元素值会通过setter方法设置到相应的属性中。在execute()方法中,先实例化一个Calculator类的对象,再调用此对象的add()方法进行加法运算。将计算的结果值保存到Session中,代码如下。

ActionContext.getContext().getSession().put("result", result);

Struts2的Action可以通过ActionContext来访问Servlet API,有关ActionContext的详细介绍见后续章节。

2.2.5 配置业务控制器

创建完AddAction类后,需要在struts.xml中对AddAction进行配置。如图2-3所示,在类文件的根目录(即src目录)下创建一个struts.xml文件。

图2-3 struts.xml位置

下述代码用于实现任务描述2.D.1,在struts.xml中配置业务控制器。

【描述2.D.1】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>
    <!-- 指定Struts2处于开发阶段,可以进行调试 -->
    <constant name="struts.devMode" value="true" />
    <!-- Struts2的Action都必须配置在package里 -->
    <package name="p2" extends="struts-default">
        <!-- 定义一个add的Action,实现类为com.haiersoft.ch02.action.AddAction -->
        <action name="add" class="com.haiersoft.ch02.action.AddAction">
            <!-- 配置execute()方法返回值所对应的页面 -->
            <result name="cal">/add_result.jsp</result>
        </action>
    </package>
</struts>

上述代码配置了一个名为add的Action,并指明对应的Action类。在<result>元素中指明返回值为“cal”时对应的跳转页面是add_result.jsp。

2.2.6 创建结果视图

下述代码用于实现任务描述2.D.1,在WebContent目录中创建add_result.jsp页面,显示计算结果值。

【描述2.D.1】add_result.jsp

<%@ page contentType="text/html; charset=GBK" pageEncoding="GBK"%>
<html>
<head>
<title>计算器</title>
</head>
<body bgcolor="#ffffc0">
<h1>算术计算器</h1>
<table>
    <tbody>
        <tr>
            <td>第一个数</td>
            <td>${param.num1}</td>
        </tr>
        <tr>
            <td>第二个数</td>
            <td>${param.num2}</td>
        </tr>
        <tr>
            <td>结果</td>
            <td>${sessionScope.result}</td>
        </tr>
    </tbody>
</table>
<button onclick="history.go(-1);">返回</button>
</body>
</html>

上述代码与任务描述1.D.1中的add_result.jsp一样,用于显示计算结果,只是结果值是从session中提取的,而非request中。

2.2.7 运行

到目前为止,基于Struts2的加法器已经完成,运行结果如图2-4所示。

图2-4 Struts2加法器的运行结果

基于Struts2的加法器在原理上与自定义框架的加法器是一样的。相比自定义框架的加法器实现,基于Struts2的加法器在代码上简化了许多;而且当增加一个Action时,只需在Struts2的配置文件中进行简单配置即可,无须使用大量代码进行控制实现。另外Struts2框架还提供了许多功能,例如,异常处理、Struts2标签库等,这些功能使Struts2开发更加轻松和完善。

注意 Struts2 除了支持JSP作为视图资源之外,还可以使用其他视图技术如FreeMarker、Velocity等。