You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by ge...@apache.org on 2006/05/20 21:53:12 UTC
svn commit: r408085 -
/struts/action/trunk/tiles/src/main/java/org/apache/struts/tiles/commands/TilesPreProcessor.java
Author: germuska
Date: Sat May 20 12:53:11 2006
New Revision: 408085
URL: http://svn.apache.org/viewvc?rev=408085&view=rev
Log:
STR-2879: fix behavior when used with modules to be consistent with Struts 1.2.x. Specifically, dispatch forwards for tiles within the TilesPreProcessor, rather than creating a ForwardConfig and leaving that responsibility to a later chain command (e.g. PerformForward). Also, change chain behavior slightly; for both includes and forwards, TilesPreProcessor returns false (i.e. 'continue processing chain'), but sets the ForwardConfig to null if TilesPreProcessor has called requestDispatcher.(forward|include). This would potentially allow someone to have housekeeping commands in the chain which would be able to execute, while preventing PerformForward from believing that it needs to do anything.
Modified:
struts/action/trunk/tiles/src/main/java/org/apache/struts/tiles/commands/TilesPreProcessor.java
Modified: struts/action/trunk/tiles/src/main/java/org/apache/struts/tiles/commands/TilesPreProcessor.java
URL: http://svn.apache.org/viewvc/struts/action/trunk/tiles/src/main/java/org/apache/struts/tiles/commands/TilesPreProcessor.java?rev=408085&r1=408084&r2=408085&view=diff
==============================================================================
--- struts/action/trunk/tiles/src/main/java/org/apache/struts/tiles/commands/TilesPreProcessor.java (original)
+++ struts/action/trunk/tiles/src/main/java/org/apache/struts/tiles/commands/TilesPreProcessor.java Sat May 20 12:53:11 2006
@@ -209,15 +209,14 @@
if (doInclude) {
log.info("Tiles process complete; doInclude with " + uri);
doInclude(sacontext, uri);
- return (true);
} else {
- // create an "instant" forward config which can be used
- // by an AbstractPerformForward later as if our ForwardConfig
- // were the one actually returned by an executing Action
log.info("Tiles process complete; forward to " + uri);
- sacontext.setForwardConfig( new ForwardConfig("tiles-chain", uri, false) );
- return (false);
+ doForward(sacontext, uri);
}
+
+ log.debug("Tiles processed, so clearing forward config from context.");
+ sacontext.setForwardConfig( null );
+ return (false);
}
@@ -234,18 +233,50 @@
String uri)
throws IOException, ServletException {
- HttpServletRequest request = context.getRequest();
+ RequestDispatcher rd = getRequiredDispatcher(context, uri);
+
+ if (rd != null) {
+ rd.include(context.getRequest(), context.getResponse());
+ }
+ }
+
+ /**
+ * <p>Do an include of specified URI using a <code>RequestDispatcher</code>.</p>
+ *
+ * @param context a chain servlet/web context
+ * @param uri Context-relative URI to include
+ */
+ protected void doForward(
+ ServletActionContext context,
+ String uri)
+ throws IOException, ServletException {
+
+ RequestDispatcher rd = getRequiredDispatcher(context, uri);
- HttpServletResponse response = context.getResponse();
+ if (rd != null) {
+ rd.forward(context.getRequest(), context.getResponse());
+ }
+ }
+
+ /**
+ * <p>Get the <code>RequestDispatcher</code> for the specified <code>uri</code>. If it is not found,
+ * send a 500 error as a response and return null;
+ *
+ * @param context the current <code>ServletActionContext</code>
+ * @param uri the ServletContext-relative URI of the request dispatcher to find.
+ * @return the <code>RequestDispatcher</code>, or null if none is returned from the <code>ServletContext</code>.
+ * @throws IOException if <code>getRequestDispatcher(uri)</code> has an error.
+ */
+ private RequestDispatcher getRequiredDispatcher(ServletActionContext context, String uri) throws IOException {
RequestDispatcher rd = context.getContext().getRequestDispatcher(uri);
if (rd == null) {
+ log.debug("No request dispatcher found for " + uri);
+ HttpServletResponse response = context.getResponse();
response.sendError(
HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
"Error getting RequestDispatcher for " + uri);
- return;
}
- rd.include(request, response);
+ return rd;
}
-
}