Struts2

Struts2

  • 提供 Exception 处理机制,并且具有良好的 Ajax 支持。
  • Result 方式的页面导航,通过 Result 标签很方便地实现重定向和页面跳转。
  • 拥有智能的默认设置,不需要另外进行繁琐的设置。使用默认设置就可以完成大多数项目程序开发所需要的功能。

Struts2目录结构和基础JAR包介绍

Struts2 的官方下载网址为 http://struts.apache.org,在该网址中可以下载最新版本的 Struts2。由于本教程使用的 Struts2 版本为 2.3.37,因此建议读者也下载该版本。

下载成功后,将 struts-2.3.37-all.zip 压缩包进行解压,解压后的目录如图 1 所示。

 


了解了 Struts2 的文件夹结构后,下面学习一下如何在项目中使用 Struts2 框架。将图 1 中的 lib 文件夹打开,可以看到 Struts2 开发中可能用到的所有 JAR 包(此版本有 106 个 JAR 包)。在一般的 Web 开发中,只需要将 lib 文件夹下所依赖的几个基础 JAR 包复制到 Web 项目的 WEB-INF/lib 路径下即可使用 Struts2 框架。

下面针对 Struts2 项目所依赖的基础 JAR 包进行介绍,如表 2 所示。

从表 2 中可以看出,此版本的 Struts2 项目所依赖的基础 JAR 包共 13 个。Struts2 根据版本的不同所依赖的基础 JAR 包可能不完全相同,不过基本变化不大,读者可以视情况而定。

【拓展阅读】快速添加 Struts2 所需的 JAR 包

在图 1 中的 apps 目录下,找到 struts2-blank.war 文件,此文件是 Struts2 官方提供的一个空示例项目,里面包含了一些基础 JAR 包和一些 xml 配置文件。开发中为了方便快速地使用 Struts2 进行开发,读者可将此文件的扩展名改为 zip(即 struts2-blank.zip),然后以压缩包方式解压打开。

将 WEB-INF/lib 文件夹下所有的 JAR 文件复制添加到自己所建立的 Web 应用程序的 WEB-INF/lib 中,即完成了 Struts2 的添加工作,这些 JAR 文件刚好就是 Struts2 所依赖的基础包。

第一个Struts2程序

通过前面两节的学习,读者已经了解了什么是 Struts2 框架,并掌握了在项目中添加 Struts2 框架的方法。为了帮助读者更快地掌握 Struts2 框架的使用,本节将使用 Struts2 框架实现一个 HelloWorld 程序。

1)创建项目

在 MyEclipse 中新建一个名为 struts2Demo01 的 Web 项目,将 Struts2 框架依赖的基础 JAR 包复制到此项目的 WEB-INF/lib 路径中,然后选中所有 JAR 并右击,进行 Build Path→Add to Build Path 操作(此时所选 JAR 包会被添加到项目的 classpath 中),添加后的项目结构如图 1 所示。

 

2)配置 Struts2 的核心过滤器

