myfaces-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Jeffey Liu (JIRA)" <...@myfaces.apache.org>
Subject [jira] Commented: (MYFACES-1955) MyFaces 1.2.4 and WebLogic 10.3- strict servlet API: cannot call getWriter() after getOutputStream()
Date Thu, 26 Nov 2009 06:26:39 GMT

    [ 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.


Mime
View raw message