【问题标题】:multiple ajax calls to servlet对 servlet 的多个 ajax 调用
【发布时间】:2013-03-18 08:51:23
【问题描述】:

我对 servlet 的 AJAX 调用有疑问。 在一个页面上,我想对同一个 servlet 进行多次 ajax 调用, 但我无法让它按我想要的方式工作:

page.jsp:

...
// 按下按钮 A

 $.ajax({
        type: "POST",
        url: "MatchingServlet",
        data: matchingData_X,
  success: function(data) {
     $('.input_A).html(data);
     }
});
...
// Button B pressed
$.ajax({
        type: "POST",
        url: "MatchingServlet",
        data: matchingData_Y,
  success: function(data) {
     $('.input_B).html(data);
     }
 });
...

MatchingServlet.java:

...
MethodA(...){
...
}

MethodB(...){
...
}

在这个项目之前,我习惯了 java 6 和 Spring MVC,你可以通过注释来做到这一点。在这种环境下,我得到了 java 1.4.2(很快迁移到 java 6)并且没有框架。

主要问题: 我怎样才能让这 2 个 ajax 调用转到不同的 servlet 方法?

我在这里找到的所有示例都只有一个 ajax 调用,它转到 doGet 或 doPost 方法。所以我希望它甚至可以做我想做的事。

提前致谢, WvdL

【问题讨论】:

  • 可以在url中使用参数吗? url: "MatchingServlet"+"?method=A" 或 url: "MatchingServlet"+"?method=B"

标签: java javascript jquery ajax servlets


【解决方案1】:

一个简单的解决方案是添加一个名为 e.g. 的参数。向您调用 servlet 的“方法”,例如:

$.ajax({
        type: "POST",
        url: "MatchingServlet?method=methodA",
        data: matchingData_X,
  success: function(data) {
     $('.input_A).html(data);
     }
});

然后,在 servlet 的 doGet 方法本身中,读取参数并将调用转发给其他方法之一。

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

    String method = request.getParameter("method");
  if(method.equals("methodA"){
     methodA();
  }else if (method.equals("methodB"){
     methodB();
  }else{
    throw new IllegalArgumentExcpetion("'method' parameter required, must be 'methodA' or 'methodB' !");
  }

}

MethodA(...){
...
}

MethodB(...){
...
}

对这一基本技术的改进可能是:

  • 使用反射而不是 if...else... 来确定要调用的方法
  • 使用路径的最后一段而不是方法名称的参数:MatchingServlet/methodA

但基本上,您必须自己编写调度逻辑!

【讨论】:

  • 感谢您的回答。现在做了一些我自己的调度逻辑。和你现在的差不多。
【解决方案2】:

使用 servlet 时,您将需要使用 doGetdoPost 方法,但是一旦调用这些方法,具体实现由您决定。我会简单地在doPost 方法中添加一个条件,以获取所需的功能。条件将根据传递给 servlet 的请求参数调用适当的方法。在我的示例中,我将参数 action 传递给 servlet,然后它使用它来识别要使用的方法。

public class MyServletextends HttpServlet {

   public void doPost(HttpServletRequest request, HttpServletResponse response)
         throws IOException, ServletException {
     if(request.getParameter("action").equals("methodA"){
        methodA();
     }else if(request.getParameter("action").equals("methodB"){
        methodB();
     }
   }

   public void methodA(){}
   public void methodB(){}
}

在 Javascript 中你只需要添加 action 参数:

 matchingData_X.action = "methodA"; //assuming matchignData_X is an object
 $.ajax({
        type: "POST",
        url: "MatchingServlet",
        data: matchingData_X,
  success: function(data) {
     $('.input_A).html(data);
     }
});
...
// Button B pressed
matchingData_X.action = "methodB"; //assuming matchignData_X is an object
$.ajax({
        type: "POST",
        url: "MatchingServlet",
        data: matchingData_Y,
  success: function(data) {
     $('.input_B).html(data);
     }
 });

【讨论】:

  • 感谢您的回答。由于我的积分限制,我不能给你积分:(
【解决方案3】:

尝试添加一个 parameters: 'someParam' ajax 调用中的部分,然后在 Servlet 上从请求中获取参数:

String param= request.getParameter("someParam");
            if (param.equals("someParam") {
                MethodA();
            }

【讨论】:

  • 这就是我现在正在做的事情,但对我来说这似乎不是“正确”的方式。
  • 我认为 Pierre Henry 的答案更符合您的要求。他提供了更多细节。这可能是关键 "url: "MatchingServlet?method=methodA""
猜你喜欢
  • 1970-01-01
  • 2014-04-07
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-27
  • 2014-03-26
  • 1970-01-01
相关资源
最近更新 更多