http://git-wip-us.apache.org/repos/asf/struts-site/blob/f694fc8f/content/core-developers/interceptors.html ---------------------------------------------------------------------- diff --git a/content/core-developers/interceptors.html b/content/core-developers/interceptors.html index 5cf3a14..4fcb55b 100644 --- a/content/core-developers/interceptors.html +++ b/content/core-developers/interceptors.html @@ -223,7 +223,403 @@ than reiterate the same list of Interceptors, we can bundle these Interceptors t <h2 id="the-default-configuration">The Default Configuration</h2> -<figure class="highlight"><pre><code class="language-xml" data-lang="xml">500: Internal Server Error</code></pre></figure> +<figure class="highlight"><pre><code class="language-xml" data-lang="xml"><span class="cp"><?xml version="1.0" encoding="UTF-8" ?></span> +<span class="c"><!-- +/* + * $Id$ + * + * 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. + */ +--></span> + +<span class="c"><!-- + When declaring beans in this file you must either use name="struts" or don't name the bean at all. + + The name="struts" must be used when alias was defined in {@link org.apache.struts2.config.DefaultBeanSelectionProvider} - + it is then the default bean's name and {@link org.apache.struts2.config.DefaultBeanSelectionProvider} links name "struts" + with "default" (aliasing it) + + If name won't be defined then the "default" value will be used {@link com.opensymphony.xwork2.inject.Container#DEFAULT_NAME} + and {@link com.opensymphony.xwork2.inject.Inject} +--></span> +<span class="cp"><!DOCTYPE struts PUBLIC + "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" + "http://struts.apache.org/dtds/struts-2.5.dtd"></span> + +<span class="nt"><struts></span> + + <span class="nt"><constant</span> <span class="na">name=</span><span class="s">"struts.excludedClasses"</span> + <span class="na">value=</span><span class="s">"</span> + <span class="err">java.lang.Object,</span> + <span class="err">java.lang.Runtime,</span> + <span class="err">java.lang.System,</span> + <span class="err">java.lang.Class,</span> + <span class="err">java.lang.ClassLoader,</span> + <span class="err">java.lang.Shutdown,</span> + <span class="err">java.lang.ProcessBuilder,</span> + <span class="err">ognl.OgnlContext,</span> + <span class="err">ognl.ClassResolver,</span> + <span class="err">ognl.TypeConverter,</span> + <span class="err">ognl.MemberAccess,</span> + <span class="err">ognl.DefaultMemberAccess,</span> + <span class="err">com.opensymphony.xwork2.ognl.SecurityMemberAccess,</span> + <span class="err">com.opensymphony.xwork2.ActionContext"</span> <span class="nt">/></span> + + <span class="c"><!-- this must be valid regex, each '.' in package name must be escaped! --></span> + <span class="c"><!-- it's more flexible but slower than simple string comparison --></span> + <span class="c"><!-- constant name="struts.excludedPackageNamePatterns" value="^java\.lang\..*,^ognl.*,^(?!javax\.servlet\..+)(javax\..+)" / --></span> + + <span class="c"><!-- this is simpler version of the above used with string comparison --></span> + <span class="nt"><constant</span> <span class="na">name=</span><span class="s">"struts.excludedPackageNames"</span> + <span class="na">value=</span><span class="s">"</span> + <span class="err">java.lang.,</span> + <span class="err">ognl.,</span> + <span class="err">javax,</span> + <span class="err">freemarker.core.,</span> + <span class="err">freemarker.template.,</span> + <span class="err">freemarker.ext.rhino.,</span> + <span class="err">freemarker.ext.beans.,</span> + <span class="err">sun.reflect.,</span> + <span class="err">javassist."</span> <span class="nt">/></span> + + <span class="nt"><bean</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.ObjectFactory"</span> <span class="na">name=</span><span class="s">"struts"</span><span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.factory.ResultFactory"</span> <span class="na">name=</span><span class="s">"struts"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.factory.StrutsResultFactory"</span> <span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.factory.ActionFactory"</span> <span class="na">name=</span><span class="s">"struts"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.factory.DefaultActionFactory"</span> <span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.factory.ConverterFactory"</span> <span class="na">name=</span><span class="s">"struts"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.factory.DefaultConverterFactory"</span> <span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.factory.InterceptorFactory"</span> <span class="na">name=</span><span class="s">"struts"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.factory.DefaultInterceptorFactory"</span> <span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.factory.ValidatorFactory"</span> <span class="na">name=</span><span class="s">"struts"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.factory.DefaultValidatorFactory"</span> <span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.factory.UnknownHandlerFactory"</span> <span class="na">name=</span><span class="s">"struts"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.factory.DefaultUnknownHandlerFactory"</span> <span class="nt">/></span> + + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.FileManager"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.util.fs.DefaultFileManager"</span> <span class="na">name=</span><span class="s">"system"</span> <span class="na">scope=</span><span class="s">"singleton"</span><span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.FileManagerFactory"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.util.fs.DefaultFileManagerFactory"</span> <span class="na">name=</span><span class="s">"struts"</span> <span class="na">scope=</span><span class="s">"singleton"</span><span class="nt">/></span> + + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.ActionProxyFactory"</span> <span class="na">name=</span><span class="s">"struts"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.factory.StrutsActionProxyFactory"</span><span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.ActionProxyFactory"</span> <span class="na">name=</span><span class="s">"prefix"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.factory.PrefixBasedActionProxyFactory"</span><span class="nt">/></span> + + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.conversion.ObjectTypeDeterminer"</span> <span class="na">name=</span><span class="s">"struts"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.conversion.impl.DefaultObjectTypeDeterminer"</span><span class="nt">/></span> + + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.util.PatternMatcher"</span> <span class="na">name=</span><span class="s">"struts"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.util.WildcardHelper"</span> <span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.util.PatternMatcher"</span> <span class="na">name=</span><span class="s">"namedVariable"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.util.NamedVariablePatternMatcher"</span><span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.util.PatternMatcher"</span> <span class="na">name=</span><span class="s">"regex"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.util.RegexPatternMatcher"</span><span class="nt">/></span> + + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"org.apache.struts2.util.ContentTypeMatcher"</span> <span class="na">name=</span><span class="s">"struts"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.util.DefaultContentTypeMatcher"</span><span class="nt">/></span> + + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"org.apache.struts2.dispatcher.mapper.ActionMapper"</span> <span class="na">name=</span><span class="s">"struts"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.dispatcher.mapper.DefaultActionMapper"</span> <span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"org.apache.struts2.dispatcher.mapper.ActionMapper"</span> <span class="na">name=</span><span class="s">"composite"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.dispatcher.mapper.CompositeActionMapper"</span> <span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"org.apache.struts2.dispatcher.mapper.ActionMapper"</span> <span class="na">name=</span><span class="s">"restful"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.dispatcher.mapper.RestfulActionMapper"</span> <span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"org.apache.struts2.dispatcher.mapper.ActionMapper"</span> <span class="na">name=</span><span class="s">"restful2"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.dispatcher.mapper.Restful2ActionMapper"</span> <span class="nt">/></span> + + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"org.apache.struts2.dispatcher.multipart.MultiPartRequest"</span> <span class="na">name=</span><span class="s">"jakarta"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest"</span> <span class="na">scope=</span><span class="s">"prototype"</span><span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"org.apache.struts2.dispatcher.multipart.MultiPartRequest"</span> <span class="na">name=</span><span class="s">"jakarta-stream"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.dispatcher.multipart.JakartaStreamMultiPartRequest"</span> <span class="na">scope=</span><span class="s">"prototype"</span><span class="nt">/></span> + + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"org.apache.struts2.views.TagLibraryDirectiveProvider"</span> <span class="na">name=</span><span class="s">"s"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.views.DefaultTagLibrary"</span> <span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"org.apache.struts2.views.TagLibraryModelProvider"</span> <span class="na">name=</span><span class="s">"s"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.views.DefaultTagLibrary"</span> <span class="nt">/></span> + + <span class="nt"><bean</span> <span class="na">class=</span><span class="s">"org.apache.struts2.views.freemarker.FreemarkerThemeTemplateLoader"</span> <span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">class=</span><span class="s">"org.apache.struts2.views.freemarker.FreemarkerManager"</span> <span class="na">name=</span><span class="s">"struts"</span> <span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">class=</span><span class="s">"org.apache.struts2.views.velocity.VelocityManager"</span> <span class="na">name=</span><span class="s">"struts"</span> <span class="na">optional=</span><span class="s">"true"</span> <span class="nt">/></span> + + <span class="nt"><bean</span> <span class="na">class=</span><span class="s">"org.apache.struts2.components.template.TemplateEngineManager"</span> <span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"org.apache.struts2.components.template.TemplateEngine"</span> <span class="na">name=</span><span class="s">"ftl"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.components.template.FreemarkerTemplateEngine"</span> <span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"org.apache.struts2.components.template.TemplateEngine"</span> <span class="na">name=</span><span class="s">"vm"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.components.template.VelocityTemplateEngine"</span> <span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"org.apache.struts2.components.template.TemplateEngine"</span> <span class="na">name=</span><span class="s">"jsp"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.components.template.JspTemplateEngine"</span> <span class="nt">/></span> + + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.conversion.impl.XWorkConverter"</span> <span class="na">name=</span><span class="s">"struts"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.conversion.impl.XWorkConverter"</span> <span class="nt">/></span> + + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.conversion.ConversionPropertiesProcessor"</span> <span class="na">name=</span><span class="s">"struts"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.conversion.impl.DefaultConversionPropertiesProcessor"</span> <span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.conversion.ConversionFileProcessor"</span> <span class="na">name=</span><span class="s">"struts"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.conversion.impl.DefaultConversionFileProcessor"</span> <span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.conversion.ConversionAnnotationProcessor"</span> <span class="na">name=</span><span class="s">"struts"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.conversion.impl.DefaultConversionAnnotationProcessor"</span> <span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.conversion.TypeConverterCreator"</span> <span class="na">name=</span><span class="s">"struts"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.conversion.impl.DefaultTypeConverterCreator"</span> <span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.conversion.TypeConverterHolder"</span> <span class="na">name=</span><span class="s">"struts"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.conversion.impl.DefaultTypeConverterHolder"</span> <span class="nt">/></span> + + <span class="nt"><bean</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter"</span> <span class="nt">/></span> + + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.conversion.impl.CollectionConverter"</span> <span class="na">name=</span><span class="s">"struts"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.conversion.impl.CollectionConverter"</span> <span class="na">scope=</span><span class="s">"singleton"</span><span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.conversion.impl.ArrayConverter"</span> <span class="na">name=</span><span class="s">"struts"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.conversion.impl.ArrayConverter"</span> <span class="na">scope=</span><span class="s">"singleton"</span><span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.conversion.impl.DateConverter"</span> <span class="na">name=</span><span class="s">"struts"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.conversion.impl.DateConverter"</span> <span class="na">scope=</span><span class="s">"singleton"</span><span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.conversion.impl.NumberConverter"</span> <span class="na">name=</span><span class="s">"struts"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.conversion.impl.NumberConverter"</span> <span class="na">scope=</span><span class="s">"singleton"</span><span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.conversion.impl.StringConverter"</span> <span class="na">name=</span><span class="s">"struts"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.conversion.impl.StringConverter"</span> <span class="na">scope=</span><span class="s">"singleton"</span><span class="nt">/></span> + + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.LocalizedTextProvider"</span> <span class="na">name=</span><span class="s">"global-only"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.util.GlobalLocalizedTextProvider"</span> <span class="na">scope=</span><span class="s">"singleton"</span> <span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.LocalizedTextProvider"</span> <span class="na">name=</span><span class="s">"struts"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.util.StrutsLocalizedTextProvider"</span> <span class="na">scope=</span><span class="s">"singleton"</span> <span class="nt">/></span> + + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.TextProvider"</span> <span class="na">name=</span><span class="s">"system"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.DefaultTextProvider"</span> <span class="na">scope=</span><span class="s">"singleton"</span> <span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.TextProviderFactory"</span> <span class="na">name=</span><span class="s">"struts"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.StrutsTextProviderFactory"</span> <span class="na">scope=</span><span class="s">"singleton"</span> <span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.LocaleProviderFactory"</span> <span class="na">name=</span><span class="s">"struts"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.DefaultLocaleProviderFactory"</span> <span class="na">scope=</span><span class="s">"singleton"</span> <span class="nt">/></span> + + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"org.apache.struts2.components.UrlRenderer"</span> <span class="na">name=</span><span class="s">"struts"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.components.ServletUrlRenderer"</span><span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"org.apache.struts2.views.util.UrlHelper"</span> <span class="na">name=</span><span class="s">"struts"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.views.util.DefaultUrlHelper"</span><span class="nt">/></span> + + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.util.ValueStackFactory"</span> <span class="na">name=</span><span class="s">"struts"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.ognl.OgnlValueStackFactory"</span> <span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.util.reflection.ReflectionProvider"</span> <span class="na">name=</span><span class="s">"struts"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.ognl.OgnlReflectionProvider"</span> <span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.util.reflection.ReflectionContextFactory"</span> <span class="na">name=</span><span class="s">"struts"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.ognl.OgnlReflectionContextFactory"</span> <span class="nt">/></span> + + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.conversion.NullHandler"</span> <span class="na">name=</span><span class="s">"java.lang.Object"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.conversion.impl.InstantiatingNullHandler"</span> <span class="nt">/></span> + + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.validator.ActionValidatorManager"</span> <span class="na">name=</span><span class="s">"struts"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.validator.AnnotationActionValidatorManager"</span> <span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.validator.ActionValidatorManager"</span> <span class="na">name=</span><span class="s">"no-annotations"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.validator.DefaultActionValidatorManager"</span> <span class="nt">/></span> + + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.validator.ValidatorFactory"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.validator.DefaultValidatorFactory"</span><span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.validator.ValidatorFileParser"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.validator.DefaultValidatorFileParser"</span> <span class="nt">/></span> + + <span class="nt"><bean</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.ognl.OgnlUtil"</span> <span class="nt">/></span> + + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.util.TextParser"</span> <span class="na">name=</span><span class="s">"struts"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.util.OgnlTextParser"</span> <span class="na">scope=</span><span class="s">"singleton"</span><span class="nt">/></span> + + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"ognl.PropertyAccessor"</span> <span class="na">name=</span><span class="s">"com.opensymphony.xwork2.util.CompoundRoot"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.ognl.accessor.CompoundRootAccessor"</span> <span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"ognl.PropertyAccessor"</span> <span class="na">name=</span><span class="s">"java.lang.Object"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.ognl.accessor.ObjectAccessor"</span> <span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"ognl.PropertyAccessor"</span> <span class="na">name=</span><span class="s">"java.util.Iterator"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.ognl.accessor.XWorkIteratorPropertyAccessor"</span> <span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"ognl.PropertyAccessor"</span> <span class="na">name=</span><span class="s">"java.util.Enumeration"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.ognl.accessor.XWorkEnumerationAccessor"</span> <span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"ognl.PropertyAccessor"</span> <span class="na">name=</span><span class="s">"java.util.List"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.ognl.accessor.XWorkListPropertyAccessor"</span> <span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"ognl.PropertyAccessor"</span> <span class="na">name=</span><span class="s">"java.util.Set"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor"</span> <span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"ognl.PropertyAccessor"</span> <span class="na">name=</span><span class="s">"java.util.Map"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.ognl.accessor.XWorkMapPropertyAccessor"</span> <span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"ognl.PropertyAccessor"</span> <span class="na">name=</span><span class="s">"java.util.Collection"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor"</span> <span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"ognl.PropertyAccessor"</span> <span class="na">name=</span><span class="s">"com.opensymphony.xwork2.ognl.ObjectProxy"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.ognl.accessor.ObjectProxyPropertyAccessor"</span> <span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"ognl.PropertyAccessor"</span> <span class="na">name=</span><span class="s">"org.apache.struts2.dispatcher.HttpParameters"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.ognl.accessor.HttpParametersPropertyAccessor"</span> <span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"ognl.PropertyAccessor"</span> <span class="na">name=</span><span class="s">"org.apache.struts2.dispatcher.Parameter"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.ognl.accessor.ParameterPropertyAccessor"</span> <span class="nt">/></span> + + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"ognl.MethodAccessor"</span> <span class="na">name=</span><span class="s">"java.lang.Object"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.ognl.accessor.XWorkMethodAccessor"</span> <span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"ognl.MethodAccessor"</span> <span class="na">name=</span><span class="s">"com.opensymphony.xwork2.util.CompoundRoot"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.ognl.accessor.CompoundRootAccessor"</span> <span class="nt">/></span> + + <span class="nt"><bean</span> <span class="na">class=</span><span class="s">"org.apache.struts2.views.jsp.ui.OgnlTool"</span> <span class="nt">/></span> + + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"org.apache.struts2.dispatcher.StaticContentLoader"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.dispatcher.DefaultStaticContentLoader"</span> <span class="na">name=</span><span class="s">"struts"</span> <span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.UnknownHandlerManager"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.DefaultUnknownHandlerManager"</span> <span class="na">name=</span><span class="s">"struts"</span> <span class="nt">/></span> + + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"org.apache.struts2.dispatcher.DispatcherErrorHandler"</span> <span class="na">name=</span><span class="s">"struts"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.dispatcher.DefaultDispatcherErrorHandler"</span> <span class="nt">/></span> + + <span class="nt"><constant</span> <span class="na">name=</span><span class="s">"struts.dispatcher.errorHandler"</span> <span class="na">value=</span><span class="s">"struts"</span> <span class="nt">/></span> + + <span class="c"><!-- Silly workarounds for OGNL since there is currently no way to flush its internal caches --></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"ognl.PropertyAccessor"</span> <span class="na">name=</span><span class="s">"java.util.ArrayList"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.ognl.accessor.XWorkListPropertyAccessor"</span> <span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"ognl.PropertyAccessor"</span> <span class="na">name=</span><span class="s">"java.util.HashSet"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor"</span> <span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"ognl.PropertyAccessor"</span> <span class="na">name=</span><span class="s">"java.util.HashMap"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.ognl.accessor.XWorkMapPropertyAccessor"</span> <span class="nt">/></span> + + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.security.ExcludedPatternsChecker"</span> <span class="na">name=</span><span class="s">"struts"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.security.DefaultExcludedPatternsChecker"</span> <span class="na">scope=</span><span class="s">"prototype"</span> <span class="nt">/></span> + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.security.AcceptedPatternsChecker"</span> <span class="na">name=</span><span class="s">"struts"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.security.DefaultAcceptedPatternsChecker"</span> <span class="na">scope=</span><span class="s">"prototype"</span> <span class="nt">/></span> + + <span class="nt"><bean</span> <span class="na">type=</span><span class="s">"com.opensymphony.xwork2.config.providers.ValueSubstitutor"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.config.providers.EnvsValueSubstitutor"</span> <span class="na">scope=</span><span class="s">"singleton"</span><span class="nt">/></span> + + <span class="nt"><package</span> <span class="na">name=</span><span class="s">"struts-default"</span> <span class="na">abstract=</span><span class="s">"true"</span> <span class="na">strict-method-invocation=</span><span class="s">"true"</span><span class="nt">></span> + <span class="nt"><result-types></span> + <span class="nt"><result-type</span> <span class="na">name=</span><span class="s">"chain"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.ActionChainResult"</span><span class="nt">/></span> + <span class="nt"><result-type</span> <span class="na">name=</span><span class="s">"dispatcher"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.result.ServletDispatcherResult"</span> <span class="na">default=</span><span class="s">"true"</span><span class="nt">/></span> + <span class="nt"><result-type</span> <span class="na">name=</span><span class="s">"freemarker"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.views.freemarker.FreemarkerResult"</span><span class="nt">/></span> + <span class="nt"><result-type</span> <span class="na">name=</span><span class="s">"httpheader"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.result.HttpHeaderResult"</span><span class="nt">/></span> + <span class="nt"><result-type</span> <span class="na">name=</span><span class="s">"redirect"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.result.ServletRedirectResult"</span><span class="nt">/></span> + <span class="nt"><result-type</span> <span class="na">name=</span><span class="s">"redirectAction"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.result.ServletActionRedirectResult"</span><span class="nt">/></span> + <span class="nt"><result-type</span> <span class="na">name=</span><span class="s">"stream"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.result.StreamResult"</span><span class="nt">/></span> + <span class="nt"><result-type</span> <span class="na">name=</span><span class="s">"velocity"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.result.VelocityResult"</span><span class="nt">/></span> + <span class="nt"><result-type</span> <span class="na">name=</span><span class="s">"xslt"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.views.xslt.XSLTResult"</span><span class="nt">/></span> + <span class="nt"><result-type</span> <span class="na">name=</span><span class="s">"plainText"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.result.PlainTextResult"</span> <span class="nt">/></span> + <span class="nt"><result-type</span> <span class="na">name=</span><span class="s">"postback"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.result.PostbackResult"</span> <span class="nt">/></span> + <span class="nt"></result-types></span> + + <span class="nt"><interceptors></span> + <span class="nt"><interceptor</span> <span class="na">name=</span><span class="s">"alias"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.interceptor.AliasInterceptor"</span><span class="nt">/></span> + <span class="nt"><interceptor</span> <span class="na">name=</span><span class="s">"autowiring"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"</span><span class="nt">/></span> + <span class="nt"><interceptor</span> <span class="na">name=</span><span class="s">"chain"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.interceptor.ChainingInterceptor"</span><span class="nt">/></span> + <span class="nt"><interceptor</span> <span class="na">name=</span><span class="s">"conversionError"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"</span><span class="nt">/></span> + <span class="nt"><interceptor</span> <span class="na">name=</span><span class="s">"cookie"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.interceptor.CookieInterceptor"</span><span class="nt">/></span> + <span class="nt"><interceptor</span> <span class="na">name=</span><span class="s">"cookieProvider"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.interceptor.CookieProviderInterceptor"</span><span class="nt">/></span> + <span class="nt"><interceptor</span> <span class="na">name=</span><span class="s">"clearSession"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.interceptor.ClearSessionInterceptor"</span> <span class="nt">/></span> + <span class="nt"><interceptor</span> <span class="na">name=</span><span class="s">"createSession"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.interceptor.CreateSessionInterceptor"</span> <span class="nt">/></span> + <span class="nt"><interceptor</span> <span class="na">name=</span><span class="s">"debugging"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.interceptor.debugging.DebuggingInterceptor"</span> <span class="nt">/></span> + <span class="nt"><interceptor</span> <span class="na">name=</span><span class="s">"execAndWait"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.interceptor.ExecuteAndWaitInterceptor"</span><span class="nt">/></span> + <span class="nt"><interceptor</span> <span class="na">name=</span><span class="s">"exception"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"</span><span class="nt">/></span> + <span class="nt"><interceptor</span> <span class="na">name=</span><span class="s">"fileUpload"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.interceptor.FileUploadInterceptor"</span><span class="nt">/></span> + <span class="nt"><interceptor</span> <span class="na">name=</span><span class="s">"i18n"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.interceptor.I18nInterceptor"</span><span class="nt">/></span> + <span class="nt"><interceptor</span> <span class="na">name=</span><span class="s">"logger"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.interceptor.LoggingInterceptor"</span><span class="nt">/></span> + <span class="nt"><interceptor</span> <span class="na">name=</span><span class="s">"modelDriven"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"</span><span class="nt">/></span> + <span class="nt"><interceptor</span> <span class="na">name=</span><span class="s">"scopedModelDriven"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor"</span><span class="nt">/></span> + <span class="nt"><interceptor</span> <span class="na">name=</span><span class="s">"params"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.interceptor.ParametersInterceptor"</span><span class="nt">/></span> + <span class="nt"><interceptor</span> <span class="na">name=</span><span class="s">"actionMappingParams"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.interceptor.ActionMappingParametersInteceptor"</span><span class="nt">/></span> + <span class="nt"><interceptor</span> <span class="na">name=</span><span class="s">"prepare"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.interceptor.PrepareInterceptor"</span><span class="nt">/></span> + <span class="nt"><interceptor</span> <span class="na">name=</span><span class="s">"staticParams"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.interceptor.StaticParametersInterceptor"</span><span class="nt">/></span> + <span class="nt"><interceptor</span> <span class="na">name=</span><span class="s">"scope"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.interceptor.ScopeInterceptor"</span><span class="nt">/></span> + <span class="nt"><interceptor</span> <span class="na">name=</span><span class="s">"servletConfig"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.interceptor.ServletConfigInterceptor"</span><span class="nt">/></span> + <span class="nt"><interceptor</span> <span class="na">name=</span><span class="s">"timer"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.interceptor.TimerInterceptor"</span><span class="nt">/></span> + <span class="nt"><interceptor</span> <span class="na">name=</span><span class="s">"token"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.interceptor.TokenInterceptor"</span><span class="nt">/></span> + <span class="nt"><interceptor</span> <span class="na">name=</span><span class="s">"tokenSession"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.interceptor.TokenSessionStoreInterceptor"</span><span class="nt">/></span> + <span class="nt"><interceptor</span> <span class="na">name=</span><span class="s">"validation"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"</span><span class="nt">/></span> + <span class="nt"><interceptor</span> <span class="na">name=</span><span class="s">"workflow"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"</span><span class="nt">/></span> + <span class="nt"><interceptor</span> <span class="na">name=</span><span class="s">"store"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.interceptor.MessageStoreInterceptor"</span> <span class="nt">/></span> + <span class="nt"><interceptor</span> <span class="na">name=</span><span class="s">"checkbox"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.interceptor.CheckboxInterceptor"</span> <span class="nt">/></span> + <span class="nt"><interceptor</span> <span class="na">name=</span><span class="s">"datetime"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.interceptor.DateTextFieldInterceptor"</span> <span class="nt">/></span> + <span class="nt"><interceptor</span> <span class="na">name=</span><span class="s">"profiling"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.interceptor.ProfilingActivationInterceptor"</span> <span class="nt">/></span> + <span class="nt"><interceptor</span> <span class="na">name=</span><span class="s">"roles"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.interceptor.RolesInterceptor"</span> <span class="nt">/></span> + <span class="nt"><interceptor</span> <span class="na">name=</span><span class="s">"annotationWorkflow"</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.interceptor.annotations.AnnotationWorkflowInterceptor"</span> <span class="nt">/></span> + <span class="nt"><interceptor</span> <span class="na">name=</span><span class="s">"multiselect"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.interceptor.MultiselectInterceptor"</span> <span class="nt">/></span> + <span class="nt"><interceptor</span> <span class="na">name=</span><span class="s">"noop"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.interceptor.NoOpInterceptor"</span> <span class="nt">/></span> + + <span class="c"><!-- Empty stack - performs no operations --></span> + <span class="nt"><interceptor-stack</span> <span class="na">name=</span><span class="s">"emptyStack"</span><span class="nt">></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"noop"</span><span class="nt">/></span> + <span class="nt"></interceptor-stack></span> + + <span class="c"><!-- Basic stack --></span> + <span class="nt"><interceptor-stack</span> <span class="na">name=</span><span class="s">"basicStack"</span><span class="nt">></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"exception"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"servletConfig"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"prepare"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"checkbox"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"datetime"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"multiselect"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"actionMappingParams"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"params"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"conversionError"</span><span class="nt">/></span> + <span class="nt"></interceptor-stack></span> + + <span class="c"><!-- Sample validation and workflow stack --></span> + <span class="nt"><interceptor-stack</span> <span class="na">name=</span><span class="s">"validationWorkflowStack"</span><span class="nt">></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"basicStack"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"validation"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"workflow"</span><span class="nt">/></span> + <span class="nt"></interceptor-stack></span> + + <span class="c"><!-- Sample file upload stack --></span> + <span class="nt"><interceptor-stack</span> <span class="na">name=</span><span class="s">"fileUploadStack"</span><span class="nt">></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"fileUpload"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"basicStack"</span><span class="nt">/></span> + <span class="nt"></interceptor-stack></span> + + <span class="c"><!-- Sample model-driven stack --></span> + <span class="nt"><interceptor-stack</span> <span class="na">name=</span><span class="s">"modelDrivenStack"</span><span class="nt">></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"modelDriven"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"basicStack"</span><span class="nt">/></span> + <span class="nt"></interceptor-stack></span> + + <span class="c"><!-- Sample action chaining stack --></span> + <span class="nt"><interceptor-stack</span> <span class="na">name=</span><span class="s">"chainStack"</span><span class="nt">></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"chain"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"basicStack"</span><span class="nt">/></span> + <span class="nt"></interceptor-stack></span> + + <span class="c"><!-- Sample i18n stack --></span> + <span class="nt"><interceptor-stack</span> <span class="na">name=</span><span class="s">"i18nStack"</span><span class="nt">></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"i18n"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"basicStack"</span><span class="nt">/></span> + <span class="nt"></interceptor-stack></span> + + <span class="c"><!-- An example of the paramsPrepareParams 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. --></span> + <span class="nt"><interceptor-stack</span> <span class="na">name=</span><span class="s">"paramsPrepareParamsStack"</span><span class="nt">></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"exception"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"alias"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"i18n"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"checkbox"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"datetime"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"multiselect"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"params"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"servletConfig"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"prepare"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"chain"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"modelDriven"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"fileUpload"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"staticParams"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"actionMappingParams"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"params"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"conversionError"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"validation"</span><span class="nt">></span> + <span class="nt"><param</span> <span class="na">name=</span><span class="s">"excludeMethods"</span><span class="nt">></span>input,back,cancel,browse<span class="nt"></param></span> + <span class="nt"></interceptor-ref></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"workflow"</span><span class="nt">></span> + <span class="nt"><param</span> <span class="na">name=</span><span class="s">"excludeMethods"</span><span class="nt">></span>input,back,cancel,browse<span class="nt"></param></span> + <span class="nt"></interceptor-ref></span> + <span class="nt"></interceptor-stack></span> + + <span class="c"><!-- 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 + servletConfig 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. + --></span> + <span class="nt"><interceptor-stack</span> <span class="na">name=</span><span class="s">"defaultStack"</span><span class="nt">></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"exception"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"alias"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"servletConfig"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"i18n"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"prepare"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"chain"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"scopedModelDriven"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"modelDriven"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"fileUpload"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"checkbox"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"datetime"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"multiselect"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"staticParams"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"actionMappingParams"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"params"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"conversionError"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"validation"</span><span class="nt">></span> + <span class="nt"><param</span> <span class="na">name=</span><span class="s">"excludeMethods"</span><span class="nt">></span>input,back,cancel,browse<span class="nt"></param></span> + <span class="nt"></interceptor-ref></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"workflow"</span><span class="nt">></span> + <span class="nt"><param</span> <span class="na">name=</span><span class="s">"excludeMethods"</span><span class="nt">></span>input,back,cancel,browse<span class="nt"></param></span> + <span class="nt"></interceptor-ref></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"debugging"</span><span class="nt">/></span> + <span class="nt"></interceptor-stack></span> + + <span class="c"><!-- The completeStack is here for backwards compatibility for + applications that still refer to the defaultStack by the + old name --></span> + <span class="nt"><interceptor-stack</span> <span class="na">name=</span><span class="s">"completeStack"</span><span class="nt">></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"defaultStack"</span><span class="nt">/></span> + <span class="nt"></interceptor-stack></span> + + <span class="c"><!-- Sample execute and wait stack. + Note: execAndWait should always be the *last* interceptor. --></span> + <span class="nt"><interceptor-stack</span> <span class="na">name=</span><span class="s">"executeAndWaitStack"</span><span class="nt">></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"execAndWait"</span><span class="nt">></span> + <span class="nt"><param</span> <span class="na">name=</span><span class="s">"excludeMethods"</span><span class="nt">></span>input,back,cancel<span class="nt"></param></span> + <span class="nt"></interceptor-ref></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"defaultStack"</span><span class="nt">/></span> + <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"execAndWait"</span><span class="nt">></span> + <span class="nt"><param</span> <span class="na">name=</span><span class="s">"excludeMethods"</span><span class="nt">></span>input,back,cancel<span class="nt"></param></span> + <span class="nt"></interceptor-ref></span> + <span class="nt"></interceptor-stack></span> + + <span class="nt"></interceptors></span> + + <span class="nt"><default-interceptor-ref</span> <span class="na">name=</span><span class="s">"defaultStack"</span><span class="nt">/></span> + + <span class="nt"><default-class-ref</span> <span class="na">class=</span><span class="s">"com.opensymphony.xwork2.ActionSupport"</span> <span class="nt">/></span> + + <span class="nt"><global-allowed-methods></span>execute,input,back,cancel,browse,save,delete,list,index<span class="nt"></global-allowed-methods></span> + + <span class="nt"></package></span> + +<span class="nt"></struts></span></code></pre></figure> <p>Since the <code class="highlighter-rouge">struts-default.xml</code> is included in the applicationâs configuration by default, all of the predefined interceptors and stacks are available âout of the boxâ.</p>
http://git-wip-us.apache.org/repos/asf/struts-site/blob/f694fc8f/content/core-developers/localization.html ---------------------------------------------------------------------- diff --git a/content/core-developers/localization.html b/content/core-developers/localization.html index f4645cd..40bcea9 100644 --- a/content/core-developers/localization.html +++ b/content/core-developers/localization.html @@ -127,309 +127,158 @@ <a class="edit-on-gh" href="https://github.com/apache/struts-site/edit/master/source/core-developers/localization.md" title="Edit this page on GitHub">Edit on GitHub</a> <h1 id="localization">Localization</h1> -<p>####Overview####</p> +<h2 id="overview">Overview</h2> <p>The framework supports internationalization (i18n) in the following places:</p> <ol> - <li> - <p>the <em>UI Tags</em></p> - </li> - <li> - <p>Messages and Errors from the <a href="http://struts.apache.org/2.0.6/struts2-core/apidocs/index.html?com/opensymphony/xwork2/ValidationAware.html">ValidationAware</a>^[http://struts.apache.org/2.0.6/struts2-core/apidocs/index.html?com/opensymphony/xwork2/ValidationAware.html] interface (implemented by <a href="http://struts.apache.org/2.0.6/struts2-core/apidocs/index.html?com/opensymphony/xwork2/ActionSupport.html">ActionSupport</a>^[http://struts.apache.org/2.0.6/struts2-core/apidocs/index.html?com/opensymphony/xwork2/ActionSupport.html] and <a href="http://struts.apache.org/2.0.6/struts2-core/apidocs/index.html?com/opensymphony/xwork2/ValidationAwareSupport.html">ValidationAwareSupport</a>^[http://struts.apache.org/2.0.6/struts2-core/apidocs/index.html?com/opensymphony/xwork2/ValidationAwareSupport.html])</p> - </li> - <li> - <p>Within action classes that extend <a href="http://struts.apache.org/2.0.6/struts2-core/apidocs/index.html?com/opensymphony/xwork2/ActionSupport.html">ActionSupport</a>^[http://struts.apache.org/2.0.6/struts2-core/apidocs/index.html?com/opensymphony/xwork2/ActionSupport.html] through the getText() method</p> - </li> + <li>the <em>UI Tags</em></li> + <li>Messages and Errors from the <a href="http://struts.apache.org/struts2-core/apidocs/index.html?com/opensymphony/xwork2/ValidationAware.html">ValidationAware</a></li> + <li>Within action classes that extend <a href="http://struts.apache.org/struts2-core/apidocs/index.html?com/opensymphony/xwork2/ActionSupport.html">ActionSupport</a> through the <code class="highlighter-rouge">getText()</code> method</li> </ol> -<p>####Resource Bundle Search Order####</p> +<h2 id="resource-bundle-search-order">Resource Bundle Search Order</h2> <p>Resource bundles are searched in the following order:</p> <ol> - <li></li> + <li><code class="highlighter-rouge">ActionClass</code>.properties</li> + <li><code class="highlighter-rouge">Interface</code>.properties (every interface and sub-interface)</li> + <li><code class="highlighter-rouge">BaseClass</code>.properties (all the way to Object.properties)</li> + <li>ModelDrivenâs model (if implements ModelDriven), for the model object repeat from 1</li> + <li>package.properties (of the directory where class is located and every parent directory all the way to the root directory)</li> + <li>search up the i18n message key hierarchy itself</li> + <li>global resource properties</li> </ol> -<div class="highlighter-rouge"><pre class="highlight"><code>ActionClass -</code></pre> -</div> -<p>.properties</p> - -<ol> - <li></li> -</ol> - -<div class="highlighter-rouge"><pre class="highlight"><code>Interface -</code></pre> -</div> -<p>.properties (every interface and sub-interface)</p> - -<ol> - <li></li> -</ol> - -<div class="highlighter-rouge"><pre class="highlight"><code>BaseClass -</code></pre> -</div> -<p>.properties (all the way to Object.properties)</p> - -<ol> - <li> - <p>ModelDrivenâs model (if implements ModelDriven), for the model object repeat from 1</p> - </li> - <li> - <p>package.properties (of the directory where class is located and every parent directory all the way to the root directory)</p> - </li> - <li> - <p>search up the i18n message key hierarchy itself</p> - </li> - <li> - <p>global resource properties</p> - </li> -</ol> - -<p>This is how it is implemented in a default implementation of the </p> +<p>This is how it is implemented in a default implementation of the <code class="highlighter-rouge">LocalizedTextProvider</code> interface. You can provide your +own implementation using <code class="highlighter-rouge">TextProvider</code> and <code class="highlighter-rouge">TextProviderFactory</code> interfaces.</p> -<div class="highlighter-rouge"><pre class="highlight"><code>LocalizedTextProvider -</code></pre> -</div> -<p> interface. You can provide your own implementation using</p> +<p>To clarify #5, while traversing the package hierarchy, Struts 2 will look for a file <code class="highlighter-rouge">package.properties</code>:</p> -<div class="highlighter-rouge"><pre class="highlight"><code>TextProvider -</code></pre> -</div> -<p> and</p> - -<div class="highlighter-rouge"><pre class="highlight"><code>TextProviderFactory -</code></pre> -</div> -<p> interfaces.</p> - -<table> - <tbody> - <tr> - <td>To clarify #5, while traversing the package hierarchy, Struts 2 will look for a file package.properties:</td> - </tr> - </tbody> -</table> - -<p>| com/ - acme/ +<div class="highlighter-rouge"><pre class="highlight"><code>com/ + acme/ package.properties actions/ package.properties FooAction.java - FooAction.properties</p> - -<table> - <tbody> - <tr> - </tr> - </tbody> -</table> - -<table> - <tbody> - <tr> - <td>If FooAction.properties does not exist, com/acme/action/package.properties will be searched for, if not found com/acme/package.properties, if not found com/package.properties, etc.</td> - </tr> - </tbody> -</table> - -<table> - <tbody> - <tr> - </tr> - </tbody> -</table> - -<p>#####Default actionâs class#####</p> - -<p>If you configure action as follow</p> - -<div class="highlighter-rouge"><pre class="highlight"><code><action name="index"> - <result>/index.jsp</result> -</action> + FooAction.properties </code></pre> </div> -<p>it will use a default class defined with </p> +<blockquote> + <p>If <code class="highlighter-rouge">FooAction.properties</code> does not exist, <code class="highlighter-rouge">com/acme/action/package.properties</code> will be searched for, if not found +<code class="highlighter-rouge">com/acme/package.properties</code>, if not found <code class="highlighter-rouge">com/package.properties</code>, etc.</p> +</blockquote> -<div class="highlighter-rouge"><pre class="highlight"><code>default-class-ref -</code></pre> -</div> -<p> in </p> +<h2 id="default-actions-class">Default actionâs class</h2> -<div class="highlighter-rouge"><pre class="highlight"><code>struts-default.xml -</code></pre> -</div> -<p>which is </p> +<p>If you configure action as follow</p> -<div class="highlighter-rouge"><pre class="highlight"><code>com.opensymphony.xwork2.ActionSupport +<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt"><action</span> <span class="na">name=</span><span class="s">"index"</span><span class="nt">></span> + <span class="nt"><result></span>/index.jsp<span class="nt"></result></span> +<span class="nt"></action></span> </code></pre> </div> -<p>. It means you have two options here to get I18N working in that case:</p> -<ul> - <li>define </li> -</ul> - -<div class="highlighter-rouge"><pre class="highlight"><code>com/opensymphony/xwork2/ActionSupport.properties -</code></pre> -</div> -<p>and put messages there</p> +<p>it will use a default class defined with <code class="highlighter-rouge">default-class-ref</code> in <code class="highlighter-rouge">struts-default.xml</code> which is +<code class="highlighter-rouge">com.opensymphony.xwork2.ActionSupport</code>. It means you have two options here to get I18N working in that case:</p> <ul> - <li>point </li> + <li>define <code class="highlighter-rouge">com/opensymphony/xwork2/ActionSupport.properties</code> and put messages there</li> + <li>point <code class="highlighter-rouge">default-class-ref</code> to your base class and then defined appropriated <code class="highlighter-rouge">.properties</code> file (corresponding to +classâ name or package)</li> </ul> -<div class="highlighter-rouge"><pre class="highlight"><code>default-class-ref -</code></pre> -</div> -<p>to your base class and then defined appropriated</p> +<h2 id="examples">Examples</h2> -<div class="highlighter-rouge"><pre class="highlight"><code>.properties -</code></pre> -</div> -<p> file (corresponding to classâ name or package)</p> +<p>There are several ways to access the message resources, including <code class="highlighter-rouge">getText</code>, the <code class="highlighter-rouge">text</code> tag, and the <code class="highlighter-rouge">i18n</code> tag.</p> -<p>Examples</p> +<h3 id="using-gettext-from-a-tag">Using getText from a Tag</h3> -<p>There are several ways to access the message resources, including</p> +<p>To display i18n text, use a call to <code class="highlighter-rouge">getText</code> in the <code class="highlighter-rouge">property</code> tag, or any other tag, such as the UI tags. (The <code class="highlighter-rouge">getText</code> +technique is especially useful for labels of UI tags.)</p> -<div class="highlighter-rouge"><pre class="highlight"><code>getText +<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt"><s:property</span> <span class="na">value=</span><span class="s">"getText('some.key')"</span> <span class="nt">/></span> </code></pre> </div> -<p>, the</p> -<div class="highlighter-rouge"><pre class="highlight"><code>text -</code></pre> -</div> -<p>tag, and the</p> +<p>The default implementation of <code class="highlighter-rouge">TextProvider</code> which is used in <code class="highlighter-rouge">ActionSupport</code> perform evaluation of value read from +bundle base on the provided key, see [Localizing Output] for an example.</p> -<div class="highlighter-rouge"><pre class="highlight"><code>i18n -</code></pre> -</div> -<p>tag.</p> +<h3 id="using-the-text-tag">Using the text tag</h3> -<p>#####Using getText from a Tag#####</p> +<p>The <code class="highlighter-rouge">text</code> tag retrieves a message from the default resource bundle.</p> -<p>To display i18n text, use a call to</p> +<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt"><s:text</span> <span class="na">name=</span><span class="s">"some.key"</span> <span class="nt">/></span> -<div class="highlighter-rouge"><pre class="highlight"><code>getText +<span class="nt"><s:text</span> <span class="na">name=</span><span class="s">"some.invalid.key"</span><span class="nt">></span> + The Default Message That Will Be Displayed +<span class="nt"></s:text></span> </code></pre> </div> -<p>in the <em>property</em> tag, or any other tag, such as the UI tags. (The</p> -<div class="highlighter-rouge"><pre class="highlight"><code>getText -</code></pre> -</div> -<p>technique is especially useful for labels of UI tags.)</p> +<h3 id="using-the-i18n-tag">Using the I18n tag</h3> -<div class="highlighter-rouge"><pre class="highlight"><code><span class="p">{</span><span class="err">snippet:id=i18nExample|javadoc=true|lang=xml|url=org.apache.struts2.components.Property</span><span class="p">}</span><span class="w"> -</span></code></pre> -</div> +<p>The <code class="highlighter-rouge">i18n</code> tag pushes an arbitrary resource bundle on to the value stack. Other tags within the scope of the i18n tag +can display messages from that resource bundle.</p> -<p>The default implementation of TextProvider which is used in ActionSupport perform evaluation of value read from bundle base on the provided key, see <em>Localizing Output</em> for an example.</p> - -<table> - <tbody> - <tr> - </tr> - </tbody> -</table> - -<p>#####Using the text tag#####</p> - -<p>The <em>text</em> tag retrieves a message from the default resource bundle.</p> - -<div class="highlighter-rouge"><pre class="highlight"><code><span class="p">{</span><span class="err">snippet:id=i18nExample|javadoc=true|lang=xml|url=org.apache.struts2.components.Text</span><span class="p">}</span><span class="w"> -</span></code></pre> -</div> - -<p>#####Using the I18n tag#####</p> - -<p>The <em>i18n</em> tag pushes an arbitrary resource bundle on to the value stack. Other tags within the scope of the i18n tag can display messages from that resource bundle.</p> - -<div class="highlighter-rouge"><pre class="highlight"><code><span class="p">{</span><span class="err">snippet:id=i18nExample|javadoc=true|lang=xml|url=org.apache.struts2.components.I18n</span><span class="p">}</span><span class="w"> -</span></code></pre> +<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt"><s:i18n</span> <span class="na">name=</span><span class="s">"some.package.bundle"</span><span class="nt">></s:i18n></span> + <span class="nt"><s:text</span> <span class="na">name=</span><span class="s">"some.key"</span> <span class="nt">/></span> +<span class="nt"></s:i18n></span> +</code></pre> </div> -<p>Internationalizing SiteMesh decorators is possible, but there are quirks. See <em>SiteMesh Plugin</em> for more.</p> +<p>Internationalizing SiteMesh decorators is possible, but there are quirks. See <a href="../plugins/sitemesh/">SiteMesh Plugin</a><br /> +for more.</p> -<table> - <tbody> - <tr> - </tr> - </tbody> -</table> - -<p>#####Using the Key attribute of UI Tags#####</p> +<h3 id="using-the-key-attribute-of-ui-tags">Using the Key attribute of UI Tags</h3> <p>The key attribute of most UI tags can be used to retrieve a message from a resource bundle:</p> -<div class="highlighter-rouge"><pre class="highlight"><code><s:textfield key="some.key" name="textfieldName"/> +<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt"><s:textfield</span> <span class="na">key=</span><span class="s">"some.key"</span> <span class="na">name=</span><span class="s">"textfieldName"</span><span class="nt">/></span> </code></pre> </div> -<p>####I18n Interceptor####</p> +<h2 id="i18n-interceptor">I18n Interceptor</h2> -<p>Essentially, the i18n Interceptor pushes a locale into the ActionContext map upon every request. The framework components that support localization all utilize the ActionContext locale. See <a href="i18n-interceptor.html">I18n Interceptor</a> for details.</p> +<p>Essentially, the i18n Interceptor pushes a locale into the ActionContext map upon every request. The framework +components that support localization all utilize the ActionContext locale. See <a href="i18n-interceptor.html">I18n Interceptor</a> f +or details.</p> -<p>####Global Resources (struts.custom.i18n.resources) in struts.properties####</p> +<h2 id="global-resources-strutscustomi18nresources-in-strutsproperties">Global Resources (struts.custom.i18n.resources) in struts.properties</h2> <p>A global resource bundle could be specified programmatically, as well as the locale.</p> -<p>####Formatting Dates and Numbers####</p> +<h2 id="formatting-dates-and-numbers">Formatting Dates and Numbers</h2> <p>See <a href="formatting-dates-and-numbers.html">Formatting Dates and Numbers</a> for more details and examples.</p> -<p>####Comparison with Struts 1####</p> - -<p>Struts 1 users should be familiar with the application.properties resource bundle, where you can put all the messages in the application that are going to be translated. Struts 2, though, splits the resource bundles per action or model class, and you may end up with duplicated messages in those resource bundles. A quick fix for that is to create a file called ActionSupport.properties in com/opensymphony/xwork2 and put it on your classpath. This will only work well if all your actions subclass XWork2âs ActionSupport.</p> - -<p>####Using only global bundles####</p> +<h2 id="comparison-with-struts-1">Comparison with Struts 1</h2> -<p>If you donât need to use the package-scan-functionality and only base on the global bundles (those provided by the framework and via </p> - -<div class="highlighter-rouge"><pre class="highlight"><code>struts.custom.i18n.resources -</code></pre> -</div> -<p>) you can use existing </p> +<p>Struts 1 users should be familiar with the application.properties resource bundle, where you can put all the messages +in the application that are going to be translated. Struts 2, though, splits the resource bundles per action or model +class, and you may end up with duplicated messages in those resource bundles. A quick fix for that is to create a file +called ActionSupport.properties in com/opensymphony/xwork2 and put it on your classpath. This will only work well if +all your actions subclass XWork2âs ActionSupport.</p> -<div class="highlighter-rouge"><pre class="highlight"><code>GlobalLocalizedTextProvider -</code></pre> -</div> -<p>implementation. To use this please define the following option in your </p> +<h2 id="using-only-global-bundles">Using only global bundles</h2> -<div class="highlighter-rouge"><pre class="highlight"><code>struts.xml -</code></pre> -</div> -<p>:</p> +<p>If you donât need to use the package-scan-functionality and only base on the global bundles (those provided by +the framework and via <code class="highlighter-rouge">struts.custom.i18n.resources</code>) you can use existing <code class="highlighter-rouge">GlobalLocalizedTextProvider</code> +implementation. To use this please define the following option in your <code class="highlighter-rouge">struts.xml</code>:</p> -<div class="highlighter-rouge"><pre class="highlight"><code><constant name="struts.localizedTextProvider" value="global-only" /> +<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt"><constant</span> <span class="na">name=</span><span class="s">"struts.localizedTextProvider"</span> <span class="na">value=</span><span class="s">"global-only"</span> <span class="nt">/></span> </code></pre> </div> -<p>####Custom TextProvider and TextProviderFactory####</p> +<h2 id="custom-textprovider-and-textproviderfactory">Custom TextProvider and TextProviderFactory</h2> -<p>If you want use a different logic to search for localized messages, or you want to use a database or just want to search default bundles, you must implement both those interfaces (or subclass the existing implementations). You can check a small <a href="https://github\.com/apache/struts\-examples/tree/master/text\-provider">example app</a>^[https://github.com/apache/struts-examples/tree/master/text-provider] how to use both. Please remember that the </p> - -<div class="highlighter-rouge"><pre class="highlight"><code>TextProvider -</code></pre> -</div> -<p>interface is implemented by the </p> - -<div class="highlighter-rouge"><pre class="highlight"><code>ActioSupport -</code></pre> -</div> -<p>class, thatâs why an extra layer - </p> - -<div class="highlighter-rouge"><pre class="highlight"><code>TextProviderFactory -</code></pre> -</div> -<p>- is needed.</p> +<p>If you want use a different logic to search for localized messages, or you want to use a database or just want to search +default bundles, you must implement both those interfaces (or subclass the existing implementations). You can check +a small <a href="https://github.com/apache/struts\-examples/tree/master/text\-provider">example app</a> how to use both. +Please remember that the <code class="highlighter-rouge">TextProvider</code> interface is implemented by the <code class="highlighter-rouge">ActionSupport</code> class, thatâs why +an extra layer - <code class="highlighter-rouge">TextProviderFactory</code> - is needed.</p> </section> </article>