0x00 参考

本笔记直接参考或引自如下链接文章:

http://c.biancheng.net/struts2/

https://www.w3cschool.cn/struts_2/

0x01 Struts2简介

Struts2 是 Apache 软件组织推出的一个基于 MVC 模式的轻量级 Web 框架,自问世以来,就受到了广大 Web 开发者的欢迎。目前,Struts2 在 Java Web 开发领域中已占据了十分重要的地位。

目前为止,Struts 框架拥有两个主要版本:Struts1.x 和 Struts2.x。Struts1 是最早的基于 MVC 模式的轻量级 Web 框架,它能够合理划分代码结构,并包含验证框架、国际化框架等多种实用工具框架。

随着技术的不断进步,Struts1 的局限性也越来越多地暴露出来。为了符合更加灵活、高效的开发需求,Struts2 框架应运而生,并在逐渐取代 Struts1 框架。

Struts2 是在 Struts1 和 WebWork 技术(WebWork 是由 OpenSymphony 组织开发的、致力于组件化和代码重用的 J2EE Web 框架,它也是一个 MVC 框架)的基础上进行合并后的全新框架。

虽然 Struts2 的名字与 Struts1 相似,但其设计思想有很大不同,因为 Struts2 是以 WebWork 为核心的,它是 WebWork 技术与 Struts1 技术的结合,所以 Struts2 可以理解为 WebWork 的更新产品。

Struts2的优点如下:

  • POJO表单及POJO操作 - Struts2 去除掉了Struts框架中的Action Forms部分。在Struts2框架下,你可以用任何一POJO来接收表单输入,同样的,你可以把任一POJO视为一个Action类。
  • 标签支持 - Struts2 改进了标签表单,而新的标签可让开发人员减少代码编写量。
  • AJAX支持 - Struts2 被认可接收进Web 2.0技术,并创建了功能非常类似于标准的Struts2 标签的AJAX标签,把AJAX支持整合进其结果中。
  • 易于整合 - Struts有多种整合方式可使用,现在与其他类型的框架,如Spring、Tiles、SiteMesh之类的,整合更为容易了。
  • 模板支持 - 支持使用模板生成视图。
  • 插件支持 - 有大量的插件可用于Struts2,而使用插件可以增强和扩大Struts2 核心行为。
  • 性能分析 - Struts2 为调试和配置应用程序提供综合的性能分析,此外,Struts也以嵌入调试工具的形式提供集成调试。
  • 易于修改标签 - 在Struts2 中,可使用Freemarker的模板对标签标记进行调整,而修改标签不需要JSP或是Java知识,基本的HTML、XML和CSS知识就足够了。
  • 促进减少配置 - Struts2 使用各种设置的默认值促进减少配置,而你不需要再配置什么除非是偏离了Struts2 设定的默认设置。
  • 视图技术 - Struts2 为多种视图选项(JSP、Freemarker、Velocity、XSLT等)提供支持。

尽管Struts2 有一大列的优点,但我们还是要提到关于它的一些仍需不断改进的缺点:

  • 更大的学习曲线 - 使用Struts MVC,你必须要熟悉JSP、Servlet APIs标准以及一个大型、复杂的框架。
  • 文档缺乏 - 相比于Servlet和JSP APIs标准,Struts的在线资源较少,许多初学者会发现Apache在线文档混乱并缺乏整理。
  • 不够透明 - 相比于使用正常的基于Java的Web应用程序,使用Struts的应用程序有许多是进行在后台,这使得框架不易于理解。

最后说明一点,一个好的框架应该提供各种类型的应用程序都可以使用的通用行为,Struts2 是最好的Web框架之一,并频繁用于RIA(Rich Internet Applications)的发展。

0x02 Struts2目录结构和基础Jar包

Struts2 的官方下载网址为:http://struts.apache.org

这里下载2.3.37版本来演示。

目录结构

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

各个目录介绍如下表:

名称 作用
apps 用于存放官方提供的 Struts2 示例程序,这些程序可以作为学习者的参考资料。各示例均为 war 文件,可以通过 zip 方式进行解压。
docs 用于存放官方提供的 Struts2 文档,包括 Struts2 的快速入门、Struts2 的文档,以及 API 文档等内容。
lib 用于存放 Struts2 的核心类库,以及 Struts2 的第三方插件类库。
src 用于存放该版本 Struts2 框架对应的源代码。

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

下面看看几个基础的Jar包。

基础Jar包

Struts2 2.3.37版本依赖的 JAR 包介绍如下表:

