Можете ли вы использовать диспетчер запросов для получения изображений?

Я старался

@WebServlet("/imgTest")
public class ImgTestServlet extends HttpServlet {
    @Override
    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        serveRequest(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        serveRequest(req, resp);
    }

    private void serveRequest(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.getRequestDispatcher("/imgs/banner.png").include(req,resp);
    }
}

И это похоже на работу.

Однако, если я изменю serveRequest метод, скажем,

private void serveRequest(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    resp.getWriter().println("Here, have an image:");
    req.getRequestDispatcher("/imgs/banner.png").include(req,resp);
}

Я получаю

java.lang.IllegalStateException: getWriter() has already been called for this response
    org.apache.catalina.connector.Response.getOutputStream(Response.java:604)
    org.apache.catalina.connector.ResponseFacade.getOutputStream(ResponseFacade.java:197)
    javax.servlet.ServletResponseWrapper.getOutputStream(ServletResponseWrapper.java:96)
    org.apache.catalina.servlets.DefaultServlet.serveResource(DefaultServlet.java:877)
    org.apache.catalina.servlets.DefaultServlet.doGet(DefaultServlet.java:411)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    [...].webapp.servlets.ImgTestServlet.serveRequest(ImgTestServlet.java:24)
    [...].webapp.servlets.ImgTestServlet.doGet(ImgTestServlet.java:14)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)

Я не совсем уверен, почему это не удается. Я предполагаю, что диспетчер запросов пытается отобразить изображение только клиенту, что не соответствует тому факту, что оно фактически встроено в более крупный ответ.

Так есть ли способ сделать эту работу или я должен написать это так

private void serveRequest(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    resp.setContentType("text/html");
    resp.getWriter().println("Here, have an image:<br>");
    resp.getWriter().println("<img src='/webapp/imgs/banner.png'><br>");
}

?

0 ответов

Другие вопросы по тегам