[
https://issues.apache.org/jira/browse/MYFACES-1955?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12681557#action_12681557
]
Leonardo Uribe commented on MYFACES-1955:
-----------------------------------------
The problem is related to a unwanted call to response.getOutputStream() from
some part of myfaces core.
The only call is on org.apache.myfaces.application.jsp.ViewResponseWrapper,
method flushToWrappedResponse().
The idea of this call is solve MYFACES-1815 (Resources under /faces/* returns
empty). This solution is right but a side effect occur on
org.apache.myfaces.taglib.core.ViewTag
The related code is this:
public int doStartTag() throws JspException
{
if (log.isTraceEnabled()) log.trace("entering ViewTag.doStartTag");
FacesContext facesContext = FacesContext.getCurrentInstance();
Object response = facesContext.getExternalContext().getResponse();
if (response instanceof ViewResponseWrapper)
{
try
{
pageContext.getOut().flush();
((ViewResponseWrapper) response).flushToWrappedResponse();
}
catch (IOException e)
{
throw new JspException("Can't write content above <f:view> tag"
+ " " + e.getMessage());
}
}
The comment that says why this code exist is this:
revision 494409: JspViewHandlerImpl now working an rendering output to the
page. Created wrapper for the response, so the rendered code can be mixed with
other code. Flushing when the view tag is started
The default execution uses getOuputStream because there is no previous call to
getWriter, which initialize a PrintWriter.
The solution is do this:
public int doStartTag() throws JspException
{
if (log.isTraceEnabled()) log.trace("entering ViewTag.doStartTag");
FacesContext facesContext = FacesContext.getCurrentInstance();
Object response = facesContext.getExternalContext().getResponse();
if (response instanceof ViewResponseWrapper)
{
try
{
pageContext.getOut().flush();
ViewResponseWrapper wrapper = (ViewResponseWrapper) response;
//Ensure usage CharArrayWriter calling response.getWriter(),
//so flushToWrappedResponse does not call
response.getOuputStream()
wrapper.getWriter();
wrapper.flushToWrappedResponse();
}
catch (IOException e)
{
throw new JspException("Can't write content above <f:view> tag"
+ " " + e.getMessage());
}
}
It could be good if anyone can probe this solution on WebLogic, so we can
commit this solution.
> 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
> 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.