jsp ajax实例讲解

下面介绍JSP前台表单内容通过Ajax异步提交到后台Servlet进行校验(校验方式多种,包括提取数据库信息,校验用户名是否重复等),异步在JSP表单页面显示校验结果信息的基本过程。

一、说明:

1.由于本文只限于介绍JSP+Servlet+Ajax运用的基本流程,重点不在于后台数据库的访问和校验内容,因此省略Servlet对数据库的访问。

二、基本流程:

1. JSP页面login.jsp提供一个表单“form”,表单中有两个“text”类型的输入框,其中我们将用第一个输入框来做实验。

在第一个输入框中(输入用户名),通过onblur=validate();,当用户光标离开输入框时,触发JS函数validate() ,函数validate()在Ajax.js文件中声明。

Html代码  

  1. <%@page contentType="text/html" pageEncoding="UTF-8"%>
  2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  3. "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <script type="javascript" src="Ajax.js"></script>
  8. </head>
  9. <body>
  10. <h1>Test Ajax</h1><p>
  11. <form action="" method="get" name="form">
  12. <br>
  13. 输入用户名:
  14. <input type="text" size="10" maxlength="8" id="userName" name="name" onblur="validate()">
  15. <span id="info"></span>
  16. <br>
  17. 输入商品名:
  18. <input type="text" size="10" maxlength="8" >
  19. </form>
  20. </body>
  21. </html>

2、Ajax.js文件声明了一系列函数,用于完成向表单与servlet的中接处理。

2.1、函数validate()要点:

2.1.1、通过document.getElementById(String id)获取表单中有特定id值的输入框的值,即获取用户输入的用户名。

2.1.2、声明一个变量url,存放要访问的servlet:"validate.do?id=" + escape(idField.value),问号?后面表示在url后添加一个值,这个值在validate.do这个servlet中可以通过request.getParameter("id")来获取。

Js代码  

  1. var url = "validate.do?id=" + escape(idField.value);

2.1.3、 通过if()语句以兼容IE,Firefox等多个浏览器版本的方式创建一个XMLHttpRequest对象。

Java代码  

  1. if(window.XMLHttpRequest) {
  2. //IE7, Firefox, Opera支持
  3. req = new XMLHttpRequest();
  4. }else if(window.ActiveXObject) {
  5. //IE5,IE6支持
  6. req = new ActiveXObject("Microsoft.XMLHTTP");
  7. }

2.1.4、调用XMLHttpRequest对象函数open()准备向servlet发送请求(此时只是“准备发送”,并没有发送)

Js代码  

  1. req.open("GET", url, true);

2.1.5、 调用XMLHttpRequest对象函数send(param)向servlet发送请求。param参数的值null(关于send()方法使用请另外查阅)

Js代码  

  1. req.send(null);

2.1.6、调用一个触发事件onreadystatechange,每当 readyState 改变时,onreadystatechange 函数就会被执行。readyState有5个可能值:0:请求未初始化(在调用open()之前);1:请求已经提出(调用send()之前);2:请求已经发送(这里通常可以从响应得到内容头部);3:请求处理中(响应中通常有部分数据可用,但是服务器还没有完成响应);4:请求已经完成(可以访问服务器响应并使用它)

Js代码  

  1. req.onreadystatechange = callback;

2.2、function callback()要点:

2.2.1    XMLHttpRequest.status = 200表示服务器已经成功响应。

通过XMLHttpRequest.responseText获取servlet端的getPrintWriter().write()输出的响应。得到的值是 一个String类型数据。

Js代码  

  1. var check = req.responseText;

2.3、通过show()函数输出结果到标签标记的位置。

完整的Ajax.js文件:

Js代码  

  1. var req;
  2. function validate() {
  3. //获取表单提交的内容
  4. var idField = document.getElementById("userName");
  5. //访问validate.do这个servlet,同时把获取的表单内容idField加入url字符串,以便传递给validate.do
  6. var url = "validate.do?id=" + escape(idField.value);
  7. //创建一个XMLHttpRequest对象req
  8. if(window.XMLHttpRequest) {
  9. //IE7, Firefox, Opera支持
  10. req = new XMLHttpRequest();
  11. }else if(window.ActiveXObject) {
  12. //IE5,IE6支持
  13. req = new ActiveXObject("Microsoft.XMLHTTP");
  14. }
  15. /*
  16. open(String method,String url, boolean )函数有3个参数
  17. method参数指定向servlet发送请求所使用的方法,有GET,POST等
  18. boolean值指定是否异步,true为使用,false为不使用。
  19. 我们使用异步才能体会到Ajax强大的异步功能。
  20. */
  21. req.open("GET", url, true);
  22. //onreadystatechange属性存有处理服务器响应的函数,有5个取值分别代表不同状态
  23. req.onreadystatechange = callback;
  24. //send函数发送请求
  25. req.send(null);
  26. }
  27. function callback() {
  28. if(req.readyState == 4 && req.status == 200) {
  29. var check = req.responseText;
  30. show (check);
  31. }
  32. }
  33. function show(str) {
  34. if(str == "OK") {
  35. var show = "<font color=‘green‘>恭喜!!用户名可用!</font>";
  36. document.getElementById("info").innerHTML = show;
  37. }
  38. else if( str == "NO") {
  39. var show = "<font color=‘red‘>对不起,用户名不可用!!请重新输入!</font>";
  40. document.getElementById("info").innerHTML = show;
  41. }
  42. }

三、servlet处理:

重点1:通过以下几行代码设置浏览器不进行Ajax处理页面的缓存(如果出现缓存,将导致一些不可预知的麻烦)

Java代码  

  1. response.setContentType("text/html");
  2. response.setHeader("Cache-Control", "no-store");
  3. response.setHeader("Pragma", "no-cache");
  4. response.setDateHeader("Expires", 0);

重点2:通过request.getParameter()来获取Ajax传递的参数。

Java代码  

  1. String name = request.getParameter("id");

重点3:通过response.getWriter().write()向Ajax输出参数,在Ajax一端通过var check = XMLHttpRequest.responseText获取参数值。

Java代码  

  1. if(name.equals("1")) {
  2. out.write("OK");
  3. }
  4. else {
  5. out.write("NO");
  6. }

完整的servlet代码:

Java代码  

  1. package com.model;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. public class DoAjaxServlet extends HttpServlet {
  9. protected void processRequest(HttpServletRequest request, HttpServletResponse response)
  10. throws ServletException, IOException {
  11. response.setContentType("text/html;charset=UTF-8");
  12. PrintWriter out = response.getWriter();
  13. try {
  14. response.setContentType("text/html");
  15. response.setHeader("Cache-Control", "no-store");
  16. response.setHeader("Pragma", "no-cache");
  17. response.setDateHeader("Expires", 0);
  18. String name = request.getParameter("id");
  19. if(name.equals("1")) {
  20. out.write("OK");
  21. }
  22. else {
  23. out.write("NO");
  24. }
  25. } finally {
  26. out.close();
  27. }
  28. }
  29. @Override
  30. protected void doGet(HttpServletRequest request, HttpServletResponse response)
  31. throws ServletException, IOException {
  32. processRequest(request, response);
  33. }
  34. @Override
  35. protected void doPost(HttpServletRequest request, HttpServletResponse response)
  36. throws ServletException, IOException {
  37. processRequest(request, response);
  38. }
  39. @Override
  40. public String getServletInfo() {
  41. return "Short description";
  42. }
  43. }

最后,记得在web.xml配置文件中配置这个servlet:

Xml代码  

  1. <servlet>
  2. <servlet-name>DoAjaxServlet</servlet-name>
  3. <servlet-class>com.model.DoAjaxServlet</servlet-class>
  4. </servlet>
  5. <servlet-mapping>
  6. <servlet-name>DoAjaxServlet</servlet-name>
  7. <url-pattern>/validate.do</url-pattern>
  8. </servlet-mapping>
时间: 2024-11-08 18:52:10

jsp ajax实例讲解的相关文章

