java - 将 AJAX 与 servlet 一起使用

标签 java ajax jsp servlets

我刚刚开始使用 AJAX。尽管我在互联网上找到了一些教程并开始工作,但我对很多事情都不确定。我很抱歉粘贴了很多代码,但我不太清楚我哪里出错了。不过还是谢谢你的帮助! :-)

这是我的 JSP(仅 javascript 部分)和 servlet 代码:(后面是异常,后面是我将用于普通 Java 应用程序的等效 Java 代码):

JSP:

//--Function to get the xmlhttp object
function getHttpObject(){
    var xmlhttp = null;
    if (window.XMLHttpRequest){xmlhttp=new XMLHttpRequest();}
    else if (window.ActiveXObject){xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");}
    else {alert("Your browser does not support XMLHTTP!");}
    return xmlhttp;
}   

function populateReply(str){
    xmlhttp = getHttpObject();
    xmlhttp.onreadystatechange=function(){
        if(xmlhttp.readyState==4){
            ajxfrm.chatresponse.value=xmlhttp.responseText;
        }
    }
    xmlhttp.open("GET","NewServlet?chatinput="+str,true);
    xmlhttp.send(null);
}

Servlet:

public class NewServlet extends HttpServlet implements Servlet {

NetworkAimlFacade aiml = null;
int status = 0;
String botName;
String param[];
GraphBuilder builder;


public NewServlet() throws Exception{
    super();

    aiml = new NetworkAimlFacade(param);
    builder = aiml.getNetworkGraphBuilder();
    builder.addDirectoryUnlessAlreadyAdded
    (
        "C:\\Program Files\\RebeccaAIML\\aiml\\annotated_alice"
    );
    builder.createGraph();
    botName = builder.getBotPredicate("name");

}

private String handleRequest(String param){
    return null;
}

public void destroy()
{
    try{
    aiml.destroy();
    }catch(Exception e){
        e.printStackTrace();
    }
}

protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{

    res.setContentType("text/xml");
    res.setHeader("Cache-Control", "no-store, no-cache");
    String input = "";
    if(req.getParameter("chatinput") != null) 
        input = req.getParameter("chatinput");
    try{
        String response = builder.getResponse(input);
        if(response!=null)    res.getWriter().write(response);
            else res.getWriter().write("No");
    }catch(Exception e){
        e.printStackTrace();
    }

}

protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

}}

这是我得到的错误,而不是从 servlet 获取响应:

Apache Tomcat/7.0.11 - 错误报告

HTTP 状态 500 -

类型异常报告

消息

描述 服务器遇到内部错误 (),导致其无法完成此请求。

异常>

    javax.servlet.ServletException: Error instantiating servlet class NewServlet
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:498)  
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)   
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)   
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:394) 
    org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)  
    org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)    
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)    
    java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    java.lang.Thread.run(Thread.java:619)

root cause

java.lang.NullPointerException  Ice.PropertiesI.<init>(PropertiesI.java:250)
    Ice.Util.createProperties(Util.java:29)
    Ice.Util.initialize(Util.java:70)
    Ice.Util.initialize(Util.java:49)
    Ice.Util.initialize(Util.java:56)
    rebecca.NetworkGraphBuilderAIML.<init>(Unknown Source)    
    rebecca.NetworkAimlFacade.<init>(Unknown Source)  
    NewServlet.<init>(NewServlet.java:27)
    sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)   sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    java.lang.Class.newInstance0(Class.java:355)
    java.lang.Class.newInstance(Class.java:308)
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:498)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:394)
    org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)
    org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
    java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    java.lang.Thread.run(Thread.java:619)

note The full stack trace of the root cause is available in the Apache Tomcat/7.0.11 logs.

Apache Tomcat/7.0.11

Here's the equivalent Java code, that I use in a normal Java application, and it works fine!

  public class Console {

  public static void main(String args[]) {
  NetworkAimlFacade aiml = null;
  int status = 0;
  try {
    aiml = new NetworkAimlFacade(args);
    GraphBuilder builder = 
        aiml.getNetworkGraphBuilder();
    builder.addDirectoryUnlessAlreadyAdded
    (
      "C:\\Program Files\\RebeccaAIML\\aiml\\annotated_alice"
    );
    builder.createGraph();
    String botName = 
        builder.getBotPredicate("name");
    String initialResponse = 
        builder.getResponse("connect");
    System.out.println(botName + " says: " + 
        initialResponse);
    while(true) {
      System.out.print("You say> ");
      BufferedReader br = 
        new BufferedReader(new 
            InputStreamReader(System.in));
      String input = br.readLine();
      if(input.equals("/exit")) {
        break;
      } else {

String response = 
            builder.getResponse(input);
        System.out.println("=====================");
        //Print out what Rebecca says.
        System.out.println(botName + " says: " + 
            response);
        }
    }
    aiml.destroy();
    } catch(NetworkException e) {
      e.printStackTrace();
      status = 1;
    } catch (Exception e) {
      e.printStackTrace();
      status = 1;
    }
    System.exit(status);
  }
}

最佳答案

以下是您的异常(exception)情况的相关摘录:

javax.servlet.ServletException: Error instantiating servlet class NewServlet
  ...
java.lang.NullPointerException 
  Ice.PropertiesI.<init>(PropertiesI.java:250)
  Ice.Util.createProperties(Util.java:29)
  Ice.Util.initialize(Util.java:70)
  Ice.Util.initialize(Util.java:49)
  Ice.Util.initialize(Util.java:56)
  rebecca.NetworkGraphBuilderAIML.<init>(Unknown Source)
  rebecca.NetworkAimlFacade.<init>(Unknown Source)
  NewServlet.<init>(NewServlet.java:27)
  ...

换句话说,当容器尝试执行以下操作时

Servlet serlvet = new NewServlet();

它失败了,因为 PropertiesI 类的构造函数中的某些内容(第 250 行)期望某个对象不为 null 并尝试直接访问它,而不事先检查是否它是否为null。检查第 250 行 PropertiesI 类的源代码并进行相应修复。

这一切都与 ajax 或 servlet 无关。了解如何解释异常和堆栈跟踪。

关于java - 将 AJAX 与 servlet 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10350433/

相关文章:

java - 配置 Dispatcher 以进行 akka 日志记录

Javascript 发布数组显示语法错误

javascript - 如何使用 Javascript 和 AJAX 在索引页面上呈现弹出窗口 Ruby on Rails 5

java - Netbeans错误: Schema doesnt exist

java - 排除 if 的最佳方法,因为 if 会调用多个方法

java - 如何解决异常 [Error loading application.groovy due to [java.lang.ArrayIndexOutOfBoundsException] : 0] when deploying war?

java - String java 或 javascript 中的 Trim 和 <br> 标签

java - 何时创建 Maven 子模块

jquery - 通过 AJAX 回调修改 DOM 时 Bootstrap Modal 消失

javascript - 在 JSP 中以矩阵形式显示图像