2013-07-28 28 views
5

Mam problem z wyświetlaniem obrazu, który został załadowany za pośrednictwem serwletu z bazy danych. Używam tej klasySerwlet obrazu JSF nie ładuje obrazu

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(); 
     } 
    } 
} 
} 

moje twarze-config

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

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

załadować moje zdjęcie z tego kodu:

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

Mam problem z wyświetlaniem obrazu na stronach bez głównej strony. Po otwarciu strony:

http://localhost:8080/ClothesJSF/ 

wszystkie moje obrazy zostały normalnie załadowane z bazy danych. jeśli otworzyć stronę

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

że równa mojej stronie głównej mój obraz nie zostanie załadowany. Ten problem wystąpił również na wszystkich innych stronach.

myślę, że mam problem z ustawieniami obrazu serwletów

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

a może potrzebujesz innych wyrażeń regularnych w url-pattern, ale nie mogłem zorientować się go. Będę zadowolony z każdej porady. Dzięki Ci.

UPDATE Jeśli będę używać ścieżki jak to we wszystkich obrazka:

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

to będzie działać, ale jeśli użyje # {request.contextPath}/to nie będzie działać. Może potrzebuję wprowadzić pewne zmiany preferencji, jeśli chcę, aby # {request.contextPath}/image? Id = # działał.

Odpowiedz

4

Jeśli <h:graphicImage value> nie zaczyna się od schematu lub /, to jest względne w stosunku do bieżącego adresu URL żądania. Wyobraź sobie, że jesteś otwarcie strony przez http://localhost:8080/ClothesJSF/faces/page.xhtml a strona w pytaniu ma

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

następnie JSF będzie generować

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

które skutecznie staje się względem http://localhost:8080/ClothesJSF/faces/ i webbrowser będzie próbował pobrać rzeczywisty obraz z http://localhost:8080/ClothesJSF/faces/image?id=1, który w ten sposób kończy się tylko błędem. Jeśli zwróciłbyś uwagę na wbudowany w webbrowser mechanizm HTTP trafficitor, zauważyłbyś to.

Musisz pozwolić mu zacząć od /, aby uczynić go względnym względem ścieżki kontekstowej.

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

ten sposób JSF wygeneruje

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

co jest słuszne. Zauważ, że #{request.contextPath} nie jest konieczne. Model <h:graphicImage> już teraz zajmuje się tym przezroczyście. Potrzebujesz tego tylko w elementach "zwykłego HTML", takich jak <a>, <img>, <link>, , itp.

+0

Dziękuję Ci, za pracę! Mam tylko 2 tygodnie pracy z JSF, JPA itp., Ale przeczytałem już tuzin artykułów i zaoszczędziło mi mnóstwo czasu. Wykonujesz świetną robotę, dziękuję bardzo. PS Kiedy napisałem ten wpis, pomyślałem, że prawdopodobnie odpowiedziałbyś: D. PPS Przepraszam za mój angielski – Kroko

+0

Nie ma za co :) – BalusC