Struts框架,提供了一种基于MVC体系结构的Web程序的开发方法,具有组件模块化、灵活性和重用性等优点,使基于MVC模式的程序结构更加清晰,同时也简化了Web应用程序的开发。本章主要介绍Struts2框架的使用方法及其使用Struts2开发Web程序的过程及其设计案例。

11.1  Struts2简介

11.1.1  Struts2的组成与工作原理

Struts2是基于MVC模式的Web框架,Struts2框架按照MVC的思想主要有,控制器层,模型层,视图组件。

Struts2的处理流程图:

当用户请求到达时,该Filter会过滤用户的请求。当请求转入Struts2框架处理时会先经过一系列的拦截器,然后再到Action。Struts2对用户的每一次请求都会创建一个Action,Action是线程安全的。

1.下载Struts2

在搭建Struts2环境前,首先下载Struts2包文件。下载网站为:http://struts.apache.org/download,下载压缩文件struts-2.x.x-all.zip(目前最新的版本为Strut-2.3.8-all-zip)。

下载后,解压该文件,其目录下包含4个子目录:

  • apps:该文件夹下包含了基于Struts2的示例应用,这些示例应用对于学习者是非常有用的资料。
  • docs:该文件夹下包含了Struts 2的相关文档,包括Struts 2的快速入门、Struts 2的文档,以及API文档等内容。
  • lib:该文件夹下包含了Struts 2框架的核心类库,以及Struts 2的第三方插件类库,在可发应用程序时,要将需要到的jar文件,导入工程中。
  • src:该文件夹下包含了Struts 2框架的全部源代码。

11.1.2  搭建Struts2开发环境

对于一个应用程序(Web工程),搭建其所需要的Struts2环境,一般需要以下2步工作:

首先,找到开发Struts2应用所需要使用到的jar文件,并导入工程中; 其次,修改配置web.xml文件,在web.xml文件中加入Struts2 MVC框架启动配置。

1)导入开发Struts2应用所依赖的jar文件

开发Struts 2应用程序最少需要的Jar包:

  • struts2-core-2.x.x.jar:Struts 2框架的核心类库。
  • xwork-core-2.x.x.jar:XWork类库。
  • ognl-2.6.x.jar:对象图导航语言,struts2框架通过其读写对象的属性。
  • freemarker-2.3.x.jar:Struts 2的UI标签的模板使用FreeMarker编写。
  • commons-logging-1.x.x.jar:支持Log4J和JDK 1.4以上的日志记录。
  • commons-fileupload-1.2.1.jar:文件上传组件。
  • javassist-3.11.0.GA.jar:对象图导航语言类库
  • commons-validator-1.3.1.jar:验证类库

2)在配置文件Web.Xml中配置Struts2的启动信息

Struts2通过StrutsPrepareAndExecuteFilter过滤器来启动,在web.xml文件中添加如下配置:

<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>

(3)建立一个Struts2应用的配置文件

Struts2默认的配置文件为struts.xml(对于MyEclipse开发环境,需要建立在scr子目录下)。对于刚建立的Web应用程序,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>

在以后的设计中,需要对该文件进行修改,添加有关的配置信息

11.1.3  Struts2入门案例

                   ——基于Struts2任意两数据的代数和

【例11-1】设计一个简单的Web程序,其功能是让用户输入两个整数,并提交给Action,在Action中计算这两个数的代数和,如果代数和为非负数,则跳转到ch11_1_Positive.jsp页面,否则跳转到ch11_1_Negative.jsp页面。

【分析】该问题可设计3个大组件,视图组件、模型组件和控制组组件,但由于该问题较简单,只需要视图组建和控制组建。其中,视图组建有3个Jsp页面:输入两个数据的提交页面(ch11_1_Input.jsp)、代数和为非负数,跳转到ch11_1_Positive.jsp页面,否则跳转到ch11_1_Negative.jsp页面;控制器有一个Action:Ch11_1_Action,该类有三个属性(int x,int y,int sum),分别存放加数、被加数以及和值。其逻辑关系,如图所示。

