Struts2的配置文件及其元素

Struts2的配置文件及其元素

Struts2配置文件

当应用被Tomcat加载时,struts2的配置文件就已经加载初始化了。

Struts2的配置文件比较多,文件之间有着加载的顺序,如下所示。

顺序配置文件名所在位置说明
1default.propertiesstruts2-core-2.3.15.3.jar\org\apache\struts2不能修改
2struts-default.xmlstruts2-core-2.3.15.3.jar不能修改
3struts-plugin.xml在struts2提供的插件jar包中不能修改
4==struts.xml==我们应用中的struts.xml配置文件可以修改(推荐使用)
5==struts.properties==我们应用中的struts.properties配置文件可以修改(推荐使用)
6web.xml我们应用中的web.xml配置文件可以修改(可以给过滤器配置参数,不推荐)

注:

1.Struts2提供了2种配置方式,一种是通过key=value的方式,即struts.properties文件。另一种是通过xml配置,即struts.xml文件。

2.当多个配置文件中,有相同的参数,后面的会把前面的覆盖掉。

Struts2框架提供的常量

Struts2常量定义在default.properties配置文件中,体现形式是key=value。

常用的常量:

常量名常量值说明
struts.i18n.encodingUTF-8应用中使用的编码
struts.objectFactory.spring.autoWirename和spring框架整合有关
==struts.multipart.parser==jakarta指定文件上传用的组件
==struts.multipart.maxSize==2097152文件上传总文件大小限制:2M
==struts.action.extension==action,,能进入struts2框架内部的URL地址后缀名。多个值使用分号分隔
struts.enable.DynamicMethodInvocationfalse是否允许动态方法调用
==struts.devMode==false是否是开发模式(开发模式改配置不需要重启服务器,开发阶段建议使用true)。
struts.ui.themexhtml页面展示用的主题
  • 在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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值