[
https://issues.apache.org/jira/browse/MYFACES-1955?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12782766#action_12782766
]
Jeffey Liu commented on MYFACES-1955:
-------------------------------------
Weblogic's Jsp Runtime uses response's outputstream to write template data and
some container internal data to client due to some performance issues. I have
reviewed the implementation for JspWriterImpl and its related class e.g:
DelegateChunkWriter, and they do not violates the servlet spec. The servlet
spec only forbid the user to mix both outputstream and writer. The jsp spec
doesn't force the container to use response.getWriter, and it's the freedom of
the container to choose either writer or outputstream to write information to
client.
The reason why this happened is that org.apache.myfaces.taglib.core.ViewTag's
doStartTag(), it invokes flushContentToWrappedResponse(). It means if container
invokes getOutputStream() on the instance of ViewHandlerResponseWrapper, then
the wrapping response's getOutputStream() will be invoked. When flusing, the
ViewHandlerResponseWrapper will flush the writer or outputstream to the real
one, then it calls ServletResponse.getOutputStream. During the rendering
phrase, the org.apache.myfaces.application.jsp.JspViewHandlerImpl always
expects writer from response. This assumption will lead specification violation
since getOutputStream() and getWriter() could not be mixed on
HttpServletResponse.
This is similar with the bug we filed for sun's ri. you can refer it here :
https://javaserverfaces.dev.java.net/issues/show_bug.cgi?id=414
For the fix, I suggest the ViewHandlerResponseWrapper uses only either the
writer or outputstream of the servlet response, and not to use them together.
I have reviewed the fix, and it is fine for weblogic. Thanks
> MyFaces 1.2.4 and WebLogic 10.3- strict servlet API: cannot call getWriter()
> after getOutputStream()
> ----------------------------------------------------------------------------------------------------
>
> Key: MYFACES-1955
> URL: https://issues.apache.org/jira/browse/MYFACES-1955
> Project: MyFaces Core
> Issue Type: Bug
> Affects Versions: 1.2.2, 1.2.3, 1.2.4
> Environment: Windows Vista, WebLogic 10.3, MyFaces 1.2.4
> Reporter: Paulo Moreira
> Assignee: Leonardo Uribe
> Fix For: 1.2.8
>
> Attachments: MYFACES-1955.patch
>
>
> I am trying to run a very simple JSF application using myFaces 1.2.4 and
> WebLogic 10.3. The application has the following content:
> web.xml:
> <?xml version="1.0" encoding="ISO-8859-1"?>
> <web-app xmlns="http://java.sun.com/xml/ns/javaee"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
> http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
> version="2.5">
> <servlet>
> <servlet-name>Faces Servlet</servlet-name>
> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
> <load-on-startup>1</load-on-startup>
> </servlet>
> <servlet-mapping>
> <servlet-name>Faces Servlet</servlet-name>
> <url-pattern>*.faces</url-pattern>
> </servlet-mapping>
> <welcome-file-list>
> <welcome-file>index.html</welcome-file>
> </welcome-file-list>
> </web-app>
> faces-config.xml:
> <?xml version="1.0"?>
> <faces-config xmlns="http://java.sun.com/xml/ns/javaee"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
> http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"
> version="1.2">
> <navigation-rule>
> <from-view-id>/index.jsp</from-view-id>
> <navigation-case>
> <from-outcome>login</from-outcome>
> <to-view-id>/welcome.jsp</to-view-id>
> </navigation-case>
> </navigation-rule>
> <managed-bean>
> <managed-bean-name>user</managed-bean-name>
> <managed-bean-class>pt.pm.richfaces.UserBean</managed-bean-class>
> <managed-bean-scope>session</managed-bean-scope>
> </managed-bean>
> </faces-config>
> index.html:
> <html>
> <head>
> <meta http-equiv="Refresh" content= "0; URL=index.faces"/>
> <title>Start Web Application</title>
> </head>
> <body>
> <p>Please wait for the web application to start...</p>
> </body>
> </html>
> index.jsp:
> <html>
> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
> <f:view>
> <head>
> <title>A Simple JavaServer Faces Application</title>
> </head>
> <body>
> <h:form>
> <h3>Please enter your name and password.</h3>
> <table>
> <tr>
> <td>Name:</td>
> <td><h:inputText value="#{user.name}" /></td>
> </tr>
> <tr>
> <td>Password:</td>
> <td><h:inputSecret value="#{user.password}"
> /></td>
> </tr>
> </table>
> <p><h:commandButton value="Login" action="login" /></p>
> </h:form>
> </body>
> </f:view>
> </html>
> My WEB_INF/lib contains the following jars: commons-beanutils-1.7.0,
> commons-codec-1.3, commons-collections-3.2, commons-digester-1.8,
> commons-discovery-0.4, commons-logging-1.1.1, glassfish.el_2.1.0,
> glassfish.jstl_1.2.0.1, myfaces-api-1.2.4, myfaces-impl-1.2.4.
> Whenever I try to run my application I get the following exception:
> java.lang.IllegalStateException: strict servlet API: cannot call getWriter()
> aft
> er getOutputStream()
> at
> weblogic.servlet.internal.ServletResponseImpl.getWriter(ServletRespon
> seImpl.java:308)
> at
> org.apache.myfaces.application.jsp.JspViewHandlerImpl.renderView(JspV
> iewHandlerImpl.java:362)
> at
> org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderRes
> ponseExecutor.java:41)
> at
> org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:
> 140)
> at javax.faces.webapp.FacesServlet.service(FacesServlet.java:155)
> If instead of using myFaces I use the Sun Reference implementation everything
> goes well. If I deploy the application (using myFaces) in JBoss 5 it works
> well. So the problem seems to be related with the use of WLS 10.3 and myFaces
> 1.2.4.
> I tried with 1.2.3 and 1.2.2 and got the issue with both. I tried with 1.2.0
> and got another error:
> javax.faces.FacesException: weblogic.servlet.jsp.CompilationException: Failed
> to compile JSP /index.jsp
> index.jsp:14:22: Static attribute must be a String literal, its illegal to
> specify an expression.
> <td><h:inputText value="#{user.name}" /></td>
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.