一、struts 2 基础---3.struts.xml的配置

struts.xml的配置

1.struts.xml概述

struts.xml 为Struts 2的核心配置文件。struts.xml中主要配置Struts项目的一些全局的属性,用户请求和响应Action之间的对应关系,以及配置Action中可能用到的参数,以及处理结果的返回页面。还包括各种拦截器的配置等。

struts.xml的DTD(Document Type Definition)描述如下:

<?xml version="1.0" encoding="UTF-8"?>

<!-- START SNIPPET: strutsDtd -->

<!--
Struts configuration DTD.
Use the following DOCTYPE

<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"
http://struts.apache.org/dtds/struts-2.0.dtd">
-->

<!ELEMENT struts (package|include|bean|constant)*>

<!--

struts标签下可以出现下面标签0次或多次

package:将多个action组织成一个package的方式。

include:用来包含一个配置文件,目的是为了配置文件能够分离。

bean:被容器的框架创建,并注入到框架内部的对象。主要用来关联第三方类库,比如spring,一般应用程序不需要配置。

contant:用来设置Struts2运行的环境。效果等同于在struts.properties中配置,或者web.xml中配置FilterDispatcher的init param

-->

<!ELEMENT package (result-types?, interceptors?, default-interceptor-ref?, default-action-ref?, global-results?, global-exception-mappings?, action*)>

<!--

package标签下可以出现下面标签0次或者1次

result-types:用来定义结果类型

interceptors:用来定义拦截器

default-interceptor-ref:为package定义默认使用的拦截器,这个package中所有的action(如果这个action没有设置自己使用的拦截器)都会调用设置的默认拦截器

default-action-ref:这个package默认使用的action

global-results:为这个package设置共通使用的result,对这个package下的所有action都有效

global-exception-mappings:为这个package定义共通的当发生异常的时候,所用到的result,需与global-results结合使用

package标签下可以出现下面标签0次或者多次

action:为这个package定义action信息。

-->
<!ATTLIST package
name CDATA #REQUIRED
extends CDATA #IMPLIED
namespace CDATA #IMPLIED
abstract CDATA #IMPLIED
externalReferenceResolver NMTOKEN #IMPLIED
>

<!--

package标签可以必须出现下面的属性

name:为此package定义一个唯一的标识

package标签可以出现下面的属性(也可不出现)

extends:此package所继承的package

namespace:此package的命名空间(其下所有的result和action都会在RootContext后加上设置的命名空间),如果不设定,默认为RootContext。

abstract:设置此package为抽象的,抽象的package里不能存在action。此属性的值为true或者false,默认为false

externalReferenceResolver:用来整合第三方类库,如spring

-->

<!ELEMENT result-types (result-type+)>

<!--

result-types标签下必须出现result-type标签1次或者多次

result-type:用来定义一个结果类型

-->

<!ELEMENT result-type (param*)>

<!--

result-type标签下可以出现param标签0次或者多次

用来定义此结果类型需要用到的参数

-->
<!ATTLIST result-type
name CDATA #REQUIRED
class CDATA #REQUIRED
default (true|false) "false"
>

<!--

result-type标签必须包含下面属性

name:用来唯一标识这个结果类型

class:此结果类型的java class的位置

default:是否设置为默认的结果类型,默认值为false(不设置为默认的结果类型)。如果设置为默认的结果类型,则如果一个result没有指定type将会默认使用此result type。

-->

<!ELEMENT interceptors (interceptor|interceptor-stack)+>

<!--

interceptors标签下必须出现下面的标签1次或者多次(两者任一,或者同时)

interceptor:用来定义一个拦截器

interceptor-stack:用来定义一个拦截器栈

-->

<!ELEMENT interceptor (param*)>

<!--

interceptor标签下可以出现param标签0次或者多次

param:用来设置此拦截器需要的参数

-->
<!ATTLIST interceptor
name CDATA #REQUIRED
class CDATA #REQUIRED
>

<!--

interceptor必须包含下面属性

name:用来唯一标识此拦截器

class:用来指定此拦截器java class的位置

-->

<!ELEMENT interceptor-stack (interceptor-ref+)>

<!--

interceptor-stack标签下必须出现interceptor-ref标签1次或多次

interceptor-ref:用来指定此拦截器栈使用的拦截器

-->
<!ATTLIST interceptor-stack
name CDATA #REQUIRED
>

<!--

interceptor-stack标签必须包含name属性,用来唯一标识此拦截器栈

-->

<!ELEMENT interceptor-ref (param*)>

<!--

interceptor-ref标签下可以出现param标签0次或多次,用来设置使用拦截器时所需的参数。

-->
<!ATTLIST interceptor-ref
name CDATA #REQUIRED
>

<!--

