2013-07-28 98 views
5

我有dispaying图像,通过serlvet从数据库加载的问题。 我使用这个类JSF图像servlet不加载图像

public class ImageServlet extends HttpServlet { 

private static final int DEFAULT_BUFFER_SIZE = 10240; 

@EJB 
private GoodsDAO goodsDAO; 

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    String stringImageId = request.getParameter("id"); 

    if (stringImageId == null) { 
     response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404. 
     return; 
    } 
    int imageId = Integer.parseInt(stringImageId); 
    Goods goods = goodsDAO.find(imageId); 

    if (goods == null) { 

     response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404. 
     return; 
    } 

    response.reset(); 
    response.setBufferSize(DEFAULT_BUFFER_SIZE); 
    response.setContentType("image/jpeg"); 
    response.setContentLength(goods.getImage().length); 
    response.setHeader("Expires", "Thu, 15 Apr 2010 20:00:00 GMT"); 

    BufferedOutputStream output = null; 

    try { 
     output = new BufferedOutputStream(response.getOutputStream(), DEFAULT_BUFFER_SIZE); 
     output.write(goods.getImage()); 
    } finally { 
     close(output); 
    } 
} 

private static void close(Closeable resource) { 
    if (resource != null) { 
     try { 
      resource.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
} 

我的脸,配置

<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_2_0.xsd" 
version="2.0"> 


<navigation-rule> 
    <navigation-case> 
     <from-outcome>listAllGoods</from-outcome> 
     <to-view-id>/pages/protected/user/listAllGoods.xhtml</to-view-id> 
    </navigation-case> 
</navigation-rule> 

<navigation-rule> 
    <navigation-case> 
     <from-outcome>createGoods</from-outcome> 
     <to-view-id>/pages/protected/admin/createGoods.xhtml</to-view-id> 
    </navigation-case> 
</navigation-rule> 

<navigation-rule> 
    <navigation-case> 
     <from-outcome>createOrder</from-outcome> 
     <to-view-id>/pages/protected/user/createOrder.xhtml</to-view-id> 
    </navigation-case> 
</navigation-rule> 

<application> 
    <resource-bundle> 
     <base-name>messages</base-name> 
     <var>msgs</var> 
    </resource-bundle> 
</application> 

我的web.xml

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
id="WebApp_ID" version="3.0"> 
<display-name>ClothesJSF</display-name> 
<welcome-file-list> 
    <welcome-file>pages/protected/user/listAllGoods.xhtml</welcome-file> 
</welcome-file-list> 
<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> 
    <url-pattern>*.jsf</url-pattern> 
    <url-pattern>*.xhtml</url-pattern> 
</servlet-mapping> 
<servlet> 
    <servlet-name>imageServlet</servlet-name> 
    <servlet-class>com.servlet.ImageServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>imageServlet</servlet-name> 
    <url-pattern>/image/*</url-pattern> 
</servlet-mapping> 
<filter> 
    <filter-name>PrimeFaces FileUpload Filter</filter-name> 
    <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class> 
    <init-param> 
     <param-name>thresholdSize</param-name> 
     <param-value>51200</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>PrimeFaces FileUpload Filter</filter-name> 
    <servlet-name>Faces Servlet</servlet-name> 
</filter-mapping> 

我加载我的形象与此代码:

<h:graphicImage id="zoomImage" value="image?id=#{goods.id}" 
       style="cursor:pointer" width="70" /> 

我有在非主页上显示图像的问题。当我打开页面时:

http://localhost:8080/ClothesJSF/ 

我的所有图像通常都是从数据库加载的。 如果我打开等于我的主页我的形象就不会被加载

页面
http://localhost:8080/ClothesJSF/pages/protected/user/listAllGoods.xhtml 

。这个问题也出现在所有其他页面上。

我认为我有图像的servlet设置

<servlet-mapping> 
<servlet-name>imageServlet</servlet-name> 
<url-pattern>/image/*</url-pattern> 
</servlet-mapping> 

,也许我需要的url-pattern其他的正则表达式的问题,但我无法弄清楚它。 我会很乐意提供任何建议。谢谢。

UPDATE如果我将所有图像中使用的路径是这样的:

<h:graphicImage id="zoomImage" value="http://localhost:8080/ClothesJSF/image?id=# 
{goods.id}" style="cursor:pointer" width="70" /> 

它会工作,但如果我将使用#{} request.contextPath /这是不行的。如果我希望#{request.contextPath}/image?id =#可以工作,也许我需要进行一些首选项更改。

回答

4

如果<h:graphicImage value>没有以方案或/开头,那么它与当前请求URL有关。试想一下,你被http://localhost:8080/ClothesJSF/faces/page.xhtml打开该网页,并在问题页面有一个

<h:graphicImage value="image?id=1" /> 

那么JSF将生成一个

<img src="image?id=1" /> 

这实际上变成相对http://localhost:8080/ClothesJSF/faces/和WebBrowser会尝试下载从http://localhost:8080/ClothesJSF/faces/image?id=1的实际图像,因此只会以错误结束。如果你已经注意到webbrowser内置的HTTP流量监听器,你会注意到这一点。

您需要让它以/开头,以使其相对于上下文路径。

<h:graphicImage value="/image?id=1" /> 

这样,JSF将产生

<img src="/ClothesJSF/image?id=1" /> 

这是正确的。请注意,#{request.contextPath}不是必需的。 <h:graphicImage>已经透明地处理它。您只需要在“纯HTML”资源元素中使用,如<a>,<img>,<link>, 等。

+0

谢谢你,它的工作!我只用了两周的时间与JSF,JPA等合作,但我已经阅读了很多你的文章,并且你节省了很多时间。你做得很好,非常感谢你。 PS当我写这篇文章时,我想可能你会回答它:D。 PPS对不起我英文 – Kroko

+0

不客气:) – BalusC