diff --git a/core/src/main/java/org/apache/struts2/RequestUtils.java b/core/src/main/java/org/apache/struts2/RequestUtils.java index 46b1dac8f6..5840ff06b6 100644 --- a/core/src/main/java/org/apache/struts2/RequestUtils.java +++ b/core/src/main/java/org/apache/struts2/RequestUtils.java @@ -18,6 +18,7 @@ */ package org.apache.struts2; +import jakarta.servlet.RequestDispatcher; import jakarta.servlet.http.HttpServletRequest; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.FastDateFormat; @@ -89,7 +90,7 @@ public static String getServletPath(HttpServletRequest request) { */ public static String getUri(HttpServletRequest request) { // handle http dispatcher includes. - String uri = (String) request.getAttribute("jakarta.servlet.include.servlet_path"); + String uri = (String) request.getAttribute(RequestDispatcher.INCLUDE_SERVLET_PATH); if (uri != null) { return uri; } diff --git a/core/src/main/java/org/apache/struts2/components/Include.java b/core/src/main/java/org/apache/struts2/components/Include.java index 02867d890a..c78a11106b 100644 --- a/core/src/main/java/org/apache/struts2/components/Include.java +++ b/core/src/main/java/org/apache/struts2/components/Include.java @@ -42,6 +42,7 @@ import java.io.PrintWriter; import java.io.Writer; import java.net.URLEncoder; +import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; @@ -100,7 +101,7 @@ public class Include extends Component { private static final Logger LOG = LogManager.getLogger(Include.class); - private static final String systemEncoding = System.getProperty("file.encoding"); + private static final String SYSTEM_ENCODING = Charset.defaultCharset().displayName(); protected String value; private final HttpServletRequest req; @@ -149,8 +150,7 @@ public boolean end(Writer writer, String body) { String concat = ""; // Set parameters - for (Object next : parameters.entrySet()) { - Map.Entry entry = (Map.Entry) next; + for (Map.Entry entry : parameters.entrySet()) { Object name = entry.getKey(); List values = (List) entry.getValue(); @@ -191,7 +191,7 @@ public static String getContextRelativePath(ServletRequest request, String relat } else if (!(request instanceof HttpServletRequest hrequest)) { returnValue = relativePath; } else { - String uri = (String) request.getAttribute("jakarta.servlet.include.servlet_path"); + String uri = (String) request.getAttribute(RequestDispatcher.INCLUDE_SERVLET_PATH); if (uri == null) { uri = RequestUtils.getServletPath(hrequest); @@ -203,7 +203,7 @@ public static String getContextRelativePath(ServletRequest request, String relat // .. is illegal in an absolute path according to the Servlet Spec and will cause // known problems on Orion application servers. if (returnValue.contains("..")) { - Stack stack = new Stack(); + Stack stack = new Stack<>(); StringTokenizer pathParts = new StringTokenizer(returnValue.replace('\\', '/'), "/"); while (pathParts.hasMoreTokens()) { @@ -279,7 +279,7 @@ public static void include( String relativePath, Writer writer, ServletRequest r pageResponse.getContent().writeTo(writer, encoding); } else { // Use the platform specific encoding - pageResponse.getContent().writeTo(writer, systemEncoding); + pageResponse.getContent().writeTo(writer, SYSTEM_ENCODING); } } diff --git a/core/src/main/java/org/apache/struts2/components/ServletUrlRenderer.java b/core/src/main/java/org/apache/struts2/components/ServletUrlRenderer.java index fcca605385..ab87b77ad7 100644 --- a/core/src/main/java/org/apache/struts2/components/ServletUrlRenderer.java +++ b/core/src/main/java/org/apache/struts2/components/ServletUrlRenderer.java @@ -23,6 +23,7 @@ import com.opensymphony.xwork2.config.entities.ActionConfig; import com.opensymphony.xwork2.inject.Inject; import com.opensymphony.xwork2.util.ValueStack; +import jakarta.servlet.RequestDispatcher; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -302,7 +303,7 @@ private String extractQueryString(UrlProvider urlComponent) { // Parse the query string to make sure that the parameters come from the query, and not some posted data String query = urlComponent.getHttpServletRequest().getQueryString(); if (query == null) { - query = (String) urlComponent.getHttpServletRequest().getAttribute("jakarta.servlet.forward.query_string"); + query = (String) urlComponent.getHttpServletRequest().getAttribute(RequestDispatcher.FORWARD_QUERY_STRING); } if (query != null) { diff --git a/core/src/main/java/org/apache/struts2/dispatcher/DefaultDispatcherErrorHandler.java b/core/src/main/java/org/apache/struts2/dispatcher/DefaultDispatcherErrorHandler.java index 423d188f8b..00cc4ff100 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/DefaultDispatcherErrorHandler.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/DefaultDispatcherErrorHandler.java @@ -22,6 +22,7 @@ import com.opensymphony.xwork2.util.location.Location; import com.opensymphony.xwork2.util.location.LocationUtils; import freemarker.template.Template; +import jakarta.servlet.RequestDispatcher; import jakarta.servlet.ServletContext; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @@ -87,7 +88,7 @@ protected void sendErrorResponse(HttpServletRequest request, HttpServletResponse LOG.error("Exception occurred during processing request: {}", e.getMessage(), e); // send a http error response to use the servlet defined error handler // make the exception available to the web.xml defined error page - request.setAttribute("jakarta.servlet.error.exception", e); + request.setAttribute(RequestDispatcher.ERROR_EXCEPTION, e); // for compatibility request.setAttribute("jakarta.servlet.jsp.jspException", e); diff --git a/core/src/main/java/org/apache/struts2/result/ServletDispatcherResult.java b/core/src/main/java/org/apache/struts2/result/ServletDispatcherResult.java index a283aba5cf..df0896cf41 100644 --- a/core/src/main/java/org/apache/struts2/result/ServletDispatcherResult.java +++ b/core/src/main/java/org/apache/struts2/result/ServletDispatcherResult.java @@ -55,7 +55,7 @@ * {@link PageContext#include(String) include} method is called. * *
  • If there is no PageContext and we're not in any sort of include (there is no - * "jakarta.servlet.include.servlet_path" in the request attributes), then a call to + * {@link RequestDispatcher#INCLUDE_SERVLET_PATH} in the request attributes), then a call to * {@link RequestDispatcher#forward(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse) forward} * is made.
  • * @@ -125,7 +125,7 @@ public void setQueryStringParser(QueryStringParser queryStringParser) { * HTTP request. */ public void doExecute(String finalLocation, ActionInvocation invocation) throws Exception { - LOG.debug("Forwarding to location: {}", finalLocation); + LOG.debug("Processing location: {}", finalLocation); PageContext pageContext = ServletActionContext.getPageContext(); @@ -145,8 +145,6 @@ public void doExecute(String finalLocation, ActionInvocation invocation) throws if (!queryParams.isEmpty()) { parameters = HttpParameters.create(queryParams.getQueryParams()).withParent(parameters).build(); invocation.getInvocationContext().withParameters(parameters); - // put to extraContext, see Dispatcher#createContextMap - invocation.getInvocationContext().getContextMap().put("parameters", parameters); } } @@ -158,17 +156,19 @@ public void doExecute(String finalLocation, ActionInvocation invocation) throws } //if we are inside an action tag, we always need to do an include - Boolean insideActionTag = (Boolean) ObjectUtils.defaultIfNull(request.getAttribute(StrutsStatics.STRUTS_ACTION_TAG_INVOCATION), Boolean.FALSE); + boolean insideActionTag = (Boolean) ObjectUtils.defaultIfNull(request.getAttribute(StrutsStatics.STRUTS_ACTION_TAG_INVOCATION), Boolean.FALSE); // If we're included, then include the view // Otherwise do forward // This allow the page to, for example, set content type - if (!insideActionTag && !response.isCommitted() && (request.getAttribute("jakarta.servlet.include.servlet_path") == null)) { + if (!insideActionTag && !response.isCommitted() && (request.getAttribute(RequestDispatcher.INCLUDE_SERVLET_PATH) == null)) { + LOG.debug("Forwarding to location: {}", finalLocation); request.setAttribute("struts.view_uri", finalLocation); request.setAttribute("struts.request_uri", request.getRequestURI()); dispatcher.forward(request, response); } else { + LOG.debug("Including location: {}", finalLocation); dispatcher.include(request, response); } } diff --git a/core/src/main/java/org/apache/struts2/views/freemarker/FreemarkerManager.java b/core/src/main/java/org/apache/struts2/views/freemarker/FreemarkerManager.java index 0cb14b1173..6f0594769b 100644 --- a/core/src/main/java/org/apache/struts2/views/freemarker/FreemarkerManager.java +++ b/core/src/main/java/org/apache/struts2/views/freemarker/FreemarkerManager.java @@ -43,6 +43,7 @@ import freemarker.template.Version; import freemarker.template.utility.StringUtil; import jakarta.servlet.GenericServlet; +import jakarta.servlet.RequestDispatcher; import jakarta.servlet.ServletContext; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @@ -550,7 +551,7 @@ protected void populateContext(ScopesHashModel model, ValueStack stack, Object a model.putAll(standard); // support for JSP exception pages, exposing the servlet or JSP exception - Throwable exception = (Throwable) request.getAttribute("jakarta.servlet.error.exception"); + Throwable exception = (Throwable) request.getAttribute(RequestDispatcher.ERROR_EXCEPTION); if (exception == null) { exception = (Throwable) request.getAttribute("jakarta.servlet.error.JspException"); diff --git a/core/src/main/java/org/apache/struts2/views/util/DefaultUrlHelper.java b/core/src/main/java/org/apache/struts2/views/util/DefaultUrlHelper.java index 888e946e3a..37f013b11f 100644 --- a/core/src/main/java/org/apache/struts2/views/util/DefaultUrlHelper.java +++ b/core/src/main/java/org/apache/struts2/views/util/DefaultUrlHelper.java @@ -19,6 +19,7 @@ package org.apache.struts2.views.util; import com.opensymphony.xwork2.inject.Inject; +import jakarta.servlet.RequestDispatcher; import org.apache.commons.lang3.StringUtils; import org.apache.commons.text.StringEscapeUtils; import org.apache.logging.log4j.LogManager; @@ -126,7 +127,7 @@ public String buildUrl(String action, HttpServletRequest request, HttpServletRes // (Applicable to Servlet 2.4 containers) // If the request was forwarded, the attribute below will be set with the original URL - String uri = (String) request.getAttribute("jakarta.servlet.forward.request_uri"); + String uri = (String) request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI); // If the attribute wasn't found, default to the value in the request object if (uri == null) { @@ -145,7 +146,7 @@ public String buildUrl(String action, HttpServletRequest request, HttpServletRes // (Applicable to Servlet 2.4 containers) // If the request was forwarded, the attribute below will be set with the original URL if (requestURI == null) { - requestURI = (String) request.getAttribute("jakarta.servlet.forward.request_uri"); + requestURI = (String) request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI); } // If neither request attributes were found, default to the value in the request object diff --git a/core/src/test/java/org/apache/struts2/result/ServletDispatcherResultTest.java b/core/src/test/java/org/apache/struts2/result/ServletDispatcherResultTest.java index 2253c86caa..90da7b6c9d 100644 --- a/core/src/test/java/org/apache/struts2/result/ServletDispatcherResultTest.java +++ b/core/src/test/java/org/apache/struts2/result/ServletDispatcherResultTest.java @@ -26,7 +26,6 @@ import org.apache.struts2.ServletActionContext; import org.apache.struts2.StrutsInternalTestCase; import org.apache.struts2.StrutsStatics; -import org.apache.struts2.dispatcher.HttpParameters; import jakarta.servlet.RequestDispatcher; import jakarta.servlet.http.HttpServletRequest; @@ -130,7 +129,6 @@ public void testWithParameter() { assertTrue(mockActionInvocation.getInvocationContext().getParameters().contains("bar")); assertEquals("1", mockActionInvocation.getInvocationContext().getParameters().get("bar").getValue()); - assertEquals("1", ((HttpParameters) mockActionInvocation.getInvocationContext().getContextMap().get("parameters")).get("bar").getValue()); dispatcherMock.verify(); requestMock.verify(); dispatcherMock.verify(); diff --git a/plugins/tiles/src/main/java/org/apache/tiles/web/util/TilesDispatchServlet.java b/plugins/tiles/src/main/java/org/apache/tiles/web/util/TilesDispatchServlet.java index 1542b41020..decdd607bf 100644 --- a/plugins/tiles/src/main/java/org/apache/tiles/web/util/TilesDispatchServlet.java +++ b/plugins/tiles/src/main/java/org/apache/tiles/web/util/TilesDispatchServlet.java @@ -18,6 +18,7 @@ */ package org.apache.tiles.web.util; +import jakarta.servlet.RequestDispatcher; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.tiles.api.AttributeContext; @@ -113,7 +114,7 @@ protected void doGet(HttpServletRequest req, HttpServletResponse res) { * @return The definition name to render. */ protected String getDefinitionName(HttpServletRequest request) { - String path = (String) request.getAttribute("jakarta.servlet.include.servlet_path"); + String path = (String) request.getAttribute(RequestDispatcher.INCLUDE_SERVLET_PATH); if (path == null) { path = request.getServletPath(); }