Servlet 3.0与纯JavaScript通过Ajax交互的实例详解

作者:闭包旅人时间:2026-10-22 13:17:33浏览:416

本文详解如何使用Servlet 3.0配合纯JavaScript实现Ajax无刷新交互。通过@WebServlet注解简化配置,利用原生XMLHttpRequest对象处理前后端数据传递,展示从前端输入到后端接收并返回字符串的完整流程,无需引入jQuery等第三方库。

Servlet 3.0纯JavaScript Ajax交互实例详解

对于许多开发者而言,这或许是一个基础概念,但为了帮助后续学习Ajax技术的读者更清晰地理解,此处仍进行详细梳理。

尽管js.html是一个纯静态页面,但为了实现Ajax交互效果,该程序必须部署在Tomcat服务器上运行,否则无法观察到实际的交互结果。

在使用Eclipse for Java EE时,务必确保将构建好的工程正确部署到Tomcat服务器中,随后再启动Tomcat服务。

本工程除了JSP必需的Servlet相关包外,无需引入其他额外依赖。虽然理论上可以直接使用一个JSP页面完成此工程,但当前开发习惯中,很少有人直接在.jsp文件中编写逻辑,后台动作通常被移至.java文件中处理。

基本目标与实现思想

一、基本目标

将前台js.html中输入框的内容传递至后台名为ajaxRequest、地址为/ajaxRequest的Servlet.java。Servlet.java在后台处理后将相应信息返回给前台js.html,实现不刷新、无跳转的即时响应。

二、基本思想

由于采用Servlet 3.0,可以使用注解方式编写Servlet,无需在web.xml中编写任何配置,直接由Eclipse生成即可。

其中只需保留如下内容:


<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xmlns="http://java.sun.com/xml/ns/javaee" 
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
  version="3.0"> 
</web-app> 

制作过程与代码实现

三、制作过程

1、首先编写Servlet.java与js.html,两者的编写顺序无关紧要,因为在Ajax交互中,这两个文件是紧密耦合的,不可割裂看待。

先查看js.html,其HTML布局部分非常简单,甚至没有使用表单,仅包含两个输入框。

在创建Ajax对象XMLHttpRequest时,注意不要使用XMLHttpRequest这个关键字作为Ajax对象的命名变量,否则部分浏览器可能无法正确处理。


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Js</title> 
</head> 
 
<body> 
  <input type="text" id="param1" /> 
  <input type="text" id="param2" /> 
  <button onclick="ajax()">Go!</button> 
</body> 
</html> 
<script> 
  //创建Ajax对象,不同浏览器有不同的创建方法,其实本函数就是一个简单的new语句而已。  
  function createXMLHttpRequest() { 
    var XMLHttpRequest1; 
    if (window.XMLHttpRequest) { 
      XMLHttpRequest1 = new XMLHttpRequest(); 
    } else if (window.ActiveXObject) { 
      try { 
        XMLHttpRequest1 = new ActiveXObject("Msxml2.XMLHTTP"); 
      } catch (e) { 
        XMLHttpRequest1 = new ActiveXObject("Microsoft.XMLHTTP"); 
      } 
    } 
    return XMLHttpRequest1; 
  } 
  function ajax() { 
    //param1与param2就是用户在输入框的两个参数 
    var param1=document.getElementById("param1").value; 
    var param2=document.getElementById("param2").value; 
    var XMLHttpRequest1 = createXMLHttpRequest(); 
    //指明相应页面  
    var url = "./ajaxRequest"; 
    XMLHttpRequest1.open("POST", url, true); 
    //这里没法解释,你所有JavaScript的请求头都这样写就对了,不会乱码  
    XMLHttpRequest1.setRequestHeader("Content-Type", 
        "application/x-www-form-urlencoded"); 
    //对于ajaxRequest,本js.html将会传递param1与param2给你。  
    XMLHttpRequest1.send("param1=" + param1 + "¶m2=" + param2); 
    //对于返回结果怎么处理的问题  
    XMLHttpRequest1.onreadystatechange = function() { 
      //这个4代表已经发送完毕之后  
      if (XMLHttpRequest1.readyState == 4) { 
        //200代表正确收到了返回结果  
        if (XMLHttpRequest1.status == 200) { 
          //弹出返回结果  
          alert(XMLHttpRequest1.responseText); 
        } else { 
          //如果不能正常接受结果,你肯定是断网,或者我的服务器关掉了。  
          alert("网络连接中断!"); 
        } 
      } 
    }; 
  } 
</script> 

2、接下来是Servlet.java,虽然doGet与doPost方法都是在页面上打印内容,但采用了不同的形式。PrintStream是早期JDK的输出流,而PrintWriter似乎是JDK 1.4之后的输出流。不过这部分内容较为简单,输入输出流处理是Java开发的必修课。 js.html将param1与param2传递给此Servlet.java后,等待Servlet.java打印出相应内容,随后在前台直接通过XMLHttpRequest1.responseText变量读取出来。


package jsServletAjax; 
import java.io.*;  
import javax.servlet.*;  
import javax.servlet.http.*;  
import javax.servlet.annotation.*;  
  
//说明这个Servlet是没有序列号的  
@SuppressWarnings("serial")  
//说明这个Servlet的名称是ajaxRequest,其地址是/ajaxRequest 
//这与在web.xml中设置是一样的  
@WebServlet(name = "ajaxRequest", urlPatterns = { "/ajaxRequest" })  
public class Servlet extends HttpServlet {  
  //放置用户之间通过直接在浏览器输入地址访问这个servlet  
  protected void doGet(HttpServletRequest request,  
      HttpServletResponse response) throws ServletException, IOException {  
    PrintStream out = new PrintStream(response.getOutputStream());  
    response.setContentType("text/html;charSet=utf-8");  
    out.print("请正常打开此页"); 
  }  
  
  protected void doPost(HttpServletRequest request,  
      HttpServletResponse response) throws ServletException, IOException { 
    response.setContentType("text/html; charset=utf-8"); 
    PrintWriter pw = response.getWriter(); 
    request.setCharacterEncoding("utf-8"); 
    String param1=request.getParameter("param1"); 
    String param2=request.getParameter("param2");     
    pw.print("前台传来了参数:param1="+param1+",param2="+param2); 
    pw.flush(); 
    pw.close(); 
  }  
}  

总结

四、总结 以上示例采取了纯粹的JavaScript完成Ajax交互。Servlet.java仅仅向js.html传递了一个字符串! 其实可以利用jQuery使前台的代码变得更加简短的。

其实可以利用jQuery使前台的代码变得更加简短的。

作者最新文章