Display db images using ContentFlow (coverflow) IllegalStateException error

徘徊边缘 提交于 2019-12-20 03:55:06

问题


I'm currently using a third party image coverflow (http://www.jacksasylum.eu/ContentFlow/) to display images which are being saved within a database. I'm using Java, JPA, and Richfaces for this. I have set up an image servlet to handle the image display. I have a Richfaces datatable set up and I only want to display images of selected records within the coverflow. This functionality is in place to do this. I have a command button to render the image coverflow within an OutputPanel. My images display correctly down the page without errors before implementing the coverflow. So, I know my underlying functionality works as desired. The issue is that when I implement the coverflow by placing specific div tags around my img tags as instructed I get the following error:

Error Rendering View[/index.xhtml]: java.lang.IllegalStateException: Cannot create a session after the response has been committed
at org.apache.catalina.connector.Request.doGetSession(Request.java:2636) [jbossweb-7.0.10.Final.jar:]
at org.apache.catalina.connector.Request.getSession(Request.java:2375) [jbossweb-7.0.10.Final.jar:]
at org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:841) [jbossweb-7.0.10.Final.jar:]
at com.sun.faces.context.ExternalContextImpl.getSession(ExternalContextImpl.java:155) [jsf-impl-2.1.5-jbossorg-1.jar:2.1.5-SNAPSHOT]
at javax.faces.context.ExternalContextWrapper.getSession(ExternalContextWrapper.java:396) [jboss-jsf-api_2.1_spec-2.0.0.Final.jar:2.0.0.Final]
at com.sun.faces.renderkit.ServerSideStateHelper.writeState(ServerSideStateHelper.java:175) [jsf-impl-2.1.5-jbossorg-1.jar:2.1.5-SNAPSHOT]
at com.sun.faces.renderkit.ResponseStateManagerImpl.writeState(ResponseStateManagerImpl.java:122) [jsf-impl-2.1.5-jbossorg-1.jar:2.1.5-SNAPSHOT]
at com.sun.faces.application.StateManagerImpl.writeState(StateManagerImpl.java:166) [jsf-impl-2.1.5-jbossorg-1.jar:2.1.5-SNAPSHOT]
at com.sun.faces.application.view.WriteBehindStateWriter.flushToWriter(WriteBehindStateWriter.java:225) [jsf-impl-2.1.5-jbossorg-1.jar:2.1.5-SNAPSHOT]
at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:419) [jsf-impl-2.1.5-jbossorg-1.jar:2.1.5-SNAPSHOT]
at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131) [jsf-impl-2.1.5-jbossorg-1.jar:2.1.5-SNAPSHOT]
at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:288) [jboss-jsf-api_2.1_spec-2.0.0.Final.jar:2.0.0.Final]
at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:288) [jboss-jsf-api_2.1_spec-2.0.0.Final.jar:2.0.0.Final]
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121) [jsf-impl-2.1.5-jbossorg-1.jar:2.1.5-SNAPSHOT]
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) [jsf-impl-2.1.5-jbossorg-1.jar:2.1.5-SNAPSHOT]
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) [jsf-impl-2.1.5-jbossorg-1.jar:2.1.5-SNAPSHOT]
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594) [jboss-jsf-api_2.1_spec-2.0.0.Final.jar:2.0.0.Final]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.10.Final.jar:]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.10.Final.jar:]
at org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:62) [weld-core-1.1.5.AS71.Final.jar:2012-02-10 15:31]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.10.Final.jar:]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.10.Final.jar:]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.10.Final.jar:]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.10.Final.jar:]
at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50) [jboss-as-jpa-7.1.0.Final.jar:7.1.0.Final]
at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:154) [jboss-as-web-7.1.0.Final.jar:7.1.0.Final]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155) [jbossweb-7.0.10.Final.jar:]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.10.Final.jar:]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.10.Final.jar:]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368) [jbossweb-7.0.10.Final.jar:]
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.10.Final.jar:]
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671) [jbossweb-7.0.10.Final.jar:]
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930) [jbossweb-7.0.10.Final.jar:]
at java.lang.Thread.run(Thread.java:662) [rt.jar:1.6.0_32]

Here is some of my code:

