JAVA AJAX教程第一章-初始AJAX

既然是認識AJAX,理論和實踐相結合,這樣讓自己學的更快,理解更深入,我分一下幾點:

1、  認識傳統的同步交互方式和AJAX解決方案

2、  AJAX使用到的技術

3、  實例體驗AJAX

 

一、同步交互方式和AJAX解決方案

傳統的WEB應用是同步交互的方式,這種同步交互方式的處理過程如下圖

 

什麼是同步交互方式:

首先,用戶向HTTP服務器提交一個處理請求。接着,服務器端接收到請求後,按照預先編寫好的程序中的業務邏輯進行處理,比如和數據庫服務器進行數據信息交換。最後,服務器對請求進行響應,將結果返回給客戶端,返回一個HTML在瀏覽器中顯示,通常會有CSS樣式豐富頁面的顯示效果。

同步交互的不足之處,會給用戶一種不連貫的體驗,當服務器處理請求時,用戶只能等待狀態,頁面中的顯示內容只能是空白。

 

AJAX解決方案

AJAX採用的異步交互的處理方式,很好的解決不連貫的用戶體驗,處理過程如圖:

 

 

二、AJAX使用的技術

1JavaScript腳本

2XHTMLCSS

3DOM

4XMLXSTL

5XMLHTTPRequest

 

 

三、實例體驗AJAX

首先,佈置好開發環境:

JDK 1.4以上,我使用1.6

Eclipse 3.1以上,我使用3.4

Tomcat 5.0以上,我使用6.0

MySql 4以上,我使用5.0

如果你沒有十足的把握請搭建和我一樣的環境。

 

實例1

我先做一個傳統同步交互的實例,然後同AJAX的異步交互進行對比。

這裏還要介紹下J2EE中經常提到的MVC模式:

MVC模式,即模型—視圖—控制器模式,核心是代碼分爲相對獨立的3個組成部分,其功能如下:

模型(Model),業務邏輯層。實現業務邏輯、狀態管理的功能。

視圖(View),表示層。即實現與用戶交互的界面,通常實現數據的輸入和輸出功能。

控制器(Control),控制層。起到控制整個業務流程的作用,實現ViewModel部分的協同工作。

Model2中,採用Servlet作爲控制器,負責接收客戶端Web瀏覽器發送來的所有請求,並依據處理的不同結果,轉發到對應的JSP頁面實現在瀏覽器客戶端的顯示。

Model2模式工作如下:

 

好現在就開始寫代碼來實現上面的原理了:

要有三個東西,如下:

一個頁面,也就是View,先制定好是login.jsp,用來登陸的;

一個Servlet,也就是Model,用來作爲控制層。

好了,奇怪爲什麼沒有Control,也就是沒有控制器呢?後面就知道咯!

下面是Eclipse中的層次結果:

 

 

login.jsp代碼如下:

<%@ page contentType="text/html; charset=UTF-8" language="java"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<%

    String result = (String)session.getAttribute("result");

    if(result != null && result != ""){

       if(result.equals("ok")){

           out.println("<script>window.alert('熱烈的歡迎你!')</script>");

       }else{

           out.println("<script>winodw.alert('對不起,登陸失敗!')</script>");

       }

       session.invalidate();

    }

%>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">

<title>Insert title here</title>

</head>

<body>

<form action="login" method="post">

用戶名:<input type="text" name="uname">

密碼:<input type="password" size="20" name="pwd">

<input type="submit" value="login">

</form>

</body>

</html>

 

 

LoginAction.java代碼如下:

package classmate;

 

import java.io.IOException;

 

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

 

public class LoginAction_refersh extends HttpServlet {

 

       @Override

       protected void service(HttpServletRequest req, HttpServletResponse resp)

                     throws ServletException, IOException {

              // TODO Auto-generated method stub

              String uname = req.getParameter("uname");

              String pwd = req.getParameter("pwd");

              String target = "";

              HttpSession session = req.getSession();

              if(uname.equals("yhw")&&pwd.equals("admin")){

                     session.setAttribute("result", "ok");

                     target = "/ajaxtest/login.jsp";

              }else{

                     session.setAttribute("result", "wrong");

                     target = "/ajaxtest/login.jsp";

              }

              resp.sendRedirect(target);

       }

 

}

 

 

 

web.xml代碼如下:

