js+ajax+jquery(2)(验证码例子,json格式,ajax中json传递数据,第三方转换json)

回顾:

验证码的一个例子:(用到了正则)

01_image.jsp(验证码图片)

<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page contentType="image/jpeg"  import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %>
<%!
    public Color getColor(){
        Random random = new Random();
        int r = random.nextInt(256);//0-255
        int g = random.nextInt(256);
        int b = random.nextInt(256);
        return new Color(r,g,b);
    }
    public String getNum(){
        String str = "";
        Random random = new Random();
        for(int i=0;i<4;i++){
            str += random.nextInt(10);//0-9
        }
        return str;
    }
%>
<%
    response.setHeader("pragma", "mo-cache");
    response.setHeader("cache-control", "no-cache");
    response.setDateHeader("expires", 0);
    
    BufferedImage image = new BufferedImage(80,30,BufferedImage.TYPE_INT_RGB);
    
    Graphics g = image.getGraphics();
    g.setColor(new Color(200,200,200));
    g.fillRect(0,0,80,30);
    
    
    for (int i = 0; i < 30; i++) {
        Random random = new Random();
        int x = random.nextInt(80);
        int y = random.nextInt(30);
        int xl = random.nextInt(x+10);
        int yl = random.nextInt(y+10);
        g.setColor(getColor());
        g.drawLine(x, y, x + xl, y + yl);
    }
    
    
    g.setFont(new Font("serif", Font.BOLD,16));
    g.setColor(Color.BLACK);
    String checkNum = getNum();//"2525"
    
    StringBuffer sb = new StringBuffer();
    for(int i=0;i<checkNum.length();i++){
        sb.append(checkNum.charAt(i)+" ");//"2 5 2 5"
    }
    g.drawString(sb.toString(),15,20);
    
    session.setAttribute("CHECKNUM",checkNum);//2525
    
    ImageIO.write(image,"jpeg",response.getOutputStream());
    out.clear();
    out = pageContext.pushBody();
%>
View Code

02_checkcode.jsp

<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>验证码检查</title>
    <script type="text/javascript" src="js/ajax.js"></script>
  </head>
  <body>
    
    <form>
        <table border="0" align="center">
            <tr>
                <th>验证码:</th>
                <td><input size="2" type="text" name="checkcode" id="checkcodeID" maxlength="4"/></td>
                <td><img src="01_image.jsp"/>
                <td id="res"></td>
            </tr>
        </table>
    </form>
    
    <script type="text/javascript">
        //去掉二边的空格
        function trim(str){"  zhaojun  "
            str = str.replace(/^\s*/,"");//"zhaojun  "     
            str = str.replace(/\s*$/,"");//"zhaojun"
            return str;     
        }
    </script>
    
    <script type="text/javascript">
        document.getElementById("checkcodeID").onkeyup = function(){
            var checkcode = this.value;
            checkcode = trim(checkcode);//2525
            if(checkcode.length == 4){
                //NO1)
                var ajax = createAJAX();
                //NO2)
                var method = "POST";
                var url = "${pageContext.request.contextPath}/checkRequest?time="+new Date().getTime();
                ajax.open(method,url);
                //NO3)
                ajax.setRequestHeader("content-type","application/x-www-form-urlencoded");
                //NO4)
                var content = "checkcode=" + checkcode;
                ajax.send(content);
            
                //--------------------------------------------------------等待
                
                //NO5)
                ajax.onreadystatechange = function(){
                    if(ajax.readyState == 4){
                        if(ajax.status == 200){
                            //NO6)
                            var tip = ajax.responseText;
                            
                            //NO7)
                            var img = document.createElement("img");
                            img.src = tip;
                            img.style.width = "14px";
                            img.style.height = "14px";
                            var td = document.getElementById("res");
                            td.innerHTML = "";
                            td.appendChild(img);
                        }
                    }
                }
            }else{
                //清空图片
                var td = document.getElementById("res");
                td.innerHTML = "";
            }
        }
    </script>    

  </body>
</html>
View Code

CheckcodeAction.java(stuts部分配置省略)

package cn.itcast.javaee.js.checkcode;

import java.io.PrintWriter;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

/**
 * 验证码检查
 * @author AdminTC
 */
