1

在 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)

任何意见,将不胜感激。

问候

4

2 回答 2

3

问题是,如果 StreamingResolution 是用 Reader 打开的,那么它(自然地)会打开一个 Writer 以将输出流式传输出去。c:import 标签并不关心,只需在响应中调用 getOutputStream 即可。

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

另一种选择是覆盖 StreamingResolution.stream() 方法。

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

幸运的是,您可以控制 Stripes 的操作。没有那么多 c:imports 动作。

于 2011-04-12T22:37:48.353 回答
1

问题不在于 JSTL,而在于目标 servlet。异常消息很清楚-您不应该调用getOutputStream()getWriter()获得相同的响应。

于 2011-04-12T21:57:07.983 回答