Можете ли вы использовать диспетчер запросов для получения изображений? - PullRequest
0 голосов
/ 09 января 2019

Я пытался

@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)

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

Так что - это , есть ли способ заставить это работать, или у меня есть , чтобы написать это как

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>");
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...