【问题标题】:How do I return a string from a servlet without leaving the page?如何在不离开页面的情况下从 servlet 返回字符串?
【发布时间】:2015-05-07 06:37:16
【问题描述】:

图片如下:

我有一个带有表单的 html/jsp 页面。

    <div id = "divAttributes">
        <form id = 'fid' method = "post" action = "RunQuery">
            Id Number: <input type= "text" name = "foo" id = "txtFoo"/><br/>        
            <input type = "checkbox" id = "chboxZap" value = "zap"/>Foo<br/>
            <input type = "checkbox" id = "chboxBar" value = "bar"/>Bar<br/>
            <input type= "submit" id = "btnSubmit" value = "submit" onclick = "setDisabled('divAttributes', true)"/><br/>
        </form>
    </div>

当用户按下提交按钮时,我想将表单中包含的信息发送到一个servlet,然后它会做一些处理并返回一个字符串。

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

    response.setContentType("text/plain");

    ReturnCode rc = world.hello.MyMainClass.wait(request.getParameter("foo"));

    /*I want to return the RC, which is a bool, a string, and another object, which in this case is a string*/
}

然后该字符串应该被发送到不同的 servlet,然后保存一个文件。

我已经将 servlet 保存到文件中:

public void doPost(HttpServletRequest request,
                   HttpServletResponse response) throws IOException {
    response.setContentType("text/plain");
    response.setHeader("Content-Disposition",
            "attachment;filename=downloadname.txt");

    ServletContext ctx = getServletContext();

    String s = new String(request.getParameter("data"));

    InputStream is = new ByteArrayInputStream(s.getBytes());

    int read = 0;
    byte[] bytes = new byte[BYTES_DOWNLOAD];

    OutputStream os = response.getOutputStream();

    while ((read = is.read(bytes)) != -1) {
        os.write(bytes, 0, read);
    }
    os.flush();
    os.close();
}

我有两个问题:

  1. 调用第二个 servlet 时,不会重定向到新页面。它只是立即提供下载对话框。但是,当我调用第一个 servlet 时,它提供了一个空白的 html 页面。为什么?

  2. 如何将值从 servlet 返回到调用它的 HTML 页面,并从那里访问它们?

【问题讨论】:

    标签: java html http servlets


    【解决方案1】:

    JavaScript,更具体地说,Ajax 将为您提供帮助。如果您在 HTML 中包含具有良好 Ajax 支持的库(例如 jQuery),则可以在保持在同一页面上的同时调用您的 servlet。

    因此,您可以调用一个 JavaScript 函数,该函数使用嵌套的 Ajax 发布到两个 servlet,而不是从按钮提交表单:

    function submitForm() {
      $.post( 'url/to/firstServlet', { text: $('#txtFoo').val() }, function(dataFromFirst) {
        $.post( 'url/to/secondServlet', { data: dataFromFirst }, function(dataFromSecond) {
          // handle response from second servlet
        });
      });
    }
    

    【讨论】:

      【解决方案2】:

      使用 AJAX!

      AJAX 允许您创建一个 Ajax Javascript 对象,并将 HttpResponse 返回给该对象。

      例如。

      function myAjaxRequest()
      {
      var xmlhttp; /*our ajax object*/
      
              if (window.XMLHttpRequest)
                {// code for IE7+, Firefox, Chrome, Opera, Safari
                xmlhttp=new XMLHttpRequest();
                }
              else
                {// code for IE6, IE5
                xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
                }
              setVisible('loading', true) ;
      
              /*this function called when ajax state changes*/
              xmlhttp.onreadystatechange=function()
                {
                /*when the query has completed successfully*/
                if (xmlhttp.readyState==4 && xmlhttp.status==200)
                  {
                      /*now you can do what you want with your response text!*/
                      var mystring= xmlhttp.responseText;
                      alert(mystring);
                  }
      
                }
      
              /*the URL query we want to run*/
              var query = "RunQuery?foo="+$('#txtFoo').val();
              alert(query);
      
              /*AJAX object runs the query*/
              xmlhttp.open("GET", query, true); 
              xmlhttp.send();     
      }       
      

      【讨论】:

        猜你喜欢
        • 2011-07-25
        • 1970-01-01
        • 1970-01-01
        • 2010-10-10
        • 2017-06-04
        • 1970-01-01
        • 1970-01-01
        • 2016-11-06
        • 1970-01-01
        相关资源
        最近更新 更多