public class CheckcodeAction extends ActionSupport{
    //客户端验证码
    private String checkcode;//2525
    //注入客户端验证码
    public void setCheckcode(String checkcode) {
        this.checkcode = checkcode;
    }
    /**
     * 验证
     */    
    public String check() throws Exception {
        //图片路径
        String tip = "images/MsgError.gif";
        //从服务器获取session中的验证码
        String checkcodeServer = (String) ActionContext.getContext().getSession().get("CHECKNUM");
        //将客户端的验证码与服务端的验证码进行比较
        if(checkcode.equals(checkcodeServer)){
            tip = "images/MsgSent.gif";
        }
        //以IO流的方式将tip变量的值输出到AJAX异步对象中
        HttpServletResponse response = ServletActionContext.getResponse();
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter pw = response.getWriter();
        pw.write(tip);
        pw.flush();
        pw.close();
        //以下方式不是最好的,但可以完成AJAX异步交互
        return null;
    }
}
View Code

 注意采用json和html传递数据中ajax返回的方法是一样的,http协议中的文件类型也是一样的

要求

1)掌握JSON及其应用

2)了解jQuery的背景和特点

3)理解js对象和jQuery对象的区别

4)掌握jQuery九类选择器及应用(上)

一)什么是JSON

1)JSON(Java Script Object Notation(记号,标记))是一种轻量级的数据交换语言,
        以文本字符串为基础,且易于让人阅读
        注意:XML就是一个重量级的数据交换语言
   (2)JSON采用完全独立于任何程序语言的文本格式,使JSON成为理想的数据交换语言

json的格式:(当然对象里面属性可以对象也可以对象数组)

一个对象用大括号{}:
var o={id:1,name:"哈哈"}

多个对象用[]:
[{...},{...},{...}]

二)JSON的作用

(1)简化创建自定义对象的方式

    注意:

