From 24c0e5f640e5a6c437e0776652a3f107de61e6d3 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Fri, 15 Nov 2024 08:45:35 +0100 Subject: [PATCH] WW-5463 Exposes final location as request attribute FORWARD_SERVLET_PATH --- .../org/apache/struts2/result/ServletDispatcherResult.java | 7 +++++++ .../apache/struts2/result/ServletDispatcherResultTest.java | 4 ++++ 2 files changed, 11 insertions(+) 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 d50ebadf57..feced67bb7 100644 --- a/core/src/main/java/org/apache/struts2/result/ServletDispatcherResult.java +++ b/core/src/main/java/org/apache/struts2/result/ServletDispatcherResult.java @@ -158,6 +158,13 @@ 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); + // this should allow integration with third-party view related frameworks + if (finalLocation.contains("?")) { + request.setAttribute(RequestDispatcher.FORWARD_SERVLET_PATH, finalLocation.substring(0, finalLocation.indexOf('?'))); + } else { + request.setAttribute(RequestDispatcher.FORWARD_SERVLET_PATH, finalLocation); + } + // If we're included, then include the view // Otherwise do forward // This allow the page to, for example, set content type 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 2947e71e53..c64c9d76ad 100644 --- a/core/src/test/java/org/apache/struts2/result/ServletDispatcherResultTest.java +++ b/core/src/test/java/org/apache/struts2/result/ServletDispatcherResultTest.java @@ -18,6 +18,7 @@ */ package org.apache.struts2.result; +import jakarta.servlet.RequestDispatcher; import org.apache.struts2.ActionContext; import org.apache.struts2.StrutsInternalTestCase; import org.apache.struts2.StrutsStatics; @@ -47,6 +48,7 @@ public void testForward() throws Exception { view.execute(invocation); assertEquals("foo.jsp", response.getForwardedUrl()); + assertEquals("foo.jsp", request.getAttribute(RequestDispatcher.FORWARD_SERVLET_PATH)); } public void testInclude() throws Exception { @@ -60,6 +62,7 @@ public void testInclude() throws Exception { view.execute(invocation); assertEquals("foo.jsp", response.getIncludedUrl()); + assertEquals("foo.jsp", request.getAttribute(RequestDispatcher.FORWARD_SERVLET_PATH)); } public void testWithParameter() throws Exception { @@ -73,6 +76,7 @@ public void testWithParameter() throws Exception { // See https://issues.apache.org/jira/browse/WW-5486 assertEquals("1", stack.findString("#parameters.bar")); + assertEquals("foo.jsp", request.getAttribute(RequestDispatcher.FORWARD_SERVLET_PATH)); } @Override