Как вызвать doGet перед отображением страницы jsp

У меня есть веб-страница с именем export.jsp, когда пользователь получает доступ к домену /export.jsp, я хочу, чтобы он автоматически загружал файл csv с помощью метода doGet сервлета. После этого я хочу отобразить фактический файл JSP, который является export.jsp

Мой метод doGet выглядит следующим образом:

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //RequestDispatcher rd = request.getRequestDispatcher("/export.jsp");
        //rd.forward(request, response);

        //getting and loading the property file
        Properties propConfig = new Properties();
        Properties propLog = new Properties();

        Statement stmt = null;
        Connection connection = null;

        try {
            //Loading the property files
            propConfig.load(getServletContext().getResourceAsStream("/WEB-INF/config.properties"));
            propLog.load(getServletContext().getResourceAsStream("/WEB-INF/log4j.properties"));
            PropertyConfigurator.configure(propLog);

            logger.info("loaded log4j properties From Path: /WEB-INF/log4j.properties");

            connection = DbTools.getConnection(propConfig.getProperty("db_hostname"), 
                    propConfig.getProperty("db_port"), propConfig.getProperty("db_serviceName"),
                    propConfig.getProperty("db_userName"),propConfig.getProperty("db_password"));

            stmt = connection.createStatement();
            ResultSet rset = stmt .executeQuery("SELECT * FROM QACOMPLETE_DEFECT");

            File csvfile = FileTools.generateCsvFile(rset);


            response.setContentType("text/csv");
            response.setHeader("Content-Disposition", "inline; filename=\""+csvfile.getName()+"\"");

            OutputStream outputStream = response.getOutputStream();
            outputStream.write(Files.readAllBytes(Paths.get(csvfile.getAbsolutePath())));
            outputStream.flush();
            outputStream.close();

        } catch (SQLException e) {
            logger.error("SQLException", e);

        }catch (IOException e) {
            logger.error("IOexception, The user may have cancel the download ", e);
        }
        finally
        {
            DbTools.closeQuietly(stmt);
            DbTools.closeQuietly(connection);
        }
    }

мой web.xml выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <servlet>
    <description></description>
    <display-name>DefectExporter</display-name>
    <servlet-name>DefectExporter</servlet-name>
    <servlet-class>exporter.DefectExporter</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>DefectExporter</servlet-name>
    <url-pattern>/export.jsp</url-pattern>
  </servlet-mapping>
</web-app>

Я делаю что-то неправильно? Потому что, когда я вхожу в URL http://localhost:7001/DefectsExporter/export.jsp в браузере вызывается метод doGet, но веб-страница export.jsp не отображается.

1 ответ

Решение

Вы не можете сделать это, по крайней мере, без Javascript.

ServletResponse может делать только одно: либо возвращать данные CSV, либо возвращать HTML-страницу. Вам абсолютно необходимо 2 разных запроса (будь то простые обычные запросы или один javascript): сначала загрузите файл csv, затем загрузите JSP.

Единственное, что я могу себе представить, чтобы удовлетворить такое требование, - это то, что сервлет отправляет страницу, которая через javascript и на стороне клиента сначала загружает (и сохраняет) файл csv, а затем, используя другой URL, отправляет запрос на страницу JSP. НО AFAIK, нет никакой возможности сделать это на стороне сервера.

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