Struts2的基本配置(上)
所有web应用程序的内容都是建立在Struts2的配置文件的基础上的,这些配置文件也是Struts2应用程序的核心部分.
(1) 配置web.xml文件
任何MVC框架都需要与WEB应用整合,这就不得不借助在/WEB-INF路径下的web.xml文件,只有配置在web.xml文件中的Servlet才会被应用加载.
通常,所有MVC框架都需要WEB应用加载一个核心控制器,对于Struts2框架而言,需要加载FilterDispatcher,只要Web应用负责加载FilterDispatcher,FilterDispatcher将会加载应用的Struts2框架.
因为Struts2将核心控制器设计成一个过滤器Filter,而不是一个普通的Servlet,所以为了让Web应用加载FilterDispatcher,只需要在Web.xml文件中配置FilterDispatcher就可以了.
配置FilterDispatcher的代码片段如下:
[xhtml] view plaincopyprint?
<!-- 配置Struts2框架的核心Filter -->
<filter>
<!-- 配置Struts2核心Filter的名字 -->
<filter-name>Struts2</filter-name>
<!-- 配置Struts2核心Filter的实现类 -->
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
<init-param>
<!-- 配置Struts2框架默认加载的Action包结构 -->
<param-name>actionPackages</param-name>
<param-value>org.apache.struts2.showcase.person</param-value>
</init-param>
<!-- 配置Struts2框架的配置提供者类 -->
<init-param>
<param-name>configProviders</param-name>
<param-value>superMos.MyconfigurationProvider</param-value>
</init-param>
</filter>
正如上面看到的,当配置Struts2的FilterDispatcher类的时候,可以指定一系列的初始化参数,为该Filter配置初始化参数的时候,其中有三个初始化参数有特殊意义:
l config:该参数的值是一个以英文逗号(,)隔开的字符串,每个字符串都是一个XML配置文件的位置.Struts2框架将自动加载该属性指定的系列配置文件.
l actionPackages:该参数也是一个以英文逗号(,)隔开的字符串,每个字符串都是一个包空间,Struts框架将扫描这些包空间下面的Action类.
l configProviders:如果用户需要实现自己的ConfigurationProvider类,用户可以提供一个或者多个实现了ConfigurationProvider接口的类,然后将这些类的类名设置成该属性的值,多个类名之间以英文逗号(,)隔开.
除此之外,还可以在此配置Struts常量,每个<init-param>元素配置一个Struts2常量,其中<param-name>元素指定了常量的name,而<param-value>子元素指定了常量value.
在web.xml中配置了该Filter,还需要配置Filter拦截的URL,通常,我们让该Filter拦截所有的用户请求,因此使用通配符来配置该Filter拦截的URL.
下面是配置该Filter拦截URL的配置片段:
[xhtml] view plaincopyprint?
<!-- 配置FIlter拦截的URL -->
<filter-mapping>
<!-- 通过配置,让核心FilterDispatcher拦截所有的用户请求 -->
<filter-name>Struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
配置了Struts2的核心FilterDispatcher之后,基本上完成了Struts2在web.xml文件中的配置.
如果Web应用使用了Servlet2.3以前的规范,因为Web应用不会自动加载Struts2框架的标签文件,因此必须在web.xml文件中加载Struts2的标签库.
如果在Web应用中使用Servlet2.4以上的规范,那么就不需要在web.xml文件中配置标签库的定义了,因为Servlet2.4规范会自动的去加载标签库定义文件.
(Struts2标签库的定义文件包含在Struts2-core-x.x.x.jar文件中,在struts2-core-x.x.x.jar文件的META-INF路径下面,包含一个struts-tags.tld文件,这个文件就是Struts2的标签库定义文件,Servlet2.4规范会自动的去加载该标签库文件.我们再JSP页面中使用<%@tag uri=”/struts-tag” prefix=”s”%>引入的也就是这个标签库文件.)
对于Servlet2.4以上的规范web应用自动加载该标签库定义文件,加载struts-tag.tld标签库定义文件的时候,该文件的开始部分包含有以下的代码片段
[xhtml] view plaincopyprint?
<taglib>
<!—定义标签库的版本信息 -->
<tlib-version>2.2.3</tlib-version>
<short-name>s</short-name>
<!—定义Struts2标签库的URI -->
t;uri>/struts-tags</uri>
因为该文件中已经定义了该标签库的URI:struts-tags,这样就避免了在web.xml中重新定义Struts2标签库文件的URI.
(2) struts.xml配置文件
Struts框架的核心配置文件就是struts.xml配置文件,该文件主要负责管理Struts2框架的业务控制器Action(区别一下业务控制器和业务逻辑组件吧,业务控制器不对业务进行真正的操作,仅仅是负责一个根据处理结果来返回一个字符串的作用,业务控制器调用的是业务逻辑组件的功能,就相当于Service的功能组件,业务逻辑组件又封装了DAO等操作,在实际的项目中,业务逻辑组件流行的都是使用Spring等IOC进行注入的,这样可以更大的降低代码的耦合度,提高代码复用的效率).
在默认情况下,Struts2框架将自动加载放到/WEB-INF/classes路径下的struts.xml文件.(如果是在EclipseIDE环境下进行Struts2的配置,一定要将Struts.xml文件放到src文件夹下面,这样在使用Eclipse的部署到tomcat等容器的时候,才会自动的将struts.xml刷到/WEB-INF/classes文件夹下面.)在大部分应用里,随着应用规模的增加,系统中的Action数量也大量的增加,导致struts.xml配置文件变得非常的臃肿.
为了避免struts.xml文件过于庞大,臃肿,提高Struts.xml文件的可读性,我们可以将一个struts.xml配置文件分解成多个配置文件,然后在struts.xml文件中包含其他的配置文件.
下面的struts.xml文件就是通过include手动导入了一个配置文件,struts-part1.xml文件,这样,通过这种方式,就可以将Struts2的Action按照模块配置在多个配置文件当中:
[xhtml] view plaincopyprint?
<?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>
<!-- 通过include元素导入另外一个配置文件,避免struts.xml臃肿 -->
<include file="struts-part1.xml"/>
<package name="strutsqs" extends="struts-default">
<action name="login" class="com.supermos.app.LoginAction">
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
<result name="input">/login.jsp</result>
</action>
<action name="showBook" class="com.supermos.app.GetBooksAction">
<result name="success">/showBook.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
</struts>
通过这种方式,Struts2提供了一种模块化的方式来管理Struts.xml配置文件.(在Struts1.1之后,已经提供了两种模块化的管理方式了,一种是在导入配置文件的时候用逗号隔开,但是这样,后面内容就会将前面相同的配置覆盖掉,不实用,还有一个就是多个配置文件的方式,这个在项目中是非常常用的.当然Struts1的配置文件的引入在web.xml中是体现为一个Servlet的,在Struts2中是以一个过滤器形式.)
除此之外,Struts2还提供了一种插件式的方式来管理配置文件,我们可以在struts2-core-xxx.jar文件中,找到struts-default.xml文件,查看这个文件,我们在该文件中发现了如下的代码:
[xhtml] view plaincopyprint?
<?xml version="1.0" encoding="UTF-8" ?>
<!—指定Struts2配置文件的DTD信息 -->
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<!—Struts2配置文件的根元素 -->
<struts>
<!—下面定义了Struts 2框架的一些基础的Bean -->
<bean class="com.opensymphony.xwork2.ObjectFactory" name="xwork" />
<bean type="com.opensymphony.xwork2.ObjectFactory" name="struts" class="org.apache.struts2.impl.StrutsObjectFactory" />
<!—-省略n行… -->
<!—-下面定义Struts2的默认包空间,我们在Struts.xml中定义包空间 -->
<!—- 定义的package name=”strutsqs” extends=”struts-default” -->
<package name="struts-default" abstract="true">
<!—定义Struts2内建支持的结果类型 -->
<result-types>
<!—定义Action链Result类型 -->
<result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
<!—定义Dispatcher的result类型,并且设置default=”true”,指定结果Result是默认的Result类型 -->
<result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>
<result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/>
<!—-省略n行… -->
</result-types>
<!—定义Struts2内建的拦截器 -->
<interceptors>
<interceptor name="alias" class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/>
<interceptor name="autowiring" class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/>
<!—-省略n行… -->
<!—定义基本的拦截器栈-->
<interceptor-stack name="basicStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="servletConfig"/>
<!—省略n行配置文件 -->
</interceptor-stack>
<!—省略n行配置文件 -->
</interceptors>
<!—- 定义默认的拦截器的引用-->
<default-interceptor-ref name="defaultStack"/>
</struts>
上面的代码并没有完全的列出struts-default.xml(可以解压struts2-core-2.x.x.jar找到struts-default.xml文件)只是列出了每个元素的代表,上面配置文件中定义了一个名字为struts-default的包空间,该包空间里面定义了Struts2内建的Result类型,还定义了Struts2内建的系列的拦截器,以及由不同的拦截器组成的拦截器栈,文件的最最后还定义了默认的拦截器引用.
这个struts-default.xml文件是Struts2框架的默认配置文件,Struts2框架每次都会自动加载该struts-default.xml文件,查看我们前面写的Struts.xml文件,看到我们自己定义的package元素有如下的代码:
[xhtml] view plaincopyprint?
<?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>
<package name="strutsqs" extends="struts-default">
</package>
</struts>
在上面的配置文件当中,名字为strutsqs的包空间,继承了名为struts-default的包空间,struts-default包空间定义在struts-default.xml文件当中,可以见得,Struts2框架默认会加载struts-default.xml文件的.
不仅仅如此,Struts2框架提供了一种类似于Eclipse的扩展方式,它允许以一种”可插拔”的方式来安装插件,比如Spring插件,JSF插件等等,他们都提供了一种类似于struts2-xxx-plugin.jar的文件---这个文件就是插件安装文件,只要将该文件放到WEB应用的/WEB-INF/lib路径下,Struts2框架将会自动的加载该框架.
打开struts2-spring-plug2.1.6.jar文件,找到struts-plugin.xml文件,打开该文件,该文件的代码如下:
[xhtml] view plaincopyprint?
<?xml version="1.0" encoding="UTF-8" ?>
<!—指定Struts 2的DTD信息 -->
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!—定义一个名字为spring的ObjectFactory -->
<bean type="com.opensymphony.xwork2.ObjectFactory" name="spring" class="org.apache.struts2.spring.StrutsSpringObjectFactory" />
<!—指定名字为spring的ObjectFactory是Struts 2的ObjectFactory -->
<constant name="struts.objectFactory" value="spring" />
<!—定义名字为spring-default的包空间 -->
<package name="spring-default">
<!—定义整合spring框架所必需的拦截器列表 -->
<interceptors>
<interceptor name="autowiring" class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/>
<interceptor name="sessionAutowiring" class="org.apache.struts2.spring.interceptor.SessionContextAutowiringInterceptor"/>
</interceptors>
</package>
</struts>
在上面的配置文件当中,配置了Struts2与Spring框架整合必须的常量,拦截器等等,这也是Struts2框架使用Spring插件必须的配置,只要将struts2-spring-plugin2.1.6.jar文件放到/WEB-INF/lib路径下,Struts2框架将自动加载该文件.
(如果用户开发属于自己的Struts2插件,只要将对应的struts-plugin.xml文件放在JAR文件中,Struts2框架将会自动的加载该文件,通过这种方式,Struts2框架允许使用可插拔的方式管理Struts2的插件.)
(3) struts.properties配置文件
Struts2框架有两个核心的配置文件,其中struts.xml文件主要负责管理应用中的Action映射,以及该Action包含的Result定义等等,除此之外,Struts2框架还包含一个struts.properties文件,该文件定义了Struts2框架的大量的属性,开发者可以通过改变这些属性来满足应用的需求.
struts.properties文件时一个标准的Properties文件,该文件包含了系列的key-value对象,每个key就是一个Struts2属性,该key对应的value就是一个Struts2属性值.
struts.properties文件通常放在WEB-INF/classes路径下,实际上,只要将给文件放在WEB应用的CLASSPATH下,Struts2框架就可以加载该文件.
现在的问题是,struts.properties文件的哪些key是有效的?也就是说struts.properties文件里面包含哪些有效的Struts2属性.下面列出了可以在struts.properties中定义的Struts2的属性:
l struts.configuration:该属性指定加载Struts2配置文件的配置文件管理器,该配置文件的默认值是org.apache.Struts2.config.DefaultConfiguration,这是Struts2默认的配置文件管理器.如果需要实现自己的配置管理器,开发者则可以实现一个实现了Configuration接口的类,该类可以自己加载Struts2配置文件.
l struts.locale:指定Web应用的默认的Locale
l struts.i18n.encoding:指定WEB应用的默认的编码集,该属性对于处理中文请求参数非常有用,对于获取中文请求参数值,应该将该属性设置为GBK或者GB2312,(当设置该参数为GBK的时候,相当于调用HttpServletRequest的setCharacterEncoding方法).
l struts.objectFactory:指定Struts2默认的ObjectFactory Bean,该属性默认值是spring
l struts.objectFactory.spring.autoWire:指定Spring框架的自动装配方式,该属性的默认值是name,也就是根据Bean的name属性自动进行装配.
l struts.objectFactory.spring.useClassCache:该属性指定整合spring框架的时候,是否缓存Bean实例,该属性允许使用true和false两个属性值,他们默认的是true,通常不建议修改该属性值.
l struts.objectTypeDeterminer:该属性指定Struts2的类型检测机制,通常支持tiger和notiger两个属性值.
l struts.multipart.parser:该属性指定处理multipart/form-data的MIME类型(文件上传)请求的框架,该属性支持cos,pell还有jakarta等属性值,既分别对应使用cos的文件上传框架,pell上传以及common-fileupload文件上传框架.该属性的默认值为jakarta.(注意,如果需要使用cos或者pell的文件上传的方式,则应该将对应的JAR文件复制到web应用当中,比如说,使用cos上传方式,就需要自己去下载cos框架的Jar文件,并且将该文件放到WEB-INF/lib路径的下面)
l struts.multipart.saveDir:该属性指定上传文件的临时保存路径,该属性的默认值是javax.servlet.context.tempdir.
l struts.multipart.maxSize:该属性指定Struts2文件上传中整个请求内容允许的最大的字节数.
l struts.custom.properties:该属性指定Struts2应用加载用户自定义的属性文件,该自定义属性文件制定的属性不会覆盖struts.properties文件中指定的属性,如果需要加载多个自定义属性文件,多个自定义属性文件名以英文逗号(,)隔开.
l struts.mapper.class:指定将HTTP请求映射到指定的Action的映射器,Struts2提供了默认的映射器:org.apache.struts2.diepatcher.mapper.DefaultActionMapper默认映射器根据请求的前缀与Action的name属性完成映射.
l struts.action.extension:该属性指定需要Struts2处理的请求后缀,该属性的默认值是action,也就是所有匹配*.action的请求都由Struts2来进行处理,如果用户需要指定多个请求,则多个后缀之间用英文逗号(,)进行隔开.
l struts.serve.static:该属性设置是否通过JAR文件提供静态内容服务,该属性只支持true和false属性值,该属性的默认属性值为true.
l struts.serve.static.browserCache:该属性设置浏览器是否缓存静态内容.当应用处于开发阶段的时候,我们希望每次请求都获得服务器的最新的响应,则可以设置该属性为false.
l struts.enable.DynamicMethodInvocation:该属性设置Struts2是否支持动态方法调用,该属性的默认值为true,如果需要关闭动态方法调用,则可以设置该属性为false.
l struts.enable.SlashesInActionNames:该属性设置Struts2是否允许在Action名中使用斜线,该属性的默认值为false,如果开发者允许在Action中使用斜线的时候,就可以设置该属性为true了.(这个作用还是蛮有用的,我们可以用这种方式骗过黑客猜想我们的路径….待)
l struts.tag.altSyntax:该属性指定是否允许在Struts2标签中使用表达式语法,因为通常都需要在标签中使用表达式语法,故此属性应该设置为true,该属性的默认值就是true.
l struts.devMode:该属性设置Struts2应用是否使用开发模式.如果设置该属性为true,则可以再应用出错的时候显示更多,更友好的出错提示,该属性值只接受true和false两个值,该属性的默认值是false,通常在应用开发阶段,将该属性设置为true,当进入产品发布阶段的时候,则该属性设置为false.
l struts.i18n.reload:该属性设置是否每次HTTP请求到达的时候,系统都重新加载资源文件,该属性默认值是false,在开发阶段,将该属性设置为了true将会更加有利于开发,但是在产品的发布阶段应该将属性设置为false(开发阶段将该属性设置为true,将可以再每次请求的时候都重新加载国际化资源文件,从而可以让开发者实时的看到开发效果:产品发布阶段应该将该属性设置为false,是为了提供响应性能.每次请求都需要重新加载资源文件会大大降低应用的性能)
l struts.ui.theme:该属性指定视图标签默认的视图主题,该属性的默认值是xhtml
l struts.ui.templateDir:该属性指定模版文件的后缀,该属性的默认属性值是ftl.该属性还允许使用ftl,vm或者jsp,分别对应FreeMarker,Velocity和JSP模版.
l struts.configuration.xml.reload:该属性设置当struts.xml文件改变之后,系统是否自动重新加载该文件.该属性的默认值是false
l struts.velocity.configfile:该属性指定Velocity框架所需要的velocity.properties文件的位置,该属性默认的值是velocity.properties
l struts.velocity.contexts:该属性指定Velocity框架的Context位置,如果该框架有多个Context,则多个Context之间以英文逗号(,)隔开.
l struts.velocity.toolboxlocation:该属性指定Velocity框架的toolbox的位置
l struts.url.http.port:该属性指定web应用所在的监听端口,该属性通常没有太大的用处,只是当Struts2需要生成URL的时候(比如说URL标签),该属性才提供Web应用的默认端口.
l struts.url.https.port:该属性类似于struts.url.http.port属性的作用,区别是该属性指定的是Web应用的加密服务端口
l struts.url.includeParams:该属性指定Struts2生成URL的时候是否包含请求参数,该属性能够接受none,get和all三个属性值,分别对应不包含,仅包含GET类型请求参数和包含全部请求参数.
l struts.custom.i18n.resources:该属性指定Struts2应用所用到的国际化资源文件,如果有多份国际化资源文件,则多个资源文件的文件名以英文(,)隔开.
l struts.dispatcher.parametersWorkaround:对于某个javaEE服务器,不支持HttpServletRequest调用getParameterMap()方法,此时可以设置属性值为true来解决该问题.该属性的默认值是false,对于WebLogic,Orian和OC4J服务器,通常应该设置该属性值为true.
l struts.freemarker.manager.classname:该属性指定Struts2使用的FreeMarker管理器.该属性的默认值是org.apache.struts2.views.freemarker.FreemarkerManager,这是Struts2内建的FreeMarker管理器.
l struts.xslt.nocache:该属性指定XSLT Result是否使用样式表缓存.刚应用处于开发阶段的时候,这个属性通常被设置为true,当应用处于产品的使用阶段的时候,该属性通常被设置为false
l struts.configuration.files:该属性指定Struts2框架默认加载的配置文件,如果需要指定默认加载多个配置文件,则多个配置文件之间以英文逗号(,)隔开.该属性的默认值为struts-default.xml,struts-plugin.xml,struts.xml.
有些时候,开发者不喜欢使用额外的struts.properties文件,struts2允许使用struts.xml文件中管理Struts2属性,在struts.xml文件中通过配置constant元素,一样可以配置这些属性:
struts.xml配置文件如下:
[xhtml] view plaincopyprint?
<?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元素配置Struts2的属性 -->
<contant name="struts.custom.i18n.resources" value="messageResource"/>
</struts>
上面的代码片段配置了一个非常常用的属性struts.custom.i18n.resources,该属性所需要的国际化资源文件的baseName为messageResource.
(Struts2提供了两种方式来管理Struts2的属性,既可以通过struts.properties文件来配置Struts2属性,也可以通过struts.xml文件中配置constant元素来配置Struts2属性)