JSON就是用JS语法来书写,所以必须放在<script>标签中
在用JS语法书写JSON时,最外面不要用""双引号(意思:json定义的部分不是字符串,这样书写是错误的:var p="id:1,name:"www",age:1";

不过可以将字符串的json对象转换成可以解析执行json对象,如下方式:

 

简单json对象例子:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>简化创建自定义对象的方式</title>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  </head>
  <body>
    
    <!-- js方式定义Person对象
    <script type="text/javascript">
        function Person(id,name,sal){
            this.id = id;
            this.name = name;
            this.sal = sal;
        }
        var p = new Person(1,"波波",7000);
        document.write("编号:" + p.id + "<br/>");
        document.write("姓名:" + p.name + "<br/>");
        document.write("薪水:" + p.sal + "<br/>");
    </script>
    -->
    
    <hr/>
    
    <!-- json方式定义Person对象 -->
        <script type="text/javascript">
        //采用js语言来书写
        var p = {id:1,name:"包包",sal:8000};
        //属性可以''或""符号
        //字符串必加''或""符号,其它类型不用加符号
        document.write("编号:" + p.id + "<br/>");
        document.write("姓名:" + p.name + "<br/>");
        document.write("薪水:" + p.sal + "<br/>");
    </script>
  </body>
</html>
View Code

对象数组例子:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>创建一个数组,数组中有三个对象</title>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  </head>
  <body>
    
    <script type="text/javascript">
        var ps = [
            {
                id:1,
                name:'哈哈'
            },
            {
                id:2,
                name:'呵呵'
            },
            {
                id:3,
                name:'嘻嘻'
            }
        ];
    </script>
    
    <script type="text/javascript">
        document.write("共有" + ps.length + "个学生<br/>");
        for(var i=0;i<ps.length;i++){
            document.write("编号:" + ps[i].id + "<br/>");
            document.write("姓名:" + ps[i].name + "<br/>");
        }
    </script>
    
  </body>
</html>
View Code

属性是数组(数组又可以简单数组和对象数组)例子:

    

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>创建一个对象,其它一个属性是数组</title>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  </head>
  <body>
    
    <script type="text/javascript">
        var p = {
            id:1,
            name:'哈哈',
            home:['湘潭','长沙','广州']
        };    
        for(var i=0;i<p.home.length;i++){
            document.write(p.home[i]+"  ");
        }                
    </script>
    
  </body>
</html>
View Code

布尔类型属性以及属性方法的定义(重点):

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>创建一个对象,使用function做为属性值</title>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  </head>
  <body>    
    <script type="text/javascript">        
        var p = {
            id:1,
            name:'哈哈',
            isLove:true,
            home:['广州','深圳'],
            show : function(str){
                alert("你是" + str);
            }
        };        
        //document.write(p.isLove?"已婚":"单身"+"<br/>");
        p.show("赵君");        
    </script>    
  </body>
</html>

(2)在AJAX中,json作为数据载体之一

注意:
JS可以直接解析JSON格式的文本,
前提是:该JSON必须采用JS格式书写的才行,
如果该JSON是采用Java格式写的,必须使用eval()函数转换后,方可被JS解析,
该eval("(...)")函数接收一个字符串格式的json内容。

(3)省份-城市-区域三级联动【Struts2(服务端部分省略,需要身体struts2-json-plugin.jar包支持) + JSON版】的例子:

       (JSON是不能完完全全替代XML的,只能在定义对象和数据交换语言方面替代  )

服务端返回的json格式:

请求省份返回城市json:; 返回县城json:

 

前端代码:

<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>省份-城市-区域三级联动【Struts2 + JSON版】</title>
    <script type="text/javascript" src="js/ajax.js"></script>
  </head>
  <body>
    
    <select id="provinceID" style="width:111px">
        <option>选择省份</option>
        <option>湖北</option>
        <option>湖南</option>
        <option>广东</option>
    </select>
    
    <select id="cityID" style="width:111px">
        <option>选择城市</option>
    </select>
    
    <select id="areaID" style="width:111px">
        <option>选择区域</option>
    </select>    
            
    <!-- 省份->城市 -->
    <script type="text/javascript">
        document.getElementById("provinceID").onchange = function(){
            //清空城市下拉框(清空的原因是,重新选择的时候,不能使用已有的数据)
            var cityElement = document.getElementById("cityID");
            cityElement.options.length = 1;
            //清空区域下拉框
            var areaElement = document.getElementById("areaID");
            areaElement.options.length = 1;
            
            var province = this[this.selectedIndex].innerHTML;
            if("选择省份" != province){
                //NO1)
                var ajax = createAJAX();
                //NO2)
                var method = "POST";
                var url = "${pageContext.request.contextPath}/findCityByProvinceRequest?time="+new Date().getTime();
                ajax.open(method,url);
                //NO3)
                ajax.setRequestHeader("content-type","application/x-www-form-urlencoded")
                //NO4)
                var content = "bean.province=" + province;
                ajax.send(content);
                
                //-------------------------------------------等待
                
                //NO5
                ajax.onreadystatechange = function(){
                    if(ajax.readyState == 4){
                        if(ajax.status == 200){
                            //NO6)返回JAVA格式的JSON文本
                            var jsonJAVA = ajax.responseText;
                            
                            //p所代表的是java格式的json文本,是不能直接被js执行的
                            //解决方案:将java格式的json文本,转成js格式的json文本
                            //如何做:用js提供的一个函数搞定
                            var jsonJS = eval("("+jsonJAVA+")");
                            
                            var array = jsonJS.cityList;
                            var size = array.length;
                            for(var i=0;i<size;i++){
                                var city = array[i];
                                var option = document.createElement("option");
                                option.innerHTML = city;
                                cityElement.appendChild(option);
                            }}}}}
    </script>
    
    <!-- 城市->区域 -->
    <script type="text/javascript">
        document.getElementById("cityID").onchange = function(){
            var areaElement = document.getElementById("areaID");
            areaElement.options.length = 1;
            var city = this[this.selectedIndex].innerHTML;
            if("选择城市" != city){
                //NO1)
                var ajax = createAJAX();
                //NO2)
                var method = "POST";
                var url = "${pageContext.request.contextPath}/findAreaByCityRequest?time="+new Date().getTime();
                ajax.open(method,url);
                //NO3)
                ajax.setRequestHeader("content-type","application/x-www-form-urlencoded")
                //NO4)
                var content = "bean.city=" + city;
                ajax.send(content);
                
                //------------------------------------------等待
                
                //NO5)
                ajax.onreadystatechange = function(){
                    
                    if(ajax.readyState == 4){
                        if(ajax.status == 200){    
                            //NO6)
                            var jsonJAVA = ajax.responseText;
                            var jsonJS = eval("("+jsonJAVA+")");
                            var array = jsonJS.areaList;
                            var size = array.length;
                            for(var i=0;i<size;i++){
                                var area = array[i];
                                var option = document.createElement("option");
                                option.innerHTML = area;
                                areaElement.appendChild(option);
                            }}}}}}
    </script>    
  </body>
</html>

三)使用第三方工具,将JavaBean对象/ListSetMap对象转成JSON

准备导入第三方jar包:

》commons-beanutils-1.7.0.jar
》commons-collections-3.1.jar
》commons-lang-2.5.jar
》commons-logging-1.1.1.jar
》ezmorph-1.0.3.jar
》json-lib-2.1-jdk15.jar      
View Code   

 

   (1)JavaBean----->JSON
        》JSONArray jsonArray = JSONArray.fromObject(city);
        》String jsonJAVA = jsonArray.toString();
   (2)List<JavaBean>----->JSON 
        》JSONArray jsonArray = JSONArray.fromObject(cityList);
        》String jsonJAVA = jsonArray.toString();
   (3)List<String>----->JSON 
        》JSONArray jsonArray = JSONArray.fromObject(stringList);
        》String jsonJAVA = jsonArray.toString(); 
   (4)Set<JavaBean>----->JSON 
        》JSONArray jsonArray = JSONArray.fromObject(citySet);
        》String jsonJAVA = jsonArray.toString();
   (5)Map<String,Object>----->JSON 
        》JSONArray jsonArray = JSONArray.fromObject(map);
        》String jsonJAVA = jsonArray.toString();
/**
 * 使用第三方工具,将JavaBean对象/List或Set或Map对象转成JSON 
 * @author AdminTC
 */
public class TestBean2Json {
    private static void javabean2json() {
        City city = new City(1,"广州");
        JSONArray jSONArray = JSONArray.fromObject(city);
        String jsonJAVA = jSONArray.toString();
        System.out.println(jsonJAVA);
        //[{"id":1,"name":"广州"}]
    }
    private static void list2json() {
        List<City> cityList = new ArrayList<City>();
        cityList.add(new City(1,"广州"));
        cityList.add(new City(2,"珠海"));
        JSONArray jSONArray = JSONArray.fromObject(cityList);
        String jsonJAVA = jSONArray.toString();
        System.out.println(jsonJAVA);
        //[{"id":1,"name":"广州"},{"id":2,"name":"珠海"}]
    }
    private static void set2json() {
        Set<City> citySet = new LinkedHashSet<City>();
        citySet.add(new City(1,"广州"));
        citySet.add(new City(2,"珠海"));
        JSONArray jSONArray = JSONArray.fromObject(citySet);
        String jsonJAVA = jSONArray.toString();
        System.out.println(jsonJAVA);
        //[{"id":1,"name":"广州"},{"id":2,"name":"珠海"}]
    }
    private static void javabeanlist2json() {
        List<City> cityList = new ArrayList<City>();
        cityList.add(new City(1,"中山"));
        cityList.add(new City(2,"佛山"));
        Province province = new Province(1,"广东",cityList);
        
        JSONArray jSONArray = JSONArray.fromObject(province);
        String jsonJAVA = jSONArray.toString();
        System.out.println(jsonJAVA);
        /*
          [
             {
              "id":1,
              "name":"广东"
              "cityList":[{"id":1,"name":"中山"},{"id":2,"name":"佛山"}],
             }
          ]
          */
    }
    private static void map2json() {
        
        List<City> cityList = new ArrayList<City>();
        cityList.add(new City(1,"中山"));
        cityList.add(new City(2,"佛山"));
        
        Map<String,Object> map = new LinkedHashMap<String,Object>();
        map.put("total",cityList.size());//表示集合的长度
        map.put("rows",cityList);//rows表示集合
        
        JSONArray jSONArray = JSONArray.fromObject(map);
        String jsonJAVA = jSONArray.toString();
        System.out.println(jsonJAVA);
        //[{"total":2,"rows":[{"id":1,"name":"中山"},{"id":2,"name":"佛山"}]}]
        
        jsonJAVA = jsonJAVA.substring(1,jsonJAVA.length()-1);
        System.out.println(jsonJAVA);
    }

四)总结JSON的特点

   (1)在客户端(特指PC浏览器),直接使用JavaScript语言解析JSON,无需第三方jar包
   (2)本质上,就是一个文本,只是该文本有特定的书写格式
   (3)可以使用第三方工具,将JavaBean对象或者List/Set/Map<JavaBean>对象转成JSON
   (4)优点:JSON与XML很相似,但是它更加轻巧,服务器只需发送一个html普通字符串,不用发送复杂的xml格式文档了
   (5)缺点:语法过于严谨,初学者可能觉得代码不易读,写错一点都不行
   (6)JSON本质上,就是用JS语法写的特殊文本记号,用JS可以直接解析

五)模拟jQuery库,体验使用第三方实用库的特点【图片隐藏与显示】

    学会:JS的封装思想
    学会:创建自定义对象和优化方法
    学会:引用第三方实用的库,该库中预定义大量实用的对象和函数
    学会:查阅第三方实用的库提供的API手册

