Struts2 框架(二) —— struts.xml 详细配置
文章目录一、struts.xml 详细配置1、使用 constant 标签配置 struts2 的默认属性2、配置 action 标签3、定义默认 action 优化404页面4、响应AJAX请求5、全局结果配置6、引入其他配置文件一、struts.xml 详细配置1、使用 constant 标签配置 struts2 的默认属性(1)struts2 的核心包中提供了一个 default.pr...
文章目录
一、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" />
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)