ImgServlet.java

 /**
   * Servlet implementation class ImgServlet
   */
    @WebServlet(name = "ImgServlet", urlPatterns = {"/ImgServlet/*"})
    public class ImgServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @Inject
    Screenshot model;
        @PersistenceUnit(unitName = "primary")
    private EntityManagerFactory emf; 

    public ImgServlet() {
        super();
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        PrintWriter writer = response.getWriter();
        ServletContext sc = getServletContext();

        String classString = "Screenshot";
        String idString = request.getParameter("id");

        if (classString == null || classString.isEmpty() || idString == null || idString.isEmpty()) {
            response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404.
            return;
        }

        Long id = Long.parseLong(idString.trim());
        PhotoInterface entry = null;

        EntityManager em = null;

        try {
            em = emf.createEntityManager();
        } catch (Throwable e1) {
            e1.printStackTrace();
        } 

        try {
            entry = em.find(Screenshot.class, id);
        } catch (Exception ex) {
            //Log.log(ex.getMessage());
        }

        if (entry == null) {
            response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404.
            return;
        }

        ServletOutputStream out = null;

        try {
            response.reset();

             // It works ok without setting any of these...
            //response.setContentType(image.getContentType());
            //response.setHeader("Content-Length", String.valueOf(image.getLength()));
            //response.setHeader("Content-Disposition", "inline; filename=\"" + image.getName() + "\"");
            response.setContentType("image/png");

            out = response.getOutputStream();

            if (entry.getPng() != null && entry.getPng().length != 0) {
                out.write(entry.getPng());
                getServletContext().log("Found png!!");
            }
            else 
                getServletContext().log("png is NULL!!!");
        } catch (IOException e) {
            getServletContext().log("Error finding png!!!");
        } finally {
            close(out);
        }

    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    }

    private static void close(Closeable resource) {
        if (resource != null) {
            try {
                resource.close();
            } catch (IOException e) {
                // Do your thing with the exception. Print it, log it or mail it.
            }
        }
    }
}

contentflow_src.js - javascript used to render the coverflow and an example can be viewed at

http://www.jacksasylum.eu/ContentFlow/download.php

This currently works in my xhtml (without ContentFlow Div tags inside the outputPanel):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"  
    xmlns:h="http://java.sun.com/jsf/html"  
    xmlns:f="http://java.sun.com/jsf/core"  
    xmlns:p="http://primefaces.org/ui">  

    <ui:composition 
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:a4j="http://richfaces.org/a4j"
                xmlns:rich="http://richfaces.org/rich"
                xmlns:my="http://java.sun.com/jsf/composite/components"
                xmlns:s="http://jboss.com/products/seam/taglib"
                >
    <h:head>  
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <h:outputStylesheet name="screen.css" library="css"/> 
        <script language="JavaScript" type="text/javascript" src="contentflow_src.js" load="slideshow lightbox">
        </script>
    </h:head>  
    <h:body>
       <h:form id="form"> 
        <p:dataTable var="scrshot">
          ....................
          ....................
         </p:dataTable>

          <p:commandButton id="viewDetails" value="View Selected Screenshots" icon="ui-icon-search"  
                             update=":form:imgBlock"/> 

          <p:outputPanel id="imgBlock" layout="block"> 
             <a4j:repeat var="img" value="#{screenshotListProducer.selectedScreenshots}">
               <img src="ImgServlet?id=#{img.id}" title="#{img.time}"/>
             </a4j:repeat>
          </p:outputPanel>
         </h:form>                            
    </h:body> 
    </ui:composition> 
</html>

This doesn't work in my xhtml (after implementing the ContentFlow by wrapping with the Div tags inside the outputPanel) and triggers the error:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"  
    xmlns:h="http://java.sun.com/jsf/html"  
    xmlns:f="http://java.sun.com/jsf/core"  
    xmlns:p="http://primefaces.org/ui">  

    <ui:composition 
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:a4j="http://richfaces.org/a4j"
                xmlns:rich="http://richfaces.org/rich"
                xmlns:my="http://java.sun.com/jsf/composite/components"
                xmlns:s="http://jboss.com/products/seam/taglib"
                >
    <h:head>  
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <h:outputStylesheet name="screen.css" library="css"/> 
        <script language="JavaScript" type="text/javascript" src="contentflow_src.js" load="slideshow lightbox">
        </script>
    </h:head>  
    <h:body>
       <h:form id="form"> 
        <p:dataTable var="scrshot">
          ....................
          ....................
         </p:dataTable>

          <p:commandButton id="viewDetails" value="View Selected Screenshots" icon="ui-icon-search"  
                             update=":form:imgBlock"/> 

          <p:outputPanel id="imgBlock" layout="block"> 
           <div class="ContentFlow" id="ContentFlow">
            <div class="flow">
             <a4j:repeat var="img" value="#{screenshotListProducer.selectedScreenshots}">
              <div class="item">
               <img src="ImgServlet?id=#{img.id}" title="#{img.time}"/>
              </div>
             </a4j:repeat>
            </div>
           </div>
          </p:outputPanel>
         </h:form>                            
    </h:body> 
    </ui:composition> 
</html>

Sorry about all of the code. If anyone can help it will be greatly appreciated! I've gone in circles for days trying to get the ContentFlow to play nice with my session.

来源:https://stackoverflow.com/questions/11660247/display-db-images-using-contentflow-coverflow-illegalstateexception-error

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!