一个显示隐藏图片的例子:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>模拟jQuery库,体验使用第三方实用库的特点【图片隐藏与显示】</title>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  </head>
  <body>
    
    <img src="images/zgl.jpg"/>
    
    <input id="hide" type="button" value="隐藏" style="position:absolute;top:250;left:50"/>
        &nbsp;&nbsp;&nbsp;&nbsp;
    <input id="show" type="button" value="显示" style="position:absolute;top:250;left:120"/>
    
    
    <script type="text/javascript">
        function Photo(){
            //相像
            var img = document.images[0];
            //隐藏方法
            this.hide = function(){
                img.style.visibility = "hidden";
            } 
            //显示方法
            this.show = function(){
                img.style.visibility = "visible";
            }
        }
    </script>    
        
    <script type="text/javascript">
        var p = new Photo();
        document.getElementById("hide").onclick = function(){
            p.hide();
        }
        document.getElementById("show").onclick = function(){
            p.show();
        }
    </script>

  </body>
</html>

优化标签对象的获取:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>模拟jQuery库,体验使用第三方实用库的特点【图片隐藏与显示】</title>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  </head>
  <body>
    
    <img src="images/zgl.jpg"/>
    
    <input id="hide" type="button" value="隐藏" style="position:absolute;top:250;left:50"/>
        &nbsp;&nbsp;&nbsp;&nbsp;
    <input id="show" type="button" value="显示" style="position:absolute;top:250;left:120"/>
    
    
    <script type="text/javascript">
        function Photo(){
            //相像
            var img = document.images[0];
            //隐藏方法
            this.hide = function(){
                img.style.visibility = "hidden";
            } 
            //显示方法
            this.show = function(){
                img.style.visibility = "visible";
            }
        }
    </script>    
        
    <script type="text/javascript">
        //$()表示定位指定的标签
        function $(str){
            //获取str变量的类型
            var type = typeof(str);
            //如果是string类型的话
            if(type == "string"){
                //截取字符串的第一个字符
                var first = str.substring(0,1);
                //如果是#号的话
                if("#" == first){
                    //获取#号之后的所有字符串
                    var end = str.substring(1,str.length);
                    //根据id定位标签
                    var element = document.getElementById(end);
                    //如果找到了
                    if(element != null){
                        //返回标签
                        return element;
                    }else{
                        alert("查无此标签");
                    }
                }else{
                
                }
            }else{
                alert("参数必须是字符串类型");
            }
        }
    </script>

    <script type="text/javascript">
        var p = new Photo();
        $("#hide").onclick = function(){
            p.hide();
        }
        $("#show").onclick = function(){
            p.show();
        }
    </script>
    
  </body>