打开项目的 web.xml 文件,在文件中添加 Struts2 的核心过滤器 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter,具体如下所示。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  5. id="WebApp_ID" version="3.0">
  6. <!-- 配置Struts2核心过滤器 -->
  7. <filter>
  8. <filter-name>struts2</filter-name>
  9. <filter-class>
  10. org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
  11. </filter-class>
  12. </filter>
  13. <filter-mapping>
  14. <filter-name>struts2</filter-name>
  15. <url-pattern>/*</url-pattern>
  16. </filter-mapping>
  17. </web-app>

在 web.xml 文件中,<filter> 标签中配置的信息就是 Struts2 的核心过滤器,该过滤器的名称为 struts2,过滤器类为 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter,而 <filter-mapping> 标签中配置的是该过滤器的映射。

需要注意的是,在 Struts2.1 版本之前,所使用的核心过滤器类是 org.apache.struts2.dispatcher.FilterDispatcher,从 Struts2.1 版本之后,这个过滤器类已经不推荐使用了,而是使用 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter 类。

如果你觉得上边配置 Struts2 核心控制器麻烦,下边讲解一个快捷配置 Struts2 的核心过滤器的方法。
 
从上述 Web.xml 文件中可以看出,Struts2 的核心过滤器名称很长,如果手写的话,则很容易出现错误。为此,这里教读者一个快速添加 Struts2 核心过滤器的方法。

在第《Struts2下载及目录结构和JAR包介绍》教程中快捷导入基础 JAR 包时解压的 struts2-blank 文件夹中,打开 WEB-INF/web.xml 文件,即可找到上述 Web.xml 中 Struts2 的核心过滤器配置的代码,将配置代码复制到自己 Web 应用程序的 web.xml 文件中,就省去了自己手动编写的麻烦。

3)创建 Action 类

在项目的 src 目录下,新建一个名称为 com.mengma.action 的包,在包中创建一个名为 HelloWorldAction 的类,并使其继承 ActionSupport 类(Struts2 框架所提供的类)。在 HelloWorldAction 类中定义一个 execute() 方法,返回值为 SUCCESS,编辑后的代码如下所示。

  1. package com.mengma.action;
  2. import com.opensymphony.xwork2.ActionSupport;
  3. public class HelloWorldAction extends ActionSupport {
  4. public String execute() throws Exception {
  5. return SUCCESS;
  6. }

在上述 HelloWorldAction.java 中,execute() 方法的返回值 SUCCESS 是从父类中继承的常量字段,用于表示执行成功,并返回结果页面。execute() 方法的返回值对应 struts.xml 文件中 <result> 标签中 name 属性的值,Struts2 框架会根据 name 属性值执行对应处理结果下的视图资源。

4)编写 Struts2 的配置文件

在 src 目录下新建一个名称为 struts.xml 的文件,编辑代码后如下所示。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- 指定 Struts2 配置文件的 DTD 信息 -->
  3. <!DOCTYPE struts PUBLIC
  4. "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  5. "http://struts.apache.org/dtds/struts-2.3.dtd">
  6. <!-- Struts2配置文件的根元素 -->
  7. <struts>
  8. <!-- Struts2的Action必须放在指定的包空间下定义 -->
  9. <package name="hello" namespace="/" extends="struts-default">
  10. <!-- 定义 action,该 action 对应的类为 com.mengma.action.HelloWorldAction 类-->
  11. <action name="helloWorld" class="com.mengma.action.HelloWorldAction">
  12. <!-- 定义处理结果和视图资源之间的映射关系 -->
  13. <result name="success">/success.jsp</result>
  14. </action>
  15. </package>
  16. </struts>

在 struts.xml 文件中,<action> 标签中定义了请求路径,以及与其对应的 Action 类的映射关系,子标签 <result> 定义了处理结果和视图资源之间的映射关系。关于 struts.xml 文件的详细配置信息,后面的教程中会进行重点讲解,此处读者可不必关心其细节问题。

在 Struts2 的配置文件需要编写的内容有很多。尤其是文件上面的 dtd 信息,如果手动编写的话十分容易出错。同样的,在解压的 struts2-blank 文件夹中,将 WEB-INF/classes 目录下的 struts.xml 文件复制到自己所建立的 Web 项目的 src 目录下,然后在此基础上进行修改和配置即可。

5)创建视图首页文件

在 WebContent 目录下创建一个名称为 index.jsp 的页面文件,在其中编写一个超链接,用于访问 Action 对象,此链接指向的地址为 helloWorld.action,如下所示。

  1. <%@ page language="java" contentType="text/html; charset=utf-8"
  2. pageEncoding="utf-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <title>首页</title>
  7. </head>
  8. <body>
  9. <a href="${pageContext.request.contextPath }/helloWorld.action">
  10. 第一个 Struts2 程序!
  11. </a>
  12. </body>
  13. </html>

6)创建返回页面

在 WebContent 下再创建一个名称为 success.jsp 的文件,作为 Action 对象处理成功后的返回页面,如下所示。

  1. <%@ page language="java" contentType="text/html; charset=utf-8"
  2. pageEncoding="utf-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <title>成功页面</title>
  7. </head>
  8. <body>
  9. 您的第一个小程序执行成功,欢迎来到Struts2的世界!
  10. </body>
  11. </html>

7)启动项目并查看结果

将项目 struts2Demo01 发布到 Tomcat 服务器后启动服务器,在浏览器的地址栏中输入地址 http://localhost:8080/struts2Demo01/index.jsp 后,浏览器的显示结果如图 2 所示。

index.jsp
图 2  index.jsp


单击图 2 中的超链接后,浏览器会发送一个以 helloWorld.action 为结尾的请求,此时浏览器的显示结果如图 3 所示。

success.jsp
图 3  success.jsp


从图 3 的显示结果中可以看出,程序顺利返回到了 success.jsp 页面,这说明 Struts2 入门案例执行成功。

上面所讲解的 Struts2 入门程序,实际上就是一个请求发出到响应结束的过程,为了让读者更直观地了解该案例的执行全过程,下面通过简单的执行流程图进行说明,如图 4 所示。

从图 4 中可以看出,在客户端浏览器上单击 index.jsp 中的超链接时,会发送一个 helloWorld.action 请求,该请求被核心过滤器拦截后,会通过 struts.xml 文件中的配置找到请求对应的 HelloWorldAction,并默认调用 HelloWorldAction 中的 execute() 方法返回逻辑视图名,然后再通过配置文件找到并转发给对应的视图页面 success.jsp 中,最后生成响应内容并输出响应的返回结果。

Struts2处理用户请求的完整流程

通过学习《第一个Struts2程序》教程,相信读者对 Struts2 框架的使用已经有了一个初步的了解。为了帮助读者能够更好地学习 Struts2 框架,下面通过图例深入分析一下 Struts2 的基本执行流程,如图 1 所示。

从图 1 所示的流程图中可以看出,一个请求在 Struts2 框架中的处理大概可以分为以下几个步骤。

1)首先客户端浏览器发送一个请求(HttpServletRequest)。

2)接着程序会调用 StrutsPrepareAndExecuteFilter,然后询问 ActionMapper 这个请求是否需要调用某个 Action。

3)如果 ActionMapper 决定需要调用某个 Action,StrutsPrepareAndExecuteFilter 会把请求的处理交给 ActionProxy。

4)ActionProxy 通过配置管理器(Configuration Manager)从配置文件(struts.xml)中读取框架的配置信息,从而找到需要调用的 Action 类。

5)ActionProxy 会创建一个 ActionInvocation 的实例。

6)ActionInvocation 使用命名模式调用 Action,在调用 Action 前,会依次调用所有配置的拦截器(Intercepter1、Intercepter2……)。

7)一旦 Action 执行完,则返回结果字符串,ActionInvocation 就会负责查找结果字符串对应的 Result,然后执行这个 Result。通常情况下 Result 会调用一些模板(JSP 等)呈现页面。

8)产生的 Result 信息返回给 ActionInvocation,在此过程中拦截器会被再次执行(顺序与 Action 执行之前相反)。

9)最后产生一个 HttpServletResponse 的响应行为,通过 StrutsPrepareAndExecuteFilter 反馈给客户端。

配置struts.xml自动提示功能

在开发过程中如果可以上网,struts.xml 会自动缓存 dtd,提供提示功能,方便代码编写。如果不能够上网,则需要手动配置本地 dtd,这样才能够使 struts.xml 产生提示。具体配置方法如下。

1)在 MyEclipse 中,依次单击工具栏中的 window 和下方的 Preferences 弹出对话框,然后在左侧的搜索框中输入 xml,显示出所有与 xml 有关的选项后,单击 XML Catalog,会出现如图 1 所示的界面。

2)在 Struts2 的 lib 包中找到其核心包 struts2-core-2.3.37.jar,使用解压工具将其解压成文件夹形式。解压后,会看到文件夹中有几个以 dtd 结尾的文件。这里所使用的是 struts-2.3.dtd。

3)将 struts-2.3.dtd 文件使用 EditPlus 等文本工具打开后,找到图 2 中选中的内容,将其 http 地址(http://struts.apache.org/dtds/struts-2.3.dtd)复制,如图 2 所示。

 

4)单击 Eclipse 中弹出对话框中右侧的 Add... 按钮,此时会弹出 Add XML Catalog Element 界面。单击 File System 按钮,找到本地刚才解压文件夹中的 struts-2.3.dtd,然后将界面中的 Key type 改为 URI,并将刚才复制的地址粘贴到 Key 中,如图 3 所示。

 

在图 3 中单击 OK 按钮后,关闭已经打开的 struts.xml,然后再重新打开 struts.xml,此时再编写 struts.xml 内容时,就会有提示了。

struts.xml配置文件详解

struts.xml 是 Struts2 框架的核心配置文件,该文件主要用于配置 Action 和请求的对应关系,以及配置逻辑视图和物理视图(逻辑视图就是在 struts.xml 文件中配置的 <result> 元素,它的 name 属性值就是逻辑视图名;物理视图是指 <result> 元素中配置的结果页面,如 JSP 文件)资源的对应关系。

struts.xml 文件通常放在 Web 应用的 WEB-INF/classes 目录下,在该目录下的 struts.xml 文件可以被 Struts2 框架自动加载。由于 MyEclipse 开发工具在编译时会自动将 src 路径下的 struts.xml 文件编译后放到 WEB-INF/classes 路径下,所以直接将其放到项目的 src 路径下即可。

下面来看一个典型的 struts.xml 文件结构,如下所示:

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  4. "http://struts.apache.org/dtds/struts-2.3.dtd">
  5. <struts>
  6. <!--<constant>元素用常量的配置-->
  7. <constant name="struts.enable.DynamicMethodInvocation" value="false" />
  8. <constant name="struts.devMode" value="true" />
  9. <!--<package>元素用于包配置-->
  10. <package name="default" namespace="/" extends="struts-default">
  11. <!--配置Action-->
  12. <action name="index" class="Xxx"/>
  13. <!--配置Result-->
  14. <result type="dispatcher">
  15. <param name="location">/index.jsp</param>
  16. </result>
  17. </action>
  18. </package>
  19. <!-- <include>元素用于包含配置 -->
  20. <include file="example.xml"/>
  21. </struts>
原文地址:https://www.cnblogs.com/lkwcrystal/p/12558769.html