struts.xml配置文件详解

一、package详解
  <?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC

    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

<!--namespace可以不配置,如配:访问路径为  /工程名/namespace值/actionName-->

   <package name="itcast" namespace="/test" extends="struts-default">

<!--  通常每个包都应该继承struts-default包, 因为Struts2很多核心的功能都是拦截器来实现 如:从请求中把请求参数封装到action、文件上传和数据验证等等都是通过拦截器实现的。 struts-default定义了这些拦截器和Result类型。可以这么说:当包继承了struts-default才能使用struts2提供的核心功能。 struts-default包是在struts2-core-2.x.x.jar文件中的struts-default.xml中定义。 struts-default.xml也是Struts2默认配置文件。 Struts2每次都会自动加载 struts-default.xml文件。-->

        <action name="helloworld" class="cn.itcast.action.HelloWorldAction" method="execute" >

  <result name="success">/WEB-INF/page/hello.jsp</result>

        </action>

    </package>

<!--包还可以通过abstract=“true”定义为抽象包,抽象包中不能包含action。-->

</struts>

二、1、action详解
Action配置中的各项默认值

1>如果没有为action指定class,默认是ActionSupport。

2>如果没有为action指定method,默认执行action中的execute() 方法。

3>如果没有指定result的name属性,默认值为success。

============================================================

result配置类似于struts1中的forward,但struts2中提供了多种结果类型,常用的类型有:【 type属性里的值 】 dispatcher(默认值)、 redirect 、 redirectAction 、 plainText。

同一个包下的action跳转:

<result type="redirect/redirectAction">
    toThisActionName<!--目标action的name值-->
</result>

不同包下的action跳转:

type属性值只能是redirectAction,否则用redirect的话报NumPoiterException

配置文件中可以用:EL表达式来获取action中的属性值

========================================================================================

当多个action中都使用到了相同视图,这时我们应该把result定义为全局视图。struts1中提供了全局forward,struts2中也提供了相似功能:

<package ....>

  <global-results>

  <result name="message">/message.jsp</result>

  </global-results>

</package>
2、action别名
    在默认情况下,Struts2会调用动作类的execute方法。但有些时候,我们需要在一个动作类中处理不同的动作。也就是用户请求不同的动作时,执行动作类中的不同的方法。为了达到这个目的,可以在<action>标签中通过method方法指定要指行的动作类的方法名,并且需要为不同的动作起不同的名子(也称为别名)。如下面代码所示:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="demo" extends="struts-default" >
    <action name="test"   class="action.MyAction">
      
    </action>           
    <action name="my"   class="action.MyAction" method="my">
       
    </action>           
</package>   
</struts>

上面代码的两个动作的class属性都指向同一个类,name为这个类起了两个动作别名:test和my。在动作my中,使用了method属性指定要要运行的方法名为my。
    在MyAction类中必须要有my方法,代码如下:

package action;

import com.opensymphony.xwork2.ActionSupport;

public class MyAction extends ActionSupport
{
   
    public String execute() throws Exception
     {
        // 处理test动作的代码
     }
    public String my() throws Exception
     {
          // 处理my动作的代码
     }
   
}


除了在struts.xml中配置别名,还可以通过请求参数来描述指定动作(并不需要在struts.xml中配置)。请求参数的格式如下:

http://localhost:8080/contextPath/actionName!method.action
3. 为action指定参数

在struts2中还可以为action指定一个或多个参数。大家还记着struts1.x是如何设置的action参数不? 在struts1.x中可以使用<action>标签的parameter属性为其指定一个action参数,如果要指定多个,就只能通过逗号(,)或其他的分隔符将不同的参数隔开。而在struts2中可以通过<param>标签指定任意多个参数。代码如下:

<action name="submit"  class="action.MyAction">
<param name="param1">value1</param>
<param name="param2">value2</param>
    <result name="save" >
        /result.jsp
    </result>
    
</action>      

    当然,在action中读这些参数也非常简单,只需要象获取请求参数一样在action类中定义相应的setter方法即可(一般不用定义getter方法)。如下面的代码将读取param1和param2参数的值:
package action;

import com.opensymphony.xwork2.ActionSupport;

public class MyAction extends ActionSupport
{
    private String param1;
    private String param2;

    public String execute() throws Exception
    {
        System.out.println(param1 + param2);
    }
    public void setParam1(String param1)
    {
        this.param1 = param1;
    }
    public void setParam2(String param2)
    {
        this.param2 = param2;
    }
    
}
4.        选择result类型



在默认时,<result>标签的type属性值是“dispatcher”(实际上就是转发,forward)。开发人员可以根据自己的需要指定不同的类型,如redirect、stream等。如下面代码所示:

<result name="save" type="redirect">

       /result.jsp

</result>

这此result-type可以在struts2-core-2.0.11.1.jar包或struts2源代码中的struts-default.xml文件中找到,在这个文件中找到<result-types>标签,所有的result-type都在里面定义了。代码如下:

<result-types>
       <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
       <result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>
       <result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/>
       <result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/>
       <result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/>
       <result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>
       <result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>
       <result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/>
       <result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/>
       <result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" />
       <!-- Deprecated name form scheduled for removal in Struts 2.1.0. The camelCase versions are preferred. See ww-1707 -->
       <result-type name="redirect-action" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>
       <result-type name="plaintext" class="org.apache.struts2.dispatcher.PlainTextResult" />
</result-types>


5.  全局result

有很多时候一个<result>初很多<action>使用,这时可以使用<global-results>标签来定义全局的<result>,代码如下:

<struts>
    <package name="demo" extends="struts-default">
        <global-results>
            <result name="print">/result.jsp</result>
        </global-results>
        <action name="submit" class="action.MoreSubmitAction">
        
        </action>
        <action name="my" class="action.MoreSubmitAction" method="my">
        
        </action>
    </package>
</struts>

   如果<action>中没有相应的<result>,Struts2就会使用全局的<result>。

三、为应用指定多个struts配置文件
在Struts2中提供了一个默认的struts.xml文件,但如果package、action、interceptors等配置比较多时,都放到一个struts.xml文件不太容易维护。因此,就需要将struts.xml文件分成多个配置文件,然后在struts.xml文件中使用<include>标签引用这些配置文件。这样做的优点如下:

结构更清晰,更容易维护配置信息。

配置文件可以复用。如果在多个Web程序中都使用类似或相同的配置文件,那么可以使用<include>标签来引用这些配置文件,这样可以减少工作量。

假设有一个配置文件,文件名为newstruts.xml,代码如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
     "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <package name="demo" extends="struts-default" >
        <action name="submit"   class="action.MoreSubmitAction">
            <result name="save" >/result.jsp</result>
            <result name="print">/result.jsp</result>
        </action>           
    </package>   
</struts>

则struts.xml引用newstruts.xml文件的代码如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
     "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <include file="newstruts.xml"/>
    <package name="test" extends="struts-default">
   
    </package>   
</struts>

大家要注意一下,用<include>引用的xml文件也必须是完成的struts2的配置。实际上<include>在引用时是单独解析的xml文件,而不是将被引用的文件插入到struts.xml文件中。
四、常量
    前面我们都是默认使用.action后缀访问Action。其实默认后缀是可以通过常量” struts.action.extension“进行修改的

eg: <constant name="struts.action.extension" value="do,go"/> 逗号分开

==============建议常量 【<constant name="" value=""/>】定义在struts.xml中

项目加载常量顺序:

struts-default.xml

struts-plugin.xml

struts.xml

struts.properties

web.xml

如果在多个文件中配置了同一个常量,则后一个文件中配置的常量值会覆盖前面文件中配置的常量值.

==============================================================

常用的常量介绍

<!-- 指定默认编码集,作用于HttpServletRequest的setCharacterEncoding方法和freemarker 、velocity的输出 -->

    <constant name="struts.i18n.encoding" value=" UTF-8"/>

    <!-- 该属性指定需要Struts 2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts2处理。

    如果用户需要指定多个请求后缀,则 多个后缀之间以英文逗号(,)隔开。 -->

    <constant name="struts.action.extension" value="do"/>

    <!-- 设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭 -->

    <constant name="struts.serve.static.browserCache" value="false"/>

    <!-- 当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开 -->

    <constant name="struts.configuration.xml.reload" value="true"/>

    <!-- 开发模式下使用,这样可以打印出更详细的错误信息 -->

    <constant name="struts.devMode" value="true" />

     <!-- 默认的视图主题 -->

    <constant name="struts.ui.theme" value="simple" />

    <!– 与spring集成时,指定由spring负责action对象的创建 -->

    <constant name="struts.objectFactory" value="spring" />

<!–该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true。如果需要关闭动态方法调用,则可设置该属性为false。 -->

<constant name="struts.enable.DynamicMethodInvocation" value="false"/>

<!--上传文件的大小限制-->

<constant name="struts.multipart.maxSize" value=“10701096"/>

==================================================================

你可能感兴趣的:(struts)