</html>
View Code

继续优化将公共方法采用引用的方式:

js/photo.js

function Photo(){
    //相像
    var img = document.images[0];
    //隐藏方法
    this.hide = function(){
        img.style.visibility = "hidden";
    } 
    //显示方法
    this.show = function(){
        img.style.visibility = "visible";
    }
}
//$()表示定位指定的标签
function $(str){
    //获取str变量的类型
    var type = typeof(str);
    //如果是string类型的话
    if(type == "string"){
        //截取字符串的第一个字符
        var first = str.substring(0,1);
        //如果是#号的话
        if("#" == first){
            //获取#号之后的所有字符串
            var end = str.substring(1,str.length);
            //根据id定位标签
            var element = document.getElementById(end);
            //如果找到了
            if(element != null){
                //返回标签
                return element;
            }else{
                alert("查无此标签");
            }
        }else{
        
        }
    }else{
        alert("参数必须是字符串类型");
    }
}
View Code

html:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>模拟jQuery库,体验使用第三方实用库的特点【图片隐藏与显示】</title>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <script type="text/javascript" src="js/photo.js"></script>
  </head>
  <body>
    
    <img src="images/zgl.jpg"/>
    
    <input id="hide" type="button" value="隐藏" style="position:absolute;top:250;left:50"/>
        &nbsp;&nbsp;&nbsp;&nbsp;
    <input id="show" type="button" value="显示" style="position:absolute;top:250;left:120"/>
    
    <script type="text/javascript">
        var p = new Photo();
        $("#hide").onclick = function(){
            p.hide();
        }
        $("#show").onclick = function(){
            p.show();
        }
    </script>    
  </body>
</html>

 

posted @ 2017-05-22 20:45  假程序猿  阅读(254)  评论(0)    收藏  举报