2012-07-09 76 views
1

我想顯示存儲在本地磁盤上的圖像沒有成功。顯示圖像JSF

在我的index.xhtml我:

<h:graphicImage id="image" value="#{tableData.imageTitle}" /> 

我創建了以下the tutorial

我的web.xml中一個新的servlet:

<!-- JSF mapping --> 
    <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>*.xhtml</url-pattern> 
    </servlet-mapping> 

    <!-- Image Mapping --> 
    <servlet> 
     <servlet-name>imageServlet</servlet-name> 
     <servlet-class>package.ImageServlet</servlet-class> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>imageServlet</servlet-name> 
     <url-pattern>*.png</url-pattern> 
    </servlet-mapping> 

    <context-param> 
     <param-name>javax.faces.PROJECT_STAGE</param-name> 
     <param-value>Development</param-value> 
    </context-param> 

就像我說的,圖像找不到(我的圖像存儲在「C:\ Documents and Settings \ user \ images」)。

任何反饋,強烈讚賞。謝謝!

UPDATE:

我使用嵌入式Jetty和JSF 2.0。

我ImageServlet看起來像這樣(我修改了一點點從教程ImageServlet):

/* 
* The Image servlet for serving from absolute path. 
*/ 
public class ImageServlet extends HttpServlet { 

    // Constants 
    // ---------------------------------------------------------------------------------- 

    private static final int DEFAULT_BUFFER_SIZE = 10240; // 10KB. 

    // Properties 
    // --------------------------------------------------------------------------------- 

    private String imagePath; 

    // Actions 
    // ------------------------------------------------------------------------------------ 

    public void init() throws ServletException { 

     // Define base path somehow. You can define it as init-param of the 
     // servlet. 
     this.imagePath = "C:\\Documents and Settings\\user\\images"; 
     //this.imagePath = PlatformConfig.getProperty("LocalOperation.Images.Path", null); 
     System.out.println("imagePath = " + imagePath); 

     // In a Windows environment with the Applicationserver running on the 
     // c: volume, the above path is exactly the same as "c:\images". 
     // In UNIX, it is just straightforward "/images". 
     // If you have stored files in the WebContent of a WAR, for example in 
     // the 
     // "/WEB-INF/images" folder, then you can retrieve the absolute path by: 
     // this.imagePath = getServletContext().getRealPath("/WEB-INF/images"); 
    } 

    protected void doGet(HttpServletRequest request, 
      HttpServletResponse response) throws ServletException, IOException { 
     // Get requested image by path info. 
     String requestedImage = request.getPathInfo(); 
     System.out.println("requestedImage = " + requestedImage); 

     // Check if file name is actually supplied to the request URI. 
     if (requestedImage == null) { 
      // Do your thing if the image is not supplied to the request URI. 
      // Throw an exception, or send 404, or show default/warning image, 
      // or just ignore it. 
      response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404. 
      return; 
     } 

     // Decode the file name (might contain spaces and on) and prepare file 
     // object. 
     System.out.println(imagePath); 
     File image = new File(imagePath, URLDecoder.decode(requestedImage, 
       "UTF-8")); 

     // Check if file actually exists in filesystem. 
     if (!image.exists()) { 
      // Do your thing if the file appears to be non-existing. 
      // Throw an exception, or send 404, or show default/warning image, 
      // or just ignore it. 
      response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404. 
      return; 
     } 

     // Get content type by filename. 
     String contentType = getServletContext().getMimeType(image.getName()); 

     // Check if file is actually an image (avoid download of other files by 
     // hackers!). 
     // For all content types, see: 
     // http://www.w3schools.com/media/media_mimeref.asp 
     if (contentType == null || !contentType.startsWith("image")) { 
      // Do your thing if the file appears not being a real image. 
      // Throw an exception, or send 404, or show default/warning image, 
      // or just ignore it. 
      response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404. 
      return; 
     } 

     // Init servlet response. 
     response.reset(); 
     response.setBufferSize(DEFAULT_BUFFER_SIZE); 
     response.setContentType(contentType); 
     response.setHeader("Content-Length", String.valueOf(image.length())); 
     response.setHeader("Content-Disposition", 
       "inline; filename=\"" + image.getName() + "\""); 

     response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1. 
     response.setHeader("Pragma", "no-cache"); // HTTP 1.0. 
     response.setDateHeader("Expires", 0); // Proxies. 

     // Prepare streams. 
     BufferedInputStream input = null; 
     BufferedOutputStream output = null; 

     try { 
      // Open streams. 
      input = new BufferedInputStream(new FileInputStream(image), 
        DEFAULT_BUFFER_SIZE); 
      output = new BufferedOutputStream(response.getOutputStream(), 
        DEFAULT_BUFFER_SIZE); 

      // Write file contents to response. 
      byte[] buffer = new byte[DEFAULT_BUFFER_SIZE]; 
      int length; 
      while ((length = input.read(buffer)) > 0) { 
       output.write(buffer, 0, length); 
      } 
     } finally { 
      // Gently close streams. 
      close(output); 
      close(input); 
     } 
    } 

    // Helpers (can be refactored to public utility class) 
    // ---------------------------------------- 

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

我的豆腐看起來是這樣的:

@ManagedBean 
@SessionScoped 
public class TableData { 

    private String imageTitle = "Image_ON.png"; 

     public String getImageTitle(){ 
     return imageTitle; 
    } 
} 

我不明白爲什麼圖像未找到。

+0

我認爲最好的解決辦法是把apache放到服務器的靜態文件中。但是發佈你的代碼。 – 2012-07-09 12:16:18

回答

2

您已經將後綴模式*.png而不是前綴模式(如/image/*)中的servlet映射到您自己發現的教程中。這樣request.getPathInfo()將總是返回null。您需要改爲request.getServletPath()

+0

非常感謝!現在它正在工作! – wallE 2012-07-10 08:27:45

0

我認爲你應該嘗試使用Virtual directory。這是非常直接的,無需創建任何類型的servlet等。