Struts2配置详解1 基本元素介绍

Struts2配置详解
一:Struts2的配置文件:
Struts2框架的主要配置文件如表所示:

文件 可选 位置(相对于webapp) 用途
web.xml 是 /WEB-INF/ Web部署描述符,包括所有必须的框架组件,该文件由开发人员编写.
struts.xml 否 /WEB-INF/classes/ 主要的配置文件,包含result映射,action映射,拦截器配置等.该文件由开发人员编写。
struts.properties 否 /WEB-INF/classes/ Struts2框架的属性配置,该文件由开发人员编写.
struts-default.xml 否 /WEB-INF/lib/struts2-core.jar Struts2文件提供的默认配置,该文件由框架提供.
struts-plugin.xml 否 /WEB-INF/lib/struts2-xxx-plugin.jar Struts2框架的插件所用的配置文件,该文件由插件提供.
    
Struts.xml配置详解:
  1>Bean配置
      Struts2是个可扩展的框架,框架的核心组件都是可配置的,这些组件通过 
    Struts2自己的依赖注入容器来装配。你也可以编写自己的组件实现类来扩展
    或者替换框架的某一部分,并通过bean元素来配置组件实现类。
      看一下struts-default.xml文件中,定义了Struts2框架的可配置组件,例如:
             <bean type="com.opensymphony.xwork2.ActionProxyFactory" name="xwork"  class="com.opensymphony.xwork2.DefaultActionProxyFactor"/>
     <bean type="com.opensymphony.xwork2.ActionProxyFactory"
name="struts"
class="org.apache.struts2.impl.StrutsActionProxyFactor"
/>
                 Bean元素的完整属性如表所示:
属性 是否必须 说明
class 是 bean的类名
type 否 bean实现的接口
name 否 bean的名字,在具有相同type属性的Bean中,该名字是唯一的
Scope 否 bean的范围,有效的值包括default,singleton,request,session和thread
Static 否 是否使用静态方法注入,如果指定了type属性,就不要把该属性设置为true.
optional 否 bean是否是可选的
                








              

可以配置两种那个用途的Bean:
           1.框架的Ioc容器创建bean的实例,然后将该实例注入到框架的内部对象中
2.通过bean的静态方法向bean注入值.
     在第一种用法中,bean将被注入到框架内部,和内部对象协作,框架要知道bean的类型,因此,在配置bean时,通常要使用type属性,以指明bean实现的接口.例如我们创建了自己的ObjectFactory,可以在struts.xml文件中使用bean元素配置如下:
             <struts>
<bean
type="com.opensymphony.xwork2.ObjectFactory"
name="myfactory" class="com.company.myapp.MyObjectFactory "/>
  </struts>
       在第二种方法中,使用值注入,允许不创建bean,而让bean接收框架的
常量,bean使用值注入,必须使用static属性,并将该属性设置为true.例如struts-default.xml文件中的一个配置项.
              <bean class="com.opensymphony.xwork2.ObjectFactory" static=”true” />
             提示:在Struts2.0版本中,这个配置项存在,到了Struts2.2版本中,这个配置项就不存在了.原因不明.
            
             在实际开发中,很少使用bean元素,因为Struts2本身提供的功能已经能够满
足大多数的应用了。
   
         2>常量(Constant)的配置:
              其实配置常量,就是配置Struts2的属性,常量可以在多个文件中声明,默认
的,Struts2框架按照下列文件的顺序搜索常量,越靠后的文件,优先级越高,
也是说,顺序靠后中的文件常量设置,可以覆盖顺序靠前的文件中的常量设置。
1. struts-default.xml
2. struts-plugin.xml
3. struts.xml
4. struts.properties
5. web.xml

    在struts.xml(struts-default.xml,struts-plugin.xml与struts.xml结构相同)文件中配置常量,要使用constant元素。

属性 是否必须 说明
name 是 常量的名字
value 是 常量的值

