8.1 简单json输出

json是一种字符串序列,它遵循“键:值”这样的格式,现在已经成为了一种通用的数据传输格式,下面就是一个json字符串:
[{
    "code":"010100",
    "parentCode":"010000",
    "serial":"1.1  ",
    "level":2,
    "even":false,
    "name":"如何学习java",
    "gotChildren":"false",
    "id":"726",
    "chapterTitle":"1.1    如何学习java",
    "child":"false"
},
{
    "code":"010200",
    "parentCode":"010000",
    "serial":"1.2  ",
    "level":2,
    "even":true,
    "name":"Java编程环境",
    "gotChildren":"false",
    "id":"187",
    "chapterTitle":"1.2    Java编程环境",
    "child":"false"
}
]
通常用大括号表示一个对象,用方括号表示数组。上面的字符串,表示一个数组,它有两个对象,每个对象,都有code、parentCode、serial、level等属性。
1.所有属性都是“键:值”的格式
2.每个键值对用逗号隔开
前端后台技术分开后,json已经成为了前后端数据交流的标准格式。一般来说,前端发起http请求,后台接受到请求后发送json数据,前端接受到数据后填入页面。后台不再负责页面的样式,包括布局、背景、字体、颜色等。那么一个jsp页面,如何发回一个纯json的应答呢?请看这个例子:
点击后可看到发回的json应答。
这是怎么做到的呢?

首先,需要导入一个写json格式的jar,这样的jar有很多种,它们的功能都大同小异,这里我们使用阿里云的json包
然后复制到项目的WEB-INF/lib文件夹下,再右键点击,“构建路径”-》“添加至构建路径”,如图所示:
这样在jsp中只要使用import语句导入,就可以使用阿里云的json工具包。
下面是一个简单的例子test.jsp,把一个user对象,直接转换成一个json字符串:
<%@ page language="java" contentType="text/html; charset=UTF-8"
 pageEncoding="UTF-8"%>
<%@ page import="com.alibaba.fastjson.*,db.*"%>
<%
 String username = request.getParameter("username");
 User user=UserData.getUserById(username);
 String json=JSON.toJSONString(user);
 response.setCharacterEncoding("UTF-8");
 response.setContentType("application/json; charset=utf-8");
 response.getWriter().print(json);
%>

其中第3行代码是导入json包,以及db包(db包有UserData,以及User两个类,参见4.3数据库
在这里为了测试json包,第6行代码的getUserById是新增加的函数,通过账号查询整个用户,完整函数如下:
public static User getUserById(String username){
    User user=new User();
    // 要执行的sql语句,通过字符串拼接出来
    String SQLTEXT="select * from user where userName = '"+username+"'";
    try{
        //使用上面的DBConifg类的getCon方法,建立一个连接
        Connection con=DBConfig.getCon();
        //准备执行sql的实体
        Statement stmt=con.createStatement();
        //执行sql,并把查询结果赋给rst
        ResultSet rst=stmt.executeQuery(SQLTEXT);
        while(rst.next()){
            //查询结果,并逐个把属性设置到user对象
            user.setPassword(rst.getString("password"));
            user.setNickname(rst.getString("nickName"));
            user.setRole(rst.getString("role"));
            user.setCreateDate(rst.getString("create_date"));
            user.setUsername(username);
        }
        //后使用先关闭原则,关闭各个对象,特别是con如果不关闭,会造成连接泄露
        rst.close();
        stmt.close();
        con.close();
    }
    catch(SQLException e){
        e.printStackTrace();
    }
    return user;
}

最后运行test.jsp,手动在test.jsp后加入username参数(图示的username的值是abcd,username的值可以是user表中任意一个账号),最终效果如图所示: