Struts2 框架(二) —— struts.xml 详细配置

一、struts.xml 详细配置

1、使用 constant 标签配置 struts2 的默认属性

(1)struts2 的核心包中提供了一个 default.properties 文件,该文件中配置了一些 struts2 框架在运行时所需要的参数,有时为了满足具体的业务需求我们需要对 struts2 中的一些默认参数进行修改,这时我们可以使用<struts>标签下的子标签<constant>来进行配置。
(2)语法

<constant name="参数名称" value="值" />

具体的参数名称可以通过 default.properties 文件进行查看,以下列出常用的一些参数及其用途:

<!-- 所有匹配*.action的请求都由struts2处理 -->
<constant name="struts.action.extension" value="action" />
<!-- 是否启用开发模式 -->
<constant name="struts.devMode" value="true" />
<!-- struts配置文件改动后,是否重新加载 -->
<constant name="struts.configuration.xml.reload" value="true" />
<!-- 设置浏览器是否缓存静态内容 -->
<constant name="struts.serve.static.browserCache" value="false" />
<!-- 请求参数的编码方式 -->
<constant name="struts.i18n.encoding" value="utf-8" />
<!-- 让struts2支持动态方法调用 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<!-- 国际化资源文件名称 -->
<constant name="struts.custom.i18n.resources" value="i18n" />
<!-- 是否自动加载国际化资源文件  -->
<constant name="struts.i18n.reload" value="true" />
<!-- 上传文件大小限制设置 -->
<constant name="struts.multipart.maxSize" value="-1" />

2、配置 action 标签

(1)package 是 struts2 中包,该标签中拥有很多子标签,每个子标签都有其独特的用途,以下是常用的子标签以及必须遵守的书写顺序:

  • result-types:定义该包中的响应类型种类,一般不适用
  • interceptors:加载拦截器
  • default-interceptor-ref:定义默认拦截器
  • default-action-ref:定义默认 action
  • default-class-ref:当 action 中不写 class 属性时,默认执行的 Action 类,默认是 ActionSupport
  • global-results:全局结果映射
  • global-exception-mappings:全局异常结果映射

上述标签在 package 中不需要都写,但是一旦用到了就一定要按照上述的先后顺序来写,不然 struts.xml 文件会报错。

(2)package 标签中的 name 属性和 extends 属性在前面已经有过介绍,namespace 表示package 包中所有 action 的请求地址所在路径,但是 struts2 匹配请求地址时并不是简单的判断相等,而是遵循如下规则:
例如:请求地址是 localhost:8080/struts/user/a/b/select

  • 首先,Struts 会把请求的资源路径拿到,也就是 select。
  • 然后在看看有没有 user/a/b 这个名称空间;如果有,就返回结果
  • 如果没有,就看看有没有 /user/a 这个名称空间;如果有,就返回结果
  • 如果没有,再看看有没有 /user 这个名称空间;如果有,就返回结果
  • 直到最后,如果都没有找到,就报错!

(3)action 是 package 的子标签,该标签用于配置 struts2 中的请求地址映射信息以及响应结果映射信息。在一个 package 中可以定义多个 action 标签,action 标签格式如下:

<action name=”请求地址”  class=”该action的请求地址需要执行的Action类名”  method=”需要执行Action类中方法名”>
<result name=”逻辑视图名称” type=”响应物理视图的方式”>物理视图地址</result>
<result name=”逻辑视图名称” type=”响应物理视图的方式”>物理视图地址</result>
...
</action>

如果一个 action 标签中,没有 class 属性也没有 method 属性,那么该请求将默认执行 ActionSupport 类中的 execute 方法并返回 success 逻辑视图。

(4)使用通配符优化请求地址映射
正常情况下一个请求对应一个 action 标签,但是一旦请求过多,就需要配置很多的 action 标签,为了解决该问题,在 action 标签中可以使用通配符来介绍优化配置。
首先在定义 action 标签的 name 属性时可以使用*作为通配符,在一个请求地址中可以配置多个通配符*,一个通配符表示一个字符或者多个字符,不能使用/:例如:
在这里插入图片描述
当请求地址如上图所示进行配置时,所有匹配请求地址格式的请求都会通过该 action 标签的配置来执行方法和响应信息。在 action 的其他属性和 result 属性中还可以使用指定位置通配符所对应的真实值,具体使用使用方式为:

{通配符序号}
{1}表示从左到右数第一个通配符的真实值
{2}表示从左到右数第二个通配符的真实值,以此类推。

在 struts2 2.5 以后的版本中要使用通配符,有了更加严格的要求,需要对于方法名称进行验证,可以在 package 中添加标签:

<global-allowed-methods>regex:.*</global-allowed-methods>
表示所有的方法都通过验证。

例如:
当客户端发送请求 user_add 请求,第一个通配符对应的真实值就是 add,将真实值带入到后面的 method 属性中,表示该请求会执行 Action 中的 add 方法,将通配符带入到结果集的物理视图地址中,表示该请求的逻辑视图 success 对应的物理视图地址是/WEB-INF/page/user_add_success.html
当客户端发送请求 user_update 请求,第一个通配符对应的真实值就是 update,将真实值带入到后面的 method 属性中,表示该请求会执行Action 中的 update 方法,将通配符带入到结果集的物理视图地址中,表示该请求的逻辑视图 success 对应的物理视图地址是/WEB-INF/page/user_update_success.html
这种方式可以简化 action 的配置,但是就必须保证页面的命名,Action 中的方法名必须按照通配符中的规则来定义,规范性很强。