<?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"

        xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

        id="WebApp_ID"

        version="2.5">

  <display-name>ajaxtest</display-name>

  <servlet>

    <servlet-name>login</servlet-name>

    <servlet-class>classmate.LoginAction</servlet-class>

  </servlet>

  <servlet-mapping>

    <servlet-name>login</servlet-name>

    <url-pattern>/login</url-pattern>

  </servlet-mapping>

  <welcome-file-list>

    <welcome-file>login.jsp</welcome-file>

  </welcome-file-list>

</web-app>

 

這樣就完成了一個傳統同步交互了哦。看看你的成果。

 

實例2

做完了同步交互,現在要來正式體驗AJAX異步體驗了哦。注意的是,現在要使用MySql,而且也涉及到了採用AJAX後的MVC設計模式:

MySql就不說了,你要做的準備就是安裝好MySql數據庫,和下一個驅動JAR包。

採用AJAX後的MVC設計模式,如圖:

 

文件層次如下:

 

 

先來看View,視圖部分的代碼,login.jsp:

<%@ page language="java" contentType="text/html; charset=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">

<title>Insert title here</title>

</head>

<body>

<script language="javascript">

var XMLHttpReq = false;

function createXMLHttpRequest(){

    if(window.XMLHttpRequest){

       XMLHttpReq = new XMLHttpRequest();

    }else if(window.ActiveXObject){

       try{

           XMLHttpReq = new ActiveXObject("MSXML2.XMLHTTP");

       }catch(e){

           try{

              XMLHttpReq = new ActiveXObject("Mircsoft.XMLHTTP");

           }catch(e1){}

       }

    }

}

function sendRequest(url){

    createXMLHttpRequest();

    XMLHttpReq.open("GET",url,true);

    XMLHttpReq.onreadystatechange = processResponse;

    XMLHttpReq.send(null);

}

function processResponse(){

    if(XMLHttpReq.readyState == 4){

       if(XMLHttpReq.status == 200){

           var res = XMLHttpReq.responseXML.getElementsByTagName("res")[0].firstChild.data;

           window.alert(res);

           document.myform.uname.value="";

           document.myform.pwd.value="";

       }else{

           window.alert("你請求的頁面有異常");

       }

    }

}

function userCheck(){

    var uname = document.myform.uname.value;

    var pwd = document.myform.pwd.value;

    if(uname == ""){

       window.alert("用戶名不能爲空");

       document.myform.pwd.value="";

       document.myform.uname.focus();

       return false;

    }else{

       sendRequest("login?uname="+uname+"&pwd="+pwd);

    }

}

</script>

<form action="" method="post" name="myform">

用戶名:<input type="text" name="uname">

密碼:<input type="password" size="20" name="pwd">

<input type="button" value="login" onclick="userCheck()">

</form>

</body>

</html>

 

現在講解下採用AJAX的幾步驟:

1、  在瀏覽器客戶端創建對應的XMLHttpRequest

如上代碼中的:

function createXMLHttpRequest(){

    if(window.XMLHttpRequest){

       XMLHttpReq = new XMLHttpRequest();

    }else if(window.ActiveXObject){

        try{

           XMLHttpReq = new ActiveXObject("MSXML2.XMLHTTP");

       }catch(e){

           try{

              XMLHttpReq = new ActiveXObject("Mircsoft.XMLHTTP");

           }catch(e1){}

       }

    }

}

根據不同的瀏覽器創建對應的XMLHttpRequest對象

2、  當用戶點擊按鈕提交請求後,通過內置的AJAX核心對象XMLHttpRequest以異步的方式發送請求,如上代碼中的:

function userCheck(){

    var uname = document.myform.uname.value;

    var pwd = document.myform.pwd.value;

    if(uname == ""){

       window.alert("用戶名不能爲空");

       document.myform.pwd.value="";

       document.myform.uname.focus();

       return false;

    }else{

       sendRequest("login?uname="+uname+"&pwd="+pwd);

    }

}

function sendRequest(url){

    createXMLHttpRequest();

    XMLHttpReq.open("GET",url,true);

    XMLHttpReq.onreadystatechange = processResponse;

    XMLHttpReq.send(null);

}

3、  在請求提交後爲AJAX核心對象的XMLHttpRequest指定好響應的函數後,該監聽器就開始監聽工作。

如上代碼中的:

