Struts2的配置文件及其元素
Struts2配置文件
当应用被Tomcat加载时,struts2的配置文件就已经加载初始化了。
Struts2的配置文件比较多,文件之间有着加载的顺序,如下所示。
顺序 | 配置文件名 | 所在位置 | 说明 |
---|---|---|---|
1 | default.properties | struts2-core-2.3.15.3.jar\org\apache\struts2 | 不能修改 |
2 | struts-default.xml | struts2-core-2.3.15.3.jar | 不能修改 |
3 | struts-plugin.xml | 在struts2提供的插件jar包中 | 不能修改 |
4 | ==struts.xml== | 我们应用中的struts.xml配置文件 | 可以修改(推荐使用) |
5 | ==struts.properties== | 我们应用中的struts.properties配置文件 | 可以修改(推荐使用) |
6 | web.xml | 我们应用中的web.xml配置文件 | 可以修改(可以给过滤器配置参数,不推荐) |
注:
1.Struts2提供了2种配置方式,一种是通过key=value的方式,即struts.properties文件。另一种是通过xml配置,即struts.xml文件。
2.当多个配置文件中,有相同的参数,后面的会把前面的覆盖掉。
Struts2框架提供的常量
Struts2常量定义在default.properties配置文件中,体现形式是key=value。
常用的常量:
常量名 | 常量值 | 说明 |
---|---|---|
struts.i18n.encoding | UTF-8 | 应用中使用的编码 |
struts.objectFactory.spring.autoWire | name | 和spring框架整合有关 |
==struts.multipart.parser== | jakarta | 指定文件上传用的组件 |
==struts.multipart.maxSize== | 2097152 | 文件上传总文件大小限制:2M |
==struts.action.extension== | action,, | 能进入struts2框架内部的URL地址后缀名。多个值使用分号分隔 |
struts.enable.DynamicMethodInvocation | false | 是否允许动态方法调用 |
==struts.devMode== | false | 是否是开发模式(开发模式改配置不需要重启服务器,开发阶段建议使用true)。 |
struts.ui.theme | xhtml | 页面展示用的主题 |
- 在struts.xml中覆盖常量
使用<Constant name="" value=""></Constant>元素进行覆盖
eg:
<?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>
<!-- struts2的配置,对默认struts2的修改 -->
<constant name="struts.devMode" value="true"/><!--设置为开发模式-->
<constant name="struts.action.extension" value="do"/><!--设置过滤以.do结尾的url-->
...
</struts>
- 在struts.properties中覆盖常量
# 对struts默认配置的修改,会覆盖struts.xml的配置
# 设置过滤以.abc结尾的url
struts.action.extension=abc
- 在web.xml中配置过滤器参数
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<!--对struts默认配置的修改,会覆盖struts.xml和struts.properties配置文件,但一般不这么配置-->
<init-param>
<!--设置过滤以.abcd结尾的url-->
<param-name>struts.action.extension</param-name>
<param-value>abcd</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
在index.jsp中写有5个url,结合Struts入门案例分别测试Struts2的配置文件。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Struts2入门案例</title>
</head>
<body>
<a href="${pageContext.request.contextPath}/hello.action" target="_blank">访问struts2的入门案例带有.action的</a><br/>
<a href="${pageContext.request.contextPath}/hello" target="_blank">访问struts2的入门案例不带有.action的</a><br/>
<a href="${pageContext.request.contextPath}/hello.do" target="_blank">访问struts2的入门案例带有.do的</a><br/>
<a href="${pageContext.request.contextPath}/hello.abc" target="_blank">访问struts2的入门案例不带有.abc的</a><br/>
<a href="${pageContext.request.contextPath}/hello.abcd" target="_blank">访问struts2的入门案例带有.abcd的</a><br/>
</body>
</html>
struts.xml配置文件中的主要元素
package元素
作用:在struts2的配置文件中引入了面向对象的思想,使用了分包管理。易于管理动作类。便于模块化开发动作类。
属性:
- name:包的名称。必须写,且唯一。
- extends:一般情况下需要继承struts-default包,但不是必须。不过如果不继承的话,将无法使用struts2提供的核心功能。struts-default.xml中定义着struts-default这个包。而struts-default.xml是在我们的struts.xml加载之前加载。
- abstract:把包声明为抽象包,抽象包就是用来被继承的。只要是没有元素的包,就可以声明为抽象包。
namespace:名称空间。
名称空间 + 动作名称 = 访问路径当不指定该属性时,该属性有默认值,默认值是”“。注意,不是”/”。
名称空间的搜索顺序:
第一步:先找对应的名称空间
在指定的名称空间下找到了:就执行第二步。
在指定的名称空间下没找到:按照名称空间结构向上追溯,一直到根名称空间,只要在任何一级找到了,执行第二步。
第二步:找动作名称
先在指定的名称空间下,搜索对应的动作名称:找到了就执行动作类的动作方法。
在指定的名称空间没有找到对应的动作名称:前往默认的名称空间下,找动作名称。注意:他只是找动作名称。
例子:名称空间 + 动作名称 = 访问路径
struts.xml
<?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> <package name="p1" extends="struts-default" namespace="/struts"><!--添加namespace命名空间--> <action name="hello" class="com.yundoku.action.HelloAction" method="sayHello"> <result name="success">/success.jsp</result><!--当调用sayHello的返回结果为success,转发到/success.jsp--> </action> </package> </struts>
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Struts2入门案例</title> </head> <body> <a href="${pageContext.request.contextPath}/hello.action" target="_blank">访问struts2的入门案例带有.action的</a><br/><!--访问出错--> <a href="${pageContext.request.contextPath}/struts/hello.action" target="_blank">访问struts2的入门案例带有namespace为struts的.action的</a><br/><!--访问成功--> </body> </html>
action元素
- 作用:配置动作
属性:
name:动作名称
class:动作类全名。(默认动作类:com.opensymphony.xwork2.ActionSupport)。
如果需要替换动作类,我们需要在struts.xml中
<package> <default-class-ref class="自己类的全路径"></default-class-ref> ... <package>
- method:动作类中的方法名称。默认是public String execute(){}
- 要求:
- public修饰
- 返回值必须是String
- 方法不带有参数
- 要求:
动作类的3种实现
方式一:自己创建一个简单的Java对象(POJO:Plain Old Java Object 原始的Java对象)。
方式二:动作类实现com.opensymphony.xwork2.Action接口
在Action接口中定义了5个常量- SUCCESS:对应的值success字符串,表示方法执行成功。
- ERROR:对应的是error字符串,表示方法执行遇到异常
- INPUT:对应的是input字符串,用于回显。
- LOGIN:对应的是login字符串,一般转向登入页面
- NONE:对应none字符串,表示不转向任何的视图
- 方式三:动作类继承com.opensymphony.xwork2.ActionSupport类。(推荐使用)
动作的的访问:
使用通配符(*):
struts.xml
<?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> <package name="p" extends="struts-default" namespace="/user"> <action name="*" class="com.yundoku.action.UserAction" method="{1}"> <result name="success">/{1}.jsp</result> </action> </package> </struts>
UserAction
public class UserAction extends ActionSupport { public String addUser() { System.out.println("addUser方法调用了"); return SUCCESS; } public String updateUser() { System.out.println("updateUser方法调用了"); return SUCCESS; } public String findUser() { System.out.println("findUser方法调用了"); return SUCCESS; } public String deleteUser() { System.out.println("deleteUser方法调用了"); return SUCCESS; } }
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Struts2入门案例</title> </head> <body> <a href="${pageContext.request.contextPath}/user/addUser.action" target="_blank">addUser</a><br/> <a href="${pageContext.request.contextPath}/user/updateUser.action" target="_blank">updateUser</a><br/> <a href="${pageContext.request.contextPath}/user/findUser.action" target="_blank">findUser</a><br/> <a href="${pageContext.request.contextPath}/user/deleteUser.action" target="_blank">deleteUser</a><br/> </body> </html>
当我们党文inde.jsp中的链接,会访问对应的UserAction的方法,根据struts.xml的配置文件中的result转向对应的jsp文件。
动态方法调用:
struts.xml
<?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 name="struts.enable.DynamicMethodInvocation" value="true"/> <package name="p" extends="struts-default" namespace="/user"> <action name="user" class="com.yundoku.action.UserAction"> <result name="success">/success.jsp</result> </action> </package> </struts>
UserAction和上面例子一样
index.jsp
<html> <head> <title>Struts2入门案例</title> </head> <body> <a href="${pageContext.request.contextPath}/user/user!addUser.action" target="_blank">addUser</a><br/> <a href="${pageContext.request.contextPath}/user/user!updateUser.action" target="_blank">updateUser</a><br/> <a href="${pageContext.request.contextPath}/user/user!findUser.action" target="_blank">findUser</a><br/> <a href="${pageContext.request.contextPath}/user/user!deleteUser.action" target="_blank">deleteUser</a><br/> </body> </html>
当执行时,我们可以知道每个链接对应的自己的action的方法。
result元素(结果视图)
- 作用:为动作指定结果视图
属性:
- name:name的值对应的是action方法的返回值。
type:结果类型,使用什么方式转到定义的页面,默认是dispatcher(转发)
type的取值- dispatcher(默认):转发到页面
- redirect:重定向页面
redirectAction:
- 1.重定向到另一个相同名称空间的动作
struts.xml
<?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> <package name="p" extends="struts-default" namespace="/user"> <action name="user" class="com.yundoku.action.UserAction" method="addUser"> <result name="success" type="redirectAction">success</result> </action> <action name="success"> <result>/success.jsp</result> </action> </package> <struts>
- 2.重定向到不同名称空间的动作
struts.xml
<?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> <package name="p2" extends="struts-default" namespace="/user"> <action name="user" class="com.yundoku.action.UserAction" method="findUser"> <result name="success" type="redirectAction"> <param name="namespace">/success</param> <param name="actionName">success</param> </result> </action> </package> <package name="p3" extends="struts-default" namespace="/success"> <action name="success"> <result>/success.jsp</result> </action> </package> <struts>
chain:使用的是请求转发
转发到另一个相同名称空间的动作
请求转发到不同名称空间的动作
result中的param元素
- 作用:采用了依赖注入的思想。将param元素就是将配置的参数,注入到resultType的对应的类setter方法中。
例如:redirectAction结果视图,在struts-default.xml中定义result-type
<result-type name="redirectAction" class="org.apache.struts2.dispathcher.ServletActionRedirectResult"/>
在ServletActionRedirectResult类中有setNamespace()和setActionName(),所以我们可以通过param元素来替换其中的值。
<result name="success" type="redirectAction"> <param name="namespace">/success</param> <param name="actionName">success</param> </result>
result局部视图与全局视图
局部视图:给当前动作使用的视图,别人不能访问
<package name="p" extends="struts-default"> <action name="action" class="" method=""> <result>/success.jsp</result><!--局部结果视图--> </action> </package>
全局视图:
<package name="base" extends="struts-default" abstract="true"> <!--声明全局视图--> <global-result> <result name="success" type="redirect"> /success.jsp </result><!--结果视图--> </global-result> </package> <!--当action1的动作方法返回success,调用全局结果视图,因为这里继承的是base包,而不是struts-default--> <package name="p1" extends="base"> <action name="action1" class="" method=""> </action> </package> <!--当action2的动作方法返回success,调用全局结果视图,因为这里继承的是base包,而不是struts-default--> <package name="p2" extends="base"> <action name="action2" class="" method=""> </action> </package>