Ajax实例讲解与技术原理

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:AJAX即"Asynchronous Javascript And XML"(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术.AJAX 是一种用于创建快速动态网页的技术.通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新.解决传统的网页(不使用 AJAX)如果需要

(转)JAVA AJAX教程第三章—AJAX详细讲解

现在开始深入AJAX,这里还是按老思路,理论和实践相结合.这章的内容主要是讲解AJAX步骤详解,下一张将会用一个AJAX技术实现页面提示效果的实例来说明AJAX的实现. 一.AJAX步骤详解 AJAX实质上是遵循Request/Server模式来进行工作的,这个框架基本的流程包括下面几个具体的步骤: (1)       XMLHttpRequest对象初始化 (2)       发送请求 (3)       服务器接收请求并进行处理 (4)       服务器返回响应数据 (5)       客

JSP+Ajax网站开发小知识

一.JSP基础 1.<select  name="love"  size="3">其中的size属性指定了列表框显示选项的条数,如果所有选项多于这个数,将会出现滚动条. 2.addCookie(Cookie  cookie)方法将其放入客户端,获取Cookie对象可调用request对象的Cookie[]  getcookies()方法. Cookie   myCookie  =  new  Cookie("name",  "

js定时器的使用(实例讲解)

js定时器的使用(实例讲解) 作者: 字体:[增加 减小] 类型:转载 时间:2014-01-06我要评论 本篇文章主要介绍了js中定时器的使用方法.需要的朋友可以过来参考下,希望对大家有所帮助 在javascritp中,有两个关于定时器的专用函数,分别为: 1.倒计定时器:timename=setTimeout("function();",delaytime);2.循环定时器:timename=setInterval("function();",delaytime

jsp+ajax实现无刷新

jsp+ajax实现无刷新,鼠标离开文本框即验证用户名 jsp+ajax实现无刷新,鼠标离开文本框即验证用户名(本功能多用于注册) input.jsp(表单提交页面): %@ page contentType=text/html; charset=GBK % html style type=text/css !-- @import url(../aqgc/style_c.css); --jsp+ajax实现无刷新,鼠标离开文本框即验证用户名(本功能多用于注册) input.jsp(表单提交页面)

这是一份很详细的 Retrofit 2.0 使用教程(含实例讲解)(转)

前言 在Andrroid开发中,网络请求十分常用 而在Android网络请求库中,Retrofit是当下最热的一个网络请求库 今天,我将献上一份非常详细Retrofit v2.0的使用教程,希望你们会喜欢. 如果对Retrofit v2.0的源码感兴趣,可看文章:Android:手把手带你深入剖析 Retrofit 2.0 源码 目录 1. 简介 特别注意: 准确来说,Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装. 原因:网络请求的工作本质上是 OkHttp 完成,

Android 实例讲解HorizontalScrollView实现左右滑动

本博文主要讲解怎么使用HorizontalScrollView实现左右滑动的效果. HorizontalScrollView实际上是一个FrameLayout ,一般通过只放置一个LinearLayout子控件.如果要使其添加其他的控件,就使用LinearLayout子控件来添加其他的控件,最后达到丰富其内容的效果.其中,LinearLayout设置的orientation布局为Horizontal.HorizontalScrollView不可以和ListView同时用,因为ListView有自

多线程之间的通信实例讲解

                 多线程之间的通信实例讲解对于线程来说,说白了,就是一个函数,如果大家对于这章函数都有理解,那我对于操作系统,线程和进程间的通信会有一个新的认识!接下来我会对每一行代码进行注释,在此过程中,大家也可以对c语言有一个崭新的认识. 第一个函数,创建两个线程. #include <stdio.h>#include <pthread.h>    这个头函数要包含,因为我们后续用的函数都是系统调用,因此需要申请头函数   这样在编译的时候,就可以找到此函数的源

Java JUC之Atomic系列12大类实例讲解和原理分解

Java JUC之Atomic系列12大类实例讲解和原理分解 2013-02-21      0个评论       作者:xieyuooo 收藏    我要投稿 在java6以后我们不但接触到了Lock相关的锁,也接触到了很多更加乐观的原子修改操作,也就是在修改时我们只需要保证它的那个瞬间是安全的即可,经过相应的包装后可以再处理对象的并发修改,以及并发中的ABA问题,本文讲述Atomic系列的类的实现以及使用方法,其中包含: 基本类:AtomicInteger.AtomicLong.Atomic