在struts.properties文件中,每个键值对就是一个常量设置。在web.xml文件中,FilterDispatcher的初始化参数作为常量被加载。
下面,我们以struts.i18n.encoding=UTF-8的属性设置为例,分别看
一下在三个文件(struts.xml,struts.properties和web.xml)中是如何设置的.
在struts.xml文件中的常量配置:
<struts>
                    <constant name="struts.i18n.encoding" value="UTF-8">
</constant>
</struts>
在struts.properties文件中的常量配置:
struts.i18n.encoding=UTF-8
在web.xml文件中的常量配置:
                  <?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
                 xmlns="http://java.sun.com/xml/ns/j2ee"
                 xmlns:xsi="http://www.w3.org/2001/
XMLSchema-instance"
                 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
                  http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
                <filter>
                         <filter-name>struts2</filter-name>        <filter-class>
org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
                         <init-param>
                            <param-name>struts.i18n.encoding</param-name>
                           <param-value>UTF-8</param-value>
                        </init-param>
                    </filter>
         <filter-mapping>
                        <filter-name>struts2</filter-name>
                        <url-pattern>/*</url-pattern>
                    </filter-mapping>
</web-app>
               执行的顺序,可以自己测试一下,通过修改属性struts.action.extension对执行的后缀名,对配置文件的执行顺序进行测试。
               Struts2框架提供struts.properties文件,是为了向后兼容WebWork,在配置常量时,应该首选在struts.xml文件中进行配置。
      
       3> 包(Package)配置:
               Struts2中的包类似于Java中的包,提供了将action,result,result类
型,拦截器和拦截器栈组织为一个逻辑单元的一种方式,从而简化了维护工作,提高了重用性。
               在struts.xml文件中使用package元素来定义包,package元素有一个必须的属性name,指定包的名字,这个名字将作为引用该包的键key。要注意的是,包的名字必须是唯一的。在一个struts.xml文件中不能出现两个同名的包。package元素的extends属性是可选的,允许一个包继承一个或多个先前定义的包中的配置,如果指定多个包,则以逗号分隔。
               需要注意的是:由于包信息的获取是按照配置文件内容的先后顺序进行的,所以父包必须在子包之前定义。
                package元素的abstract属性是可选的,将其设置为true,可以把一个包定义为抽象的,抽象的包不能有action的定义,它只能作为父包,被其他的包所继承。
抽象的包,除了不能有action的定义,其他行为都与非抽象的包相同,可以有result类型,拦截器类型和拦截器栈的定义。可以利用抽象包来设置一些默认值,其他的包只需要从抽象包继承,从而减少了配置工作,提高了可重用性,降低了维护工作,在struts-default.xml文件中定义的struts-default包就是一个抽象的包。
package元素的完整属性如表所示:

属性 是否必须 说明
name 是 被其他包引用时的键key
extends 否 指定要扩展的包
namespace 否 指定名称空间
abstract 否 声明为抽象的(在包中没有action定义)

      4> 名称空间(namespace)配置
              package元素的namespace属性可以将包中的action配置为不同的名称空
间,这样在不同的名称空间中可以使用同名的action。Struts2框架使用action
的名字和它所在的名称空间来标识一个action。
当Struts2接收到一个请求的时候,它将请求URL分为namespace和action名字这两部分,然后Struts2就会从struts.xml中查找namespace/action这个命名对。如果没有找到,则到Struts2默认的名称空间中去找action。
默认的名称空间用空字符串””来表示,当你在定义包时没有使用namespace属性,那么就指定了默认的命名空间。
Struts2还支持以”/”命名的根名称空间.
    看一个名称空间的例子:
<!-- default包在默认的名称空间 -->
          <package name="default" extends="struts-default">
              <action name="mysql" class="org.lesson05.MySqlAction">
                  <result name="success">/mysql.jsp</result>
              </action>
              <action name="oracle" class="org.lesson05.OracleAction">
                  <result name="success">/oracle.jsp</result>
              </action>
          </package>
   
          <!-- mysql包在/database名称空间中 -->
          <package name="mysql" namespace="/database" extends="struts-default">
              <action name="mysql"
class="org.lesson05.MySqlAction">
                <result name="success">/mysqldatabase.jsp</result>
              </action>
           </package>
   
          <!-- oracle包在默认的名称空间 -->
          <package name="oracle" namespace="/" extends="struts-default">
              <action name="oracle"
class="org.lesson05.OracleAction">
                <result name="success">/mysqldatabase.jsp</result>
              </action>
</package>
如果请求/database/mysql.action,框架将首先查找
/database名称空间,如果找到了,则执行mysql.action,如果没有找到,则在默认名称空间中继续查找。
如果请求/database/oracle.acion。框架将会在/database空间中查找oracle这个action,因为/database空间不存在oracle这个action,所以,默认空间的oracle将会被找到并被执行.
如果请求/oracle.action,框架将会在根名称空间(‘/’)中查找oracle.action,如果没有找到,则在到默认名称空间下去查找。
如果请求/mysql.action,框架则首先到根名称空间(‘/’)下去查找,因为没有根名称空间(‘/’)下没有mysql.action,所以,默认空间的mysql.action则会被执行。
这里需要注意的是,名称空间和文件系统的路径,具有多级目录不同,名称空间只有一个级别。例如,请求URL:/myspace/database/mysql.action,框架将首先在/myspace/database名称空间查找,如果没有找到,则直接到默认的名称空间去查找。框架并不会将名称空间解析为一系列的“文件夹”。
不同的包,可以定义相同的名称空间,但是同一个名称空间下,包名不能相同。,

      5> 包含(include)配置
             在一些大型项目中,为了降低项目的复杂度,便于团队成员分工协作,通常会将
项目划分为多个较小的模块,每个模块单独开发和管理。为此,Struts2提供了
include元素来解决这个问题。我们可以为每个模块单独提供一个配置文件,对其进行配置,然后在struts.xml中使用include这个元素来包含其他的配置文件。
             Include元素只有一个必须的属性file,指定被包含文件的文件名。看一些Struts2自带的showcase例子中的例子:
   <?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="struts-chat.xml" />   
                  <include file="struts-interactive.xml" />
                  <include file="struts-hangman.xml" />
        <include file="struts-tags.xml"/>
</struts>
             这是struts-char.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="chat" extends="struts-default" namespace="/chat">
              <action name="main">
                 <interceptor-ref name="chatAuthentication" />
                  <result type="freemarker">/chat/roomSelection.ftl
</result>
               </action>
            </package>
            </struts>
 
            这里要注意的是,每一个被包含的文件都必须和sruts.xml具有相同的格式,也
就是说,被包含的文件,本身也是完整的配置文件。也要按照struts-2.0.dtd中的定义。

            由于Struts2是按照Web应用程序的CLASSPATH查找被包含的文件,所以,被包含的文件通常都放在WEB-INF/classes目录下,和struts.xml一起。当然,你也可以将配置模块放在对应的Java包下,例如,如果将配置文件struts-user.xml放在了包org.lessones.ch05下,在struts.xml文件中包含struts-user.xml文件时,就需要写成:
                  <include file="org/lessones/ch05/struts-user.xml" />
     
      6>拦截器(Intercept)配置:
            拦截器允许你在action的执行前后插入代码执行。Struts2中的拦截器是功能很
强大的工具,它可以为action动态添加输入验证,对象组装,权限控制,日志记录等功能,而不需呀修改action.
            要为action配置引用的拦截器,首先需要在interceptors元素中使用interceptor元素定义拦截器,然后在action中使用interceptor-ref元素指定引用的的拦截器.interceptor有两个必须的属性:name和class,前者指定拦截器的名字,后者指定拦截器的完整类名。
            假设我们要为UserAction配置两个拦截器logger和security,配置文件编写如下:


             <package name="default" extends="struts-default">
       <interceptors>
            <!-- 定义名为logger的拦截器 -->
            <interceptor name="logger" class="org.lesson05.LogInterceptor" />
            <!-- 定义名为security的拦截器 -->
            <interceptor name="security" class="org.lesson05.ValidationInterceptor" />
       </interceptors>
   
        <action name="user" class="org.lesson05.UserAction">
            <result name="success">/user.jsp</result>
            <!-- 为user action指定拦截器,当user action被调用时,
                 logger和security拦截器也会被调用 -->
            <interceptor-ref name="logger"></interceptor-ref>
            <interceptor-ref name="security"></interceptor-ref>
        </action>
    </package>   

拦截器按照action引用拦截器的顺序执行。
如果一个action需要多个拦截器,引用他们也是一件麻烦事,我们可以将多个
拦截器组合在一起,组成一个拦截器栈,然后在action中直接调用拦截器栈就可
以了。
配置文件如下:
    <package name="default" extends="struts-default">
       <interceptors>
            <!-- 定义名为logger的拦截器 -->
            <interceptor name="logger"
class="org.lesson05.LogInterceptor" />
            <!-- 定义名为security的拦截器 -->
            <interceptor name="security"
class="org.lesson05.ValidationInterceptor" />
            <!-- 定义名为loggerAndSecurity的拦截器栈 -->
            <interceptor-stack name="loggerAndSecurity">
            <interceptor-ref name="logger" />
              <interceptor-refname="security" />            </interceptor-stack>
       </interceptors>
   
        <action name="user" class="org.lesson05.UserAction">
            <result name="success">/user.jsp</result>
            <!-- 为user action指定拦截器,引用名即可以是拦截器名,
也可以是拦截器栈 -->
            <interceptor-ref name="loggerAndSecurity" />
        </action>
</package>   
          拦截器按照它们在拦截器栈中定义的顺序执行。
          在引用拦截器时,Struts2并不区分拦截器和拦截器栈,所以,在定义拦截器时,
也可以引用其他的拦截器栈。
如果多个action都需要引用相同的拦截器栈,我们可以使用default-interceptor-ref元素来定义一个默认的拦截器或者拦截器栈引用,这样,就不需要为每个action指定引用信息了。
   定义默认的拦截器栈:
     <package name="default" extends="struts-default">
       <interceptors>
            <!-- 定义名为logger的拦截器 -->
            <interceptor name="logger"
class="org.lesson05.LogInterceptor" />
            <!-- 定义名为security的拦截器 -->
            <interceptor name="security"
class="org.lesson05.ValidationInterceptor" />
            <!-- 定义名为loggerAndSecurity的拦截器栈 -->
            <interceptor-stack name="loggerAndSecurity">
            <interceptor-ref name="logger" />
            <interceptor-ref name="security" />
            </interceptor-stack>
       </interceptors>
       <!-- 定义默认的拦截器栈 -->
       <default-interceptor-ref name="loggerAndSecurity" />
      
        <action name="user" class="org.lesson05.UserAction">
            <result name="success">/user.jsp</result>
            <!-- 为user action指定拦截器,引用名即可以是拦截器名,
也可以是拦截器栈 -->
            <interceptor-ref name="loggerAndSecurity" />        </action>
    </package>
  这里要注意的是,如果在一个action中定义了其他的拦截器的引用,那么这个
action将不再使用默认的拦截器的引用了。
  如果action想要在默认拦截器引用的基础上添加新的拦截器,那么只能在
action中重新配置默认拦截器引用中的拦截器栈。
   <action name="user" class="org.lesson05.UserAction">
            <result name="success">/user.jsp</result>
            <!-- 为user action指定拦截器,引用名即可以是拦截器名,
也可以是拦截器栈 -->
            <interceptor-ref name="timer" />
            <interceptor-ref name="loggerAndSecurity" />
    </action>
Struts2提供的默认配置文件struts-default.xml定义了默认的拦截器栈的引
用,对于大多数Web应用程序来说,已经够用了。
   这里需要注意的是:拦截器栈都是在包中定义的,在一个包中不能引用其他包中定义
的拦截器,除非这两个包有继承关系.

你可能感兴趣的:(oracle,bean,框架,struts,配置管理)