湖南省建设工程造价管理总站,东阳市建设局网站,腾讯企业邮箱登录入口网址,wordpress文章分类目录文章目录 JSON常用的JSON解析Jackson的常规使用指定日期格式 MVC设计模式MVC介绍前后端分离案例#xff08;开发与Json相关接口#xff09; 三层架构三层架构介绍 JSON
JSON#xff08;JavaScript Object Notation#xff09; 是一种轻量级的数据交换格式#xff0c;是存… 文章目录 JSON常用的JSON解析Jackson的常规使用指定日期格式 MVC设计模式MVC介绍前后端分离案例开发与Json相关接口 三层架构三层架构介绍 JSON
JSONJavaScript Object Notation 是一种轻量级的数据交换格式是存储和交换文本信息的一种语法它与XML具有相同的特性是一种数据存储格式却比 XML 更小、更快、 更易于人编写和阅读、更易于生成和解析。为了更好的做前端和后端之间的交互
常用的JSON解析
fastjson是阿里巴巴的开源JSON解析库Gson是Google提供的JSON解析库Jackson是SpringBoot默认序列化JSON解析库性能方面Jackson和FastJson差距很小Jackson是SpringBoot默认的序列化库也是最稳定的一个
分别对应的依赖
!--Gson--
dependencygroupIdcom.google.code.gson/groupIdartifactIdgson/artifactIdversion2.8.9/version
/dependency!--fastjson--
dependencygroupIdcom.alibaba/groupIdartifactIdfastjson/artifactIdversion1.2.73/version
/dependency!--jackson--
dependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-databind/artifactIdversion2.13.3/version
/dependencyJackson的常规使用
实例化一个Jackson中用来做序列化的对象ObjectMapper
ObjectMapper objectMapper new ObjectMapper();使用ObjectMapper提供的方法完成转换
方法名参数返回值说明writeValueAsString(Object object):StringObject被转换的对象String转换的结果将Object转换为JSONStringreadValue(String content,ClassT valueType):TString content:被转换的字符串ClassT valueType:指定接收返回值的类型泛型在第二个参数被指定的类型将JSONString转换为指定转换类型
eg
bean目录
/*** {* name:中国,* province:[{name:黑龙江,”cities”:[哈尔滨,大庆]},* {name:广东,cities:[广州,深圳,珠海]},* {name:辽宁,cities:[沈阳, 大连]},* {name:新疆,cities:[乌鲁木齐]}* ]* }*/
Data
AllArgsConstructor
NoArgsConstructor
public class Country {String name;ListProvince province;
}/*** {name:黑龙江,”cities”:[哈尔滨,大庆]}*/
Data
AllArgsConstructor
NoArgsConstructor
public class Province {String name;String[] cities;
}Execution目录
public class JsonParseExecution {SneakyThrowspublic static void main(String[] args) {Country country new Country();country.setName(中国);// ListProvince provinces new ArrayList();Province province1 new Province(黑龙江, new String[]{哈尔滨, 大庆});Province province2 new Province(广东, new String[]{深圳, 珠海, 广州});Province province3 new Province(辽宁, new String[]{沈阳, 大连});Province province4 new Province(新疆, new String[]{乌鲁木齐});ListProvince provinces Arrays.asList(province1, province2, province3, province4);country.setProvince(provinces);ObjectMapper objectMapper new ObjectMapper();// 序列化将country对象转化为字符串String jsonStr objectMapper.writeValueAsString(country);System.out.println(jsonStr);/*** {name:中国,province:[{name:黑龙江,cities:[哈尔滨,大庆]},* {name:广东,cities:[深圳,珠海,广州]},* {name:辽宁,cities:[沈阳,大连]},{name:新疆,cities:[乌鲁木齐]}]}*/// 反序列化将字符串转换为country对象Country jsonCountry objectMapper.readValue(jsonStr, Country.class);System.out.println(jsonStr);}
}指定日期格式
语句objectMapper.setDateFormat(new SimpleDateFormat(yyyy-MM-dd));
eg
在User中增加一个成员变量Date birthday
Data
NoArgsConstructor
AllArgsConstructor
public class User {Integer id;String username;String password;Integer age;Date birthday;Date createDate;String mobile;UserDetail userDetail;
}Data
NoArgsConstructor
AllArgsConstructor
public class UserDetail {Integer id;String email;String mobile;
}Execution目录
public class JsonParseExecutionTest {SneakyThrowspublic static void main(String[] args) {UserDetail userDetail new UserDetail(1, 1234163.com, 12345678909);User user new User(1, zs, 123456, 22, new Date(), new Date(), 12345678900, userDetail);ObjectMapper objectMapper new ObjectMapper();// 解决日期格式的语句objectMapper.setDateFormat(new SimpleDateFormat(yyyy-MM-dd HH:mm:ss));String userJsonStr objectMapper.writeValueAsString(user);System.out.println(userJsonStr);/*** {* id: 1,* username: zs,* password: 123456,* age: 22,* birthday: 1711811845446, // 2024-03-30* createDate: 1711811845446,* mobile: 12345678900,* userDetail: {* id: 1,* email: 1234163.com,* mobile: 12345678909* }* }*/}
} MVC设计模式 这个Servlet可以称之为控制器 → Controller查询student信息就是处理数据逻辑 → Model 另外这部分工作是在ServletController中进行的将数据和jsp共享 → 在Controller中将Model封装的数据准备就绪ServletController设置转发的jsp视图View并且在jsp视图中渲染出Model提供的信息
MVC介绍
三个核心部件
模型Model应用程序中用于处理应用程序数据逻辑的部分 获得一些具体的对象比如说User的对象、Order的list 视图View应用程序中处理数据显示的部分就是页面的展示采集用户数据控制器Controller应用程序中处理用户交互的部分。接收用户端的请求指的是Servlet的功能根据界面传递过来不同的值进行不同的增删改查操作之后再跳转到不同的界面显示。做一个承上启下的作用。 比如说request和response所处的位置就是servlet
强制性地使应用程序的输入、处理和输出分开。它们各自处理自己的任务。最典型的MVC就是JSP Servlet JavaBean的模式。MVC其实说的就是一个事情解耦。 前后端分离
通过js向后端发起Ajax异步请求然后请求到Server服务器找到对应的控制器由控制器和Model层和View做交互最终服务器处理的结果以Json的形式交给JSJS可以直接解析这个Json对象在前端页面上呈现最终的效果 也就是我们在Servlet中完成开发之后响应体中响应的是Json字符串 案例开发与Json相关接口 请求相关信息 请求URLhttp://localhost:8080/demo3/auth/account/check请求方法POST请求参数请求参数是JSON字符串{userAccount:admin123}提供Postman构造Json数据 提供filder抓取的请求报文
业务传入的用户名信息然后完成一些业务需要在数据库user_t表中根据用户名查询id信息 如果用户名长度小于6响应一段JSON数据 {data:null,errmsg:字符串长度至少6位,errno:400
}如果用户不存在响应一段JSON数据 {data:null,errmsg:用户不存在,errno:502
}如果用户存在响应一段JSON数据 {data:user的json字符串,errmsg:用户存在,errno:200
}eg
bean目录下
NoArgsConstructor
Data
public class ResponseVo {JsonProperty(data)private Object data;JsonProperty(errmsg)private String errmsg;JsonProperty(errno)private Integer errno;/*** {* data:null,* errmsg:字符串长度至少6位,* errno:400* }*/
}servlet目录下
WebServlet(/auth/account/*)
public class AuthAccountCheckServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {process(req, resp);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {process(req, resp);}SneakyThrowsprivate void process(HttpServletRequest request, HttpServletResponse response) {DispatchUtil.dispatch(request, response, this);}SneakyThrowsprivate void check(HttpServletRequest request, HttpServletResponse response) {// JSON字符串{userAccount:admin123}// 首先获得Json字符串并解析它String jsonStr request.getReader().readLine();ObjectMapper objectMapper new ObjectMapper();Map map objectMapper.readValue(jsonStr, Map.class);String userAccount (String) map.get(userAccount);String responseStr null;// 判断长度if (userAccount null || userAccount.length() 3) {// 不符合要求/*** {* data:null,* errmsg:字符串长度至少6位,* errno:400* }*/ResponseVo responseVo new ResponseVo();responseVo.setErrmsg(字符串长度至少6位);responseVo.setErrno(400);responseStr objectMapper.writeValueAsString(responseVo);}UserMapper userMapper MybatisUtil.getSqlSession().getMapper(UserMapper.class);ListUser users userMapper.selectByUserName(userAccount);if (users ! null users.size() 0) {// user存在/*** {* data:user的json字符串,* errmsg:用户存在,* errno:200* }*/ResponseVo responseVo new ResponseVo();responseVo.setData(users.get(0));responseVo.setErrmsg(用户存在);responseVo.setErrno(200);responseStr objectMapper.writeValueAsString(responseVo);} else {// user不存在/*** {* data:null,* errmsg:用户不存在,* errno:502* }*/ResponseVo responseVo new ResponseVo();responseVo.setErrmsg(用户不存在);responseVo.setErrno(502);responseStr objectMapper.writeValueAsString(responseVo);}response.setContentType(application/json;charsetutf-8);response.getWriter().println(responseStr);}
}三层架构
三层架构这里和MVC并不是冲突的概念而是在MVC的基础上进一步解耦之前在Controller控制层直接调用了Model为了后续业务上的解耦在中间增加增加了一层业务逻辑层在业务逻辑层中处理大部分业务 三层架构介绍
三层架构表示层、业务逻辑层、数据访问层 避免了表示层直接访问数据访问层表示层只和业务逻辑层有联系提高了数据安全性如果切换B/S、C/S架构直接替换表示层即可比如替换Servlet项目结构更清楚分工明确增加可维护性
实际在开发过程中的体现就是控制层Servlet中直接调用Service业务逻辑层在Service中调用Dao数据访问层