黑马程序员技术交流社区
标题:
【上海校区】Struts2的配置文件及其元素
[打印本页]
作者:
不二晨
时间:
2019-3-8 10:23
标题:
【上海校区】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"/>
1
在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>
---------------------
【转载】
作者:张行之
来源:CSDN
原文:
https://blog.csdn.net/qq_33689414/article/details/69633188
版权声明:本文为博主原创文章,转载请附上博文链接!
作者:
不二晨
时间:
2019-3-11 15:24
奈斯,感谢分享
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2