...struts2之配置文件...

…Struts2struts.xml配置文件

struts.xml文件是Struts2框架的核心配置文件,它主要负责管理Struts2框架的Bean配置、常量配置、包配置、Action配置、包含配置、拦截器配置等。

1、  Bean配置

Struts2框架是一个高度可扩展性的框架,在Struts2框架中大部分的核心组件都不是以硬编码的方式写在代码中的,而是以IOC(控制反转)容器来管理框架的核心组件。   

 

一般在我们开发中都是将bean的配置放在applicationContext.xml中进行管理,struts.xml中只是其引用而已,这样方便管理,而且IOC容器可以进行依赖注入。

      Struts2框架以可配置的方式来管理Struts2的核心组件,从而允许开发者可以很方便地扩展框架的核心组件。当开发者需要扩展或替换Struts2的核心组件时,只需要提供自己的组件实现类,并将该组件的实现类配置到Struts2IOC容器中即可。

2、常量配置

如果在这两个文件中配置了同一个Struts2常量,那么后一个文件中配置的常量值会覆盖前面文件中配置的常量值。

      通常,Struts2框架按如下搜索顺序加载Struts2常量:

struts-default.xml

struts-plugin.xml

struts.xml

struts.properties

web.xml

      由此可见如果在struts.properties文件和struts.xml文件中定义相同的常量的话,则最终将使用struts.properties中定义的常量值。推荐在struts.xml文件中配置Struts2常量

3、包配置

Struts2框架中核心组件就是Action和拦截器等 Struts2框架使用包来管理一系列的Action和拦截器等。每个包就是由多个Action、拦截器及拦截器引用组成的集合。

      配置包时,必须指定name属性,这个属性是引用该包的key。此外还可以指定extends属性,该属性是可选项,extends属性值必须是另一个包的name属性值。一旦指定extends属性就表示该包继承其他包,子包可以继承一个或多个父包中的拦截器、拦截器栈、Action等配置。

定义包时,应使用package标签,每个package标签定义了一个包配置。在定义包时可以指定如下几个属性:

name:必填属性,该属性指明该包的名字,该名字是其他包引用的key

extends:可选属性,该属性指定该包继承其他包,继承其他包后就可以继承其他包的Action定义、拦截器定义等。

namespace:可选属性,指明该名的命名空间。

 abstract:可选属性,指明该包是一个抽象包,需要注意的是抽象包中不能包含Action定义。

      提示:由于Struts2的配置文件是从上到下处理的,所以父包应该放在子包前面定义。

 

namespace(命名空间)属性详解

      有时由于Web项目的特珠性,可能出现有同名Action的情况,在Struts2中是以命名空间的方式来管理Action,同一个命名空间里不能有同名的Action,不同的命名空间里可以有同名的Action

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

命名空间必须以/+名称的方式命名,如: 

      namespace=“/demoName”

命名空间不是目录,如果在指定的命名空间中未找到aciton,它不会去上一级命名空间寻找,而是直接跳到默认命名空间寻找

根命名空间下的Action只处理根命名空间下的Action的请求。

4、包含配置

Struts2允许将一个配置文件分解成多个配置文件,从而增加配置文件的可读性。

      如果通过多个配置文件来配置Action,但是Struts2默认只加载WEB-INF/classes下的struts.xml文件,这样我们只能在struts.xml文件中包含其他配置文件。

<include file="struts-action.xml"/>

说明:被包含的struts-action.xml文件必须是标准的Struts2配置文件,即拥有标准的DTD信息、标准的Struts2配置文件的根元素等信息。

5、拦截器配置

Struts2中的拦截器实质就是AOP(面向切面编程)的编程思想。拦截器允许在Action处理之前或者处理结束之后,插入用户自定义的代码。

6Action详解及配置

对于Struts2项目而言,Action才是应用的核心,用户需要提供大量的Action类,并在struts.xml文件中进行配置。

1Action的实现

      相对于Struts1而言,Struts2采用了低侵入式的设计方式,Struts2不要求Action类继承任何的Struts2基类或者是实现任何Struts2的接口。所以在这种设计方式下,Struts2Action类就是一个普通的POJO(通常应该包含一个无参数的execute方法,Struts2自动调用)

      Struts2通常直接使用Action来封装HTTP请求参数,因此,Action类里还应该包含与请求参数对应的属性,并且为该属性提供对应的settergetter方法。注意:当某些属性是由spring依赖注入的,那么不要提供其getter方法!!!

Action类是通过对应的settergetter方法来处理请参数的,而不是通过属性名来处理请求参数的也就是说包不包含对应的属性不重要,重要是必须包含这两个属性对应的setter方法。

 

Action接口与ActionSupport

ActionSupportAction接口的一个实现类。ActionSupport类是Struts2默认的Action处理类,如果用户开发的Action类继承ActionSupport类,则会大大简化Action的开发。

      当用户配置的Action类没有指定class属性时,Struts2会自动使用ActionSupport类作为默认的Action处理类。

2)在Action中间接访问Servlet API

对于Web应用而言不访问Servlet API几乎是不可能的,例如获取session中的值等,而struts2又是低侵入式的,怎么办,当然struts2作者肯定是有解决办法的!

Struts2提供了一个ActionContext类,通过该类用户在Action类中就可以访问Servlet API

ActionContext类常用方法:

Object get(Object key):该方法相当于调用HttpServletRequestgetAttribute(String name)方法

void put(Object key,Object value):相当于调用HttpServletRequestsetAttribute(String key,Object value)方法