文件名 说 明
asm-3.3.jar 操作 Java 字节码的类库
asm-commons-3.3.jar 提供了基于事件的表现形式
asm-tree-3.3.jar 提供了基于对象的表现形式
struts2-core-2.3.37.jar Struts2 框架的核心类库
xwork-core-2.3.37.jar Web Work 核心库,Struts2 的构建基础
ognl-3.0.6.jar 对象图导航语言(Object Graph Navigation Language),Struts2 框架通过其读/写对象的属性
freemarker-2.3.22.jar Struts2 标签模板使用的类库
javassist-3.11.0.GA.jar JavaScript 字节码解释器
commons-fileupload-1.4.jar Struts2 文件上传组件依赖包
commons-io-2.2.jar Struts2 的输入/输出,传文件依赖的 JAR
commons-lang-2.4.jar 包含一些数据类型工具,是对 java.lang 包的增强
log4j-api-2.2.jar Struts2 的日志管理组件依赖包的 API
log4j-core-2.2.jar Struts2 的日志管理组件依赖包

可以看出,此版本的 Struts2 项目所依赖的基础 JAR 包共 13 个。Struts2 根据版本的不同所依赖的基础 JAR 包可能不完全相同,不过基本变化不大。

0x03 Struts2架构

Struts2是一个以MVC为基础的框架。

从一个高水平角度看,Struts2 是一个MVC拉动的(或MVC2)框架,Struts2 的模型-视图-控制器模式是通过以下五个核心部分进行实现的:

  • 操作(Actions)
  • 拦截器(Interceptors)
  • 值栈(Value Stack)/OGNL
  • 结果(Result)/结果类型
  • 视图技术

而Struts2 与传统的MVC框架略有不同,因为它由Action扮演模型的角色,而不是控制器,虽然这样会有一些重叠。

上图描述了Struts2 高级系统架构下的模型、视图及控制器。控制器是通过Struts2 分派servlet过滤器以及拦截器进行实现,模型是通过Actions进行实现,而视图则是结果类型和结果的结合。值栈和OGNL提供共同的路线、链接以及与其他组件之间的集成。

除了上述部分,还有许多组件相关的信息。web应用程序组件、Actions组件、拦截器组件、结果组件等等。

请求生命周期

通过上述图片的描述,我们可以依照下面几点解释在Struts2 中用户的请求生命周期:

  • 用户发送一个资源需求的请求到服务器(例如:页面)。
  • 核心控制器查看请求后确定适当的动作。
  • 使用验证、文件上传等配置拦截器功能。
  • 执行选择的动作来完成请求的操作。
  • 另外,如果需要的话,配置的拦截器可做任何后期处理。
  • 最后,由视图显示结果并返回给用户。

0x04 HelloWorld程序

新建项目

在IDEA新建一个Web项目,命名为st2test,整个完整目录结构如图:

先导入如上lib目录中必需的基础Jar包。

配置 Struts2 的核心过滤器

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<!-- 配置Struts2核心过滤器 -->
<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>
</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 类。

创建 Action 类

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

1
2
3
4
5
6
7
8
9
package com.mi1k7ea;

import com.opensymphony.xwork2.ActionSupport;

public class HelloWorldAction extends ActionSupport {
public String execute() throws Exception {
return SUCCESS;
}
}

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

编写 Struts2 的配置文件

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

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

在 struts.xml 文件中,<action> 标签中定义了请求路径,以及与其对应的 Action 类的映射关系,子标签 <result> 定义了处理结果和视图资源之间的映射关系。

创建视图首页文件

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

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

创建返回页面

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

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

运行

0x05 Struts2工作流程

Struts2工作流程图:

从上图所示的流程图中可以看出,一个请求在 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 反馈给客户端。

0x06 Struts2配置文件

这里介绍下Struts2中web.xml、struts.xml、struts-config.xml以及struts.properties等配置文件。

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?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>
<!--<constant>元素用常量的配置-->
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" />
<!--<package>元素用于包配置-->
<package name="default" namespace="/" extends="struts-default">
<!--配置Action-->
<action name="index" class="Xxx"/>
<!--配置Result-->
<result type="dispatcher">
<param name="location">/index.jsp</param>
</result>
</action>
</package>
<!-- <include>元素用于包含配置 -->
<include file="example.xml"/>
</struts>

在上述文件中,元素说明如下:

  • <struts> 元素是文件的根元素,所有其他元素都放在 <struts></struts> 中。
  • <constant> 元素用于进行常量配置。
  • <package> 元素用于进行包配置,在 Struts2 框架中,包用于组织 Action 和拦截器等信息,每个包都是由零个或多个拦截器以及 Action 所组成的集合。
  • <include> 元素用于在一个 struts.xml 配置文件中包含其他的配置文件。

