【问题标题】:Call Servlet and invoke Java code from JavaScript along with parameters调用 Servlet 并从 JavaScript 调用 Java 代码以及参数
【发布时间】:2011-01-09 02:07:22
【问题描述】:

我有会话密钥,它是我从 REST API 调用中获得的 JavaScript 变量。我需要在 servlet 中调用我的 Java 代码并将该键作为参数传递。我可以使用什么 JavaScript 函数来做到这一点?

【问题讨论】:

    标签: javascript jsp servlets parameter-passing


    【解决方案1】:

    几种方式:

    1. 使用window.location 触发 GET 请求。需要注意的是它是同步的(因此客户端会看到当前页面正在更改)。

      window.location = "http://example.com/servlet?key=" + encodeURIComponent(key);
      

      注意内置encodeURIComponent()函数在传递请求参数之前对其进行编码的重要性。

    2. 使用 form.submit() 触发 GET 或 POST 请求。需要注意的是它是同步的。

      document.formname.key.value = key;
      document.formname.submit();
      

      <form name="formname" action="servlet" method="post">
          <input type="hidden" name="key">
      </form>
      

      或者,您也可以只设置现有表单的隐藏字段,然后等待用户提交。

    3. 使用XMLHttpRequest#send() 在后台触发异步请求(也称为 Ajax)。下面的示例将调用 servlet 的 doGet()

      var xhr = new XMLHttpRequest();
      xhr.open("GET", "http://example.com/servlet?key=" + encodeURIComponent(key));
      xhr.send(null);
      

      以下示例将调用 servlet 的 doPost()

      var xhr = new XMLHttpRequest();
      xhr.open("POST", "http://example.com/servlet");
      xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
      xhr.send("key=" + encodeURIComponent(key));
      
    4. 使用jQuery 发送一个跨浏览器兼容的Ajax 请求(上面的xhr 代码只在真实浏览器中工作,为了兼容MSIE,你需要添加一些混乱;)。

      $.get("http://example.com/servlet", { "key": key });
      

      $.post("http://example.com/servlet", { "key": key });
      

      请注意,jQuery 本身已经对请求参数进行了透明编码,所以这里不需要encodeURIComponent()

    无论哪种方式,key 都只能由 servlet 中的request.getParameter("key") 使用。

    另见:

    【讨论】:

      【解决方案2】:

      发送 POST 时添加标头 xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

      代码看起来像 客户:

          function executeRequest(req) {
              var xhttp = new XMLHttpRequest();
              xhttp.onreadystatechange = function() {
                  if (this.readyState == 4 && this.status == 200) {
                     // Typical action to be performed when the document is ready:
                     document.getElementById("response").value = xhttp.responseText;
                  }
              };
              xhttp.open("POST", "execute/cardbrowser", true);
              xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
              xhttp.send("lorem=ipsum&name=binny");
          }
      

      服务器:

      protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
          System.out.println(req.getParameter("lorem"));
      }
      

      【讨论】:

        【解决方案3】:

        本身没有 JavaScript 函数,但浏览器通常*提供一个 XMLHttpRequest 对象,您可以使用 go through that

        LibrariesYUIjQuery 提供帮助函数以简化其使用。

        * 表示“通常”的值,包括几乎所有支持 JavaScript 并且自 Netscape 4 死后发布的浏览器

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-02
          • 2015-10-07
          相关资源
          最近更新 更多