0

I know, that there are already several of similar questions but none of them fix my problem. I have a simple JSP

<!DOCTYPE html>
<html>
   <head>
      <meta charset="UTF-8">
      <title>Home Page</title>
   </head>
   <body>    
      <jsp:include page="_menu.jsp"></jsp:include>    
      <h3>Home Page</h3>   
      <table>
            <tr>
               <td>aha</td>
            </tr>
         </table>
         ${data.image}      
         <img src="images/wappen.jpg"/>   
         <img src="/images/wappen.jpg"/>   
         <img src="../images/wappen.jpg" alt=""/>   
   </body>
</html>

none of the images is displayed. JSP is located in war in WEB-INF/views jpg is located in war in folder images.

Directory structure:

-WebContent
 - images (here are my jpgs)
 - META-INF 
 - WEB-INF 
   - lib 
   - views (here are my jsps located)

The jsp is called via webServlet:

RequestDispatcher dispatcher = this.getServletContext().getRequestDispatcher("/WEB-INF/views/homeView.jsp");
dispatcher.forward(request, response);
Martin Müller
  • 122
  • 3
  • 17
  • what is your folder structure? – Abhijeet Apr 15 '19 at 13:07
  • Maybe [this](https://stackoverflow.com/questions/23195317/accessing-resources-from-jsp-inside-web-inf) and also [here](https://stackoverflow.com/questions/30321952/read-the-file-from-webcontent-images-instead-of-web-inf) might help you . – Swati Apr 15 '19 at 13:46

1 Answers1

0

I don't know if it's the correct way, but at least I found a solution:

create a webservlet to handle the context Images:

  • retrieve the requested image
  • build the absolute filename of the image
  • load the image from disk
  • return as response

    import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.IOException; import java.lang.invoke.MethodHandles;

    import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;

    import org.slf4j.ext.XLogger; import org.slf4j.ext.XLoggerFactory;

    @WebServlet(urlPatterns = { "/Images/*" }) public class DisplayImageServlet extends HttpServlet { /** holds the logger */ final XLogger logger = XLoggerFactory.getXLogger(MethodHandles.lookup().lookupClass());

    private static final long serialVersionUID = 1L;
    

    public DisplayImageServlet() { super(); }

    @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpServletRequest req = (HttpServletRequest) request;

      String realRootPath = request.getServletContext().getRealPath("");
        String servletPath = req.getServletPath();
        String image = req.getRequestURI();
        String pathInfo = request.getPathInfo();
    
        logger.debug("realRootPath = " + realRootPath);
        logger.debug("servletPath = " + servletPath);
        logger.debug("image = " + image);
        logger.debug("pathInfo = " + pathInfo);
        String imageRealPath = realRootPath +servletPath+pathInfo;
    
        logger.debug("imageRealPath = " + imageRealPath);
        response.setContentType("image/jpeg");  
        ServletOutputStream out;  
        out = response.getOutputStream();  
        FileInputStream fin = new FileInputStream(imageRealPath);  
    
        BufferedInputStream bin = new BufferedInputStream(fin);  
        BufferedOutputStream bout = new BufferedOutputStream(out);  
        int ch =0; ;  
        while((ch=bin.read())!=-1)  
        {  
            bout.write(ch);  
        }  
    
        bin.close();  
        fin.close();  
        bout.close();  
        out.close();  
    

    }

    @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { logger.debug("doPost"); doGet(request, response); }

    }

Martin Müller
  • 122
  • 3
  • 17