1. 前记:
~~~~ 大学专业课有时候只允许使用Servlet去完成去期末, 但是你又想进行前后端分离开发, 并且遇到了Servlet用getParameter获取不到JSON数据的问题, 然后我就想通过这篇文件把我解决的办法写出来
2. 解决办法:
2.1 读取数据:
const result = await axios.post(Constant.HTTP + '/customer/login', {
name: name.value,
password: password.value,
inputCode: inputValidCode.value,
}, {
headers: {
'content-type': 'application/json'
}
})
~~~~ 这里用的是Vue3写的Axios, 这是我写的一个简单的向后端传入的登入数据, 传入了用户名, 密码和验证码。 需要注意的点, headers(请求头)中一定要明确content-type类型为application/json
public static JSONObject getJSON(HttpServletRequest req) throws IOException {
ServletInputStream inputStream = req.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder jsonBuilder = new StringBuilder();
String line;
try {
while ((line = reader.readLine()) != null) {
jsonBuilder.append(line);
}
} catch (IOException e) {
e.printStackTrace();
throw e;
}
System.out.println(jsonBuilder.toString());
return JSONObject.parseObject(jsonBuilder.toString());
}
~~~~ 这就是Servlet将JSON数据转为Java对象的部分), 其中:
ServletInputStream inputStream = req.getInputStream();
~~~~ 这里是获取请求体里的内容, 就是刚刚传入的JSON数据
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder jsonBuilder = new StringBuilder();
String line;
try {
while ((line = reader.readLine()) != null) {
jsonBuilder.append(line);
}
} catch (IOException e) {
e.printStackTrace();
throw e;
}
~~~~ 这里就是读取其中的内容, 可能有对Java输入输出流不熟悉的小伙伴, 这里我贴一下构造方法 ,也解释一下BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))的含义
public BufferedReader(Reader in)
InputStreamReader(InputStream in)
~~~~
其中InputStreamReader是Reader的子类,将字节流转为字符流;ServletInputStream类是Servlet中继承于InputStream的抽象类, 用于读取请求信息
这里为什么要将InputStream转为BuffereReader呢, 因为字节流不能读取汉字但字符流可以
return JSONObject.parseObject(jsonBuilder.toString());
~~~~ 最后的代码是使用了FastJson库, 需要自己手动下一个.jar包并放入lib依赖中
2.2 获取数据:
~~~~ 将数据读取到JSONobject中, 那现在就是如何获取数据了
User user = new User();
JSONObject jsonObject = JsonUtils.getJSON(req);
user.setName(jsonObject.getString("name"));
user.setPassword(jsonObject.getString("password"));
String inputCode = jsonObject.getString("inputCode");
~~~~ 这里就是对应上面前端出入数据名字就行
2.3 返回数据:
PrintWriter out = resp.getWriter();
out.write(JSON.toJSONString(user));
out.flush();
out.close();
这里应该没有什么需要解释的
3. 尾声
~~~~ 这是我发的第二篇文章,本来也没太想写, 毕竟我实力还是不太够, 如果写得问题太多反而有点误人子弟,但转念一想还是把这篇文章写出来了。 这篇文章还是有很多不足, 如果有问题之内的, 可以在评论区问我, 我看见都会回答的, 如果有axios请求之内的问题也能问, 我会的话还是会回答的