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

Unit02: JSON 、 使用JSON实现数据交换 、 jQuery对AJAX的支持,编码问题的更多相关文章

  1. IT兄弟连 JavaWeb教程 jQuery对AJAX的支持

    jQuery对AJAX的支持 jQuery对Ajax请求的创建.发送.响应.注册数据处理函数.JSON的解析和缓存以及传参等都进行了相应的封装,同时也考虑了浏览器的兼容性问题. jQuery中对AJA ...

  2. 【JavaWeb】jQuery对Ajax的支持

    jQuery对Ajax的支持 jQuery对Ajax进行封装,提供了$.ajax()方法 语法:$.ajax(options) 常用设置项 说明 url 发送请求地址 type 请求类型get|pos ...

  3. IT兄弟连 JavaWeb教程 jQuery对AJAX的支持经典面试题

    1.简述对Ajax的理解 AJAX是Asynchronous JavaScript and Xml异步的JavaScript和Xml.它一种用来改善用户体验的技术其实质是使用XMLHttpReques ...

  4. jQuery九大选择器和jQuery对ajax的支持

    一.jQuery九大选择器 1)基本选择器: <body> <div id="div1ID">div1</div> <div id=&qu ...

  5. jQuery对ajax的支持

    有load,get,post和ajax四个方法都可以,其中后三个直接使用$.xx调用 使用方法大致相同,这里只介绍get和post方法 -------------------------------- ...

  6. IT兄弟连 JavaWeb教程 jQuery对AJAX的支持经典案例

    案例需求:编写用户登陆页面的验证码模块,在用户进行登陆时,输入验证码后不需要点击提交按钮,使用AJAX异步地向服务器发送验证验证码的请求.如果验证码正确,可以点击提交按钮,如果验证码输入错误,提示用户 ...

  7. 2016/4/2 json:js和jquery中轻量级数据交换格式 例: 窗口弹出 popwindow

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族 ...

  8. json:js和jquery中轻量级数据交换格式

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族 ...

  9. servlet与ajax数据交换(json格式)

    JSON数据格式: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于机器解析和生成. 它基于的一个子集. JSON采用完全独 ...

随机推荐

  1. 嵌套类,PIMPL

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  2. CSS: Grid Layout Module

    Grid Layout The CSS Grid Layout Module offers a grid-based layout system, with rows and columns, mak ...

  3. Centos下找不到eth0设备的解决方法

    问题描述: ifconfig命令无法找到eth0设备,且/etc/sysconfig/network-scripts/中只有ifcfg-lo文件,而没有ifcfg-eth0. 临时解决方法一: 使用命 ...

  4. Python模块化

    在Python中,一个.py文件就称之为一个模块(Module). 模块化的好处: 1.大大提高了代码的可维护性. 2.编写代码不必从零开始.当一个模块编写完毕,就可以被其他地方引用.我们在编写程序的 ...

  5. C++11_ Variadic Templates

    版权声明:本文为博主原创文章,未经博主允许不得转载. 这次主要介绍C++11的又一个新特性 Variadic Templates (可变模板参数) 它的实现类似于initializer_list< ...

  6. php远程文件包含截断问题

    今天在学习<白帽子讲web安全>一书是,提到一个php远程文件包含漏洞 可以从攻击者服务器中的一个写好的攻击脚本中远程执行命令 服务器中有漏洞的页面代码为: #test.php#error ...

  7. Sql Server- 性能优化辅助指标SET STATISTICS TIME ON和SET STATISTICS IO ON

    1.前言 对于优化SQL语句或存储过程,以前主要是用如下语句来判断具体执行时间,但是SQL环境是复杂多变的,下面语句并不能精准判断性能是否提高:如果需要精确知道CPU.IO等信息,就无能为力了. 1 ...

  8. echarts-detail---散点图

    data4 = [{ xAxis: result.AvgEvaluate, seriesId: ', name: '基干360综合分' }, { yAxis: evalue, seriesId: ', ...

  9. TF随笔-7

    求平均值的函数 reduce_mean axis为1表示求行 axis为0表示求列 >>> xxx=tf.constant([[1., 10.],[3.,30.]])>> ...

  10. HDU 1374

    http://acm.hdu.edu.cn/showproblem.php?pid=1374 已知三点坐标,求三点确定的圆的周长 #include <iostream> #include ...