2012-07-27 35 views
0

我使用ContentFlow(http://www.jacksasylum.eu/ContentFlow/index.php)来显示使用Java,PrimeFaces和jsf的数据库中的图像。我正在使用图像servlet来帮助渲染我的图像字节数组。ContentFlow的使用使用Java,PrimeFaces和jsf

这是成功的初始页面加载与我的图像列表,但在我的图像列表更改后(使用来自数据过滤器的结果)我无法找到一种方法来重新加载/刷新ContentFlow的新列表图片。

此刷新在没有实现ContentFlow的情况下成功运行,但它似乎要么在Javascript内部做了一些背后的事情,或者它不能很好地与图像servlet一起玩(有时候我会遇到IllegalStateException)。我很难找到任何人帮助解决这个问题。

这里是我的堆栈跟踪...

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] 

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 JavaScript文件,使ContentFlow可以在http://www.jacksasylum.eu/ContentFlow/download.php没有足够的空间来查看,包括在这里了。

这一点的xhtml代码将获得数据表选择列表后的工作。此外,尝试过滤数据过滤结果列表。该ContentFlow的div没有在这里实现...

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

的XHTML代码,该位与ContentFlow的div封装后不能正常工作。一些必须发生的幕后,我只是不明白...

<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> 
+0

你可以发布一些代码和该异常的堆栈跟踪吗? – 2012-07-27 21:49:12

回答

0

自己想出来。创建了一个定制的Javascript函数,可以成功刷新ContentFlow。