• Unit02: JSON 、 使用JSON实现数据交换 、 jQuery对AJAX的支持,编码问题


      Unit02: JSON 、 使用JSON实现数据交换 、 jQuery对AJAX的支持  

    1. 编码问题

    (1)发送get请求

    为什么会产生乱码?

    ie浏览器提供的ajax对象,对中文会使用gbk来编码,非ie浏览器 会使用utf-8来编码。服务器端默认会使用"iso-8859-1"来解码, 所以会产生乱码。

    如何解决?

    step1. 在服务器端,统一使用"utf-8"来解码。
    <Connector URIEncoding="utf-8"/>

    step2. 浏览器端,使用encodeURI对中文进行编码。
    注: encodeURI函数会使用utf-8来编码。

    (2)发送post请求

    为什么会产生乱码?

    浏览器所提供的ajax对象都会使用utf-8对中文进行编码。 而服务器端会使用iso-8859-1来解码。

    如何解决?

    request.setCharacterEncoding("utf-8");

    2. JSON (Javascript Object Notation)

    (1)JSON是什么?

    是一种轻量级的数据交换格式。

    什么是数据交换?

    将数据转换成一种与平台无关的数据格式(比如xml),然后交给接收方 来处理。

    轻量级

    相对于xml,json文档更小,解析的速度更快。

    (2)基本语法

    表示一个对象

    {属性名:属性值,属性名:属性值...}
    注:
    a. 属性名必须使用双引号括起来。
    b. 属性的类型可以是string,number,true/false,null,object。
    c. 属性值如果是string,必须使用双引号括起来。

    表示由对象组成的数组

    [{},{},{}...]

    (3)使用json

    (1)java对象如何转换成json字符串。

    使用jackson工具提供的api。(ObjectMapper)

    (2)json字符串如何转换成javascript对象。

    使用javascript内置对象 JSON.parse()方法。

    3. jQuery对ajax的支持

    (1)$.ajax方法

    用法: $.ajax({});

    (2)load方法

    向服务器发送异步请求,然后将服务器返回的数据直接添加到符合要求的 节点之上。

    代码:

    src/main/java

    bean

    package bean;
    
    public class Stock {
        private String code;
        private String name;
        private int price;
        
        public String getCode() {
            return code;
        }
        public void setCode(String code) {
            this.code = code;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getPrice() {
            return price;
        }
        public void setPrice(int price) {
            this.price = price;
        }
    }
    Stock.java

    json

    package json;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.ObjectMapper;
    
    import bean.Stock;
    
    public class JsonTest {
        /*
         * 将java对象转换成json字符串
         */
        public static void test1() throws JsonProcessingException{
            Stock s = new Stock();
            s.setCode("600877");
            s.setName("中国嘉陵");
            s.setPrice(10);
            //使用jackson提供的工具来转换
            ObjectMapper om = 
                    new ObjectMapper();
            String jsonStr = 
                    om.writeValueAsString(s);
            System.out.println(jsonStr);
        }
        
        public static void test2() throws JsonProcessingException{
            List<Stock> stocks = 
                    new ArrayList<Stock>();
            for(int i = 0; i < 3; i ++){
                Stock s = new Stock();
                s.setCode("60087" + i);
                s.setName("中国嘉陵" + i);
                s.setPrice(10 + i);
                stocks.add(s);
            }
            ObjectMapper om = 
                    new ObjectMapper();
            String jsonStr = 
                    om.writeValueAsString(stocks);
            System.out.println(jsonStr);
        }
        
        
    
        public static void main(String[] args) 
                throws JsonProcessingException {
            test2();
        }
    
    }
    JsonTest.java

    web

    package web;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import com.fasterxml.jackson.databind.ObjectMapper;
    
    import bean.Stock;
    
    public class ActionServlet extends 
    HttpServlet{
        public void service(
                HttpServletRequest request,
                HttpServletResponse response)
        throws ServletException,IOException{
            response.setContentType(
                    "text/html;charset=utf-8");
            PrintWriter out = response.getWriter();
            String uri = 
                    request.getRequestURI();
            String action = 
                uri.substring(
                        uri.lastIndexOf("/"),
                        uri.lastIndexOf("."));
            System.out.println("action:" + action);
            if("/quoto".equals(action)){
                //返回几只股票的信息给客户端
                List<Stock> stocks = 
                    new ArrayList<Stock>();
                Random r = new Random();
                for(int i = 0; i < 8; i ++){
                    Stock s = new Stock();
                    s.setCode("60087" 
                    + r.nextInt(10));
                    s.setName("中国嘉陵" + r.nextInt(10));
                    s.setPrice(r.nextInt(1000));
                    stocks.add(s);
                }
                ObjectMapper om = 
                        new ObjectMapper();
                String jsonStr = 
                        om.writeValueAsString(stocks);
                System.out.println(jsonStr);
                out.println(jsonStr);
            }else if("/getNumber".equals(action)){
                //返回一个随机整数
                Random r = new Random();
                int number = r.nextInt(1000);
                System.out.println(number);
                out.println(number);
            }
        }
    }
    ActionServlet.java

    webapp

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <script type="text/javascript">
        /*
            使用json语法表示对象
        */
        function f1(){
            var obj = 
                {"code":"600877","name":"中国嘉陵",
                    "price":10};
            alert(obj.name);
        }
        function f2(){
            var obj = {"company":"达内科技",
                    "address":{
                        "city":"北京",
                        "street":"北三环西路",
                        "room":2046
                    }
            };
            alert(obj.address.street);
        }
        
        function f3(){
            var arr = [{"name":"Sally","age":22},
                       {"name":"Eric","age":32}];
            alert(arr[1].name);
        }
        
        //将json字符串转换成javascript对象
        function f4(){
            var str = '{"name":"Sally","age":22}';
            //调用javascript内置对象JSON提供的方法
            //来做转换。
            var obj = JSON.parse(str);
            alert(obj.name);
        }
        function f5(){
            var str = '[{"name":"Sally","age":22},' 
                        + '{"name":"Eric","age":32}]';
            //转换完后,得到的是一个数组。
            var arr = JSON.parse(str);
            alert(arr[1].name);
        }
    </script>
    </head>
    <body style="font-size:30px;">
        <a href="javascript:f5();">ClickMe</a>
    
    
    
    
    </body>
    </html>
    json.html
    <%@ page 
     contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <html>
    <head>
        <script type="text/javascript" 
            src="js/jquery-1.4.3.js">
        </script>
        <script type="text/javascript">
            $(function(){
                $('#a1').click(f2);
            });
            function f1(){
                $('#d1').load('getNumber.do');
            }
            function f2(){
                $.ajax({
                    "url":"getNumber.do",
                    "type":"get",
                    "dataType":"text",
                    "success":function(obj){
                        $('#d1').html(obj);
                    }
                });
            }
        </script>
        
    </head>
    <body style="font-size:30px;">
        <a id="a1" href="javascript:;">点这儿显示一个随机整数</a><br/>
        <div id="d1"></div>
    </body>
    </html>
    random.jsp
    <%@ page 
     contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <html>
    <head>
        <style>
            #d1{
                width:480px;
                height:350px;
                background-color:black;
                margin-left:350px;
                margin-top:20px;
            }
            #d2{
                color:yellow;
                background-color:red;
                height:32px;
            }
            table{
                color:white;
                font-style:italic;
                font-size:24px;
            }
        </style>
        <script type="text/javascript"
        src="js/jquery-1.4.3.js">
        </script>
        <script type="text/javascript">
            $(function(){
                //页面加载完成之后,
                //每隔一段时间执行quoto函数。
                setInterval(quoto,5000);
            });
            
            function quoto(){
                //利用jQuery提供的方法($.ajax)来
                //向服务器发送异步请求。
                $.ajax({
                    "url":"quoto.do",
                    "type":"get",
                    "dataType":"json",
                    "success":function(obj){
                        //处理服务器返回的数据
                        /*
                            obj是服务器返回的数据。
                            如果服务器返回的是json字符串,
                            会自动转换成对应的javascript对象。
                        */
                        //更新表格
                        $('#tb1').empty();
                        for(i = 0; i < obj.length; i ++){
                            var s = obj[i];
                            $('#tb1').append(
                            '<tr><td>' + s.code 
                            + '</td><td> ' + s.name 
                            + '</td><td>' + s.price 
                            + '</td></tr>');
                        }
                    },
                    "error":function(){
                        //服务器出错,在这儿处理
                    }
                    
                });
            }
            
            
        </script>
    </head>
    <body style="font-size:30px;">
        <div id="d1">
            <div id="d2">实时行情</div>
            <div id="d3">
                <table width="100%">
                    <thead>
                        <tr>
                            <td>代码</td>
                            <td>名称</td>
                            <td>价格</td>
                        </tr>
                    </thead>
                    <tbody id="tb1">
                    </tbody>
                </table>
            </div>
        </div>
    </body>
    </html>
    stock.jsp

    WEB-INF

    <?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_2_5.xsd" version="2.5">
      <servlet>
          <servlet-name>action</servlet-name>
          <servlet-class>web.ActionServlet</servlet-class>
      </servlet>
      <servlet-mapping>
          <servlet-name>action</servlet-name>
          <url-pattern>*.do</url-pattern>
      </servlet-mapping>
    </web-app>
    web.xml
      <dependencies>
          <dependency>
              <groupId>com.fasterxml.jackson.core</groupId>
              <artifactId>jackson-annotations</artifactId>
              <version>2.2.3</version>
          </dependency>
          <dependency>
              <groupId>com.fasterxml.jackson.core</groupId>
              <artifactId>jackson-core</artifactId>
              <version>2.2.3</version>
          </dependency>
          <dependency>
              <groupId>com.fasterxml.jackson.core</groupId>
              <artifactId>jackson-databind</artifactId>
              <version>2.2.3</version>
          </dependency>
      </dependencies>
    pom.xml

     扩展内容:

    服务端编码:java.net.URLEncoder.encode()

    服务端解码:java.net.URLDecoder.decode()

    package com.util;
    
    import java.io.UnsupportedEncodingException;
    /**
     * url转码、解码
     *
     * @author lifq 
     * @date 2015-3-17 下午04:09:35
     */
    public class UrlUtil {
        private final static String ENCODE = "UTF-8"; 
        /**
         * URL 解码
         *
         * @return String
         * @author lifq
         * @date 2015-3-17 下午04:09:51
         */
        public static String getURLDecoderString(String str) {
            String result = "";
            if (null == str) {
                return "";
            }
            try {
                result = java.net.URLDecoder.decode(str, ENCODE);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            return result;
        }
        /**
         * URL 转码
         *
         * @return String
         * @author lifq
         * @date 2015-3-17 下午04:10:28
         */
        public static String getURLEncoderString(String str) {
            String result = "";
            if (null == str) {
                return "";
            }
            try {
                result = java.net.URLEncoder.encode(str, ENCODE);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            return result;
        }
    
        /**
         * 
         * @return void
         * @author lifq
         * @date 2015-3-17 下午04:09:16
         */
        public static void main(String[] args) {
            String str = "唐胜伟";
            System.out.println(getURLEncoderString(str));
            System.out.println(getURLDecoderString(str));
            
        }
    
    }
    UrlUtil.java
  • 相关阅读:
    Mybatis中tinyint(1)数据自动转化为boolean处理
    使用spring-cloud-starter-bus-amqp做微服务配置刷广播,config-client配置 未刷新的 问题
    深入Spring Boot: 怎样排查 java.lang.ArrayStoreException
    springboot activiti 配置项详解
    MySQL_插入更新 ON DUPLICATE KEY UPDATE
    Maven:mirror和repository 区别
    ajax请求二进制流图片并渲染到html中img标签
    不要在工作中做滥竽充数的人
    获取客户端IP地址的三个HTTP请求头的区别
    web服务器获取请求客户端真实地址的方法
  • 原文地址:https://www.cnblogs.com/tangshengwei/p/6582487.html
Copyright © 2020-2023  润新知