function processResponse(){

    if(XMLHttpReq.readyState == 4){

       if(XMLHttpReq.status == 200){

           var res = XMLHttpReq.responseXML.getElementsByTagName("res")[0].firstChild.data;

           window.alert(res);

           document.myform.uname.value="";

           document.myform.pwd.value="";

       }else{

           window.alert("你請求的頁面有異常");

       }

    }

}

其中

var res = XMLHttpReq.responseXML.getElementsByTagName("res")[0].firstChild.data;

用戶解析由服務器端返回的XML的格式。

 

 

 

DB.java代碼如下

package classmate;

 

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

 

public class DB {

      

       Connection conn = null;

       Statement stmt = null;

       ResultSet rs = null;

      

       public DB(){

              try{

                     Class.forName("com.mysql.jdbc.Driver");

                     //System.out.println("classdb");

              }catch(java.lang.ClassNotFoundException e){

                     e.printStackTrace();

              }

       }

      

       public ResultSet executeQuery(String sql){

              try{

                     conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/ajaxtest", "root", "888888");

                     //System.out.println("conn");

                     stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

                     //System.out.println("stmt");

                     rs = stmt.executeQuery(sql);

                     //System.out.println("rs");

              }catch(SQLException e){

                     e.printStackTrace();

              }

              return rs;

       }

      

       public int executeUpdate(String sql){

              int result = 0;

              try{

                     conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/ajaxtest?useunicode=true&characterEncoding=GBK", "root", "888888");

                     stmt = conn.createStatement();

                     result = stmt.executeUpdate(sql);

              }catch(SQLException e){

                     System.out.println(e.getMessage());

              }

              return result;

       }

      

       public void close(){

              if(rs != null){

                     try{

                            rs.close();

                     }catch(Exception e1){

                            e1.printStackTrace();

                     }

              }

              if(stmt != null){

                     try{

                            stmt.close();

                     }catch(Exception e1){

                            e1.printStackTrace();

                     }

              }

              if(conn != null){

                     try{

                            conn.close();

                     }catch(Exception e1){

                            e1.printStackTrace();

                     }

              }

       }

      

}

 

 

LoginAction.java代碼如下:

package classmate;

 

import java.io.IOException;

import java.io.PrintWriter;

import java.sql.ResultSet;

import java.sql.SQLException;

 

import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

public class LoginAction extends HttpServlet {

 

       @Override

       protected void doGet(HttpServletRequest req, HttpServletResponse resp)

                     throws ServletException, IOException {

              // TODO Auto-generated method stub

              req.setCharacterEncoding("UTF-8");

              String uname = req.getParameter("uname");

              String pwd = req.getParameter("pwd");

              resp.setContentType("text/xml;charset=UTF-8");

              resp.setHeader("Cache-Control", "no-cache");

              PrintWriter out = resp.getWriter();

              out.println("<response>");

              DB db = new DB();

              ResultSet rs;

              String strSql = null;

              strSql = "select * from classuser where username='" + uname + "' and password='"

                                   + pwd + "';";

              rs = db.executeQuery(strSql);

              try{

                     if(rs.next()){

                            out.println("<res>" + "熱烈歡迎" + "</res>");

                     }else{

                            out.println("<res>" + "登陸失敗" + "</res>");

                     }

              }catch(SQLException e){

                     e.printStackTrace();

              }

              out.println("</response>");

              out.close();

       }

 

       @Override

       protected void doPost(HttpServletRequest req, HttpServletResponse resp)

                     throws ServletException, IOException {

              // TODO Auto-generated method stub

              super.doGet(req, resp);

       }

 

       @Override

       public void init(ServletConfig config) throws ServletException {

              // TODO Auto-generated method stub

             

       }

 

}

 

 

web.xml代碼如下:

<?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"

        xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

        id="WebApp_ID"

        version="2.5">

  <display-name>ajaxtest</display-name>

  <servlet>

    <servlet-name>login</servlet-name>

    <servlet-class>classmate.LoginAction</servlet-class>

  </servlet>

  <servlet-mapping>

    <servlet-name>login</servlet-name>

    <url-pattern>/login</url-pattern>

  </servlet-mapping>

  <welcome-file-list>

    <welcome-file>login.jsp</welcome-file>

  </welcome-file-list>

</web-app>

 

 

這樣就完成了AJAX實踐咯。

 

 

有聯繫請聯繫QQ540528747,我也在學習AJAX,大家一起研究,歡迎各位朋友一起交流技術。

發佈了32 篇原創文章 · 獲贊 34 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章