Servlet3.0与纯javascript通过Ajax交互的实例详解


Posted in Javascript onMarch 18, 2018

对于很多人来说应该很简单。不过还是写写,方便Ajax学习的后来者。

虽然js.html是一个纯静态的页面,但是以下的程序必须挂在Tomcat服务器上,才能做到Ajax交互,否则看不出效果的。

Eclipse for javaee注意把做好的工程挂在Tomcat上,才运行Tomcat。

本工程除了JSP必须的Servlet包以外,无须引入其它东西。其实想直接用一个JSP页面完成这个工程的,但是现在搞JSP的,基本上没有人直接在.jsp文件中写东西了吧?后台动作都扔到.java里面了。

一、基本目标

把前台js.html输入框输入的东西,传递到后台名称为ajaxRequest,地址/ajaxRequest的Servlet.java。Servlet.java后台再返回相应的信息给前台js.html,js.html不刷新无跳转,即时响应。

二、基本思想

由于是Servlet3.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对象XMLHttpRequest的命名,否则一些浏览器处理不了。

<!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貌似是JDK1.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使前台的代码变得更加简短的。

Javascript 相关文章推荐
拖动table标题实现改变td的大小(css+js代码)
Apr 16 Javascript
table行随鼠标移动变色示例
May 07 Javascript
深入理解javascript作用域和闭包
Sep 23 Javascript
JavaScript获取伪元素(Pseudo-Element)属性的方法技巧
Mar 13 Javascript
Bootstrap每天必学之栅格系统(布局)
Nov 25 Javascript
浅谈JS中的三种字符串连接方式及其性能比较
Sep 02 Javascript
Bootstrap框架实现广告轮播效果
Nov 28 Javascript
如何提高javascript加载速度
Dec 26 Javascript
js实现Tab选项卡切换效果
Jul 17 Javascript
JS删除数组里的某个元素方法
Feb 03 Javascript
详解jquery和vue对比
Apr 16 jQuery
vue 接口请求地址前缀本地开发和线上开发设置方式
Aug 13 Javascript
jQuery替换节点元素的操作方法
Mar 18 #jQuery
使用Angular CLI生成 Angular 5项目教程详解
Mar 18 #Javascript
分析javascript原型及原型链
Mar 18 #Javascript
jquery 实现拖动文件上传加载进度条功能
Mar 18 #jQuery
jQuery中each方法的使用详解
Mar 18 #jQuery
JavaScript中字符串的常用操作方法及特殊字符
Mar 18 #Javascript
js中DOM事件绑定分析
Mar 18 #Javascript
You might like
PHP文章按日期(月日)SQL归档语句
2012/11/29 PHP
Thinkphp的volist标签嵌套循环使用教程
2014/07/08 PHP
php中$_GET与$_POST过滤sql注入的方法
2014/11/03 PHP
幻宇的层模拟窗口效果-提供演示和下载
2007/01/20 Javascript
javascript 简练的几个函数
2009/08/29 Javascript
使用apply方法实现javascript中的对象继承
2013/12/16 Javascript
Angularjs编写KindEditor,UEidtor,jQuery指令
2015/01/28 Javascript
详解JavaScript中双等号引起的隐性类型转换
2016/05/30 Javascript
AngularJS入门教程之迭代器过滤详解
2016/08/18 Javascript
angular实现spa单页面应用实例
2017/07/10 Javascript
js图片轮播插件的封装
2017/07/21 Javascript
微信小程序上传图片到服务器实例代码
2017/11/07 Javascript
深入浅析angular和vue还有jquery的区别
2018/08/13 jQuery
使用layui 渲染table数据表格的实例代码
2018/08/19 Javascript
js正则取值的结果数组调试方法
2018/10/10 Javascript
vue项目前端错误收集之sentry教程详解
2019/05/27 Javascript
微信小程序实现折线图的示例代码
2019/06/07 Javascript
JS箭头函数和常规函数之间的区别实例分析【 5 个区别】
2020/05/27 Javascript
jQuery实现图片切换效果
2020/10/19 jQuery
Python列表(list)所有元素的同一操作解析
2019/08/01 Python
python函数局部变量、全局变量、递归知识点总结
2019/11/15 Python
PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译
2020/04/15 Python
浅谈keras中的目标函数和优化函数MSE用法
2020/06/10 Python
使用bandit对目标python代码进行安全函数扫描的案例分析
2021/01/27 Python
CSS3绘制六边形的简单实现
2016/08/25 HTML / CSS
HTML5 body设置全屏背景图片的示例代码
2020/12/08 HTML / CSS
介绍一下linux的文件系统
2015/10/06 面试题
如何拷贝一整个Java对象,包括它的状态
2013/12/27 面试题
Java Servlet的主要功能和作用是什么
2014/02/14 面试题
个人总结与自我评价
2014/09/18 职场文书
关于法制教育的宣传语
2015/07/13 职场文书
防溺水主题班会教案
2015/08/12 职场文书
go语言map与string的相互转换的实现
2021/04/07 Golang
一篇文章带你深入了解Mysql触发器
2021/08/02 MySQL
Python中递归以及递归遍历目录详解
2021/10/24 Python
一篇文章弄清楚Ajax请求的五个步骤
2022/03/17 Javascript