Map getApplication():返回一个Map对象,调用该方法相当于返回了一个Application对象

static ActionContext getContext():静态方法,获取系统的ActionContext对象

Map getParameters():获取所有的请求参数,类似于调用HttpServletRequest对象的getParameterMap()方法

Map getSession():返回一个Map对象,调用该方法相当于返回了一个session对象

Action类彻底从Servlet API中分离现来,可以脱离Web容器测试Action

3)在Action中直接访问Servlet API

A.  实现接口的方法:

1ServletContextAware接口:实现该接口的Action可以直接访问Web应用的ServletContext实例

2ServletRequestAware接口:实现该接口的Action可以直接访问用户请求的HttpServletRequest实例

3ServletResponseAware接口:实现该接口的Action可以直接访问用户请求的HttpServletResponse实例

B. 使用Struts2提供的ServletActionContext类该类提供了如下几个常用的静态方法:

static PageContext getPageContext():取得Web应用的PageContext对象

static HttpServletRequest getRequest():取得Web应用的HttpServletRequest对象

static HttpServletResponse getResponse():取得Web应用的HttpServletResponse对象

static ServletContext getServletContext():取得Web应用的ServletContext对象

提示:需要说明的是虽然用户可以在Action类中获取HttpServletResponse对象,但是在Struts2Action中仍旧不能生成对客户端的输出。而且容易出现转码问题。(具体的原因可能是struts2实现的问题)

4Action配置

action的属性包括:

name:请求的Action名称。

classAction处理类对应具体路径。

method:指定使用Action中的哪个方法名。

converter:指定Action使用的类型转换器。

当不设置method时,系统将默认指定Action中的execute方法。

Actionname属性命名规则,一般情况下name属性名中不能包含(.)或者(-)等字符。

5)动态方法调用

      Struts 1.x提供了DispatchAction,从而允许一个Action内包含多个处理方法。

Struts2中同样提供了这种处理多个请求的Action——DIMDynmaic Method Invocation,动态方法)调用来处理这种请求。 actionName!methodName.do

<form action="book!delBook.do" method="post">

使用动态方法调用前必面设置Struts2允许动态方法调用,开启系统的动态方法调用是通过设置struts.enable.DynamicMethodInvocation常量完成的,设置该常量的值为true(默认值),将开启动态方法调用;否则将关闭动态方法调用。

6)为action元素指定method属性

<action name="Login" class="com.UserManagerAction" method="login"/>

指定actionmethod属性,可以让Action类调用指定的方法,而不是系统自动调用Action中的execute方法来处理用户请求。

7)使用通配符

      在配置<action.../>元素时,有时需要指定nameclassmethod属性和<result.../>

,这3个属性都可以支持通配符,这种使用通配符的方式是另一种形式的动态方法调用。还以可使用${属性名}的方式来指定视图资源。其中${属性名}就是对应的Action类中的属性。而且,不仅允许使用这种简单表达式形式,还可以使用完全的ONGL表达式,即:${属性名.属性名.属性名....}

 

例:

<action name="*Action"  class="com.UserManagerAction"   method="{1}">...</action>

<action name="*Action“  class="com.{1}Action"  >...</action>

<action name="*_*" class="com.action.{1}"method="{2}">...</action>

     <action name="*">

         <result>/jsp/{1}.jsp</result>

     </action>

通常将上述的<action name="*".../>作为最后一个<action.../>元素的配置,用于实现JSP页的显示,防止在项目中同时出现.jsp.do的交叉出现。

 

注:除非请求的URLActionname属性绝对相同,否则将按先后顺序来决定由哪个Action来处理用户请求,因此在项目开发中一般将*Action配置在最后,否则Struts2将使用该Action来处理所有希望使用模式匹配的请求。

 

8)默认Action

对于只是简单的超级链接的请求,可以通过定义name*Action(该Action一般放在最后定义)来实现。除此之外,Struts2还允许在容器中定义一个默认的Action,当用户请求的URL在容器中找不到对应的Action时,系统将使用默认Action来处理用户请求。

配置默认Action通过<default-action-ref.../>元素来完成,每个<default-action-ref.../>元素配置一个默认Action,如:

<default-action-ref name="simpleViewResultAction"/>

<action name="simpleViewResultAction"   class="com.action.SimpleViewResultAction">

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

</action>

注:name属性指向容器中另一个有效的Action,该Action将成为该容器中默认的Action

7、处理结果-result

       Action仅负责处理用户请求,它只是一个控制器,它不能也不应该直接提供对用户的响应。当Action处理完用户请求后,处理结果应该通过视图资源来实现,但控制器应该控制将哪个视图资源呈现给用户。

      Struts2中当Action处理完用户请求后,并未直接将请求转发给任何具体的视图资源,而是返回一个普通字符串,该普通字符串就是一个逻辑视图名,Struts2框架收到这个逻辑视图后,把请求转发到对应的物理视图资源(即逻辑视图名与物理视图资源之间存在映射关系),物理视图资源将处理结果呈现给用户。(个人觉得这个是非常人性的设计)

Struts2还支持多种结果映射:Struts2框架将处理结果转向实际资源时,实际资源不仅可以是JSP视图资源,也可以是JSF视图资源,甚至可以将请求转发给一下Action处理,形成Action的链式处理。

1)配置结果

局部结果:将<result.../>作为<action.../>元素的子元素配置。

全局结果:将<result.../>作为<global-results.../>元素的子元素配置

一个Action可以对应多个结果

完整的<result../>配置如下:

    <result name="success" type="dispatcher">

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值