interceptor-ref标签必须包含name属性,用来指定使用的拦截器名称或者拦截器栈的名称。

-->

<!ELEMENT default-interceptor-ref (param*)>

<!--

default-interceptor-ref标签下可以出现param标签0次或多次,用来设置使用默认拦截器时所需的参数。

-->
<!ATTLIST default-interceptor-ref
name CDATA #REQUIRED
>

<!--

default-interceptor-ref标签必须包含name属性,用来指定默认使用的拦截器名称或者拦截器栈的名称。

-->

<!ELEMENT default-action-ref (param*)>

<!--

default-action-ref标签下可以出现param标签0次或多次,用来设置使用默认action时所需的参数。

-->
<!ATTLIST default-action-ref
name CDATA #REQUIRED
>

<!--

default-action-ref标签必须包含name属性,用来指定默认使用的action名称。

-->

<!ELEMENT global-results (result+)>

<!--

global-results标签下必须出现result标签1次或者多次,用来设置共通的result

-->

<!ELEMENT global-exception-mappings (exception-mapping+)>

<!--

global-exception-mappings标签下必须出现exception-mapping标签1次或者多次,用来指定共通的,当出现exception时,所参照的result

-->

<!ELEMENT action (param|result|interceptor-ref|exception-mapping)*>

<!--

action标签下可以出现下面标签0次或者多次

param:用来设置调用次action所用到的参数

result:为此action定义结果(可以是一个jsp或者是一个action)

interceptor-ref:为此action设置使用的拦截器

exception-mapping:为此action定义,当有异常发生时,所参照的result

-->
<!ATTLIST action
name CDATA #REQUIRED
class CDATA #IMPLIED
method CDATA #IMPLIED
converter CDATA #IMPLIED
>

<!--

action标签必须包含下面这些属性

name:用来唯一标识此action

class:用来指定次action的java class的位置

action标签可以包含下面这些属性

method:为此action指定调用的方法,不指定时默认调用execute方法

converter:为此action指定使用的converter,不指定时使用默认的converter

-->

