案例需求:客户端发送AJAX请求服务器端获取用户信息的数据。

案例实现:

在服务器端要将Java对象转换成JSON字符串,如果使用拼接JSON字符串的方式非常繁琐,并且非常容易出错,所以一般会借助第三方Jar包来辅助我们把Java对象编程JSON字符串。

在服务器端将单个Java对象转换成JSON字符串使用JSONObject类的静态方法:formObject (Object object),该方法返回一个JSONObject对象,调用该对象的toString()方法即可完成转换。

在客户端将JSON字符串转换为JavaScript对象,常用的方法有如下几种:

●  使用eval函数:

var jsonStr = '{"id":1,"name":"张三"}';

var obj = eval( " ( " + str + " ) " );

●  使用JSON.parse函数

var jsonStr = '{"id":1,"name":"张三"}';

var obj = JSON.parse(str);

可以发现使用JSON.parse函数可以更方便的将JSON字符串转换为JavaScript对象,这也是推荐的方式。

下面的案例将演示如何使用Ajax从服务器端查询一个用户信息并使用json-lib.jar工具包将用户对象转换为JSON字符串然后返回到客户端。

首先新建一个动态的Web工程,工程名为xdl_ajax_demo,项目构建成功后在lib目录下添加json-lib.jar以及它的依赖包:

●  commons-beanutils.jar

●  commons-collections.jar

●  common-logging.jar

●  common-lang.jar

●  ezmorph.jar

●  json-lib.jar

然后再新建com.xdl.bean包并在包下定义一个User类,用来封装用户数据,包括以下属性:

name:姓名

age:年龄

gender:性别

salary:薪水

User类的详细代码如下:

package com.xdl.bean;

public class User {

private String name;     //姓名

private int age;             //年龄

private String gender;      //性别

private double salary;      //薪水

/**

* 构造器

* @param name

* @param age

* @param gender

* @param salary

*/

public User(String name, int age, String gender, double salary) {

this.name = name;

this.age = age;

this.gender = gender;

this.salary = salary;

}

/**

* 无参构造器

*/

public User(){

}

//Get and Set方法

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public String getGender() {

return gender;

}

public void setGender(String gender) {

this.gender = gender;

}

public double getSalary() {

return salary;

}

public void setSalary(double salary) {

this.salary = salary;

}

}

接下来新建com.xdl.servlet包并在包下定义一个GetUserInfoServlet类,可以返回User对象的JSON字符串数据。详细代码如下:

package com.xdl.servlet;

import com.xdl.bean.User;

import net.sf.json.JSONObject;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

@WebServlet("/getUserInfo")

public class GetUserInfoServlet extends HttpServlet {

@Override

protected void doGet(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

User user = new User("三十画生",26,"男",5000.0);

String jsonStr = JSONObject.fromObject(user).toString();

response.setContentType("text/html;charset=UTF-8");

response.getWriter().write(jsonStr);

}

@Override

protected void doPost(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

doGet(request,response);

}

}

编写HTML页面user.html,使用Ajax发送请求,把返回的用户信息JSON字符串经过解析后显示到页面上。详细代码如下:

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Title</title>

<script type="text/javascript">

function getUserInfo(){

var xhr = window.XMLHttpRequest ?

new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHttp");

xhr.open('get','getUserInfo',true);

xhr.onreadystatechange = function(){

if(xhr.readyState == 4 && xhr.status == 200){

var userInfo = xhr.responseText;

userInfo = JSON.parse(userInfo);

document.getElementById("name").innerHTML =

'name:' + userInfo.name;

document.getElementById("age").innerHTML =

'age:' + userInfo.age;

document.getElementById("gender").innerHTML =

'gender:' + userInfo.gender;

document.getElementById("salary").innerHTML =

'salary:' + userInfo.salary;

}

};

xhr.send(null);

}

</script>

</head>

<body>

<button type="button" onclick="getUserInfo()">获取用户信息</button>

<h2 id="name"></h2>

<h2 id="age"></h2>

<h2 id="gender"></h2>

<h2 id="salary"></h2>

</body>

</html>

最后启动Tomcat服务器,然后打开浏览器并输入http://localhost:8080/xdl_ajax_ demo/user.html,浏览器将显示如图4所示的页面。

此时点击获取用户信息按钮,网页将发送Ajax请求获取用户信息,最后浏览器将显示如图5所示的页面,表示浏览器已经获取到服务器端返回的JSON格式的用户数据,并且已经成功解析。

 

图4  user.html

 

