【问题标题】:Calling servlets from client side从客户端调用 servlet
【发布时间】:2011-09-05 07:22:59
【问题描述】:

我一直在阅读有关 servlet 的书籍,所有书籍都涉及通过表单(POST 请求)调用 servlet。 我想知道客户端是否有其他方法可以调用 servlet。

这是我的理解:对于对 servlet 的 POST 请求,我们使用链接,从而在该 servlet 上发出 GET 请求,并且在 servlet 中,我们需要从 doGet() 调用 doPost()。

【问题讨论】:

  • 我重申我的问题:从客户端页面(比如 JSP 或 HTML 页面)发出 POST 请求(到 servlet)有哪些不同的方法?
  • 将鼠标放在问题下方的servlets标签上方,直到弹出一个框,点击其中的info链接,然后启发自己。
  • @BalusC 从来不知道 info 中有如此详尽的内容。谢谢

标签: java servlets


【解决方案1】:

对于 servlet 的 POST 请求,我们使用一个链接,从而生成一个 GET 对该 servlet 的请求

这没有意义,也不正确。

客户端发出GETPOST 请求。在 html 表单中,您可以在 method 属性中指定哪个,而在使用 ajax/javascript 时,您还可以指定哪个。

是的,在 servlet 中指定 doGet 和 doPost。约定是使用 POST 向服务器发送(post)数据,而 get 用于返回数据;但是,这必须强制执行。

【讨论】:

    【解决方案2】:

    您可以编写一个客户端来创建GETPOST HTTP 消息并调用一个servlet。但是您可以使用Apache Commons HTTP Client 来执行此操作。

    此外,从您的问题来看,您似乎认为 所有 Servlet 通过 POST 请求处理 GET 请求。这是不正确的。它在您查看的 servlet 中完成的原因是 servlet 对 GETPOST 请求执行相同的操作。所以为了尽量减少重复代码的数量就这么写了。

    更新:Apache Commons HTTP Client 似乎已经结束生命,不再被开发。它已被其HttpClientHttpCore 模块中的Apache HttpComponents 项目所取代,这些模块提供了更好的性能和更大的灵活性。

    UPDATE2:我将您最初的问题视为“除了从浏览器之外,我们如何调用 servlet”。好吧,浏览器只是一个客户端,它可以让我们高效轻松地向服务器发出GETPOST 请求[在我们的例子中是Servlet]。我们也可以编写一个Java proram 来向我们的Servlet 发出GETPOST 请求,但这会很乏味和麻烦。所以,我们可以使用上面指定的库来做到这一点。这些库不限于客户端 Java 程序,并且可以在任何可以调用 Java 代码 [包括 JSP] 的应用程序中使用。

    【讨论】:

    • 您能否列出从浏览器调用 servlet 的不同方法?
    • 来自浏览器?我们每天都这样做。单击任何 HTML 页面中的链接;如果链接指向的服务器是 Java 服务器,那么您很可能正在调用 servlet。 ;-)
    • 是的。所以链接是调用 servlet 的一种方式。我想到的其他方式是用户单击“提交”按钮的表单提交。还有哪些方法?是否可以为表单提交以外的其他用户事件调用 servlet,例如单击按钮、选择单选按钮或在计时器到期后自动调用等。
    【解决方案3】:

    您可以使用java.net.UrlConnectionjava.net.URL 请求一个servlet

    【讨论】:

      【解决方案4】:

      查看 servlet api (http://download.oracle.com/javaee/1.2.1/api/javax/servlet/http/HttpServlet.html)。

      支持四种方法(GET、POST、PUT、DELETE)。理论上,您可以从客户端使用其中任何一个。

      然而,实际上,您的客户端通常是浏览器或网络服务消费者。实际上,经常使用的只有 GET 和 POST。

      【讨论】:

        【解决方案5】:

        我会使用 Apache 的 HttpClient 库。非常易于使用且可自定义。
        这里有一些代码供您入门:

        HttpClient httpclient = new DefaultHttpClient();
        httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
        HttpPost request = new HttpPost("YourServletURL");
        List<NameValuePair> postParameters = new ArrayList<NameValuePair>();
        // Set your parameters here...
        UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(postParameters);
        request.setEntity(formEntity);
        HttpResponse response = httpclient.execute(request);
        HttpEntity resEntity = response.getEntity();
        if (resEntity != null)
            // Here you can read the response
            EntityUtils.consume(resEntity);
        httpclient.getConnectionManager().shutdown();
        

        【讨论】:

          【解决方案6】:

          您有 8 个 http 1.1 方法:GET、POST、HEAD、TRACE、OPTIONS、PUT、DELETE 和 CONNECT。 servlet api 只实现了其中的 7 个及其对应的匹配 doXXXX():doGet()、doPost()、doOptions()、doHead()、doTrace()、doPut()、doDelete()。但是对于大多数 servlet 开发,您将使用 doGet()(用于简单请求)或 doPost()(用于接受和处理表单数据)。

          这是我的理解:对于对 servlet 的 POST 请求,我们使用一个链接,从而在该 servlet 上发出 GET 请求,并且在 servlet 中我们需要从 doGet() 调用 doPost()

          我不明白这部分,但我认为你错了。 service() 方法根据 HTTP 方法(例如 GET、POST)确定要调用的 servlet 方法。如果客户端发送 HTTP GET 请求,则 service() 方法调用 doGet() 方法,将请求和响应对象作为参数传递。为方便起见,一些 IDE 设置了 servlet,因此它们的 doPost() 方法调用 doGet(),因为它们旨在以相同的方式处理 GET 和 POST 请求。

          【讨论】:

            【解决方案7】:

            有两种方法是调用 servlet,调用 doGet() 的 HTTP GET 和调用 doPost() 的 HTTP POST。 HTTP 协议很简单,可以使用许多客户端。您可以自己编写,可以使用现成的 java 库,可以使用 curl 等命令行工具。

            doGet() 和 doPost() 方法可以做相同或不同的事情。

            有两种常用的 servlet 设计方法:

            1. 每个 servlet 在 doGet() 和 doPost() 中执行相同的操作,其中一个调用另一个。

            示例: FindCustomerServlet - 查找客户记录 UpdateCustomerServlet - 更新客户记录

            1. servlet 在 doGet() 和 doPost() 中执行不同的操作。

            示例: CustomerServlet - 使用 GET 查找记录,使用 POST 进行更新。

            【讨论】:

              猜你喜欢
              • 2011-10-13
              • 1970-01-01
              • 1970-01-01
              • 2015-11-29
              • 2023-04-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多