<!ELEMENT param (#PCDATA)>
<!ATTLIST param
name CDATA #REQUIRED
>

<!--

param标签必须包含name属性

-->

<!ELEMENT result (#PCDATA|param)*>

<!--

result标签下可以出现param标签0次或者多次

-->
<!ATTLIST result
name CDATA #IMPLIED
type CDATA #IMPLIED
>

<!--

result标签可以包含下面属性

name:用来标识此result

type:结果的类型

-->

<!ELEMENT exception-mapping (#PCDATA|param)*>

<!--

exception-mapping标签下可以出现param标签0次或者多次

-->
<!ATTLIST exception-mapping
name CDATA #IMPLIED
exception CDATA #REQUIRED
result CDATA #REQUIRED
>

<!--

exception-mapping标签可以包含下面属性

name:用来标识此exception-mapping

exception-mapping标签必须包含下面属性

exception:发生的exception的类型

result:当发生exception时所参照的result

-->

<!ELEMENT include (#PCDATA)>
<!ATTLIST include
file CDATA #REQUIRED
>

<!--

include标签必须包含file属性,用来指定所要include的文件的位置。

-->

<!ELEMENT bean (#PCDATA)>
<!ATTLIST bean
type CDATA #IMPLIED
name CDATA #IMPLIED
class CDATA #REQUIRED
scope CDATA #IMPLIED
static CDATA #IMPLIED
optional CDATA #IMPLIED
>

<!ELEMENT constant (#PCDATA)>
<!ATTLIST constant
name CDATA #REQUIRED
value CDATA #REQUIRED
>

<!--

constant标签必须包含下面属性

name:指定constant的key

value:指定constant的value

-->

<!-- END SNIPPET: strutsDtd -->

2.Bean 配置

在struts.xml文件中定义Bean时,通常有以下两个作用:

⑴创建该Bean的实例,将该实例作为Struts 2框架的核心组建使用。

例2.1

<struts>

<!-- 配置定制的ObjectFactory Bean,该Bean实现了ObjectFactory接口,

实现类是MyObjectFactory -->

<bean type=”come.opensymphony.xwork2.ObjectFactory”

Name=”myfactory” class=”com.company.myapp.MyObjectFactory”/>

</struts>

⑵Bean包含的静态方法需要一个值注入。

这种用法可以很方便地允许不创建某个类的实例,却可以接受框架常量。

在这种方法下,通常需要设置static=”true”。(有些类似static方法:不用创建类实例就可以调用类的static方法。)

例2.2

<struts>

<bean class=”org.apache.struts2.dispatcher.FilterDispatcher” static=”true”/>

</struts>

<bean/>元素在struts.xml文件中的属性:

l class:必填属性,指定Bean实例的实现类。

l type:可选属性,指定Bean实例实现的Struts 2规范,该规范通常是通过某个接口来实现的,因此该属性的值通常是一个Struts 2接口。如果需要将Bean实例作为Struts2组件使用,则应该指定该属性。

l name:可选属性,指定Bean实例的名字,对于有相同type类型的多个Bean,则他们的name属性不能相同。

l scope:可选属性,该属性指定Bean的作用域。属性值可以是defaultsingletonrequestsessionthread其中之一。

l static:该属性指定Bean是否使用静态方法注入。通常而言,当指定了type属性时,该属性不应该指定为true

l optional:可选属性,该属性指定该Bean是否是一个可选Bean

3.常量配置

Struts2的常量在web.xml、struts.xml、struts.properties等多处都可以配置。其加载顺序如下:

l struts-default.xml:该文件保存在struts2-core-2.0.x.jar文件中。

l struts-plugin.xml:该文件保存在struts-xxx-2.0.x.jar文件中。

l struts.xml:这个就不多说了。

l struts.properties:如上。

l web.xml:同上。

Struts2中的配置:

例3.1:

<struts>

<!-- 通过constant元素配置Struts 2的属性 -->

<constant name=”struts.custom.i18n.resources” value=”globalMessage”/>

</struts>

与之等效的struts.properties文件配置如下:

#配置国际化文件

struts.custom.i18n.resources= globalMessage

contant元素的属性:

l name::指定常量的name

l value:指定常量的value

4.包配置

Struts2框架中核心组件就是Action,拦截器等,Struts2框架使用包来管理Action和拦截器等。每个包就是多个Action、多个拦截器、多哥拦截器应用的集合。

package元素的属性:

l name :必填属性,指定该包的名字,此名是该包被其他包应用的Key

l extends:可选属性,该属性指定该包继承其他包。可继承其他包的action、拦截器、拦截器栈等。

l namespace:可选属性,指定该包的命名空间。

l abstract:可选属性,指定该包是否为一个抽象包。抽象包中不能包含Action定义。

例4.1:

<struts>

<constantname="struts.custom.i18n.resources"value="globalMessages"/>

<constantname="struts.i18n.encoding"value="GBK"></constant>

<packagename="lee"extends="struts-default">

<interceptors>

<interceptorname="myfilter"class="lee.BeforeResultInterceptor">

<paramname="name">方法过滤拦截器</param>

</interceptor>

</interceptors>

<actionname="login"class="lee.LoginAction"method="Login">

<resultname="error">/error.jsp</result>

<resultname="success">/welcome.jsp</result>

<interceptor-refname="defaultStack"/>

<interceptor-refname="myfilter">

<paramname="name">改变后的拦截器</param>

<paramname="excludeMethods">execute</param>

</interceptor-ref>

</action>

</package>

</struts>

5.命名空间配置

同一个Web应用有可能需要出现同名的Action,所以Struts2中以命名空间的方式来管理Action。同一个命名空间里不能有同名的Action,不同的命名空间里可以有同名的Action。

Struts2不支持给单独的Action设置命名空间,而是通过包指定namespace属性来为包下面的所有Action指定共同的命名空间。

例5.1:

<struts>

<!-- 配置名为lee的包,该包继承了Struts2的默认包 -->

<package name=”lee” extends=”struts-default”>

<!-- 配置名为Login的Action -->

<action name=”Login” class=”lee.LoginAction”>

<result name=”input”>/login.jsp</result>

<result name=”error”>/error.jsp</result>

<result name=”success”>/success.jsp</result>

</action>

</package>

<!-- 配置名为get的包,该包继承了Struts2的默认包。指定该包命名空间/book -->

<package name=”get” extends=”struts-default” namespace=”/book”>

<!-- 配置名为Getbook的Action -->

<action name=”GetBooks” class=”lee.GetBooksAction”>

<result name=”login”>/login.jsp</result>

<result name=”success”>/success.jsp</result>

</action>

</package>

</struts>

若项目的根目录为webroot,则两个Action的URL为:

http://localhost:8080/webroot/Login.action

http://localhost:8080/webroot/book/GetBooks.action

[注]默认命名空间里的Action可以处理任何模式下的Action请求。如上例如果GetBooks在book下没有找到,则会在默认命名空间里找,如果在默认命名空间还找不到就回报错。

6.包含配置

在实际项目中要配置的信息比较多,通常分成多个配置文件,然后吧它们加载到struts.xml中。

例6.1:

<struts>

<!-- 下面包含4个配置文件 -->

<include file=”struts-shop.xml”/>

<include file=”struts-user.xml”/>

<include file=”struts-shoppingcart.xml”/>

<include file=”struts-product.xml”/>

</struts>

7.拦截器配置

拦截器的具体内容将单独介绍。例子可参照本文的例4.1。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值