图5  页面成功接收并解析服务端返回的用户信息

案例需求:在上一个案例中,是客户端发送AJAX请求,服务端返回所有用户信息。

案例实现:

在服务器端将Java集合转换为JSON字符串需要使用JSONArray类的静态方法:formObject(Object object),该方法返回一个JSONArray对象,调用该对象的toString()方法即可完成转换。

下面将在之前xdl_ajax_demo项目的基础上进行,演示了如何使用Ajax从服务器端查询一个用户信息列表并使用json-lib.jar工具包将用户列表对象转换为JSON字符串然后返回到客户端。

首先在com.xdl.servlet包下定义GetUserInfoListServlet类,可以返回User对象集合的JSON字符串数据。详细代码如下:

package com.xdl.servlet;

import com.xdl.bean.User;

import net.sf.json.JSONArray;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

import java.util.ArrayList;

import java.util.List;

@WebServlet("/getUserInfoList")

public class GetUserInfoListServlet extends HttpServlet {

@Override

protected void doGet(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

User user1 = new User("三十画生",26,"男",5000.0);

User user2 = new User("二十画生",24,"女",15000.0);

List<User> userList = new ArrayList<>();

userList.add(user1);

userList.add(user2);

String jsonStr = JSONArray.fromObject(userList).toString();

response.setContentType("text/html;charset=UTF-8");

response.getWriter().write(jsonStr);

}

@Override

protected void doPost(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

doGet(request,response);

}

}

编写HTML页面userlist.html,使用Ajax发送请求,把返回的用户信息列表的JSON字符串经过解析后显示到页面上。详细代码如下:

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Title</title>

<script type="text/javascript">

function getUserInfoList(){

var xhr = window.XMLHttpRequest ?

new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHttp");

xhr.open('get','getUserInfoList',true);

xhr.onreadystatechange = function(){

if(xhr.readyState == 4 && xhr.status == 200){

var userInfoList = xhr.responseText;

userInfoList = JSON.parse(userInfoList);

var userInfoListTable =

document.getElementById("userInfo List");

userInfoListTable.innerText = '';

var rowHead = userInfoListTable.insertRow();

rowHead.insertCell().innerHTML = 'NAME';

rowHead.insertCell().innerHTML = 'AGE';

rowHead.insertCell().innerHTML = 'GENDER';

rowHead.insertCell().innerHTML = 'SALARY';

for(var i = 0;i<userInfoList.length;i++){

var userInfo = userInfoList[i];

var row = userInfoListTable.insertRow();

row.insertCell().innerHTML = userInfo.name;

row.insertCell().innerHTML = userInfo.age;

row.insertCell().innerHTML = userInfo.gender;

row.insertCell().innerHTML = userInfo.salary;

}

}

}

xhr.send(null);

}

</script>

</head>

<body>

<button type="button" onclick="getUserInfoList()">获取用户信息列表</button>

<table id="userInfoList"></table>

</body>

</html>

最后启动Tomcat服务器,然后打开浏览器并输入http://localhost:8080/xdl_ajax_ demo/userlist.html,浏览器将显示如图6所示的页面。

此时点击获取用户信息列表按钮,网页将发送Ajax请求获取用户信息列表,最后浏览器将显示如下图7所示的页面,表示浏览器已经获取到服务器端返回的JSON格式的用户列表数据,并且已经成功解析。

 

图6  userlist.html

 

图7  页面成功接收并解析服务端返回的用户信息列表

