1

ローカル ディスクに保存されている画像を表示しようとしていますが、うまくいきません。

私の index.xhtml には次のものがあります。

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

チュートリアルに従って新しいサーブレットを作成しました

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

私が言ったように、画像が見つかりません (私の画像は「C:\Documents and Settings\user\images」に保存されています)。

フィードバックをお待ちしております。ありがとうございました!

アップデート:

組み込みの 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;
    }
}

画像が見つからない理由がわかりません。

4

2 に答える 2

2

自分で見つけたチュートリアルの*.pngように、接頭辞パターンではなく接尾辞パターンにサーブレットをマップしました。/image/*このようにrequest.getPathInfo()は常に を返しnullます。request.getServletPath()代わりに必要です。

于 2012-07-09T15:16:42.390 に答える
0

Virtual directoryを使用してみてください。サーブレットなどを作成する必要がなく、非常に簡単です。

于 2012-07-09T14:34:05.537 に答える