Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Table of Contents

Java 8

From this version of Struts, the framework requires Java 8 at least to run.

Servlet API 3.1

Struts 6.0.0 requires a servlet container which supports Servlet API 3.1 at least, it won't work with older versions.

Dependencies

Update Struts dependencies to 6.x.x.

Remove the following plugin dependencies because they were dropped and aren't supported anymore:

  • sitegraph plugin

Support for Velocity was has been moved into a dedicated pluginsplugin, also Velocity based tags were moved into the new plugin, see

Jira
serverASF JIRA
serverId5aa69414-a9e9-3523-82ec-879b028fb15b
keyWW-5049
for more details.

Note

To still use the Velocity plugin in your application you must include the plugin and its JARs plus use a proper parent package in your struts.xml  like this:

Code Block
<package name="mystrutsapp" extends="json-default, velocity-default">
  ...
</package>



DTD

Please use a proper DTD header in struts.xml as demonstrated below:

Code Block
languagexml
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 6.0//EN"
        "https://struts.apache.org/dtds/struts-6.0.dtd">

Class changes

com.opensymphony.xwork2.config.providers.XmlConfigurationProvider became abstract, please use org.apache.struts2.config.StrutsXmlConfigurationProvider instead.

...

All Xwork constans had been already deprecated, with this version all of them have been removed and Struts constants have been used instead. See tickets

Jira
serverASF JIRA
serverId5aa69414-a9e9-3523-82ec-879b028fb15b
keyWW-4792
and
Jira
serverASF JIRA
serverId5aa69414-a9e9-3523-82ec-879b028fb15b
keyWW-5000
with the linked PRs for the exact changes. Below is a list of removed constants and Struts substitutesubstitutes:

Old constantNew constant
collectionConverter struts.converter.collection
dateConverterstruts.converter.date
numberConverterstruts.converter.number
stringConverterstruts.converter.string
arrayConverterstruts.converter.array
devModestruts.devMode
logMissingPropertiesstruts.ognl.logMissingProperties
enableOGNLExpressionCachestruts.ognl.enableExpressionCache
enableOGNLEvalExpressionstruts.ognl.enableEvalExpression
reloadXmlConfigurationstruts.configuration.xml.reload
allowStaticMethodAccessstruts.ognl.allowStaticMethodAccess
xwork.loggerFactory<not used any more>
ognlExcludedClassesstruts.excludedClasses
ognlExcludedPackageNamePatternsstruts.excludedPackageNamePatterns
ognlExcludedPackageNamesstruts.excludedPackageNames
additionalExcludedPatternsstruts.additional.excludedPatterns
additionalAcceptedPatternsstruts.additional.acceptedPatterns
overrideExcludedPatternsstruts.override.excludedPatterns
overrideAcceptedPatternsstruts.override.acceptedPatterns
struts.xwork.chaining.copyErrorsstruts.chaining.copyErrors
struts.xwork.chaining.copyFieldErrorsstruts.chaining.copyFieldErrors
struts.xwork.chaining.copyMessagesstruts.chaining.copyMessages
xwork.autoGrowCollectionLimitstruts.ognl.autoGrowthCollectionLimit
objectFactory.classloaderstruts.objectFactory.classloader

...

Constant nameDescription
struts.i18n.search.defaultbundles.firstAllows search in default bundles first, read more in the docs
struts.ui.escapeHtmlBodyEnables escaping body of a tag, read more in the docs

Tag escape behaviour

After migrating to the latest Freemarker (which enables auto-escaping by default) you should stop using ?html in your custom tags and freemarker based pages. Also when embedding a tag in <s:a>, <s:submit> and <s:component> tags like in the example below:

...

There is a global flag struts.ui.escapeHtmlBody which controls this behaviour for all the tags. Tag's attribute takes precedence over the global flag. It's related to

Jira
serverASF JIRA
serverId5aa69414-a9e9-3523-82ec-879b028fb15b
keyWW-5022
and
Jira
serverASF JIRA
serverId5aa69414-a9e9-3523-82ec-879b028fb15b
keyWW-4972
.

The date tag

The <s:date/>  tag has been adjusted to support a new Java 8 Date/Time API, which means it uses DateTimeFormatter instead of SimpleDateFormat. Yet there is a slight change in patterns supported by both classes, which means your current formatting patterns can stop working after migrating to Struts 6.x and default format will be used instead. You can find more details in

Jira
serverASF JIRA
serverId5aa69414-a9e9-3523-82ec-879b028fb15b
keyWW-5016
.

Deprecated interfaces

A set of action related interfaces have been marked as deprecated. These interfaces have a new proper versions in another package, please start using the new versions as the depretacted interfaces will be removed with the next major release.

DeprecatedNew version
org.apache.struts2.interceptor.ApplicationAwareorg.apache.struts2.action.ApplicationAware
org.apache.struts2.interceptor.CookiesAwareorg.apache.struts2.action.CookiesAware
org.apache.struts2.interceptor.HttpParametersAwareorg.apache.struts2.action.ParametersAware
org.apache.struts2.interceptor.ParameterAwareorg.apache.struts2.action.ParametersAware
org.apache.struts2.interceptor.PrincipalAwareorg.apache.struts2.action.PrincipalAware
org.apache.struts2.interceptor.RequestAwareorg.apache.struts2.action.ServletRequestAware
org.apache.struts2.interceptor.ServletRequestAwareorg.apache.struts2.action.ServletRequestAware
org.apache.struts2.interceptor.ServletResponseAwareorg.apache.struts2.action.ServletResponseAware
org.apache.struts2.interceptor.SessionAwareorg.apache.struts2.action.SessionAware
org.apache.struts2.util.ServletContextAwareorg.apache.struts2.action.ServletContextAware

See

Jira
serverASF JIRA
serverId5aa69414-a9e9-3523-82ec-879b028fb15b
keyWW-4963
for more details.

Javatemplate Checkbox tag

Javatemplate Checkbox tag implementation had been missing support for submitUnchecked attribute. This has been fixed yet it can introduce a NullPointerException when you will use Boolean or String to hold an unchecked value as submittedUnchecked is set to false by default, which means the unchecked  value won't be sent and stored in the action, see

Jira
serverASF JIRA
serverId5aa69414-a9e9-3523-82ec-879b028fb15b
keyWW-5168
for more details.

Static methods access

It won't be possible to access static methods using OGNL expression, eg. @com.app.Util@makeCode() won't work anymore. If you are still using this approach you must wrap access to static methods with action instance methods or use static field access instead.

Temp/Work directory of ApplicationServer/ServletContainer

...