/**
本博客由马瘦风整理并发布,创作不易,转载请注明出处:
http://blog.csdn.net/ma_shou_feng
*/
1 Struts2的配置文件
1.1 六种配置文件
Struts2提供了两种配置的方式:
1) key=value的方式,即使用.properties文件;
2) xml文件配置方式. -- 使用xml文件(它能描述层级关系)
加载顺序
配置文件名
所在位置
说明
1
default.properties
struts2-core-2.3.15.3.jar\org\apache\struts2
用于配置Struts常量.
不能修改
2
struts-default.xml
struts2-core-2.3.15.3.jar
Struts提供的默认核心配置文件,struts大部分功能都在此配置文件中.不能修改
3
struts-plugin.xml
Struts2提供的插件包中
struts插件核心配置文件, struts整合其他框架或工具.
不能修改
4
struts.xml
应用中
用户自定义核心配置文件.
可以修改(推荐)
5
struts.properties
应用中
用于自定义struts常量配置文件.一般不使用.可以修改
6
web.xml
应用中
配置过滤器参数等,也可配置struts常量.可以修改(不推荐)
注意:如果配置常量,则存在优先级之分,编号越大优先级越高--即以优先级高的为准.
1.2 配置文件的加载
1.2.1 加载时机
服务器启动时, Struts2的配置文件被依次加载.
1.2.2 加载顺序
查看核心控制器StrutsPrepareAndExecuteFilter:
[1] init_DefaultProperties(); --default.properties
[2][3] init_TraditionalXmlConfigurations();
--struts-default.xml,struts-plugin.xml
[4] init_LegacyStrutsProperties(); --struts.properties
[5] init_CustomConfigurationProviders(); --struts.xml
[6] init_FilterInitParameters(); --web.xml中的参数
多个配置文件中若有相同的参数,则后面的配置值会覆盖前面的配置值--后面的优先级更高.
1.3 Struts2中的常量
* 常量定义在default.properties配置文件中,体现形式都是key=value.
* 所有的Struts2应用都会用到这些常量.
常量名
常量默认值
说明
struts.configuration
org.apache.struts2.config.
DefaultConfiguration
指定加载Struts2配置文件的配置文件管理器,默认值是Struts2中的默认配置文件管理器,如果需要实现自己的配置管理器可实现 Configuration接口
struts.locale
en_US
指定 web 应用的默认本地环境Locale
struts.i18n.encoding
UTF-8
指定 web 应用的默认编码集.如果设置为 GBK,控制端还需用HttpServletRequest.setCharacterEncoding()设置字符集
struts.objectFactory
spring
指定Struts2 默认的 ObjectFactory Bean,默认注释掉了
struts.objectFactory.
spring.autoWire
name
指定Spring 框架的自动装箱模式.默认根据Bean的name属性自动装配.(默认被注释掉了)
struts.objectFactory.spring.
useClassCache
true
指定整合Spring框架是是否缓存Bean实例.不建议修改此值.
struts.objectFactory.spring.
autoWire.alwaysRespect
false
Spring 的装箱策略,不建议修改
struts.objectTypeDeterminer
tiger
指定Struts2的类型检测机制,通常支持tiger和notiger 两个属性值
struts.multipart.parser
jakarta
指定处理MIME-type multipart/form-data(文件上传)请求框架.
支持 cos,pell,jakarta.Struts2中已经导入jakarta的Jar包.
struts.multipart.saveDir=
Javax.servlet.context.tempdir
设置Strut2上传的文件的临时保存路径
struts.multipart.maxSize
2097152
设置Struts2 上传文件的最大字节数(2M)
struts.custom.properties
application,
org/apache/struts2/extension/custom
指定Struts2加载用户自定义的属性文件,自定义文件不会覆盖 struts.properties文件中指定的属性值,加载多个属性文件时在文件名间用','分割.
struts.mapper.class
org.apache.struts2.dispatcher.mapper.
DefaultActionMapper
指定将HTTP请求映射到指定的Action的映射器.映射器根据请求的前缀与Action 的name属性相映射.
struts.action.extension
action,,
指定action请求路径的扩展名,默认值为 action或空,即所有*.action 或没有扩展名的请求都由Strut2 处理.
要指定多个请求后缀,需要用','分割
struts.serve.static
true
该属性设置是否通过 jar 文件提供静态内容服务,该属性只支持 true 或 false 两个值,默认为 true
struts.serve.static.browserCache
true
该属性设置浏览器是否缓存静态内容,当应用处于开发阶段,我们希望每次请求都获得服务器的最新响应,则可设置该属性为 false.
struts.enable.
DynamicMethodInvocation
false
设置Struts2 是否支持动态方法调用
struts.enable.
SlashesInActionNames
false
该属性设置 struts2是否允许在 Action 名中使用斜线,该属性的默认值是 false,如果想和 struts1 的path 中用斜线命名,可以把该属性设置为 true.
struts.tag.altSyntax
true
该属性指定是否允许在 struts2标签中使用表达式语法,开发中通常需要在标签中使用表达式语法,默认值是 true 可以使用.
struts.devMode
false
设置Struts2 应用是否使用开发模式.开发模式:改了配置文件,不需要重启.输出更多的错误信息.建议开发时设置为true,产品阶段设置为 false.
struts.i18n.reload
false
设置HTTP 请求到达时,系统是否重新加载国际化资源文件,建议开发时设置为true,保证资源为最新,产品阶段设置为 false.
struts.ui.theme
xhtml
设置Struts2的视图标签默认的视图主题.取值:simple.开发中常用simple.xhtml
struts.ui.templateDir
template
指定视图主题所需要的模板文件的位置
1.3.1 在struts.xml中覆盖常量
* 使用<constantname="" value=""></constant>元素进行覆盖
<struts> <!-- 把扩展名.action或无拓展名,改为只能是.do --> <constant name="struts.action.extention" value="do"></constant> <package name="hello" extends="struts-default"> <!-- name:对应请求的地址,注意:没有后缀(与页面上是否写了后缀没有关系) class:为该名称指定其动作类 method:动作类中对应的hello要执行的方法 --> <action name="hello" class="com.healchow.action.HelloAction" method="sayHello"> <!-- 配置结果视图 --> <result name="success" type="dispatcher">/success.jsp</result> </action> </package> </struts>
1.3.2 创建struts.properties文件覆盖常量
* 在应用的构建路径(src目录)下创建一个struts.properties的文件:
#设置为开发模式 struts.devMode=true
#设置请求资源的URI扩展名 struts.action.extention=do
1.3.3 在web.xml中配置过滤器参数
<!-- Struts2的核心控制器:过滤器--> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> <!-- 配置过滤器参数--> <init-param> <param-name>struts.action.extention</param-name> <param-value>dodo</param-value> </init-param> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
1.4 struts.xml中的标签
1.4.1 constant标签
* 作用:用于配置struts常量
* 属性:
name:struts提供固定常量名称(从 default.properties文件获得);
value:常量值
如:<constant name="struts.devMode"value="true"></constant>
1.4.2 package标签
* 作用:在struts2的配置文件中引入了面向对象思想,使用了分包管理.易于管理动作类.便于模块化开发动作类.
* 属性:
name:包的名称.必须写.且必须唯一.
extends:一般需要继承struts-default包,但不是必须的.(如果不继承,将无法使用struts2提供的核心功能)
--struts-default.xml中定义struts-default这个包.
--struts-default.xml在struts.xml加载之前加载.
abstract:把包声明为抽象包-->用来被继承.没有<action>元素的包,就可声明为抽象包.
namespace:名称空间,作用是把访问的 URL 按照模块化来管理.
名称空间 + 动作名称 = 访问路径
名称空间的写法:
* 必须以/开头;
* 后面可以是字母和数组的组合,也可只有字母;
* 如果有数字,数字不能作为/后面的第一个字符.
指定名称空间后,访问的URL = 名称空间 + action标签的name属性值如:
/customer/addCustomer.action
/customer/updateCustomer.action
/linkman/findAllLinkMan.action
/linkman/removeLinkMan.action
名称空间的默认值是:""(struts2官方文档中提供的)
<struts> <package name="myDefault" extends="struts-default" abstract="true"> <!-- 此处就可以定义公共配置,该公共配置应该是当前应用中的公共配置 --> </package> <!-- 把扩展名.action或无拓展名,改为只能是.do--> <constant name="struts.action.extention" value="do"></constant> <package name="hello" extends="myDefault" namespace="customer"> <!-- name:对应请求的地址,注意:没有后缀(与页面上是否写了后缀没有关系) class:为该名称指定其动作类 method:动作类中对应的hello要执行的方法 --> <action name="hello" class="com.healchow.action.HelloAction" method="sayHello"> <!-- 配置结果视图 --> <result name="success" type="dispatcher">/success.jsp</result> </action> </package> </struts>
⭐️ Action类的访问搜索顺序:
默认访问一个action(package.namespace= /a/b/c)时的Url搜索顺序:
* 优先从"/a/b/c" 对应的namespace获得相应的aciton,
* 如果没有获得,将从"/a/b"中获得;
* 如果没有获得,将从"/a"中获得;
* 如果没有获得,将从"/"中获得;
* 如果没有获得,将从""中获得.
1.4.3 action标签
* 作用:配置Action类(请求处理类)
* 属性:
name:指定动作名称,和页面中url后的名称保持一致.
--此处不能有后缀;
--动作名称必须唯一.
class:动作类的全限定名.
--默认的动作类:com.opensymphony.xwork2.ActionSupport(在struts-default.xml中定义)
替换默认动作类:在应用的struts.xml中,package标签中加入:
<default-class-refclass="自己的类名"></default-class-ref>
method:动作类中的方法名称.默认是execute(),故可不指定method属性.
* 动作方法的要求:
a) 必须是 public 的;
b) 必须是非静态的;
c) 返回值必须是 String(若没有返回值,则 return "none");
d) 方法名称自定义;
e) 没有参数;
f) 需要 throw Exception;
1.4.4 其他标签
* <interceptors>: 用于注册拦截器.
* <interceptor-stack>:拦截器栈,将已注册的拦截器组合在一起,形成一个栈.
如: 声明一个拦截器栈,名称是:defaultStack
<interceptor-stackname="defaultStack">
* <default-interceptor-ref>: 确定默认的拦截器
如:将“defaultStack”拦截器栈,声明默认拦截器栈
<default-interceptor-refname="defaultStack"/>
* <default-action-ref>: 指定如果访问的action不存在,默认执行的aciton.
如:/a/b/c/d/oneAction 此aciton没有配置,默认情况下显示找不到action;
配置了<default-action-ref>,存在404时,不显示错误,直接跳转到此默认action.
* <default-class-ref>: 配置默认的action实现类
<default-class-refclass="com.opensymphony.xwork2.ActionSupport" />
如果配置文件中没有声明class属性,则<actionname="">将执行ActionSupport类.
2 动作类的创建与访问
2.1 动作类的创建
2.1.1 方式一:无侵入式创建
动作类就是一个POJO(Plain Old Java Object,原始的普通的Java对象),非常简单的JavaBean(可重用组件).
如 Struts2 -01 入门与环境搭建 中的入门案例.
2.1.2 方式二:动作类实现Action接口
接口的全限定名为:com.opensymphony.xwork2.Action(使用较少)
/** * 动作类的第二种创建方式: * 实现 Action 接口--提供了5个字符串常量用于标识返回的映射字符串 */ public class HelloAction implements Action{ @Override public String execute() throws Exception { System.out.println("HelloAction的execute 方法执行了....."); return ERROR; //返回的常量 } }
* 常量:供动作方法返回值使用--使应用规范和统一.
常量变量名
对应的值
常量说明
SUCCESS
success
动作方法执行一切OK
ERROR
error
动作方法执行时遇到了异常
INPUT
input
回显(表示用户输入错误)
LOGIN
login
一般转向登陆页面(表示需要登录权限)
NONE
none
没有返回值,即不转向任何的视图
常用语Ajax操作,使用response发送数据
2.1.3 方式三:动作类继承ActionSuppoer(Action的实现类)
类的全限定名为:com.opensymphony.xwork2.ActionSupport(推荐使用),此类已默认实现多个接口,支持验证框架,国际化,数据序列化等:
public class HelloAction extends ActionSupport{}
//不用配置method <action name="hello" class="com.healchow.action.HelloAction"> <result name="success" type="dispatcher">/success.jsp</result> </action> //默认动作类:ActionSupport 类 //在struts-default.xml中设置了,默认的动作类是 ActionSupport //如果实现该类的 execute 方法,则可不用指定 class 和method 属性 <action name="defaultAction"> <result name="success" type="dispatcher">/success.jsp</result> </action>
2.2 Action的访问方式
2.2.1 原始全匹配配置
<package name="user" extends="struts-default" namespace="/user" > <action name="addUser" class="com.healchow.action.UserAction" method="addUser"> <result name="success">/success.jsp</result> </action> <action name="updateUser" class="com.healchow.action.UserAction" method="updateUser"> <result name="success">/success.jsp</result> </action> <action name="deleteUser" class="com.healchow.action.UserAction" method="deleteUser"> <result name="success">/success.jsp</result> </action> <action name="findUser" class="com.healchow.action.UserAction" method="findUser"> <result name="success">/success.jsp</result> </action> </package>
* 页面访问方式:
<a href="${pageContext.request.contextPath}/addUser.action">添加用户</a> <a href="${pageContext.request.contextPath}/updateUser.action">修改用户</a> <a href="${pageContext.request.contextPath}/deleteUser.action">删除用户</a> <a href="${pageContext.request.contextPath}/findUser.action">查询用户</a>
* Action类中的方法:
public class UserAction extends ActionSupport { public String addUser(){ System.out.println("添加了用户"); return SUCCESS; } public String updateUser(){ System.out.println("更新了用户"); return SUCCESS; } public String deleteUser(){ System.out.println("删除了用户"); return SUCCESS; } public String findUser(){ System.out.println("查询了用户"); return SUCCESS; } }
2.2.2 单一通配符
* action.name可使用通配符(*)替换动作名称,在action.class、aciton.method、result.name 处使用{n}方式匹配星号.
<package name="user" extends="struts-default"> <!-- {1}代表第一个*的内容--> <action name="*" class="com.healchow.action.UserAction" method="{1}"> <result name="success">/success.jsp</result> </action> </package>
* 页面访问方式和 Action 类中的方法不变
2.2.3 多个通配符组合使用
<package name="user" extends="struts-default"> <!-- {1}代表下划线左边的*的内容 {2}代表下划线右边的*的内容 --> <action name="*_*" class="com.healchow.action.{2}Action" method="{1}{2}"> <result name="success">/success.jsp</result> </action> </package>
* 页面访问方式:
* Action类中的方法不变<a href="${pageContext.request.contextPath}/add_User.action">添加用户</a> <a href="${pageContext.request.contextPath}/update_User.action">修改用户</a> <a href="${pageContext.request.contextPath}/delete_User.action">删除用户</a> <a href="${pageContext.request.contextPath}/find_User.action">查询用户</a>
* 优先级:(单一)绝对匹配优先.使用通配符要按照配置文件中的先后顺序进行匹配.
* 案例:
userAction_*_* {1} 匹配第一颗星;{2}匹配第二颗星 请求路径 /userAction_add_success <action name="userAction_*_*" method="{1}"> <resutl name="{2}">xxx</result> </action> {1}匹配add方法,{2}匹配返回值的名称success *_*_* 采用多个分别描述不同的内容,通过{1}{2}{3}获得 请求路径 /UserAction_add_success <action name="*_*_*" class="com.healchow.action.{1}" method="{2}"> <result name="{3}">/pages/{3}.jsp</result> </action>
2.2.4 动态方法调用(使用较少)
<!-- 开启动态方法调用 --> <constantname="struts.enable.DynamicMethodInvocation"value="true"></constant> <package name="user" extends="struts-default"> <action name="user" class="com.healchow.action.UserAction"> <result name="success">/success.jsp</result> </action> </package>
* 页面访问方式:
<%-- 动态方法调用:动作名称!动作方法名称--%> <a href="${pageContext.request.contextPath}/user!addUser.action">添加用户</a> <a href="${pageContext.request.contextPath}/user!updateUser.action">修改用户</a> <a href="${pageContext.request.contextPath}/user!deleteUser.action">删除用户</a> <a href="${pageContext.request.contextPath}/user!findUser.action">查询用户</a>
* Action 类中的方法不变.