IT兄弟连 JavaWeb教程 AJAX以及JSON字符串经典案例的更多相关文章

  1. IT兄弟连 JavaWeb教程 EL与JSTL表达式经典案例

    案例需求:使用MVC模式编写一个程序,当发起一个deptList.do请求时,在servlet中准备一个部门列表对象,把这个列表对象放入request作用域中转发到deptlist.jsp,使用JST ...

  2. IT兄弟连 JavaWeb教程 JSP内置对象经典案例

    案例需求:使用MVC模式编写一个程序当发起一个deptList.do请求时在servlet中准备一个部门列表对象,把这个列表对象放入request作用域中,然后转发到deptlist.jsp,使用js ...

  3. IT兄弟连 JavaWeb教程 AJAX的技术构成

    Ajax并不是新的技术,而是之前技术的整合,其中包括JavaScript.HTML.CSS.DOM.XMLHttpRequest.XML和JSON是构成Ajax技术体系技术基石. JavaScript ...

  4. IT兄弟连 JavaWeb教程 AJAX常见问题

    1  中文乱码问题 ●  POST提交乱码 乱码原因:所有浏览器对Ajax请求参数都使用UTF-8进行编码,而服务器默认使用ISO-8859-1去解码,所以产生乱码. 解决方法:在服务器接收请求参数前 ...

  5. IT兄弟连 JavaWeb教程 AJAX中参数传递问题

    使用Ajax发送GET请求并需要传递参数时,直接在URL地址后拼接参数,格式如下: xhr.open('get','请求路径?参数名1=参数值1&参数名2=参数值2...',true); 使用 ...

  6. IT兄弟连 JavaWeb教程 AJAX定义以及解决的问题

    Ajax是"Asynchronous JavaScript And XML"的缩写(即:异步的JavaScript和XML),是一种实现无页面刷新获取服务器数据的混合技术,Ajax ...

  7. IT兄弟连 JavaWeb教程 EL与JSTL表达式经典面试题

    1.简述EL表达式的作用 EL表达式的作用可分为以下三类 访问Bean的属性. 输出简单的运算结果. 获取请求参数值. 2.JSP标签的作用?如何定义? JSP标签可以分离JSP页面的内容和逻辑,业务 ...

  8. IT兄弟连 JavaWeb教程 JSP内置对象经典面试题

    1.请说明cookie.request.session.application的作用域和声明周期? 并说明它们适用与什么场景? request的生命周期是一次请求.可以用于JSP表单提交数据. ses ...

  9. Java基础-处理json字符串解析案例

    Java基础-处理json字符串解析案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 作为一名开发人员,想必大家或多或少都有接触到XML文件,XML全称为“extensible ...

随机推荐

  1. tmux基本使用方法

    tmux是一款优秀的终端复用软件.tmux采用C/S模型构建,输入tmux命令就相当于开启了一个服务器,此时默认将新建一个会话,然后会话中默认新建一个窗口,窗口中默认新建一个面板. 一个tmux se ...

  2. 《C prime plus (第五版)》 ---第12章 存储类.链接和内存管理

    12-1:存储类: 1.作用域: 代码块作用域,函数原型作用域和文件作用域. 2.链接:分为外部链接,内部链接和空链接.代码块作用域和函数原型作用域都是空连接,意味着是私有的.而文件作用域的变量可能是 ...

  3. 项目发布之后 总提示有一个.DLL找不到或不匹配

    最近发布项目(.net,winform)总提示有一个.dll文件找不到或者不匹配 但是在本地调试是正常的 这个.dll,原来是从.net组件中引用到项目的,后来我将此.dll文件从网上下载,然后在项目 ...

  4. 笔记 jsp/ajax/js/jquery/html5/css+div->table

    1. jsp 1).jsp(39,33)   equal symbol expected: 这个异常是说第39行有 " '( 冒号单引号)问题 2)${map[key]}  map和key换 ...

  5. redhat5.1上安装oracle 10.2g客户端及配置使用

    一)安装 1.命令 rpm -q gcc make binutils setarch compat-db compat-gcc compat-gcc-c++ compat-libstdc++ comp ...

  6. zkeacms源码解读一

    1,app.UseZKEACMS 中注册可识别的路由 其中 CMS_Redirection 表中填写了跳转路由  对应的UrlRedirectService中将会读取所有的跳转规则. 有两个路由规则很 ...

  7. Mysql中文检索匹配与正则

    今天在用sql模糊查询包含字母d的时候,发现一些不包含此字母的也被查询出来了: SELECT * FROM custom WHERE custom_realname LIKE '%d%' 查询了一下, ...

  8. 总结近期CNN模型的发展(一)---- ResNet [1, 2] Wide ResNet [3] ResNeXt [4] DenseNet [5] DPNet [9] NASNet [10] SENet [11] Capsules [12]

    总结近期CNN模型的发展(一) from:https://zhuanlan.zhihu.com/p/30746099 余俊 计算机视觉及深度学习   1.前言 好久没有更新专栏了,最近因为项目的原因接 ...

  9. Linux_异常_02_WinSCP上传文件时显示Permission denied

    异常现象如下: 二.解决方案 1.设置对应目录权限全开,就可以上传文件到这个目录了 sudo chmod 777 /devloper

  10. (转)MongoDB和Redis区别

    简介 MongoDB更类似Mysql,支持字段索引.游标操作,其优势在于查询功能比较强大,擅长查询JSON数据,能存储海量数据,但是不支持事务. Mysql在大数据量时效率显著下降,MongoDB更多 ...