(5)使用动态方法调用简化请求地址映射:
① 首先动态方法调用并不是 struts2 推荐的配置方式,所以默认情况下 struts2 是不允许这种方式的,如果要使用必须开启动态方法调用。具体的方式是通过上面讲到的<constant>标签修改 struts2 默认参数。

<constant name="struts.enable.DynamicMethodInvoation" value="true"></constant>

② 如果有静态资源如 css 属性文件等,还需要配置下面的信息,加入静态资源在 static 文件夹下:

<constant name="struts.action.excludePattern" value="/static/.*?"></constant>

如果 Struts2 的核心控制器地址匹配规则为/*,那么 struts2 将过滤所有的请求,这时除了 jsp 之外的处于 static 目录下的所有静态资源都将被拦截,如果要放行静态资源就必须要配置这个属性,改配置会将 static 下的所有请求放行,所以我们的静态资源需要放到 static 文件下。

③ 然后在配置 action 映射信息时,就不需要指定 method 属性,而是通过请求地址来指定执行的方法名。

<action name="user" class="com.xxyy.action.TestAction">
    <result name="success">success.html</result>
</action>

④ 在客户端发送请求时,在原本的地址后面使用感叹号!来指定需要执行的方法名,例如:

<form action="user!insert">
	<input type="text" name="username"></input>
    <input type="password" name="password"></input>
    <input type="submit" value="提交"></input>
</form>

通过上述配置之后,user!insert 请求就会执行 Action 中的 insert 方法。
由于动态方法调用会暴露 Action 中的方法名,有安全隐患所以还是不推荐使用。

3、定义默认 action 优化404页面

当我们的请求在服务器中未找到对应资源时,服务器会产生404异常,404默认的异常信息用户体验很差,我们可以通过定义一个默认action来将404的异常统一响应到一个用户体验更好的页面。
配置方式如下:

<default-action-ref name="defaultAction"></default-action-ref>
<global-allowed-methods>regex:.*</global-allowed-methods>
<action name="defaultAction">
	<result type="redirect">/404.html</result>
</action>

配置默认action的标签是<default-action-ref > 该标签必须位于所有 action 标签之上。
注意:每一个包中都可以有它自己默认 action,每一个包中的默认 action 只对于当前包有效,但是每一个命名空间应该只有一个默认 action。如果具有相同命名空间的多个包中都声明了默认 action,那么哪一个 action 才是默认的将无法保证。

4、响应AJAX请求

现在的很多项目都会采用 AJAX 请求方式实现数据交互,struts2 同样提供了基于 JSON 数据的的 AJAX 响应方式。
在 Struts2 中使用 AJAX 响应方式步骤:
① Struts2 响应 JSON 数据采用的 json 包,所以要将 json 包以及 struts 专门为 json 提供的插件包一起导入到项目中。

② 配置 action 请求映射信息

<struts>
    <package name="default" namespace="/" extends="json-default">
        <action name="ajax" class="com.kunkunstore.action.SelectAction" method="selectProduct">
            <result name="success" type="json"></result>
        </action>
    </package>
</struts>

和非AJAX请求相比,区别主要有三点:

  • package 标签中继承的包不再是 struts-default,而是 json-default
  • result 标签中的响应类型为 json
  • result 标签中不需要定义物理视图地址,因为AJAX请求不响应视图信息

③ 做完上述的配置以后,一旦我们在 Action 类的方法中返回了success,就会采用 JSON 的方式响应数据,而响应的数据是整个 Action 类中,所有提供了 get 方法的成员变量。

5、全局结果配置

服务器在运行时难免会出现异常,一旦出现异常,这种异常状态码为500,为了优化用户体验,我们可以可以在 Action 中进行异常处理,在 catch 中返回逻辑视图 error,将页面美观的网页响应给用户,这就要求我们在每一个 action 标签中需要添加<result name=”error”>500.html</result>标签,最简单的方式是在 struts.xml 中进行全局逻辑视图映射。

<struts>
    <package name="default" namespace="/" extends="base">
		<global-results>
            <result name="error">/error.jsp</result>
        </global-results>
    </package>
</struts>

注意全局结果映射只针对于它所在的包中的所有action生效,定义好之后再该包的action中就可以直接使用全局结果中定义的逻辑视图。

6、引入其他配置文件

(1)在大型的Web项目中,为了降低项目的复杂度,便于团队成员分工协作,通常会将项目划分为多个较小的模块,每个模块单独开发和管理。Struts2 也支持这种“分而治之”的策略,我们可以为每个模块单独提供一个配置文件,对其进行配置。然后在 struts.xml 文件中使用 include 元素来包含其他的配置文件。

include 标签是 struts 的子标签,其中只有一个必需的属性 file,指定被包含文件的文件名:

<include file="struts-chat.xml" />

具体的模块划分方式根据项目的不同各有差别,以下提供一种推荐的划分方式:

  • struts-base.xml:该 xml 用来配置一些所有模块中的通用属性设置、全局结果映射、默认 action 等
  • struts-模块名称.xml:除了 base 以外的 xml 都是各个模块自己的 aciton 映射信息。
  • struts.xml:根配置文件,在该文件中引入 base 和其他模块的 xml 文件。
    例如:
<include file="struts-chat.xml" />
<include file="struts-user.xml" />
<include file="struts-product.xml" />
<include file="struts-order.xml" />
发布了75 篇原创文章 · 获赞 10 · 访问量 2895

猜你喜欢

转载自blog.csdn.net/baidu_27414099/article/details/104440392