- 浏览: 163893 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
zhousheng193:
非常感谢LZ
在JSP页面及servlet的doGet()方法中处理汉字乱码的问题 -
jie523314:
学习下。。。
读取XML文件
struts.xml文件中每个元素的含义.
1) Bean配置
Struts2框架是一个高度可扩展的框架,框架的大部分核心组件,Struts2并不是直接以硬编码的方式写在代码中的,而是以自己的IOC(控制反转容器)来管理框架的核心组件.
Struts2框架以可配置的方式来管理Struts2的核心组件,从而允许开发者可以非常方便的扩展该框架的核心组件.当开发者需要扩展,或者替换Struts2的核心组件的时候,只需要提供自己的组件实现类,并且将组件实现类部署在Struts2的IOC容器当中就可以了.
打开Struts-core-2.1.6.jar压缩文件中的struts-default.xml文件,看到在该文件中配置了大量的Bean定义,该配置文件的代码如下:
上面的配置文件配置了Struts2框架的内置Bean,其中有三个类型检测Bean,就是在前面struts.properties文件中允许使用的类型检测器.( struts.objectTypeDeterminer:该属性指定Struts2的类型检测机制,通常支持tiger和notiger两个属性值.).
在struts.xml文件中定义Bean的时候,通常有如下两个作用:
l 、创建该Bean的实例,将该实例作为Struts2框架的核心组件使用.
2、 Bean包含的静态方法需要一个值的注入
在第一种用法下,因为Bean实例往往是作为一个核心组件使用的,因此需要告诉Struts2容器该实例的作用----就是该实例实现了哪个接口,这个接口往往定义了该组件所必须遵守的一个规范.
比如说下面的配置片段,我们使用了一个自定义的ObjectFactory来替代了Struts2内置的ObjectFactory.替换ObjectFactory的代码片段如下:
对于第二种用法,可以很方便的不创建某个类的实例,却可以接受框架的常量,在这种方式下,通常要设置static=”true”.
下面是struts-default.xml配置文件的代码片段:
为什么这个地方我没有在struts-default.xml(2.1.6版)中没有找到?
对于大部分Struts2应用而言,我们不需要重新定义Struts2框架的核心组件,也就不需要在struts.xml文件中定义Bean.
正如前面看到的,使用<bean/>元素在struts.xml文件中定义Bean,Bean元素有如下几个属性:
class:这个属性石必填属性,他指定了Bean实例的实现类
type:这个属性是可选属性,它指定了Bean实例实现的Struts2的规范,该规范通常是通过某个接口来实现的,因此该属性的值通常就是一个Struts接口.如果需要将Bean实例作为Struts2的组件来使用的话,则应该制定该属性值.
name:该属性指定了Bean实例的名字,对于有相同type类型的多个Bean则他们的name属性不能够相同,这个属性也是一个可选属性.
scope:该属性指定Bean实例的作用域,该属性是一个可选的属性,属性值只能是default.singlton,request,session或者thread其中的一个.
static:该属性指定Bean是否使用静态方法注入.通常而言,当指定了type属性的时候,该属性不应该指定为true.
optional:该属性指定该Bean是否是一个可选的Bean,该属性是一个可选的属性.
2) 常量配置
在struts.xml文件中配置常量是一种指定Struts2属性的方式.配置Struts2属性有两种方式,一种是在struts.xml中配置,一种是在struts.properties中进行属性的配置.实际上,这两种方式的作用是基本相似的.
(通常都是在struts.xml文件当中来对Struts2进行属性的配置,一般不需要在struts.properties文件中定义Struts2属性,之所以要保留使用struts.properties文件定义Struts2属性的方式,主要是为了保持与WebWork的向后的兼容性)
这样看起来,Struts2的常量既可以在struts.xml文件中配置,也可以再struts.properties文件中配置.实际上,还可以在web.xml文件中配置Struts2常量.
通常,Struts2框架按照如下搜索顺序加载Struts2常量:
上面指定了Struts2框架搜索Struts2常量的顺序,如果在多个文件当中配置了同一个Struts2常量,则后一个文件中配置的常量就会覆盖前面文件中配置的常量.
在不同的文件中,配置常量的方式是不一样的,但是不管在哪个文件当中,配置Struts2常量都需要制定两个属性,常量name和常量value.
其中在Struts.xml文件中通过constant元素来配置常量,配置常量需要指定两个必填的属性:
① name:该属性指定了常量name
② value:该属性指定了常量value
例如,如果需要指定Struts2国际化资源文件的baseName为mess,那么就可以在Struts.xml文件中通过如下代码来进行配置:
对于struts.properties文件而言,该文件的内容就是系列的key-value对,其中每个key对应一个Struts2的常量的name,每个value对应一个Struts2常量value.
比如说如下的代码段:
上面的配置片段配置了名字为struts.custom.i18n.resources的Struts2常量,该常量值为mess
在web.xml文件中配置Struts2常量,可以通过<filter>元素的<init-param>元素来指定,每个<init-param>元素配置了一个Struts2常量.
下面的代码在web.xml文件中,配置了Struts2应用所需要的国际化资源文件的baseName:
在上面的web.xml文件当中,当配置FilterDispatcher的时候,还通过init-param子元素来配置了Struts2常量,指定了国际化资源文件的baseName为mess.
在实际开发中,Struts2的常量通常不配置在web.xml当中,如果采用这种配置在web.xml的形式,需要更多的代码,而且降低了web.xml文件的可读性,通常推荐将Struts2常量集中在struts.xml文件中进行集中的管理.
3) 包配置
Struts2框架中,核心组件就是Action,拦截器等等,Struts2框架使用包来管理Action和拦截器等等,每个包就是多个Action,多个拦截器,多个拦截器应用的集合
配置包的时候,必须要指定name属性,这个属性是引用这个包的key.除此之外,还可以指定一个可选的extends属性,extends属性值必须是另外一个包的属性.指定extends属性表示让该表继承其他包,子包可以继承一个或者多个父包中的拦截器,拦截器栈,action等配置.
除此之外,Struts2还提供了一种所谓的抽象包,抽象包的含义是该包不能包含Action定义.为了显示的指定一个包是抽象包,可以为该package元素增加abstract=”true”属性.
在struts.xml当中,package用于定义包配置,每个package元素定义了一个包配置,在定义package元素的时候可以指定如下几个属性:
下面是一个简单的struts.xml配置文件的范例,在下面的struts.xml文件当中配置了两个包,其中名为default的包,继承了Struts2框架的默认包struts-default.
在上面的配置文件当中,配置了两个包,其中定义名为skill的包的时候,还制定了改包的命名空间skill,其中skill用于指定某个包对应的命名空间.
4) 命名空间的配置
考虑到在同一个Web应用中,需要同名的Action,Struts2以命名空间的方式来管理Action,在同一个命名空间中不能有同名的Action,不同的命名空间中可以存在同名的Action.
Struts2不支持为单独的Action设置命名空间,而是通过为包指定namespace属性来为包下面的所有的Action指定共同的命名空间.
看下面struts.xml配置文件的源代码:
//TODO
在上面的struts.xml配置文件当中,配置了两个包,supermos和get包,配置get包的时候指定了该包的命名空间为/book.
对于名字为supermos的包而言,没有指定namespace属性,如果某个包没有指定namespace属性,既该包使用了默认的命名空间,则默认的命名空间总是””.
当某个包指定了命名空间之后,该包下的所有的Action处理的URL应该是命名空间+Action名,以上名为get的包为例,该包下包含了名为getBooks的Action,则该Action处理的URL为:
http://localhost:8080/namespace/book/GetBooks.action
从上面可以看出,Struts2命名空间的作用类似于Struts1里面模块的作用.
(Struts2的命名空间的作用就类似于Struts1里模块的作用,它允许以模块化的方式来组织Action)
除此之外,Struts2还可以显示指定根命名空间,通过设置某个包的namespace=”/”来制定跟命名空间.
5) 包含配置
包含配置体现的是软件工程中的”分而治之”的原则.
Struts2允许将一个配置文件分解成多个配置文件,从而提供配置文件的可读性.一旦我们通过多个struts.xml文件来配置Action,但是Struts2默认只加载WEB-INF/classes下面的struts.xml,我们就必须通过struts.xml文件来包含其他的配置文件.
在struts.xml文件中包含其他配置文件通过<include…/>元素来完成,配置<include…/>元素需要指定一个必须的file属性,该属性指定了被包含配置文件的文件名,下面是一个struts.xml文件中包含了4个配置文件的代码片段:
被包含的struts-user1.xml,struts-user2.xml等配置文件,是标准的Struts2的配置文件,一样都包含了DTD信息,Struts2配置文件的根元素等信息.通常,将Struts2的所有的配置文件都放在Web应用的WEB-INF/classes路径的下面,struts.xml文件包含了其他的配置文件,Struts2框架自动的加载struts.xml文件的时候,从而完成了加载所有的配置文件的信息.
6) 包拦截器配置
拦截器其实就是AOP(面向切面编程)的编程思想,拦截器允许在Action处理之前,或者Action处理结束之后,插入开发者自己定义的代码.
在很多时候,我们需要在多个Action进行相同的操作,比如说权限的控制,此处就可以使用拦截器来检查用户是否登录,用户的权限是否足够(当然,这个地方也可以借助spring的Aop框架来完成).通常,使用拦截器可以完成如下的几个操作:
Struts2也允许将多个拦截器组合在一起,从而形成一个拦截器栈.一个拦截器栈可以包含多个拦截器,多个拦截器组成一个拦截器栈,对于Struts2系统而言,多个拦截器组成的拦截器栈对外也表现成一个拦截器.(可以认为多个拦截器组成的拦截器栈是一个比较大的拦截器)
定义拦截器栈之前,必须首先定义组成拦截器栈的多个拦截器,Struts2把拦截器栈当成拦截器来处理,因此拦截器栈和拦截器都放在<interceptors…/>元素中进行定义.
下面是拦截器的定义片段:
在上面的拦截器配置片段中,定义了两个拦截器,并且将两个拦截器组成一个拦截器栈,一旦定义了拦截器和拦截器栈以后,在Action中使用拦截器或者拦截器栈的方式是相同的.
上面的配置文件中定义了一个名字为MyAction的Action,并且在该Action中引用了一个名字为authorityandlog的拦截器栈,对于Action而言,引用拦截器和引用拦截器栈的用法是完全一样的.
1) Bean配置
Struts2框架是一个高度可扩展的框架,框架的大部分核心组件,Struts2并不是直接以硬编码的方式写在代码中的,而是以自己的IOC(控制反转容器)来管理框架的核心组件.
Struts2框架以可配置的方式来管理Struts2的核心组件,从而允许开发者可以非常方便的扩展该框架的核心组件.当开发者需要扩展,或者替换Struts2的核心组件的时候,只需要提供自己的组件实现类,并且将组件实现类部署在Struts2的IOC容器当中就可以了.
打开Struts-core-2.1.6.jar压缩文件中的struts-default.xml文件,看到在该文件中配置了大量的Bean定义,该配置文件的代码如下:
<!—下面配置了Struts2的三个类型检测器Bean --> <bean type="com.opensymphony.xwork2.conversion.ObjectTypeDeterminer" name="tiger" class="com.opensymphony.xwork2.conversion.impl.DefaultObjectTypeDeterminer"/> <bean type="com.opensymphony.xwork2.conversion.ObjectTypeDeterminer" name="notiger" class="com.opensymphony.xwork2.conversion.impl.DefaultObjectTypeDeterminer"/> <bean type="com.opensymphony.xwork2.conversion.ObjectTypeDeterminer" name="struts" class="com.opensymphony.xwork2.conversion.impl.DefaultObjectTypeDeterminer"/> <!—下面配置了Struts2的两个文件上传器Bean --> <bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="struts" class="org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest" scope="default"/> <bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="jakarta" class="org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest" scope="default" /> <!—下面配置了Struts2的标签库处理的Bean --> <bean type="org.apache.struts2.views.TagLibrary" name="s" class="org.apache.struts2.views.DefaultTagLibrary" />
上面的配置文件配置了Struts2框架的内置Bean,其中有三个类型检测Bean,就是在前面struts.properties文件中允许使用的类型检测器.( struts.objectTypeDeterminer:该属性指定Struts2的类型检测机制,通常支持tiger和notiger两个属性值.).
在struts.xml文件中定义Bean的时候,通常有如下两个作用:
l 、创建该Bean的实例,将该实例作为Struts2框架的核心组件使用.
2、 Bean包含的静态方法需要一个值的注入
在第一种用法下,因为Bean实例往往是作为一个核心组件使用的,因此需要告诉Struts2容器该实例的作用----就是该实例实现了哪个接口,这个接口往往定义了该组件所必须遵守的一个规范.
比如说下面的配置片段,我们使用了一个自定义的ObjectFactory来替代了Struts2内置的ObjectFactory.替换ObjectFactory的代码片段如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <!-- 配置定制的ObjectFactory Bean,该Bean实现了 ObjectFactory接口,实现类是MyObjectFactory --> <bean type="com.opensymphony.xwork2.ObjectFactory" name="myfactory" class="com.supermos.app.MyObjectFactory"/> </struts>
对于第二种用法,可以很方便的不创建某个类的实例,却可以接受框架的常量,在这种方式下,通常要设置static=”true”.
下面是struts-default.xml配置文件的代码片段:
<struts> <bean class=”org.apache.struts.dispatcher.FilterDispatcher” static=”true”/> </struts>
为什么这个地方我没有在struts-default.xml(2.1.6版)中没有找到?
对于大部分Struts2应用而言,我们不需要重新定义Struts2框架的核心组件,也就不需要在struts.xml文件中定义Bean.
正如前面看到的,使用<bean/>元素在struts.xml文件中定义Bean,Bean元素有如下几个属性:
class:这个属性石必填属性,他指定了Bean实例的实现类
type:这个属性是可选属性,它指定了Bean实例实现的Struts2的规范,该规范通常是通过某个接口来实现的,因此该属性的值通常就是一个Struts接口.如果需要将Bean实例作为Struts2的组件来使用的话,则应该制定该属性值.
name:该属性指定了Bean实例的名字,对于有相同type类型的多个Bean则他们的name属性不能够相同,这个属性也是一个可选属性.
scope:该属性指定Bean实例的作用域,该属性是一个可选的属性,属性值只能是default.singlton,request,session或者thread其中的一个.
static:该属性指定Bean是否使用静态方法注入.通常而言,当指定了type属性的时候,该属性不应该指定为true.
optional:该属性指定该Bean是否是一个可选的Bean,该属性是一个可选的属性.
2) 常量配置
在struts.xml文件中配置常量是一种指定Struts2属性的方式.配置Struts2属性有两种方式,一种是在struts.xml中配置,一种是在struts.properties中进行属性的配置.实际上,这两种方式的作用是基本相似的.
(通常都是在struts.xml文件当中来对Struts2进行属性的配置,一般不需要在struts.properties文件中定义Struts2属性,之所以要保留使用struts.properties文件定义Struts2属性的方式,主要是为了保持与WebWork的向后的兼容性)
这样看起来,Struts2的常量既可以在struts.xml文件中配置,也可以再struts.properties文件中配置.实际上,还可以在web.xml文件中配置Struts2常量.
通常,Struts2框架按照如下搜索顺序加载Struts2常量:
引用
l struts-default.xml该文件保存在struts2-core-2.x..x.jar文件当中.
l struts-plugin.xml该文件保存在struts2-Xxx-2.x.x.jar等Struts2插件JAR文件当中
l struts.xml该文件是WEB应用默认的Struts2配置文件
l struts.properties该文件是web应用默认的Struts2配置文件
l web.xml该文件时web应用的配置文件
l struts-plugin.xml该文件保存在struts2-Xxx-2.x.x.jar等Struts2插件JAR文件当中
l struts.xml该文件是WEB应用默认的Struts2配置文件
l struts.properties该文件是web应用默认的Struts2配置文件
l web.xml该文件时web应用的配置文件
上面指定了Struts2框架搜索Struts2常量的顺序,如果在多个文件当中配置了同一个Struts2常量,则后一个文件中配置的常量就会覆盖前面文件中配置的常量.
在不同的文件中,配置常量的方式是不一样的,但是不管在哪个文件当中,配置Struts2常量都需要制定两个属性,常量name和常量value.
其中在Struts.xml文件中通过constant元素来配置常量,配置常量需要指定两个必填的属性:
① name:该属性指定了常量name
② value:该属性指定了常量value
例如,如果需要指定Struts2国际化资源文件的baseName为mess,那么就可以在Struts.xml文件中通过如下代码来进行配置:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <constant name="struts.custom.i18n.resources" value="mess"/> </struts>
对于struts.properties文件而言,该文件的内容就是系列的key-value对,其中每个key对应一个Struts2的常量的name,每个value对应一个Struts2常量value.
比如说如下的代码段:
#指定了Struts2应用处于开发阶段 struts.custom.i18n.resources=mess
上面的配置片段配置了名字为struts.custom.i18n.resources的Struts2常量,该常量值为mess
在web.xml文件中配置Struts2常量,可以通过<filter>元素的<init-param>元素来指定,每个<init-param>元素配置了一个Struts2常量.
下面的代码在web.xml文件中,配置了Struts2应用所需要的国际化资源文件的baseName:
<?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>mess</param-name> <param-value>struts.custom.i18n.resources</param-value> </init-param> </filter> <filter-mapping> <filter-name>Struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>login.jsp</welcome-file> </welcome-file-list> </web-app>
在上面的web.xml文件当中,当配置FilterDispatcher的时候,还通过init-param子元素来配置了Struts2常量,指定了国际化资源文件的baseName为mess.
在实际开发中,Struts2的常量通常不配置在web.xml当中,如果采用这种配置在web.xml的形式,需要更多的代码,而且降低了web.xml文件的可读性,通常推荐将Struts2常量集中在struts.xml文件中进行集中的管理.
3) 包配置
Struts2框架中,核心组件就是Action,拦截器等等,Struts2框架使用包来管理Action和拦截器等等,每个包就是多个Action,多个拦截器,多个拦截器应用的集合
配置包的时候,必须要指定name属性,这个属性是引用这个包的key.除此之外,还可以指定一个可选的extends属性,extends属性值必须是另外一个包的属性.指定extends属性表示让该表继承其他包,子包可以继承一个或者多个父包中的拦截器,拦截器栈,action等配置.
除此之外,Struts2还提供了一种所谓的抽象包,抽象包的含义是该包不能包含Action定义.为了显示的指定一个包是抽象包,可以为该package元素增加abstract=”true”属性.
在struts.xml当中,package用于定义包配置,每个package元素定义了一个包配置,在定义package元素的时候可以指定如下几个属性:
引用
l name:这是一个必填的属性,该属性指定了该包的名字,该名字是该包被其他包引用的key.
l extends:该属性是一个可选的属性,该属性指定该包继承其他的包.可以继承其他包中的Action定义,拦截器定义等等.
l namespace:该属性是一个可选的属性,该属性定义该包的命名空间.
l abstract:该属性是一个可选的属性,它指定该包是否是一个抽象包,抽象包不能包含Action定义.(因为Struts2的配置文件是从上到下处理的,所以父包应该放在子包前面来定义.)
l extends:该属性是一个可选的属性,该属性指定该包继承其他的包.可以继承其他包中的Action定义,拦截器定义等等.
l namespace:该属性是一个可选的属性,该属性定义该包的命名空间.
l abstract:该属性是一个可选的属性,它指定该包是否是一个抽象包,抽象包不能包含Action定义.(因为Struts2的配置文件是从上到下处理的,所以父包应该放在子包前面来定义.)
下面是一个简单的struts.xml配置文件的范例,在下面的struts.xml文件当中配置了两个包,其中名为default的包,继承了Struts2框架的默认包struts-default.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <!-- 配置第一个包,该包的名字为default继承自struts-default --> <package name="default" extends="struts-default"> <!-- 下面定义了拦截器部分 --> <interceptors> <!-- 定义拦截器栈 --> <interceptor-stack name="crudStack"> <interceptor-ref name="params"/> <interceptor-ref name="defaultStack"/> </interceptor-stack> </interceptors> <default-action-ref name="showcase"/> <!-- 定义一个Action,该Action直接映射到showcase.jsp页面 --> <action name="Showcase"> <result>showcase.jsp</result> </action> <!-- 定义了一个Action,该Action类为com.opensymphony.webwork.showcase.DateAction --> <action name="Date" class="supermos.DateAction"> <result name="success">/date.jsp</result> </action> </package> <!-- 定义名字为skill的包,该Action继承自default的包 --> <package name="skill" extends="default" namespace="/skill"> <!-- 定义默认的拦截器引用 --> <default-interceptor-ref name="crudStack"/> <!-- 定义名为Edit的Action,该action对应的处理类为superSkillAction --> <action name="Edit" class="super.SkillAction"> <result>/empmanager/editSkill.jsp</result> <interceptor-ref name="params"/> <interceptor-ref name="basicStack"/> </action> <!-- 定义名为Save的Action,该action对应的处理类为super.SkillAction,使用save方法作为处理的方法 --> <action name="Save" class="super.SkillAction" method="save"> <result name="input">/empmanager/editSkill.jsp</result> <result name="redirect">edit.action?skillName=${currentSkill.name}</result> </action> <!-- 定义名为Delete的Action,该Action对应的处理类为supermos.SkillAction,使用delete方法作为处理方法 --> <action name="Delete" class="supermos.SkillAction"> <result name="error">/empmanager/editSkill.jsp</result> <result type="redirect">edit.action?SkillName=${currentSkill.name}</result> </action> </package> </struts>
在上面的配置文件当中,配置了两个包,其中定义名为skill的包的时候,还制定了改包的命名空间skill,其中skill用于指定某个包对应的命名空间.
4) 命名空间的配置
考虑到在同一个Web应用中,需要同名的Action,Struts2以命名空间的方式来管理Action,在同一个命名空间中不能有同名的Action,不同的命名空间中可以存在同名的Action.
Struts2不支持为单独的Action设置命名空间,而是通过为包指定namespace属性来为包下面的所有的Action指定共同的命名空间.
看下面struts.xml配置文件的源代码:
//TODO
在上面的struts.xml配置文件当中,配置了两个包,supermos和get包,配置get包的时候指定了该包的命名空间为/book.
对于名字为supermos的包而言,没有指定namespace属性,如果某个包没有指定namespace属性,既该包使用了默认的命名空间,则默认的命名空间总是””.
当某个包指定了命名空间之后,该包下的所有的Action处理的URL应该是命名空间+Action名,以上名为get的包为例,该包下包含了名为getBooks的Action,则该Action处理的URL为:
http://localhost:8080/namespace/book/GetBooks.action
从上面可以看出,Struts2命名空间的作用类似于Struts1里面模块的作用.
(Struts2的命名空间的作用就类似于Struts1里模块的作用,它允许以模块化的方式来组织Action)
除此之外,Struts2还可以显示指定根命名空间,通过设置某个包的namespace=”/”来制定跟命名空间.
引用
如果请求为/barspace/bar.action,系统会首先去查找/barspace命名空间里面的名字为bar的Action,如果在该命名空间里面找到对应的Action,则使用该Action处理该请求,否则,系统将到默认命名空间里面找到名字为bar的action,如果找到对应的Action,则使用该Action处理用户请求,如果两个命名空间里面都找不到名字为bar的Action,则系统出现错误.
(默认空间里面的Action可以处理任何模块下的Action请求,意思是说,如果存在URL为/barspace/bar.action的请求,并且/barspace的命名空间下没有名为bar的Action,则命名空间下名为bar的Action也会处理用户请求.)
如果请求为/login.action,系统会在根命名空间下(“/”)查找名字为login的Action,如果在根命名空间下找到了名字为login的Action,则由该Action处理用户的请求,否则系统将转入默认空间中查找名字为login的Action,如果默认的命名空间中有名字为login的Action,则由该Action处理用户请求,如果两个命名空间里面都找不到名字为login的Action,那么系统将会出现错误.
(命名空间只有一个级别,如果请求的URL是/bookservice/search/get.action,系统将会首先在/bookservice/search的命名空间下查找名字为get的Action,如果在该命名空间中找到名字为get的Action,则由该Action处理用户的请求,如果在该命名空间中没有找到get的Action,系统将会直接进入默认的命名空间中查找名字为get的Action,而不会在/bookService的命名空间下查找名字为get的Action).
(默认空间里面的Action可以处理任何模块下的Action请求,意思是说,如果存在URL为/barspace/bar.action的请求,并且/barspace的命名空间下没有名为bar的Action,则命名空间下名为bar的Action也会处理用户请求.)
如果请求为/login.action,系统会在根命名空间下(“/”)查找名字为login的Action,如果在根命名空间下找到了名字为login的Action,则由该Action处理用户的请求,否则系统将转入默认空间中查找名字为login的Action,如果默认的命名空间中有名字为login的Action,则由该Action处理用户请求,如果两个命名空间里面都找不到名字为login的Action,那么系统将会出现错误.
(命名空间只有一个级别,如果请求的URL是/bookservice/search/get.action,系统将会首先在/bookservice/search的命名空间下查找名字为get的Action,如果在该命名空间中找到名字为get的Action,则由该Action处理用户的请求,如果在该命名空间中没有找到get的Action,系统将会直接进入默认的命名空间中查找名字为get的Action,而不会在/bookService的命名空间下查找名字为get的Action).
5) 包含配置
包含配置体现的是软件工程中的”分而治之”的原则.
Struts2允许将一个配置文件分解成多个配置文件,从而提供配置文件的可读性.一旦我们通过多个struts.xml文件来配置Action,但是Struts2默认只加载WEB-INF/classes下面的struts.xml,我们就必须通过struts.xml文件来包含其他的配置文件.
在struts.xml文件中包含其他配置文件通过<include…/>元素来完成,配置<include…/>元素需要指定一个必须的file属性,该属性指定了被包含配置文件的文件名,下面是一个struts.xml文件中包含了4个配置文件的代码片段:
<?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-user1.xml"/> <include file="struts-user2.xml"/> <include file="struts-user3.xml"/> <include file="struts-user4.xml"/> <include file="struts-user5.xml"/> </struts>
被包含的struts-user1.xml,struts-user2.xml等配置文件,是标准的Struts2的配置文件,一样都包含了DTD信息,Struts2配置文件的根元素等信息.通常,将Struts2的所有的配置文件都放在Web应用的WEB-INF/classes路径的下面,struts.xml文件包含了其他的配置文件,Struts2框架自动的加载struts.xml文件的时候,从而完成了加载所有的配置文件的信息.
6) 包拦截器配置
拦截器其实就是AOP(面向切面编程)的编程思想,拦截器允许在Action处理之前,或者Action处理结束之后,插入开发者自己定义的代码.
在很多时候,我们需要在多个Action进行相同的操作,比如说权限的控制,此处就可以使用拦截器来检查用户是否登录,用户的权限是否足够(当然,这个地方也可以借助spring的Aop框架来完成).通常,使用拦截器可以完成如下的几个操作:
引用
l 进行权限的控制(检查浏览者是否登录,并且有足够的访问权限)
l 跟踪日志(记录每个浏览者所请求的每个Action)
l 跟踪系统的性能瓶颈(我们可以通过记录每个Action开始处理的时间和处理结束的时间,从而获得耗时比较长的Action)
l 跟踪日志(记录每个浏览者所请求的每个Action)
l 跟踪系统的性能瓶颈(我们可以通过记录每个Action开始处理的时间和处理结束的时间,从而获得耗时比较长的Action)
Struts2也允许将多个拦截器组合在一起,从而形成一个拦截器栈.一个拦截器栈可以包含多个拦截器,多个拦截器组成一个拦截器栈,对于Struts2系统而言,多个拦截器组成的拦截器栈对外也表现成一个拦截器.(可以认为多个拦截器组成的拦截器栈是一个比较大的拦截器)
定义拦截器栈之前,必须首先定义组成拦截器栈的多个拦截器,Struts2把拦截器栈当成拦截器来处理,因此拦截器栈和拦截器都放在<interceptors…/>元素中进行定义.
下面是拦截器的定义片段:
<?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="supermos" extends="struts-default"> <interceptors> <!-- 定义权限检查的拦截器 --> <interceptor name="authority" class="super.AuthrityInterceptor"/> <!-- 定义日志记录的拦截器 --> <interceptor name="log" class="super.LogInterceptor"/> <!-- 定义一个拦截器栈 --> <interceptor-stack name="authorityandlog"> <!-- 定义该拦截器里面包含的authority拦截器 --> <interceptor-ref name="authority"/> <!-- 定义该拦截器里面包含的log拦截器 --> <interceptor-ref name="log"/> </interceptor-stack> </interceptors> </package> </struts>
在上面的拦截器配置片段中,定义了两个拦截器,并且将两个拦截器组成一个拦截器栈,一旦定义了拦截器和拦截器栈以后,在Action中使用拦截器或者拦截器栈的方式是相同的.
<?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="supermos" extends="struts-default"> <interceptors> <!-- 定义权限检查的拦截器 --> <interceptor name="authority" class="super.AuthrityInterceptor"/> <!-- 定义日志记录的拦截器 --> <interceptor name="log" class="super.LogInterceptor"/> <!-- 定义一个拦截器栈 --> <interceptor-stack name="authorityandlog"> <!-- 定义该拦截器里面包含的authority拦截器 --> <interceptor-ref name="authority"/> <!-- 定义该拦截器里面包含的log拦截器 --> <interceptor-ref name="log"/> </interceptor-stack> </interceptors> <action name="MyAction" class="supermos.MyAction"> <result name="success">/success.jsp</result> <interceptor-ref name="authorityandlog"/> </action> </package> </struts>
上面的配置文件中定义了一个名字为MyAction的Action,并且在该Action中引用了一个名字为authorityandlog的拦截器栈,对于Action而言,引用拦截器和引用拦截器栈的用法是完全一样的.
发表评论
-
struts2的select标签的标签显示问题
2010-09-20 20:00 851引用使用select的标签的时候第一个显示标签怎么都弄不出来纠 ... -
解决long类型转换成date类型的转换通过struts2在页面显示
2010-09-20 17:05 1239由于数据库里面的时间类型统一的为long类型,但是到页面取值的 ... -
何时使用转发,何时使用重定向
2010-09-19 12:45 1645转发:两个jsp共享一个request请求 重定向:放弃当前r ... -
struts标签的使用总结
2010-09-17 21:01 684总结了好久才做到了 自己想要的标签使用方法,具体看代码 ... -
jsp页面导入外部文件的3种方法
2010-09-15 13:27 1772第一种: jsp 的include指令引入外部文件 <% ... -
WARN - Got result of null when trying to get Boolean.
2010-09-12 18:50 1739今天,真倒霉给注册页面添加框架验证结果却是 WARN - G ... -
Struts2内建拦截器的简要介绍
2010-09-07 19:14 914Struts2内建拦截器的简要介绍 ali ... -
struts2自定类型转换器
2010-09-04 14:28 725类型转换 a.自定类型转换器 ... -
taglib引入struts标签的使用
2010-09-03 21:01 1411<%@ page language="java ... -
struts2中ognl表达式的理解和用法
2010-09-03 19:40 1329ognl表达式的使用如下面的例子: 总的来说,就是 actio ... -
熟悉Struts2的配置文件
2010-09-03 19:28 623熟悉Struts2的配置文件 a.内置配置文件 s ... -
struts2国际化配置(+页面下拉修改)
2010-09-03 19:01 1345可以用struts.xml或struts.properties ... -
struts2的基本流程(转)
2010-09-03 10:21 892大致上 ,Struts2 框架由三个部分组成 : ... -
初步理解和使用Struts2拦截器的原理与实现
2010-09-02 11:23 1215一、理解Struts2拦截器 1. Struts2拦截器是在 ... -
The Struts dispatcher cannot be found
2010-09-02 09:42 982The Struts dispatcher cannot be ... -
struts2.0笔记(1)
2010-08-30 19:51 667了解Struts2发展历程及其特点 a.支持 ... -
两种方式修改struts2的访问路径以.do为结尾的方式
2010-08-30 19:24 1404struts2的核心包中找到:org.apache.strut ... -
帮你彻底解决eclipse(myeclipse)中写struts.xml配置文件时,没有提示功能的烦恼
2010-08-30 18:30 2243其实,在自己写struts.xml ... -
struts2基本配置(基本一个登陆)
2010-08-30 17:55 922一、导struts2的包几个包 1.struts2-c ...
相关推荐
本文将深入探讨Struts2配置文件的核心概念及其在实际开发中的应用。 **一、Struts2配置文件概述** 在Struts2中,配置文件主要分为两个部分:`struts-default.xml`和用户自定义的配置文件,如`struts.xml`或`struts-...
本文将围绕“Struts2配置文件传值中文乱码”这一主题,深入探讨其成因、解决方案以及相关的配置细节,旨在帮助开发者有效解决中文乱码问题,提升用户体验。 ### Struts2框架简介 Struts2是Apache组织下的一个开源...
本文将深入探讨Struts2的配置文件,特别是`struts.xml`文件中的关键元素和属性。 在Struts2中,`package`元素是核心组件,用于组织Action、拦截器等。一个包可以看作是一个模块,其中包含多个Action和拦截器。`...
本文将详细介绍Struts2配置文件中的各个节点及其作用,并为初学者提供深入的理解。 #### 二、Struts2配置文件概览 Struts2的配置文件主要包括以下几个方面: 1. **`struts-default.xml`**:位于`struts2-core-...
- 这是Struts配置文件的根元素,其配置类为org.apache.struts.config.ModuleConfig。该元素下有8个子元素,每个都扮演着不同的角色,如数据源配置、全局异常处理、全局转发等。 #### 2. **Data-Sources元素** - `...
《Struts2配置文件宝典》一文详细阐述了Struts2框架中配置文件的核心概念与实践技巧,尤其聚焦于如何高效地管理拦截器、包(package)以及Action的配置,为开发者提供了一套全面而深入的理解框架配置的指南。...
在深入了解Struts2的配置细节之前,我们先来简要概述一下Struts2框架的核心特点及其配置文件的基本结构。Struts2是一个基于MVC(Model-View-Controller)设计模式的Java Web应用开发框架。它通过一系列的配置文件来...
在Struts2的配置文件(struts.xml)中添加相应的配置。 3. **设置Content-Type和Content-Disposition**: - 在Action类中,使用`ValueStack`或`ActionContext`来设置HTTP响应的`Content-Type`和`Content-...
本文将深入解析Struts2的配置文件,帮助开发者更好地理解和使用这一框架。 首先,我们来看Struts2的主配置文件,通常命名为struts.xml或struts-default.xml。这个文件位于项目的类路径下,并遵循XML语法。在该文件...
本文将深入探讨Struts2配置文件的DTD(文档类型定义),以及如何使用这些配置元素。 首先,Struts2的配置文件基于DTD来解析和验证其结构。DTD是一套规则,用于定义XML文档的合法结构和元素。在Struts2中,配置文件...
本文将深入讲解Struts2的配置文件及其重要性。 首先,我们要理解的是,Struts2的核心配置文件是`struts.xml`。这个文件定义了应用的全局行为,包括Action类的映射、结果页面的指定、拦截器的配置等。`struts.xml`...
#### 一、Struts配置文件概述 在Struts框架中,`struts.xml`配置文件扮演着极其重要的角色。它主要用于定义应用中的各种配置信息,包括但不限于包(Package)、拦截器(Interceptor)、Action以及结果(Result)等...
这个压缩包中收集整理的所有Struts2配置文件,是理解并优化Struts2应用程序的关键资源。下面将详细阐述Struts2配置文件的相关知识点。 1. **struts.xml**:这是Struts2的核心配置文件,用于定义应用程序的行为、...