I am trying to display an image stored on local disk without success.
In my index.xhtml I have:
<h:graphicImage id="image" value="#{tableData.imageTitle}" /> I have created a new servlet following the tutorial
My web.xml:
<!-- 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> As I was saying, the image is not found (my images are stored "C:\Documents and Settings\user\images").
Any feedback is strongly appreciated. Thank you!
UPDATE:
I am using embedded Jetty and JSF 2.0.
My ImageServlet looks like this (i modified a little the ImageServlet from the tutorial) :
/* * 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(); } } } } My bean looks like this:
@ManagedBean @SessionScoped public class TableData { private String imageTitle = "Image_ON.png"; public String getImageTitle(){ return imageTitle; } } I don't understand why the image is not found.