2012-07-09 52 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等。