Hi all,
I've done quite a bit of RTFM and mail archive searching on this, but no dice...
We have quite a large web application built upon Struts, and are adding a portal area
using Jetspeed. We've successfully integrated Jetspeed into our app., but for some
reason using the ServletInvokerPortlet always leads to an exception in Tomcat's
RequestDispatcher. I am trying to include the output from a URL mapped to our Struts
ActionServlet (the controller servlet for Struts).
This URL definitely works properly, and I've even managed to prove that it can be
included as a portlet by going outside of the Jetspeed framework somewhat and using my
"ServletProxyPortlet", which simply opens a 'java.net.URL' connection to the URL
specified, retrieves the content, and stuffs it into a StringElement to return. This
works, but I'm obviously not wildly enthusiastic about it, as it doesn't have any of
the HTML "massaging" that EcsServletElement provides. The code for this portlet is at
the bottom, if you're interested.
2002-10-21 11:31:32 - path="/Motiva8" : -- ERROR -- EcsServletElement: Could not
include the following URL: /dashboard/compAdmin/homeTab.do : Servlet Exception -
javax.servlet.ServletException: Servlet Exception
at org.apache.tomcat.core.Handler.service(Handler.java:308)
at org.apache.tomcat.core.ServletWrapper.service(ServletWrapper.java:372)
at
org.apache.tomcat.facade.RequestDispatcherImpl.doInclude(RequestDispatcherImpl.java:400)
at
org.apache.tomcat.facade.RequestDispatcherImpl.include(RequestDispatcherImpl.java:270)
at
org.apache.jetspeed.util.servlet.EcsServletElement.output(EcsServletElement.java:127)
at
org.apache.jetspeed.util.servlet.EcsServletElement.output(EcsServletElement.java:110)
at org.apache.ecs.GenericElement.toString(GenericElement.java:723)
at
org.apache.velocity.runtime.parser.node.ASTReference.render(ASTReference.java:321)
at org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.java:94)
at
org.apache.velocity.runtime.parser.node.ASTIfStatement.render(ASTIfStatement.java:109)
at org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.java:94)
at
org.apache.velocity.runtime.parser.node.ASTIfStatement.render(ASTIfStatement.java:109)
at
org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:271)
at org.apache.velocity.Template.merge(Template.java:296)
......<snipped>......
Root cause:
java.lang.IllegalStateException: Response has already been committed
at
org.apache.tomcat.facade.HttpServletResponseFacade.sendError(HttpServletResponseFacade.java:202)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1556)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:491)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.tomcat.core.ServletWrapper.doService(ServletWrapper.java:405)
at org.apache.tomcat.core.Handler.service(Handler.java:287)
at org.apache.tomcat.core.ServletWrapper.service(ServletWrapper.java:372)
at
org.apache.tomcat.facade.RequestDispatcherImpl.doInclude(RequestDispatcherImpl.java:400)
at
org.apache.tomcat.facade.RequestDispatcherImpl.include(RequestDispatcherImpl.java:270)
at
org.apache.jetspeed.util.servlet.EcsServletElement.output(EcsServletElement.java:127)
at
org.apache.jetspeed.util.servlet.EcsServletElement.output(EcsServletElement.java:110)
at org.apache.ecs.GenericElement.toString(GenericElement.java:723)
at
org.apache.velocity.runtime.parser.node.ASTReference.render(ASTReference.java:321)
at org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.java:94)
at
org.apache.velocity.runtime.parser.node.ASTIfStatement.render(ASTIfStatement.java:109)
at org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.java:94)
at
org.apache.velocity.runtime.parser.node.ASTIfStatement.render(ASTIfStatement.java:109)
at
org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:271)
at org.apache.velocity.Template.merge(Template.java:296)
at org.apache.velocity.app.Velocity.mergeTemplate(Velocity.java:492)
at org.apache.velocity.app.Velocity.mergeTemplate(Velocity.java:461)
at
org.apache.turbine.services.velocity.TurbineVelocityService.decodeRequest(TurbineVelocityService.java:485)
at
org.apache.turbine.services.velocity.TurbineVelocityService.handleRequest(TurbineVelocityService.java:327)
at
org.apache.turbine.services.velocity.TurbineVelocity.handleRequest(TurbineVelocity.java:146)
at
org.apache.jetspeed.portal.controls.VelocityPortletControl.getContent(VelocityPortletControl.java:175)
at java.lang.reflect.Method.invoke(Native Method)
/** This Portlet class uses an application context-relative URL as an input
parameter. It uses data obtained from
* <code>org.apache.turbine.util.RunData</code> to construct an absolute URL and
append the session id to it. Using this
* URL, it constructs a java.net.URL object, retrieves the content from it, and
converts the content to a String. Finally,
* it returns an ECS StringElement created with this String for Jetspeed to render
as a portlet. Content is returned as-is;
* no filtering is performed on the html before returning it.
*
*
* @author Joe Barefoot
*/
public class ServletProxyPortlet extends AbstractPortlet
{
private static final String CAT = ServletProxyPortlet.class.getName();
private final static int BUFFER_SIZE = 2048;
/** The name of the parameter to hold our application context-relative URL */
public static final String URL_PARAMETER_NAME = "URL";
public ConcreteElement getContent(RunData rundata)
{
String servletURL = processURL(rundata);
LogService.debug(CAT, "ServletURL after processing is: " + servletURL);
String content;
// This is not robust for large content returns, but should work okay within
an application context with small amounts of content. We'll see.
try
{
URL url = new URL(servletURL);
URLConnection connection = url.openConnection();
InputStream stream = connection.getInputStream();
BufferedInputStream in = new BufferedInputStream(stream);
int length = 0;
byte[] buf = new byte[BUFFER_SIZE];
ByteArrayOutputStream out = new ByteArrayOutputStream();
while( (in != null) && ((length = in.read(buf)) != -1) )
{
// the data has already been read into buf
out.write(buf, 0, length);
}
content = out.toString();
return new StringElement(content);
}
catch( Exception e )
{
LogService.error(CAT, "Error retrieving servlet URL contents", e);
String message = "ServletInvokerPortlet: Error invoking " + servletURL +
": " + e.getMessage();
return new StringElement(message);
}
}
protected String processURL(RunData rundata)
{
String servletURL = getPortletConfig().getInitParameter(URL_PARAMETER_NAME);
servletURL = "http://" + rundata.getServerName() + ":" +
rundata.getServerPort() + rundata.getContextPath() + servletURL + ";" + "jsessionid="
+ rundata.getSession().getId();
return servletURL;
}
}
--
To unsubscribe, e-mail: <mailto:jetspeed-user-unsubscribe@;jakarta.apache.org>
For additional commands, e-mail: <mailto:jetspeed-user-help@;jakarta.apache.org>