一、struts-default默认配置文件
Struts2框架中使用包来管理action,避免了Servlet在web.xml中难以管理的与维护的局面.包的作用和java中的类包是非常类似的,它主要用于管理一组业务功能相关的action,在实际应用中,我们应该把一组业务功能相关的action 放在同一个包下.
配置包时必须指定name属性,该name属性值可以任意取名,但必须唯一,如果其他包要继承该包,必须通过该属性进行引用,包的namespace属性用于定义该包的命名空间,命名空间作用为访问该包下的action路径的一部分,见示例.namespace属性可以不配置,如果不指定该属性,默认的命名空间为””
通常每个包都应该继承struts-default包,因为struts2很多核心功能都是拦截来实现的,如,从请求中把请求参数封闭到action,文件上传和数据验证等都是通过拦截器实现的,struts-default定义了这些拦截器和Result类型,可以这么说,当包继承了struts-default才能使用struts2提供的核心功能,struts-default包是在struts2-core-2.xx.jar文件中的struts-defalut.xml中定义,struts-default.xml也是struts2默认配置文件,struts2每次都会自动加载struts-default.xml文件.
package还有一个abstract=”true”属性,指定此包为抽象包,和抽象类的概念差不多,说明此包只能被其他包继承,则它里面不允许包含action元素.
下面贴上struts-default.xml文件的源代码:
二、struts2配置文件中常用常量配置列表:
<constant name="struts.i18n.encoding" value="UTF-8" />
指定Web应用的默认编码集,相当于调用HttpServletRequest的setCharacterEncoding方法
<constant name="struts.action.extension" value="do" />
该属性指定需要Struts 2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts 2处理。 如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。
<constant name="struts.serve.static.browserCache " value="false" />
设置浏览器是否缓存静态内容,默认值为true,开发阶段最好false
<constant name="struts.configuration.xml.reload" value="true" />
当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false,开发阶段最好true
<constant name="struts.devMode" value="true" />
开发模式下设为true,这样可以打印出更详细的错误信息
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
动态方法调用,可以解决多个请求对应一个Servlet的问题,后面详细讲解,默认为true,关闭则设为false.
这里只是列举了一些常用的开关,当然还有许多其他的开关,后面的学习中会逐渐介绍,大家在这里先了解一下.
以下是从网上摘得的,比较全的一个资料
struts.serve.static.browserCache 该属性设置浏览器是否缓存静态内容。当应用处于开发阶段时,我们希望每次请求都获得服务器的最新响应,则可设置该属性为false。
struts.enable.DynamicMethodInvocation 该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true。如果需要关闭动态方法调用,则可设置该属性为false。
struts.enable.SlashesInActionNames 该属性设置Struts 2是否允许在Action名中使用斜线,该属性的默认值是false。如果开发者希望允许在Action名中使用斜线,则可设置该属性为true。
struts.tag.altSyntax 该属性指定是否允许在Struts 2标签中使用表达式语法,因为通常都需要在标签中使用表达式语法,故此属性应该设置为true,该属性的默认值是true。
struts.devMode该属性设置Struts 2应用是否使用开发模式。如果设置该属性为true,则可以在应用出错时显示更多、更友好的出错提示。该属性只接受true和flase两个值,该属性的默认值是false。通常,应用在开发阶段,将该属性设置为true,当进入产品发布阶段后,则该属性设置为false。
struts.i18n.reload该属性设置是否每次HTTP请求到达时,系统都重新加载资源文件。该属性默认值是false。在开发阶段将该属性设置为true会更有利于开发,但在产品发布阶段应将该属性设置为false。
提示 开发阶段将该属性设置了true,将可以在每次请求时都重新加载国际化资源文件,从而可以让开发者看到实时开发效果;产品发布阶段应该将该属性设置为false,是为了提供响应性能,每次请求都需要重新加载资源文件会大大降低应用的性能。
struts.ui.theme该属性指定视图标签默认的视图主题,该属性的默认值是xhtml。
struts.ui.templateDir该属性指定视图主题所需要模板文件的位置,该属性的默认值是template,即默认加载template路径下的模板文件。
struts.ui.templateSuffix该属性指定模板文件的后缀,该属性的默认属性值是ftl。该属性还允许使用ftl、vm或jsp,分别对应FreeMarker、Velocity和JSP模板。
struts.configuration.xml.reload该属性设置当struts.xml文件改变后,系统是否自动重新加载该文件。该属性的默认值是false。
struts.velocity.configfile该属性指定Velocity框架所需的velocity.properties文件的位置。该属性的默认值为velocity.properties。
struts.velocity.contexts该属性指定Velocity框架的Context位置,如果该框架有多个Context,则多个Context之间以英文逗号(,)隔开。
struts.velocity.toolboxlocation该属性指定Velocity框架的toolbox的位置。
struts.url.http.port该属性指定Web应用所在的监听端口。该属性通常没有太大的用户,只是当Struts 2需要生成URL时(例如Url标签),该属性才提供Web应用的默认端口。
struts.url.https.port该属性类似于struts.url.http.port属性的作用,区别是该属性指定的是Web应用的加密服务端口。
struts.url.includeParams该属性指定Struts 2生成URL时是否包含请求参数。该属性接受none、get和all三个属性值,分别对应于不包含、仅包含GET类型请求参数和包含全部请求参数。
struts.custom.i18n.resources该属性指定Struts 2应用所需要的国际化资源文件,如果有多份国际化资源文件,则多个资源文件的文件名以英文逗号(,)隔开。
struts.dispatcher.parametersWorkaround 对于某些Java EE服务器,不支持HttpServlet Request调用getParameterMap()方法,此时可以设置该属性值为true来解决该问题。该属性的默认值是false。对于WebLogic、Orion和OC4J服务器,通常应该设置该属性为true。
struts.freemarker.manager.classname 该属性指定Struts 2使用的FreeMarker管理器。该属性的默认值是org.apache.struts2.views.freemarker.FreemarkerManager,这是Struts 2内建的FreeMarker管理器。
struts.freemarker.wrapper.altMap该属性只支持true和false两个属性值,默认值是true。通常无需修改该属性值。
struts.xslt.nocache 该属性指定XSLT Result是否使用样式表缓存。当应用处于开发阶段时,该属性通常被设置为true;当应用处于产品使用阶段时,该属性通常被设置为false。
struts.configuration.files 该属性指定Struts 2框架默认加载的配置文件,如果需要指定默认加载多个配置文件,则多个配置文件的文件名之间以英文逗号(,)隔开。该属性的默认值为struts-default.xml,struts-plugin.xml,struts.xml,看到该属性值,读者应该明白为什么Struts 2框架默认加载struts.xml文件了。
三、struts2框架中的常识介绍
1、在请求时,路径后的后缀action可要可不要,即下面的两种请求都是可以的
http://localhost:8080/Struts2/chapter1/HelloWorld
http://localhost:8080/Struts2/chapter1/HelloWorld.action
2、
<action name="Login">
<result>/WEB-INF/JspPage/chapter1/Login.jsp</result>
</action>
我们发现,当我们请求的路径为http://localhost:8080/Struts2/chapter1/Login时,同样可以实现页面的跳转,这是怎么回事呢?
如果没有为action指定class,默认是ActionSupport类<action name="Login">
相当于
<action name="Login" class="com.opensymphony.xwork2.ActionSupport">
如果没有为action指定method,默认执行action中的execute()方法
<action name="Login">相当于
<action name="Login" class="com.opensymphony.xwork2.ActionSupport"
method="execute">
如果没有指定result的name属性,默认值为success.
<result>相当于<result name="success">
四、ActionSupport这个类到底是个什么类,为什么自己写的action都要默认继承它?
struts2不要求我们自己设计的action类继承任何的struts基类或struts接口,但是我们为了方便实现我们自己的action,大多数情况下都会继承com.opensymphony.xwork2.ActionSupport类,并重写此类里的public String execute() throws Exception方法。因为此类中实现了很多的实用借口,提供了很多默认方法,这些默认方法包括国际化信息的方法、默认的处理用户请求的方法等,这样可以大大的简化Acion的开发。
下面贴上ActionSupport.action的源代码
Struts2框架中使用包来管理action,避免了Servlet在web.xml中难以管理的与维护的局面.包的作用和java中的类包是非常类似的,它主要用于管理一组业务功能相关的action,在实际应用中,我们应该把一组业务功能相关的action 放在同一个包下.
配置包时必须指定name属性,该name属性值可以任意取名,但必须唯一,如果其他包要继承该包,必须通过该属性进行引用,包的namespace属性用于定义该包的命名空间,命名空间作用为访问该包下的action路径的一部分,见示例.namespace属性可以不配置,如果不指定该属性,默认的命名空间为””
通常每个包都应该继承struts-default包,因为struts2很多核心功能都是拦截来实现的,如,从请求中把请求参数封闭到action,文件上传和数据验证等都是通过拦截器实现的,struts-default定义了这些拦截器和Result类型,可以这么说,当包继承了struts-default才能使用struts2提供的核心功能,struts-default包是在struts2-core-2.xx.jar文件中的struts-defalut.xml中定义,struts-default.xml也是struts2默认配置文件,struts2每次都会自动加载struts-default.xml文件.
package还有一个abstract=”true”属性,指定此包为抽象包,和抽象类的概念差不多,说明此包只能被其他包继承,则它里面不允许包含action元素.
下面贴上struts-default.xml文件的源代码:
- <?xml version="1.0" encoding="UTF-8" ?>
- <!--
- /*
- * $Id: struts-default.xml 694960 2008-09-13 15:01:00Z rgielen $
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
- -->
- <!DOCTYPE struts PUBLIC
- "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
- "http://struts.apache.org/dtds/struts-2.0.dtd">
- <struts>
- <bean class="com.opensymphony.xwork2.ObjectFactory" name="xwork" />
- <bean type="com.opensymphony.xwork2.ObjectFactory" name="struts" class="org.apache.struts2.impl.StrutsObjectFactory" />
- <bean type="com.opensymphony.xwork2.ActionProxyFactory" name="xwork" class="com.opensymphony.xwork2.DefaultActionProxyFactory"/>
- <bean type="com.opensymphony.xwork2.ActionProxyFactory" name="struts" class="org.apache.struts2.impl.StrutsActionProxyFactory"/>
- <bean type="com.opensymphony.xwork2.util.ObjectTypeDeterminer" name="tiger" class="com.opensymphony.xwork2.util.GenericsObjectTypeDeterminer"/>
- <bean type="com.opensymphony.xwork2.util.ObjectTypeDeterminer" name="notiger" class="com.opensymphony.xwork2.util.DefaultObjectTypeDeterminer"/>
- <bean type="com.opensymphony.xwork2.util.ObjectTypeDeterminer" name="struts" class="com.opensymphony.xwork2.util.DefaultObjectTypeDeterminer"/>
- <bean type="org.apache.struts2.dispatcher.mapper.ActionMapper" name="struts" class="org.apache.struts2.dispatcher.mapper.DefaultActionMapper" />
- <bean type="org.apache.struts2.dispatcher.mapper.ActionMapper" name="composite" class="org.apache.struts2.dispatcher.mapper.CompositeActionMapper" />
- <bean type="org.apache.struts2.dispatcher.mapper.ActionMapper" name="restful" class="org.apache.struts2.dispatcher.mapper.RestfulActionMapper" />
- <bean type="org.apache.struts2.dispatcher.mapper.ActionMapper" name="restful2" class="org.apache.struts2.dispatcher.mapper.Restful2ActionMapper" />
- <bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="struts" class="org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest" scope="default" optional="true"/>
- <bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="jakarta" class="org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest" scope="default" optional="true" />
- <bean type="org.apache.struts2.views.TagLibrary" name="s" class="org.apache.struts2.views.DefaultTagLibrary" />
- <bean class="org.apache.struts2.views.freemarker.FreemarkerManager" name="struts" optional="true"/>
- <bean class="org.apache.struts2.views.velocity.VelocityManager" name="struts" optional="true" />
- <bean class="org.apache.struts2.components.template.TemplateEngineManager" />
- <bean type="org.apache.struts2.components.template.TemplateEngine" name="ftl" class="org.apache.struts2.components.template.FreemarkerTemplateEngine" />
- <bean type="org.apache.struts2.components.template.TemplateEngine" name="vm" class="org.apache.struts2.components.template.VelocityTemplateEngine" />
- <bean type="org.apache.struts2.components.template.TemplateEngine" name="jsp" class="org.apache.struts2.components.template.JspTemplateEngine" />
- <bean type="com.opensymphony.xwork2.util.XWorkConverter" name="xwork1" class="com.opensymphony.xwork2.util.XWorkConverter" />
- <bean type="com.opensymphony.xwork2.util.XWorkConverter" name="struts" class="com.opensymphony.xwork2.util.AnnotationXWorkConverter" />
- <bean type="com.opensymphony.xwork2.TextProvider" name="xwork1" class="com.opensymphony.xwork2.TextProviderSupport" />
- <bean type="com.opensymphony.xwork2.TextProvider" name="struts" class="com.opensymphony.xwork2.TextProviderSupport" />
- <!-- Only have static injections -->
- <bean class="com.opensymphony.xwork2.ObjectFactory" static="true" />
- <bean class="com.opensymphony.xwork2.util.XWorkConverter" static="true" />
- <bean class="com.opensymphony.xwork2.util.OgnlValueStack" static="true" />
- <bean class="com.opensymphony.xwork2.validator.ValidatorFileParser" static="true" />
- <bean class="org.apache.struts2.dispatcher.Dispatcher" static="true" />
- <bean class="org.apache.struts2.components.Include" static="true" />
- <bean class="org.apache.struts2.dispatcher.FilterDispatcher" static="true" />
- <bean class="org.apache.struts2.views.util.ContextUtil" static="true" />
- <bean class="org.apache.struts2.views.util.UrlHelper" static="true" />
- <package name="struts-default" abstract="true">
- <result-types>
- <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
- <result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>
- <result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/>
- <result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/>
- <result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/>
- <result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>
- <result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>
- <result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/>
- <result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/>
- <result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" />
- <!-- Deprecated name form scheduled for removal in Struts 2.1.0. The camelCase versions are preferred. See ww-1707 -->
- <result-type name="redirect-action" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>
- <result-type name="plaintext" class="org.apache.struts2.dispatcher.PlainTextResult" />
- </result-types>
- <interceptors>
- <interceptor name="alias" class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/>
- <interceptor name="autowiring" class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/>
- <interceptor name="chain" class="com.opensymphony.xwork2.interceptor.ChainingInterceptor"/>
- <interceptor name="conversionError" class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/>
- <interceptor name="cookie" class="org.apache.struts2.interceptor.CookieInterceptor"/>
- <interceptor name="createSession" class="org.apache.struts2.interceptor.CreateSessionInterceptor" />
- <interceptor name="debugging" class="org.apache.struts2.interceptor.debugging.DebuggingInterceptor" />
- <interceptor name="externalRef" class="com.opensymphony.xwork2.interceptor.ExternalReferencesInterceptor"/>
- <interceptor name="execAndWait" class="org.apache.struts2.interceptor.ExecuteAndWaitInterceptor"/>
- <interceptor name="exception" class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"/>
- <interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/>
- <interceptor name="i18n" class="com.opensymphony.xwork2.interceptor.I18nInterceptor"/>
- <interceptor name="logger" class="com.opensymphony.xwork2.interceptor.LoggingInterceptor"/>
- <interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/>
- <interceptor name="scopedModelDriven" class="com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor"/>
- <interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
- <interceptor name="prepare" class="com.opensymphony.xwork2.interceptor.PrepareInterceptor"/>
- <interceptor name="staticParams" class="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor"/>
- <interceptor name="scope" class="org.apache.struts2.interceptor.ScopeInterceptor"/>
- <interceptor name="servletConfig" class="org.apache.struts2.interceptor.ServletConfigInterceptor"/>
- <interceptor name="sessionAutowiring" class="org.apache.struts2.spring.interceptor.SessionContextAutowiringInterceptor"/>
- <interceptor name="timer" class="com.opensymphony.xwork2.interceptor.TimerInterceptor"/>
- <interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/>
- <interceptor name="tokenSession" class="org.apache.struts2.interceptor.TokenSessionStoreInterceptor"/>
- <interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>
- <interceptor name="workflow" class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"/>
- <interceptor name="store" class="org.apache.struts2.interceptor.MessageStoreInterceptor" />
- <interceptor name="checkbox" class="org.apache.struts2.interceptor.CheckboxInterceptor" />
- <interceptor name="profiling" class="org.apache.struts2.interceptor.ProfilingActivationInterceptor" />
- <interceptor name="roles" class="org.apache.struts2.interceptor.RolesInterceptor" />
- <!-- Basic stack -->
- <interceptor-stack name="basicStack">
- <interceptor-ref name="exception"/>
- <interceptor-ref name="servletConfig"/>
- <interceptor-ref name="prepare"/>
- <interceptor-ref name="checkbox"/>
- <interceptor-ref name="params"/>
- <interceptor-ref name="conversionError"/>
- </interceptor-stack>
- <!-- Sample validation and workflow stack -->
- <interceptor-stack name="validationWorkflowStack">
- <interceptor-ref name="basicStack"/>
- <interceptor-ref name="validation"/>
- <interceptor-ref name="workflow"/>
- </interceptor-stack>
- <!-- Sample file upload stack -->
- <interceptor-stack name="fileUploadStack">
- <interceptor-ref name="fileUpload"/>
- <interceptor-ref name="basicStack"/>
- </interceptor-stack>
- <!-- Sample model-driven stack -->
- <interceptor-stack name="modelDrivenStack">
- <interceptor-ref name="modelDriven"/>
- <interceptor-ref name="basicStack"/>
- </interceptor-stack>
- <!-- Sample action chaining stack -->
- <interceptor-stack name="chainStack">
- <interceptor-ref name="chain"/>
- <interceptor-ref name="basicStack"/>
- </interceptor-stack>
- <!-- Sample i18n stack -->
- <interceptor-stack name="i18nStack">
- <interceptor-ref name="i18n"/>
- <interceptor-ref name="basicStack"/>
- </interceptor-stack>
- <!-- An example of the params-prepare-params trick. This stack
- is exactly the same as the defaultStack, except that it
- includes one extra interceptor before the prepare interceptor:
- the params interceptor.
- This is useful for when you wish to apply parameters directly
- to an object that you wish to load externally (such as a DAO
- or database or service layer), but can't load that object
- until at least the ID parameter has been loaded. By loading
- the parameters twice, you can retrieve the object in the
- prepare() method, allowing the second params interceptor to
- apply the values on the object. -->
- <interceptor-stack name="paramsPrepareParamsStack">
- <interceptor-ref name="exception"/>
- <interceptor-ref name="alias"/>
- <interceptor-ref name="params"/>
- <interceptor-ref name="servletConfig"/>
- <interceptor-ref name="prepare"/>
- <interceptor-ref name="i18n"/>
- <interceptor-ref name="chain"/>
- <interceptor-ref name="modelDriven"/>
- <interceptor-ref name="fileUpload"/>
- <interceptor-ref name="checkbox"/>
- <interceptor-ref name="staticParams"/>
- <interceptor-ref name="params"/>
- <interceptor-ref name="conversionError"/>
- <interceptor-ref name="validation">
- <param name="excludeMethods">input,back,cancel</param>
- </interceptor-ref>
- <interceptor-ref name="workflow">
- <param name="excludeMethods">input,back,cancel</param>
- </interceptor-ref>
- </interceptor-stack>
- <!-- A complete stack with all the common interceptors in place.
- Generally, this stack should be the one you use, though it
- may do more than you need. Also, the ordering can be
- switched around (ex: if you wish to have your servlet-related
- objects applied before prepare() is called, you'd need to move
- servlet-config interceptor up.
- This stack also excludes from the normal validation and workflow
- the method names input, back, and cancel. These typically are
- associated with requests that should not be validated.
- -->
- <interceptor-stack name="defaultStack">
- <interceptor-ref name="exception"/>
- <interceptor-ref name="alias"/>
- <interceptor-ref name="servletConfig"/>
- <interceptor-ref name="prepare"/>
- <interceptor-ref name="i18n"/>
- <interceptor-ref name="chain"/>
- <interceptor-ref name="debugging"/>
- <interceptor-ref name="profiling"/>
- <interceptor-ref name="scopedModelDriven"/>
- <interceptor-ref name="modelDriven"/>
- <interceptor-ref name="fileUpload"/>
- <interceptor-ref name="checkbox"/>
- <interceptor-ref name="staticParams"/>
- <interceptor-ref name="params">
- <param name="excludeParams">dojo\..*</param>
- </interceptor-ref>
- <interceptor-ref name="conversionError"/>
- <interceptor-ref name="validation">
- <param name="excludeMethods">input,back,cancel,browse</param>
- </interceptor-ref>
- <interceptor-ref name="workflow">
- <param name="excludeMethods">input,back,cancel,browse</param>
- </interceptor-ref>
- </interceptor-stack>
- <!-- The completeStack is here for backwards compatibility for
- applications that still refer to the defaultStack by the
- old name -->
- <interceptor-stack name="completeStack">
- <interceptor-ref name="defaultStack"/>
- </interceptor-stack>
- <!-- Sample execute and wait stack.
- Note: execAndWait should always be the *last* interceptor. -->
- <interceptor-stack name="executeAndWaitStack">
- <interceptor-ref name="execAndWait">
- <param name="excludeMethods">input,back,cancel</param>
- </interceptor-ref>
- <interceptor-ref name="defaultStack"/>
- <interceptor-ref name="execAndWait">
- <param name="excludeMethods">input,back,cancel</param>
- </interceptor-ref>
- </interceptor-stack>
- <!-- Deprecated name forms scheduled for removal in Struts 2.1.0. The camelCase versions are preferred. See ww-1707 -->
- <interceptor name="external-ref" class="com.opensymphony.xwork2.interceptor.ExternalReferencesInterceptor"/>
- <interceptor name="model-driven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/>
- <interceptor name="static-params" class="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor"/>
- <interceptor name="scoped-model-driven" class="com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor"/>
- <interceptor name="servlet-config" class="org.apache.struts2.interceptor.ServletConfigInterceptor"/>
- <interceptor name="token-session" class="org.apache.struts2.interceptor.TokenSessionStoreInterceptor"/>
- </interceptors>
- <default-interceptor-ref name="defaultStack"/>
- </package>
- </struts>
二、struts2配置文件中常用常量配置列表:
<constant name="struts.i18n.encoding" value="UTF-8" />
指定Web应用的默认编码集,相当于调用HttpServletRequest的setCharacterEncoding方法
<constant name="struts.action.extension" value="do" />
该属性指定需要Struts 2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts 2处理。 如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。
<constant name="struts.serve.static.browserCache " value="false" />
设置浏览器是否缓存静态内容,默认值为true,开发阶段最好false
<constant name="struts.configuration.xml.reload" value="true" />
当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false,开发阶段最好true
<constant name="struts.devMode" value="true" />
开发模式下设为true,这样可以打印出更详细的错误信息
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
动态方法调用,可以解决多个请求对应一个Servlet的问题,后面详细讲解,默认为true,关闭则设为false.
这里只是列举了一些常用的开关,当然还有许多其他的开关,后面的学习中会逐渐介绍,大家在这里先了解一下.
以下是从网上摘得的,比较全的一个资料
struts.serve.static.browserCache 该属性设置浏览器是否缓存静态内容。当应用处于开发阶段时,我们希望每次请求都获得服务器的最新响应,则可设置该属性为false。
struts.enable.DynamicMethodInvocation 该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true。如果需要关闭动态方法调用,则可设置该属性为false。
struts.enable.SlashesInActionNames 该属性设置Struts 2是否允许在Action名中使用斜线,该属性的默认值是false。如果开发者希望允许在Action名中使用斜线,则可设置该属性为true。
struts.tag.altSyntax 该属性指定是否允许在Struts 2标签中使用表达式语法,因为通常都需要在标签中使用表达式语法,故此属性应该设置为true,该属性的默认值是true。
struts.devMode该属性设置Struts 2应用是否使用开发模式。如果设置该属性为true,则可以在应用出错时显示更多、更友好的出错提示。该属性只接受true和flase两个值,该属性的默认值是false。通常,应用在开发阶段,将该属性设置为true,当进入产品发布阶段后,则该属性设置为false。
struts.i18n.reload该属性设置是否每次HTTP请求到达时,系统都重新加载资源文件。该属性默认值是false。在开发阶段将该属性设置为true会更有利于开发,但在产品发布阶段应将该属性设置为false。
提示 开发阶段将该属性设置了true,将可以在每次请求时都重新加载国际化资源文件,从而可以让开发者看到实时开发效果;产品发布阶段应该将该属性设置为false,是为了提供响应性能,每次请求都需要重新加载资源文件会大大降低应用的性能。
struts.ui.theme该属性指定视图标签默认的视图主题,该属性的默认值是xhtml。
struts.ui.templateDir该属性指定视图主题所需要模板文件的位置,该属性的默认值是template,即默认加载template路径下的模板文件。
struts.ui.templateSuffix该属性指定模板文件的后缀,该属性的默认属性值是ftl。该属性还允许使用ftl、vm或jsp,分别对应FreeMarker、Velocity和JSP模板。
struts.configuration.xml.reload该属性设置当struts.xml文件改变后,系统是否自动重新加载该文件。该属性的默认值是false。
struts.velocity.configfile该属性指定Velocity框架所需的velocity.properties文件的位置。该属性的默认值为velocity.properties。
struts.velocity.contexts该属性指定Velocity框架的Context位置,如果该框架有多个Context,则多个Context之间以英文逗号(,)隔开。
struts.velocity.toolboxlocation该属性指定Velocity框架的toolbox的位置。
struts.url.http.port该属性指定Web应用所在的监听端口。该属性通常没有太大的用户,只是当Struts 2需要生成URL时(例如Url标签),该属性才提供Web应用的默认端口。
struts.url.https.port该属性类似于struts.url.http.port属性的作用,区别是该属性指定的是Web应用的加密服务端口。
struts.url.includeParams该属性指定Struts 2生成URL时是否包含请求参数。该属性接受none、get和all三个属性值,分别对应于不包含、仅包含GET类型请求参数和包含全部请求参数。
struts.custom.i18n.resources该属性指定Struts 2应用所需要的国际化资源文件,如果有多份国际化资源文件,则多个资源文件的文件名以英文逗号(,)隔开。
struts.dispatcher.parametersWorkaround 对于某些Java EE服务器,不支持HttpServlet Request调用getParameterMap()方法,此时可以设置该属性值为true来解决该问题。该属性的默认值是false。对于WebLogic、Orion和OC4J服务器,通常应该设置该属性为true。
struts.freemarker.manager.classname 该属性指定Struts 2使用的FreeMarker管理器。该属性的默认值是org.apache.struts2.views.freemarker.FreemarkerManager,这是Struts 2内建的FreeMarker管理器。
struts.freemarker.wrapper.altMap该属性只支持true和false两个属性值,默认值是true。通常无需修改该属性值。
struts.xslt.nocache 该属性指定XSLT Result是否使用样式表缓存。当应用处于开发阶段时,该属性通常被设置为true;当应用处于产品使用阶段时,该属性通常被设置为false。
struts.configuration.files 该属性指定Struts 2框架默认加载的配置文件,如果需要指定默认加载多个配置文件,则多个配置文件的文件名之间以英文逗号(,)隔开。该属性的默认值为struts-default.xml,struts-plugin.xml,struts.xml,看到该属性值,读者应该明白为什么Struts 2框架默认加载struts.xml文件了。
三、struts2框架中的常识介绍
1、在请求时,路径后的后缀action可要可不要,即下面的两种请求都是可以的
http://localhost:8080/Struts2/chapter1/HelloWorld
http://localhost:8080/Struts2/chapter1/HelloWorld.action
2、
<action name="Login">
<result>/WEB-INF/JspPage/chapter1/Login.jsp</result>
</action>
我们发现,当我们请求的路径为http://localhost:8080/Struts2/chapter1/Login时,同样可以实现页面的跳转,这是怎么回事呢?
如果没有为action指定class,默认是ActionSupport类<action name="Login">
相当于
<action name="Login" class="com.opensymphony.xwork2.ActionSupport">
如果没有为action指定method,默认执行action中的execute()方法
<action name="Login">相当于
<action name="Login" class="com.opensymphony.xwork2.ActionSupport"
method="execute">
如果没有指定result的name属性,默认值为success.
<result>相当于<result name="success">
四、ActionSupport这个类到底是个什么类,为什么自己写的action都要默认继承它?
struts2不要求我们自己设计的action类继承任何的struts基类或struts接口,但是我们为了方便实现我们自己的action,大多数情况下都会继承com.opensymphony.xwork2.ActionSupport类,并重写此类里的public String execute() throws Exception方法。因为此类中实现了很多的实用借口,提供了很多默认方法,这些默认方法包括国际化信息的方法、默认的处理用户请求的方法等,这样可以大大的简化Acion的开发。
下面贴上ActionSupport.action的源代码
- // Decompiled by Jad v1.5.8e2. Copyright 2001 Pavel Kouznetsov.
- // Jad home page: http://kpdus.tripod.com/jad.html
- // Decompiler options: packimports(3) fieldsfirst ansi space
- // Source File Name: ActionSupport.java
- package com.opensymphony.xwork2;
- import com.opensymphony.xwork2.util.ValueStack;
- import java.io.Serializable;
- import java.util.*;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- // Referenced classes of package com.opensymphony.xwork2:
- // TextProviderFactory, ValidationAwareSupport, Action, Validateable,
- // ValidationAware, TextProvider, LocaleProvider, ActionContext
- public class ActionSupport
- implements Action, Validateable, ValidationAware, TextProvider, LocaleProvider, Serializable
- {
- protected static Log LOG = LogFactory.getLog(com/opensymphony/xwork2/ActionSupport);
- private final transient TextProvider textProvider = (new TextProviderFactory()).createInstance(getClass(), this);
- private final ValidationAwareSupport validationAware = new ValidationAwareSupport();
- public ActionSupport()
- {
- }
- public void setActionErrors(Collection errorMessages)
- {
- validationAware.setActionErrors(errorMessages);
- }
- public Collection getActionErrors()
- {
- return validationAware.getActionErrors();
- }
- public void setActionMessages(Collection messages)
- {
- validationAware.setActionMessages(messages);
- }
- public Collection getActionMessages()
- {
- return validationAware.getActionMessages();
- }
- /**
- * @deprecated Method getErrorMessages is deprecated
- */
- public Collection getErrorMessages()
- {
- return getActionErrors();
- }
- /**
- * @deprecated Method getErrors is deprecated
- */
- public Map getErrors()
- {
- return getFieldErrors();
- }
- public void setFieldErrors(Map errorMap)
- {
- validationAware.setFieldErrors(errorMap);
- }
- public Map getFieldErrors()
- {
- return validationAware.getFieldErrors();
- }
- public Locale getLocale()
- {
- return ActionContext.getContext().getLocale();
- }
- public String getText(String aTextName)
- {
- return textProvider.getText(aTextName);
- }
- public String getText(String aTextName, String defaultValue)
- {
- return textProvider.getText(aTextName, defaultValue);
- }
- public String getText(String aTextName, String defaultValue, String obj)
- {
- return textProvider.getText(aTextName, defaultValue, obj);
- }
- public String getText(String aTextName, List args)
- {
- return textProvider.getText(aTextName, args);
- }
- public String getText(String key, String args[])
- {
- return textProvider.getText(key, args);
- }
- public String getText(String aTextName, String defaultValue, List args)
- {
- return textProvider.getText(aTextName, defaultValue, args);
- }
- public String getText(String key, String defaultValue, String args[])
- {
- return textProvider.getText(key, defaultValue, args);
- }
- public String getText(String key, String defaultValue, List args, ValueStack stack)
- {
- return textProvider.getText(key, defaultValue, args, stack);
- }
- public String getText(String key, String defaultValue, String args[], ValueStack stack)
- {
- return textProvider.getText(key, defaultValue, args, stack);
- }
- public ResourceBundle getTexts()
- {
- return textProvider.getTexts();
- }
- public ResourceBundle getTexts(String aBundleName)
- {
- return textProvider.getTexts(aBundleName);
- }
- public void addActionError(String anErrorMessage)
- {
- validationAware.addActionError(anErrorMessage);
- }
- public void addActionMessage(String aMessage)
- {
- validationAware.addActionMessage(aMessage);
- }
- public void addFieldError(String fieldName, String errorMessage)
- {
- validationAware.addFieldError(fieldName, errorMessage);
- }
- public String input()
- throws Exception
- {
- return "input";
- }
- public String doDefault()
- throws Exception
- {
- return "success";
- }
- public String execute()
- throws Exception
- {
- return "success";
- }
- public boolean hasActionErrors()
- {
- return validationAware.hasActionErrors();
- }
- public boolean hasActionMessages()
- {
- return validationAware.hasActionMessages();
- }
- public boolean hasErrors()
- {
- return validationAware.hasErrors();
- }
- public boolean hasFieldErrors()
- {
- return validationAware.hasFieldErrors();
- }
- public void clearErrorsAndMessages()
- {
- validationAware.clearErrorsAndMessages();
- }
- public void validate()
- {
- }
- public Object clone()
- throws CloneNotSupportedException
- {
- return super.clone();
- }
- public void pause(String s)
- {
- }
- }