下面,将分别针对这些常用的元素及其配置进行详细讲解。

常量配置

在使用 Struts2 框架开发的项目中,通常需要使用大量的常量,这些常量大多在默认的配置文件中已经配置好,但由于用户的需求不同,开发的要求也有所不同,这时可能就需要对这些常量值进行修改,其修改的方法就是在配置文件中对常量进行重新配置。

在 Struts2 中,常量的配置通常使用以下三种方式。

  • 在 struts.xml 文件中使用 <constant> 元素配置常量(常用方式)。
  • 在 struts.properties 文件中配置常量。
  • 在 web.xml 文件中通过 <init-param> 元素配置常量。

上述三种配置方式中,在 struts.xml 文件中通过 <constant> 元素配置常量,是项目开发时最常用的方式,教程中的常量配置也是通过此种方式实现的,所以这里只介绍通过 <constant> 元素配置常量的方式,其他两种方式读者只需了解即可。

在 struts.xml 文件中通过 <constant.../> 元素配置常量时,需要指定两个必填的属性 name 和 value。其中 name 属性用于指定常量的常量名,value 属性用于指定常量的常量值。其配置的示例代码如下所示:

1
2
3
4
5
6
<struts>
<!--设置默认编码集为UTF-8-->
<constant name="struts.il8n.encoding" value="UTF-8" />
<!--设置使用开发模式-->
<constant name="struts.devMode" value="true" />
</struts>

在上述示例代码中,配置了常量 struts.i18n.encoding 和 struts.devMode。其中 struts.i18n.encoding 用于指定 Struts2 应用程序的默认编码集为 UTF-8,struts.devMode 用于指定项目使用的是开发模式。

Struts2 所支持的常量数量很多,在 struts2-core-2.3.37.jar 压缩文件的 org/apache/struts2 路径下有一个 default.properties 文件,该文件里为 Struts2 的所有常量都指定了默认值,读者可以通过查看该文件了解 Struts2 所支持的常量。

除了可以通过上述的三种方式配置常量以外,在 Struts2 内置的一些配置文件中也有对常量的配置。因此,如果在多个文件中配置了同一个 Struts2 常量,则 Struts2 框架加载常量是有一定顺序的,通常的搜索顺序如下。

1)default.properties:该文件保存在 struts2-core-2.3.37.jar 中的 org.apache.struts2 包中。

2)struts-default.xml:该文件保存在 struts2-core-2.3.37.jar 文件中。

3)struts-plugin.xml:该文件保存在 struts-Xxx-2.3.37.jar 等 Struts2 插件 JAR 包中。

4)struts.xml:该文件是 Web 应用自身的 Struts2 配置文件。

5)struts.properties:该文件是 Web 应用默认的 Struts2 配置文件。

6)web.xml:该文件是 Web 应用的配置文件。

上面指定了 Struts2 框架搜索 Struts2 常量的顺序,需要注意的是,如果在多个文件中配置了同一个 Struts2 常量,则后一个文件中配置的常量值会覆盖前面文件中配置的常量值。

包配置

在 Struts2 框架中,包用于管理 Action 和拦截器,每个包就是多个 Action、多个拦截器、多个拦截器引用的集合。在 struts.xml 文件中,使用 <package> 元素定义包配置,每个 <package> 元素都定义了一个包配置,其示例代码下所示:

1
2
3
<package name="default" namespace="/" extends="struts-default">
...
</package>

在上述代码中,<package> 元素用到了三个关键属性 name、namespace、extends,具体说明如下。

  • name:必填属性,用于指定该包的名称(该名称在配置文件中必须是唯一的),此名称是该包被其他包引用的 Key。
  • namespace:可选属性,用于定义该包的命名空间。
  • extends:可选属性,用于指定该包继承自其他包。其属性值必须是另一个包的 name 属性值,但该属性值通常都设置为 struts-default,这样该包中的 Action 就具有了 Struts2 框架默认的拦截器等功能。

包含配置

Struts2 允许将一个配置文件分解成多个配置文件,从而提高配置文件的可读性,<include> 元素用于在一个 struts.xml 配置文件中包含其他的配置文件。Struts2 默认只加载 WEB-INF/classes 下的 struts.xml 文件,一旦通过多个 XML 文件配置 Action,就必须通过 <include>元素包含其他配置文件。

在 struts.xml 文件中包含配置的示例代码如下所示:

1
2
3
4
5
6
7
8
<struts>
<!--不指定路径,默认在src下时的方式-->
<include file="struts-post.xml"/>
<include file="struts-user.xml"/>
<include file="struts-dept.xml"/>
<!--配置文件在具体包中时的方式-->
<include file="com/mengma/action/struts-product.xml"/>
</struts>

