黑马程序员技术交流社区

标题: 【上海校区】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