下面介绍JSP前台表单内容经过Ajax异步提交到后台Servlet进行校验(校验方式多种,包括提取数据库信息,校验用户名是否重复等),异步在JSP表单页面显示校验结果信息的基本过程。
1、说明:
1.因为本文只限于介绍JSP+Servlet+Ajax运用的基本流程,重点不在于后台数据库的访问和校验内容,所以省略Servlet对数据库的访问。
2、基本流程:
1. JSP页面login.jsp提供一个表单“form”,表单中有两个“text”类型的输入框,其中咱们将用第一个输入框来作实验。
在第一个输入框中(输入用户名),经过onblur=validate();,当用户光标离开输入框时,触发JS函数validate() ,函数validate()在Ajax.js文件中声明。javascript
- <%@page contentType="text/html" pageEncoding="UTF-8"%>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <script type="javascript" src="Ajax.js"></script>
- </head>
- <body>
- <h1>Test Ajax</h1><p>
- <form action="" method="get" name="form">
- <br>
- 输入用户名:
- <input type="text" size="10" maxlength="8" id="userName" name="name" onblur="validate()">
- <span id="info"></span>
- <br>
- 输入商品名:
- <input type="text" size="10" maxlength="8" >
- </form>
- </body>
- </html>
二、Ajax.js文件声明了一系列函数,用于完成向表单与servlet的中接处理。
2.一、函数validate()要点:
2.1.一、经过document.getElementById(String id)获取表单中有特定id值的输入框的值,即获取用户输入的用户名。
2.1.二、声明一个变量url,存放要访问的servlet:"validate.do?id=" + escape(idField.value),问号?后面表示在url后添加一个值,这个值在validate.do这个servlet中能够经过request.getParameter("id")来获取。html
- var url = "validate.do?id=" + escape(idField.value);
2.1.三、 经过if()语句以兼容IE,Firefox等多个浏览器版本的方式建立一个XMLHttpRequest对象。java
- if(window.XMLHttpRequest) {
-
- req = new XMLHttpRequest();
- }else if(window.ActiveXObject) {
-
- req = new ActiveXObject("Microsoft.XMLHTTP");
- }
2.1.四、调用XMLHttpRequest对象函数open()准备向servlet发送请求(此时只是“准备发送”,并无发送)web
- req.open("GET", url, true);
2.1.五、 调用XMLHttpRequest对象函数send(param)向servlet发送请求。param参数的值null(关于send()方法使用请另外查阅)数据库
2.1.六、调用一个触发事件onreadystatechange,每当 readyState 改变时,onreadystatechange 函数就会被执行。readyState有5个可能值:0:请求未初始化(在调用open()以前);1:请求已经提出(调用send()以前);2:请求已经发送(这里一般能够从响应获得内容头部);3:请求处理中(响应中一般有部分数据可用,可是服务器尚未完成响应);4:请求已经完成(能够访问服务器响应并使用它)浏览器
- req.onreadystatechange = callback;
2.二、function callback()要点:
2.2.1 XMLHttpRequest.status = 200表示服务器已经成功响应。
经过XMLHttpRequest.responseText获取servlet端的getPrintWriter().write()输出的响应。获得的值是 一个String类型数据。缓存
- var check = req.responseText;
2.三、经过show()函数输出结果到标签标记的位置。服务器
完整的Ajax.js文件:app
- var req;
- function validate() {
-
- var idField = document.getElementById("userName");
-
- var url = "validate.do?id=" + escape(idField.value);
-
- if(window.XMLHttpRequest) {
-
- req = new XMLHttpRequest();
- }else if(window.ActiveXObject) {
-
- req = new ActiveXObject("Microsoft.XMLHTTP");
- }
-
- req.open("GET", url, true);
-
- req.onreadystatechange = callback;
-
- req.send(null);
- }
-
- function callback() {
- if(req.readyState == 4 && req.status == 200) {
- var check = req.responseText;
- show (check);
- }
- }
-
- function show(str) {
- if(str == "OK") {
- var show = "<font color='green'>恭喜!!用户名可用!</font>";
- document.getElementById("info").innerHTML = show;
- }
- else if( str == "NO") {
- var show = "<font color='red'>对不起,用户名不可用!!请从新输入!</font>";
- document.getElementById("info").innerHTML = show;
- }
- }
3、servlet处理:
重点1:经过如下几行代码设置浏览器不进行Ajax处理页面的缓存(若是出现缓存,将致使一些不可预知的麻烦) 异步
- response.setContentType("text/html");
- response.setHeader("Cache-Control", "no-store");
- response.setHeader("Pragma", "no-cache");
- response.setDateHeader("Expires", 0);
重点2:经过request.getParameter()来获取Ajax传递的参数。
- String name = request.getParameter("id");
重点3:经过response.getWriter().write()向Ajax输出参数,在Ajax一端经过var check = XMLHttpRequest.responseText获取参数值。
- if(name.equals("1")) {
- out.write("OK");
- }
- else {
- out.write("NO");
- }
完整的servlet代码:
- package com.model;
-
- import java.io.IOException;
- import java.io.PrintWriter;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
-
-
- public class DoAjaxServlet extends HttpServlet {
-
- protected void processRequest(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- response.setContentType("text/html;charset=UTF-8");
- PrintWriter out = response.getWriter();
- try {
- response.setContentType("text/html");
- response.setHeader("Cache-Control", "no-store");
- response.setHeader("Pragma", "no-cache");
- response.setDateHeader("Expires", 0);
- String name = request.getParameter("id");
- if(name.equals("1")) {
- out.write("OK");
- }
- else {
- out.write("NO");
- }
- } finally {
- out.close();
- }
- }
-
- @Override
- protected void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- processRequest(request, response);
- }
-
- @Override
- protected void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- processRequest(request, response);
- }
-
- @Override
- public String getServletInfo() {
- return "Short description";
- }
-
- }
最后,记得在web.xml配置文件中配置这个servlet:
- <servlet>
- <servlet-name>DoAjaxServlet</servlet-name>
- <servlet-class>com.model.DoAjaxServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>DoAjaxServlet</servlet-name>
- <url-pattern>/validate.do</url-pattern>
- </servlet-mapping>