2015-06-22 2 views
0

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

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

+0

Прежде всего, ваш сервлет не пересылает JSP (две строки, которые делают это, закомментированы). Но даже если это так, вы сопоставили сервлет с URL-адресом JSP, поэтому пересылка снова вызовет сервлет. Сопоставьте сервлет с ** другим ** URL-адресом и перейдите в JSP в doGet(). Но опять же, поскольку ваш сервлет уже отправляет CSV в ответ, вы также не можете отправить HTML в тот же ответ. Итак, вы должны сказать нам, что вы пытаетесь сделать, потому что на данный момент это не имеет большого значения. –

+0

Спасибо за ответ. Может быть, я должен переформулировать: я хочу, чтобы иметь возможность загружать файл csv после ссылки: http: // localhost: 7001/DefectsExporter/export.jsp вводится в браузере, как только загрузка выполняется, я хочу отобразить фактическую страницу jsp – coldistric

ответ

1

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

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

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

Смежные вопросы