json最早是JavaScript对象表示形式,现在主要用于互联网传输数据载体
* java
User user =new User();
user.setUsername("ack");
user.setAge(18);
* javaScript
let user = {"username":"ack","age":18};
let array = [{},{},{}]
name:都是字符串
value:支持各种类型
json比xml更小,更快,更易解析
JSON数据与java对象转换
常见的解析器:
工具名称 | 介绍 |
---|---|
Jsonlib | Java 类库,需要导入的jar包较多 |
Gson | google提供的一个简单的json转换工具 |
Fastjson | alibaba技术团队提供的一个高性能的json转换工具 |
Jackson | 开源免费的json转换工具,springmvc转换默认使用jackson |
1.使用jackson,需要导入jar包:如下:
提供了一个核心转换器对象
ObjectMapper om = new ObjectMapper();
2.java对象转为json字符串
String writeValueAsString(Object object);
// 将user对象转为json字符串
@Test
public void UserToJson() throws Exception {
User user = new User("1", "lucy", "女", 15, "德斯", "123", "[email protected]");
// 创建jackson转换器对象
ObjectMapper om = new ObjectMapper();
// 将任意对象转为json字符串
String json = om.writeValueAsString(user);
System.out.println(json); // 在java中name必须使用双引号包裹起来
}
// 将map集合转为json字符串
@Test
public void MapToJson() throws Exception {
Map map = new HashMap<>();
map.put("name", "张三");
map.put("age", 18);
// 创建jackson转换器对象
ObjectMapper om = new ObjectMapper();
// toJson
String json = om.writeValueAsString(map);
System.out.println(json); // {"name":"张三","age":18}
}
// 将list集合转为json数组字符串
@Test
public void ListToJson() throws Exception {
List list = new ArrayList<>();
list.add(new User("1", "lucy", "女", 15, "德斯", "123", "[email protected]"));
list.add(new User("2", "jack", "男", 15, "德斯", "123", "[email protected]"));
// 创建jackson转换器对象
ObjectMapper om = new ObjectMapper();
// toJson
String json = om.writeValueAsString(list);
System.out.println(json); // [{},{}]
}
3.将json(字符串)转为java对象
T readValue(String json,Class
classType);
// 将json字符串转为user对象
@Test
public void JsonToUser() throws Exception {
String json = "{\"id\":\"1\",\"name\":\"lucy\",\"sex\":\"女\",\"age\":15,\"address\":\"德斯\",\"qq\":\"123\",\"email\":\"[email protected]\"}";
// 创建jackson转换器对象
ObjectMapper om = new ObjectMapper();
// toUser
User user = om.readValue(json, User.class);
System.out.println(user);
}
// 将json字符串转为map集合(如果你获取的json格式没有对应的java实体对象,就可以拿map接收)
@Test
public void JsonToMap() throws Exception {
String json = "{\"name\":\"lucy\",\"age\":18}";
// 创建jackson转换器对象
ObjectMapper om = new ObjectMapper();
// toMap
Map map = om.readValue(json, Map.class);
System.out.println(map);
}
// 将json数组字符串转为list集合
@Test
public void JsonToList() throws Exception {
String json = "[{\"id\":\"1\",\"name\":\"lucy\",\"sex\":\"女\",\"age\":15,\"address\":\"德斯\",\"qq\":\"123\",\"email\":\"[email protected]\"},{\"id\":\"2\",\"name\":\"jack\",\"sex\":\"男\",\"age\":15,\"address\":\"德斯\",\"qq\":\"123\",\"email\":\"[email protected]\"}]";
// 创建jackson转换器对象
ObjectMapper om = new ObjectMapper();
// toList
List list = om.readValue(json, List.class);
System.out.println(list);
}
检查用户名是否可用:
比如用户注册页面,输入用户名,当用户名输入框失去焦点时,发送异步请求,将输入框的用户名传递给服务器进行是否存在的校验。
使用了ajax技术:通过==异步提交==,实现页面的==局部刷新==,提高用户的体验
JQuery提供ajax函数:
* ajax
$.ajax({
type:"请求方式,get|post",
url:"请求服务器地址",
data:"请求参数",
success:function(resp){
resp就是服务器返回的结果...
}
});* get
$.get(url(地址?参数),function(resp){
});
* post
$.post(url,data,function(resp){
})
coding
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
${NAME}
用户注册
@WebServlet("/CheckServlet")
public class CheckServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
// 1.接收请求参数
String username = request.getParameter("username");
// 2.声明map集合
Map map = new HashMap<>();
// 3.判断用户是否存在
if(username.equals("jack")){
map.put("flag",false);
map.put("msg", "× 此用户已注册");
}else{
map.put("flag",true);
map.put("msg", "√ 此用户可以注册");
}
// 4.将map集合转为json字符串
ObjectMapper om = new ObjectMapper();
String json = om.writeValueAsString(map);
System.out.println(json);
// 5.设置json的MIME类型
response.setContentType("application/json;charset=utf-8");
// 6.response响应json到客户端
response.getWriter().write(json);
}
}
1. 必须使用 post 请求2. file 标签必须有 name 属性type = "file" name = "..." />3. form 的 enctype 必须登录 multipart/form-data默认值 普通的表单提交enctype="application/x-www-form-urlencoded"完整type = "file" name = ".." />
比如:
在用户注册页面,我们可以输入用户名,还可以选择要上传的文件;点击提交按钮,就可以将用户输入的内容和选择的文件保存到服务器上
客户端如何将文件转化为文本
1. 表单提交方式必须为post
action="post"
2. 表单的enctype属性值必须为multipart/form-data 多组件表单数据
enctype="multipart/form-data"
3. 在表单中提供文件上传项
服务器将文本转为字节流
使用apache提供工具类 commons-fileupload
使用servlet3.0版本,通过注解实现
使用springMVC框架(最简单,底层使用commons-fileupload)
1.导入相关上传jar包
指定 服务器保存文件路径
编写Servlet接收文件并保存
1. 创建磁盘文件项工厂
2. 创建核心解析对象(依赖工厂对象)
3. 解析request对象,返回上传项list集合
4. 遍历list,获取每一个上传项
5. 判断
普通上传项
name和value
文件上传项
文件名
字节输入流
保存服务器端
@WebServlet("/UploadServlet")
public class UploadServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
// 1.创建磁盘文件项工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
// 2.创建上传解析器对象(依赖工厂对象)
ServletFileUpload fileUpload = new ServletFileUpload(factory);
// 3.解析request请求,返回上传项list集合
List fileItems = fileUpload.parseRequest(request);
// 4.遍历list
for (FileItem fileItem : fileItems) {
// 5.判断是文件项还是普通项
if (fileItem.isFormField()) {// 普通上传项
// 获取name属性名
String name = fileItem.getFieldName();
// 获取value属性值
String value = fileItem.getString();
System.out.println("普通上传项:" + name + "=" + value);
} else {// 文件上传项
// a.获取文件名 demo.txt
String fileName = fileItem.getName();
// b.获取文件字节输入流
InputStream in = fileItem.getInputStream();
// c.获取文件扩展名
String extName = FileUtil.extName(fileName);
// d.生成随机文件名
fileName = IdUtil.simpleUUID() + "." + extName;
// 此文件名会保存数据库一份,给用户查询使用...
// 获取upload目录在服务器真实路径
String realPath = request.getServletContext().getRealPath("/upload/");
// 判断此目录是否存在
File dirFile = new File(realPath);
if (!dirFile.exists()) {
dirFile.mkdirs(); // 如果不存在自己创建
}
// 设置文件字节输出流
FileOutputStream out = new FileOutputStream(realPath + fileName);
// 流的拷贝
IoUtil.copy(in, out);
// 关流
out.close();
in.close();
response.getWriter().write("success");
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
}
}
打开设置