【问题标题】:Calling a jsp multiple times from single doPost() method从单个 doPost() 方法多次调用 jsp
【发布时间】:2015-06-24 20:05:15
【问题描述】:

我正在使用 PD4ML 库将我的 .jsp 转换为 pdf 文件,并且我需要调用相同的 jsp 文件来获取值列表。 我在我的 doPost() 中这样做

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    String [] posSelected = request.getParameterValues("selectPOs");
    for(String eachPO: posSelected){

    request.getRequestDispatcher("CreateInvoices.jsp").forward(request,response);

//这不起作用,因为不能创建多个servlet实例。 }}

我得到 java.lang.IllegalStateException: Cannot forward after response has been committed 异常。

如何多次调用同一个 JSP?

谢谢 梅卡姆

【问题讨论】:

  • 你正试图赶上一辆已经离开车站的火车 :) 希望你明白如果没有我会详细说明
  • 在 HTTP 协议中,每个请求只能发送一个响应。你需要尝试另一种方法。在单个 pdf 中创建所有选定的发票可能是一种解决方案。
  • @Mudassar。能否请您详细说明。我的意思是我想知道我怎样才能做到这一点。

标签: java jsp servlets


【解决方案1】:

如何多次调用同一个 JSP?

通过多次包含它。

request.getRequestDispatcher("CreateInvoices.jsp").include(request, response);

【讨论】:

  • 仍然出现非法状态异常。
  • 那是其他地方造成的。
  • 但是当我调试时,当我的控件第二次进入 for 循环时,当我在这条线上时,它会被抛出。基本上我只是向前改变以包括。还有什么需要做的吗?
  • 问题在目前提供的信息中不可见。换句话说,当我运行与您在问题中发布的完全相同的代码并在答案中提供代码时,我就不再面临所描述的问题了。
【解决方案2】:

通过在请求调度程序上使用 Include 而不是 Forward。 可以多次调用同一个jsp调用include。

它看起来像这样。

request.getRequestDispatcher("CreateInvoices.jsp").include(request,response);

【讨论】:

  • 仍然出现非法状态异常。
  • 复制/重复别人的答案是不礼貌的。
  • 实现后能否粘贴新代码?
【解决方案3】:

正如其他人所提到的,您在 HTTP 协议中每个请求只能发送一个响应,因此您需要尝试另一种方法。

在您的情况下,因为 pd4ml 是强制性的,并且在这里您需要多个 pdf,因此创建多个 jsp 不是理想的方式。因此,您应该通过代码创建多个 pdf,而不是将 jsp 转换为 pdf,如链接中所示 http://pd4ml.com/examples.

 private void runConverter(String urlstring, File output) throws IOException {

         if (urlstring.length() > 0) {
                if (!urlstring.startsWith("http://") && !urlstring.startsWith("file:")) {
                              urlstring = "http://" + urlstring;
                }

4               java.io.FileOutputStream fos = new java.io.FileOutputStream(output);

5               if ( proxyHost != null && proxyHost.length() != 0 && proxyPort != 0 ) {
                       System.getProperties().setProperty("proxySet", "true");
                       System.getProperties().setProperty("proxyHost", proxyHost);
                       System.getProperties().setProperty("proxyPort", "" + proxyPort);
                }

6               PD4ML pd4ml = new PD4ML();

7               try {                                                              
                       pd4ml.setPageSize( landscapeValue ? pd4ml.changePageOrientation( format ): format );
                    } catch (Exception e) {
                       e.printStackTrace();
                    }

                if ( unitsValue.equals("mm") ) {
                       pd4ml.setPageInsetsMM( new Insets(topValue, leftValue,
bottomValue, rightValue) );
                } else {
                       pd4ml.setPageInsets( new Insets(topValue, leftValue,
bottomValue, rightValue) );
                }

                pd4ml.setHtmlWidth( userSpaceWidth );

8               pd4ml.render( urlstring, fos );
         }
   }

【讨论】:

    【解决方案4】:

    我已经使用 jsoup.connect().get() 来实现我想要的。

    【讨论】:

      猜你喜欢
      • 2012-06-12
      • 2018-07-14
      • 2017-01-05
      • 2015-08-24
      • 1970-01-01
      • 2020-04-17
      • 1970-01-01
      • 2015-08-29
      • 2012-07-02
      相关资源
      最近更新 更多