JSON
1.1. JSON简介
-
JSON是一种轻量级的数据传输格式,解析简单 方便阅读
-
JSON中支持的数据类型:string,数值,布尔,JSON对象,数组,null
-
语法:
- key :value
- 上下键值对之间使用逗号隔开
- KEY使用双引号引起来,字符串类型的数据都是使用双引号引起来
- 对象使用{} 数组使用[ ]
1.2.Java对JSON的处理
Java中并没有内置JSON的解析,因此使用JSON需要借助第三方类库。
下面是几个常用的 JSON 解析类库:
使用三方jar包先引入
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//处理乱码
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=UTF-8");
List<Goods> goods = goodsService.queryAll();
//生成一个对象
Gson gson = new Gson();
// 把Java对象转换为符合JSON语法的字符串
String str = gson.toJson(goods);
System.out.println(str);
Goods goods1 = goods.get(0);
String s = gson.toJson(goods1);
System.out.println(gson.toJson(s));
// 把符合JSON语法字符串转为Java对象
Goods goods2 = gson.fromJson(s, Goods.class);
System.out.println(goods2);
//把符合JSON语法字符串转为Java集合
List<Goods> o = gson.fromJson(str, new TypeToken<List<Goods>>() {
}.getType());
System.out.println(o);
resp.getWriter().write(str);
}
1.3.JS中对JSON的处理
- JS中自带对JSON的处理
// 把JSON字符串解析为JS中的对象
var parse = JSON.parse(data);
//把JS对象转换为符合JSON格式的字符串
var str = JSON.stringify(parse);
console.log(parse);
console.log(str);
1.4.购物车案例
页面代码
展示商品页面代码
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<a href="/showCart.html">去购物车结算</a>
<table class="table" id="mainTab">
<tr>
<th>商品编号</th>
<th>商品名称</th>
<th>商品价格</th>
<th>商品折扣</th>
<th>操作</th>
</tr>
</table>
<script src="js/jquery-3.2.1.min.js"></script>
<script>
$(function () {
// 异步请求
$.get('/goods', function (data) {
console.log(data);
$.each(data, function (index, item) {
$('#mainTab').append($('<tr></tr>')
.append($('<td></td>').text(item.id))
.append($('<td></td>').text(item.name))
.append($('<td></td>').text(item.price))
.append($('<td></td>').text(item.discount))
.append($('<td></td>').append($('<button class="btn btn-info addToCart">添加到购物车</button>').attr('data-gid', item.id)))
);
});
// 解析字符串
//给button按钮添加点击事件
$('.addToCart').click(function () {
console.log('clicked');
//获取商品id信息
let gId = $(this).attr('data-gid');
let cookieKey = 'good_' + gId;
//在cookie中保存此商品信息
let cookieStr = document.cookie;
// 'good_1=1 ; good_2=2 ; good_5=1 '
let cookies = cookieStr.split('; ');
// key =value good_id=1
let goodNum = 1;
$.each(cookies, function (index, item) {
var strings = item.split('=');
if (cookieKey == strings[0]) {
goodNum = parseInt(strings[1]) + 1;
}
});
document.cookie = cookieKey + "=" + goodNum;
})
},'json');
})
</script>
</body>
</html>
购物车页面代码
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<a href="/showCart.html">去下单</a>
<table class="table" id="mainTab">
<tr>
<th>商品名称</th>
<th>商品价格</th>
<th>购买数量</th>
<th>小计</th>
<th>操作</th>
</tr>
</table>
<script src="js/jquery-3.2.1.min.js"></script>
<script>
$(function () {
// 异步请求
$.get('/cart', function (data) {
console.log(data);
$.each(data, function (index, item) {
$('#mainTab').append($('<tr></tr>')
.append($('<td></td>').text(item.name))
.append($('<td></td>').text(item.price))
.append($('<td></td>').text(item.store))
.append($('<td></td>').text(item.store*item.price))
.append($('<td></td>').append($('<button class="btn btn-info addToCart">删除</button>').attr('data-gid', item.id)))
);
})
// 解析字符串
}, 'json');
})
</script>
</body>
</html>
后台代码
获取商品信息的Servlet
@WebServlet("/goods")
public class GoodsController extends HttpServlet {
private GoodsService goodsService = new GoodsServiceImpl();
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//处理乱码
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/json;charset=UTF-8");
List<Goods> goods = goodsService.queryAll();
//生成 GSON 对象
Gson gson = new Gson();
// 把Java对象转换为符合JSON语法的字符串
String str = gson.toJson(goods);
resp.getWriter().write(str);
}
}
获取购物车商品信息的servlet
@WebServlet("/cart")
public class CartServlet extends HttpServlet {
private GoodsService goodsService = new GoodsServiceImpl();
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取cookie信息
resp.setContentType("text/json;charset=UTF-8");
Cookie[] cookies = req.getCookies();
ArrayList<Goods> goods1 = new ArrayList<>();
if (cookies != null && cookies.length > 0) {
for (Cookie cookie : cookies) {
// good_id
String name = cookie.getName();
if (name.startsWith("good_")) {
String idStr = name.split("_")[1]; // "1"
Goods goods = goodsService.queryById(Integer.valueOf(idStr));
// GoodVo
goods.setStore(Integer.valueOf(cookie.getValue()));
if (goods != null) {
goods1.add(goods);
}
}
}
Gson gson = new Gson();
String s = gson.toJson(goods1);
resp.getWriter().write(s);
}
}
}
文件上传
- 借出第三方jar包实现,需要导入commons-fileupload.jar和commons-io.jar
1.1.使用form表单上传文件
前端页面
<body>
<!-- 文件上传 enctype="multipart/form-data" -->
<form action="/fileUpload" method="post" enctype="multipart/form-data">
用户名: <input type="text" name="username"> <br>
密码: <input type="password" name="pass"> <br>
头像: <input type="file" name="file" id="file"> <br>
<input type="submit" value="提交">
</form>
后端代码servlet
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 解析此请求是否是一个文件上传的请求
boolean isMultipart = ServletFileUpload.isMultipartContent(req);
if (isMultipart) {
//保存到服务器的路径
DiskFileItemFactory factory = new DiskFileItemFactory();
// 创建一个文件上传的处理器
ServletFileUpload upload = new ServletFileUpload(factory);
String baseDir = getServletContext().getRealPath("/repository");
// 解析请求
try {
List<FileItem> items = upload.parseRequest(req);
items.forEach((item) -> {
// 是普通的表单项
if (item.isFormField()) {
String name = item.getFieldName();
String value = item.getString();
System.out.println(name + " : " + value);
} else {
//是一个文件项 ,写到本地服务器
try {
// 获取文件名
String name = item.getName();
String suffix = name.substring(name.lastIndexOf("."));
//生成一个文件名 随机
UUID uuid = UUID.randomUUID();
//防止文件名冲突
String newFileName = uuid.toString().replaceAll("-", "").toUpperCase() + suffix;
item.write(new File(baseDir, newFileName));
} catch (Exception e) {
e.printStackTrace();
}
}
});
} catch (FileUploadException e) {
e.printStackTrace();
}
}
}
1.2. Ajax请求上传文件
- 需要导入第三方插件,实现文件上传
前端页面代码
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
#show {
display: none;
}
</style>
</head>
<body>
<form>
user: <input type="text" name="username"> <br>
头像 : <input type="file" name="file" id="fileId"> <br>
<img id="show" width="100" height="100">
<button id="btn1">提交</button>
</form>
<script src="js/jquery-3.2.1.min.js"></script>
<!--第三方的插件, 用来实现发送文件上传请求-->
<script src="js/ajaxfileupload.js"></script>
<script>
$(function () {
$('input:file').change(function () {
// 上传文件
$.ajaxFileUpload({
type: "POST",
url: "/fileUpload",
//文件选择框的id属性
fileElementId: 'fileId',
//服务器返回的格式
dataType: 'json',
success: function (data) {
$("#show").css('display', 'block');
$("#show").attr('src', data.url)
},
error: function (data, status, e) {
}
});
})
})
</script>
</body>
</html>
后端代码
try {
// 获取文件名
String name = item.getName();
String suffix = name.substring(name.lastIndexOf("."));
//生成一个文件名 随机
UUID uuid = UUID.randomUUID();
//防止文件名冲突
String newFileName = uuid.toString().replaceAll("-", "").toUpperCase() + suffix;
item.write(new File(baseDir, newFileName));
//
HashMap<String, String> map = new HashMap<>();
map.put("url", "/repository/" + newFileName);
Gson gson = new Gson();
String s = gson.toJson(map);
resp.getWriter().write(s);
} catch (Exception e) {
e.printStackTrace();
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/192934.html