在上述代码中,struts.xml 文件通过 <include> 元素包含了四个配置文件,其中 file 属性用于指定被包含配置文件的名称。如果被包含的配置文件在 src 路径下,则直接指定文件名即可,如果被包含的配置文件在具体的包中,则需要引入被包含文件的包路径。

需要注意的是,每一个被包含的配置文件都是标准的 Struts2 配置文件,同样包含 DTD 信息、Struts2 配置文件的根元素等信息。由于 struts.xml 文件包含了其他的配置文件,所以在 Struts2 框架自动加载 struts.xml 文件时,就会完成所有配置信息的加载。

web.xml

web.xml配置文件是一种J2EE配置文件,决定Servlet容器的HTTP元素需求如何进行处理。它严格来说不是一个Struts2配置文件,但它是Struts2运作所需要进行配置的文件。

正如前面所讨论的,这个文件为每个Web应用程序提供接入点。在部署描述符(web.xml)中,Struts2应用程序的接入点将会定义为一个过滤器。因此我们将在web.xml里定义一个StrutsPrepareAndExecuteFilter类的接入点,而这个web.xml文件需要在WebContent/WEB-INF文件夹下创建。

如果你开始时没有模板或工具(比如Eclipse或Maven2)的辅助来生成,那这就是第一个你需要配置的文件。下面是我们在上一个例子中用到的web.xml的内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<!-- 配置Struts2核心过滤器 -->
<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>
</web-app>

注意,我们将Struts2过滤器映射到/*,而不是/*.action,这意味着所有的url都会被Struts2过滤器解析。

注意:自2.1.3版本开始,ActionContextCleanUp和FilterDispatcher都由StrutsPrepareAndExecuteFilter代替。

struts-config.xml

struts-config.xml配置文件是Web Client中View和Model组件之间的链接,但在你99.99%的项目里你不必使用这些设置。 struts-config.xml配置文件包含以下主要元素:

序号 拦截器和说明
1 struts-config这是配置文件的根节点。
2 form-beans这是你将ActionForm子类映射到name的位置,你可以在struts-config.xml文件的其余部分,甚至在JSP页面上,将这个name用作ActionForm的别名。
3 global forwards此部分将你在webapp上的页面映射到name,你可以使用这个name来引用实际页面。这避免了对你网页上的URL进行硬编码。
4 action-mappings这是你声明表单处理程序的地方,也被称为操作映射(action mappings)
5 controller这部分是配置Struts的内部,在实际情况中很少使用。
6 plug-in 这部分告诉Struts在哪里找到属性文件,它包含提示和错误消息。

下面是struts-config.xml文件的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.0//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_0.dtd">

<struts-config>

<!-- ========== Form Bean Definitions ============ -->
<form-beans>
<form-bean name="login" type="test.struts.LoginForm" />
</form-beans>

<!-- ========== Global Forward Definitions ========= -->
<global-forwards>
</global-forwards>

<!-- ========== Action Mapping Definitions ======== -->
<action-mappings>
<action
path="/login"
type="test.struts.LoginAction" >

<forward name="valid" path="/jsp/MainMenu.jsp" />
<forward name="invalid" path="/jsp/LoginView.jsp" />
</action>
</action-mappings>

<!-- ========== Controller Definitions ======== -->
<controller
contentType="text/html;charset=UTF-8"
debug="3"
maxFileSize="1.618M"
locale="true"
nocache="true"/>

</struts-config>

有关struts-config.xml文件的更多详细内容,可查看Struts Documentation。

struts.properties

这个配置文件提供了一种机制来改变框架的默认行为。实际上,struts.properties配置文件中包含的所有属性也可以在web.xml中配置使用init-param,以及在struts.xml配置文件中使用constant标签。 但如果你想保持事件独立以及保留更多struts细节,那么你可以在WEB-INF/classes文件夹下创建这个文件。

struts.properties

文件中配置的值将覆盖。

default.properties

文件中配置的默认值,这些值包含在struts2-core-x.y.z.jar分布中。有一些属性,你可以考虑改为使用。

struts.properties

文件:

1
2
3
4
5
6
7
8
9
10
11
### When set to true, Struts will act much more friendly for developers
struts.devMode = true

### Enables reloading of internationalization files
struts.i18n.reload = true

### Enables reloading of XML configuration files
struts.configuration.xml.reload = true

### Sets the port that the server is run on
struts.url.http.port = 8080

这里任何以开头的行都将被假定为注释,并且它会被Struts2默认忽略。