我目前正在使用第三方图像封面流程(http://www.jacksasylum.eu/ContentFlow/)来显示正在数据库中保存的图像。我正在使用Java,JPA和Richfaces。我已经设置了一个图像servlet来处理图像显示。我有一个Richfaces数据表设置,我只想在封面流中显示所选记录的图像。此功能适用于此。我有一个命令按钮来渲染OutputPanel中的图像封面流。在实现封面流之前,我的图像在页面上正确显示而没有错误。所以,我知道我的底层功能可以按预期工作。问题是,当我按照指示在我的img标签周围放置特定div标签来实现封面流时,我得到以下错误:
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_src.js - 用于呈现封面流的javascript,可以在
查看示例目前适用于我的xhtml(在outputPanel中没有ContentFlow Div标签):
<!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>
这在我的xhtml中不起作用(在使用outputPanel内的Div标签包装实现ContentFlow之后)并触发错误:
<!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>
对所有代码感到抱歉。如果有人可以提供帮助,将不胜感激!我已经花了好几天试图让ContentFlow在我的会话中发挥得很好。