JSTL导入标记抛出带有相对URL的java.lang.IllegalStateException

时间:2011-04-12 21:52:29

标签: java jsp jboss jstl stripes

在Java Web应用程序中,我在Jboss 4.2.3上使用Stripes框架。在我使用

的JSP中
<c:import url="http://localhost:8080/contextPath/txts/someID" charEncoding="UTF-8"/>

效果很好,内容包含在输出HTML中。但是,这不起作用

<c:import url="/txts/someID" charEncoding="UTF-8"/>

并抛出此错误(整个堆栈太大而无法粘贴到此处,因此我包含前几行):

java.lang.IllegalStateException: Unexpected internal error during &lt;import&gt: Target servlet called getOutputStream(), then getWriter()
at org.apache.taglibs.standard.tag.common.core.ImportSupport$ImportResponseWrapper.getOutputStream(ImportSupport.java:492)
at net.sourceforge.stripes.action.StreamingResolution.stream(StreamingResolution.java:443)
at net.sourceforge.stripes.action.StreamingResolution.execute(StreamingResolution.java:240)
at net.sourceforge.stripes.controller.DispatcherHelper$7.intercept(DispatcherHelper.java:508)
at net.sourceforge.stripes.controller.ExecutionContext.proceed(ExecutionContext.java:158)
at org.stripesstuff.plugin.security.SecurityInterceptor.interceptResolutionExecution(SecurityInterceptor.java:225)
at org.stripesstuff.plugin.security.SecurityInterceptor.intercept(SecurityInterceptor.java:129)
at net.sourceforge.stripes.controller.ExecutionContext.proceed(ExecutionContext.java:155)
at net.sourceforge.stripes.controller.HttpCacheInterceptor.intercept(HttpCacheInterceptor.java:99)
at net.sourceforge.stripes.controller.ExecutionContext.proceed(ExecutionContext.java:155)
at net.sourceforge.stripes.controller.BeforeAfterMethodInterceptor.intercept(BeforeAfterMethodInterceptor.java:113)
at net.sourceforge.stripes.controller.ExecutionContext.proceed(ExecutionContext.java:155)
at net.sourceforge.stripes.controller.ExecutionContext.wrap(ExecutionContext.java:74)
at net.sourceforge.stripes.controller.DispatcherHelper.executeResolution(DispatcherHelper.java:502)
at net.sourceforge.stripes.controller.DispatcherServlet.executeResolution(DispatcherServlet.java:286)
at net.sourceforge.stripes.controller.DispatcherServlet.service(DispatcherServlet.java:170)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

任何建议都将受到赞赏。

此致

2 个答案:

答案 0 :(得分:3)

问题是如果使用Reader打开StreamingResolution,那么它(自然地)会打开一个Writer来输出输出。 c:import标签不关心,只需在响应上调用getOutputStream。

因此,为了缓解这种情况,您不应该为StreamingResolution使用Reader,而是需要使用InputStream创建StreamingResolution。

另一个选项是覆盖StreamingResolution.stream()方法。

Stripes基本上是“为你做正确的事”,但c:import正在你的游行中下雨。

谢天谢地,您可以控制Stripes操作。而不是c:进口行动。

答案 1 :(得分:1)

问题不在JSTL中,而是在目标servlet中。异常消息很明确 - 您不应该针对同一响应调用getOutputStream()getWriter()