【设计步骤】

由上面的分析,该程序的开发步骤为:

(1)建立Web工程并在web.xml中配置核心控制器。

(2)设计和编写视图组件(使用JSP编写页面)。

(3)编写视图组件对应的业务控制器组件Action。

(4)配置业务控制器Action,即修改struts.xml配置文件,配置Action。

(5)部署及其运行程序。

【系统的实现】按设计步骤,依次实现:

(1)在MyEclipse中创建Web工程ch11_1_StrutsAdd(注意:在创建Web工程时,最好选用JavaEE规范),并导入Struts2必需的jar包。

(2)修改web.xml配置文件,在web.xml中添加如下的配置信息:

<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>

(3)编写JSP页面

由图11-3可知,该系统需要3个页面:

ch11_1_Input.jsp

ch11_1_Positive.jsp

ch11_1_Negative.jsp

① 提交数据页面:ch11_1_Input.jsp代码:

<%@ page language="java" import="java.util.*" 
           pageEncoding="UTF-8"%>
<html>
  <head> <title>提交两数据页面</title> </head>  
<body>
    <form action= "add"  method="post">
      请输入两个整数:<br><br>
      加数:<input name="x"/><br><br>
      被加数:<input name="y"/><br><br>
     <input type="submit" value="求和">
    </form>
  </body>
</html>

 

② 代数和为非负数时要跳转到页面ch11_1_Positive.jsp代码:

<%@ page language="java"  pageEncoding="UTF-8"%>
<%@  taglib prefix="s" uri="/struts-tags"%>
<html>
  <head> 
           <title>显示页面——代数和为非负整数</title> 
</head>  
<body>
       代数和为非负整数:<s:property value="sum"/>
  </body>
</html>

 

③ 代数和为负数时要跳转到页面ch11_1_Negative.jsp代码:

<%@ page language="java"  pageEncoding="UTF-8"%>
<%@  taglib prefix="s" uri="/struts-tags"%>
<html>
  <head> <title>显示页面——代数和为负整数</title> </head>  
  <body>
     代数和为负整数:<s:property value="sum"/>
  </body>
</html>

 

(4)设计控制类(Action类):Ch11_1_Action.java

属性x、y用于接受用户提交的数据,而sum用于保存计算结果,package Action;
public class Ch11_1_Action {
private int x;
    private int y;
    private int sum;
    public int getX() {return x;}
    public void setX(int x) {this.x = x;}
    public int getY() {return y;}
    public void setY(int y) {this.y = y;}
    public int getSum() {return sum;}
    public String execute() {
                sum=x+y;
               if(sum>=0) return "+";
        else return "-";
    }
}

 

(5)修改struts.xml配置文件,配置Action

<?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="add" class="Action.Ch11_1_Action">
            <result name="+">/ch11_1_Positive.jsp </result>
            <result name="-">/ch11_1_Negative.jsp</result> 
        </action>
    </package>
</struts>

 

(6)部署该程序到服务器Tomcat中,运行。

11.1.4  Struts 2的中文乱码问题处理

中文乱码问题一般指的是当请求参数有中文时,无法再Action中得到正确的中文。

Struts2中有两种方法可以解决这个问题:

(1)设置JSP页面的pageEncoding=”UTF-8″,就不会出现中文乱码。

(2)如果JSP页面的pageEncoding=”GBK”,那么需要在源包(src)下,建立一个属性文件struts.properites,并在该文件内填写如下内容,修改有关的属性值:

struts.locale=zh_CN

struts.i18n.encoding=gbk

思考:修改例11-1,实现两个汉字字符串的连接,当连接后的串长度大于10,就显示连接结果并显示“串太长”;当连接串的长度小于10,则显示连接结果并显示“串长度较短”。

11.2  Struts2的配置文件

11.3  Struts2的业务控制器——Action类设计

11.4  Struts2的OGNL表达式、标签库、国际化

11.5  Struts2的拦截器

11.6  Struts2的文件上传和下载

11.7  Struts2的输入验证