JSON
简述
json就是指js对象,但是json并不只是适用于js,很多编程语言都有针对json的解析器,比如Java和C++。json因为具有优良的数据交换性能,所以市面上的xml格式交互主要被json替代,而xml成为配置文件。
var country = {name:"中国", province:[{name:"黑龙江",cities:["哈尔滨","大庆"]},
{name:"广东",cities:["广州","深圳"]},
{name:"台湾",cities:["高雄","台北"]},
{name:"新疆",cities:["乌鲁木齐","喀什"]}]}
console.log(country.province[3].cities[0])
var pro ={
"name":"中国",
"province":[{"name":"黑龙江",”cities”:["哈尔滨","大庆"]},
{"name":"广东","cities":["广州","深圳","珠海"]},
{"name":"台湾","cities":["台北","高雄"]},
{"name":"新疆","cities":["乌鲁木齐"]}]
}
上下两种有什么区别呢?
上面:json
下面:json字符串
通俗的理解为java里面的对象以及调用了toString方法,传输数据一般用json字符串。
使用
这里,格式转换比较麻烦的话,可以使用谷歌的Gson,阿里巴巴的fastjson,和sun格式自带的Jackson,这里以maven引入Jackson为例,说明格式转换工具的使用。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.simon</groupId>
<artifactId>jsonmvc</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.12.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.12.2</version>
</dependency>
</dependencies>
</project>
package com.simon;
public class User {
private String username;
private String password;
public User() {
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public User(String username, String password) {
this.username = username;
this.password = password;
}
}
Java对象转为json字符串
package com.simon;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.type.CollectionType;
import com.fasterxml.jackson.databind.type.TypeFactory;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
public class JSONTest {
@Test
public void testObject2Json() throws JsonProcessingException {
User user1 = new User("zs", "123");
User user2 = new User("ls", "234");
User user3 = new User("ww", "345");
User user4 = new User("zl", "456");
List<User> list = new ArrayList<>();
list.add(user1);
list.add(user2);
list.add(user3);
list.add(user4);
ObjectMapper mapper = new ObjectMapper();
String s = mapper.writeValueAsString(list);
System.out.println(s);
}
}
json字符串转为Java对象
package com.simon;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.type.CollectionType;
import com.fasterxml.jackson.databind.type.TypeFactory;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
public class JSONTest {
//这里需要无参构造器
@Test
public void testJson2Object() throws JsonProcessingException {
String jsonStr = "[{\"username\":\"zs\",\"password\":\"123\"}," +
"{\"username\":\"ls\",\"password\":\"234\"}," +
"{\"username\":\"ww\",\"password\":\"345\"}," +
"{\"username\":\"zl\",\"password\":\"456\"}]\n";
ObjectMapper mapper = new ObjectMapper();
TypeFactory typeFactory = mapper.getTypeFactory();
CollectionType type = typeFactory.constructCollectionType(List.class, User.class);
List<User> userObjects = mapper.readValue(jsonStr, type);
for (User user : userObjects) {
System.out.println(user);
}
}
}
MVC
需求
用户注册登录案例:要求是先将数据以json文件的形式进行存储数据,后面将其改成使用数据库来存储,但是逻辑不变,只是将数据存储方式做一个改变。
MVC设计模式
MVC设计模式主要的一个点就在于解耦性,将模块和模块之间的关联尽可能降到最低。
- Model:一般情况下由对象bean以及对用户的操作,可能有登录、 注册、查询、修改、删除
- View:视图。就是对model里面数据模型的一个显示。比如说京东app,我的页面、订单页面。订单页面是一个视图,视图里面的数据怎么来的呢?一般是先查询数据库,将数据封装到一个order对象,order对象里面的数据显示在页面上面。数据库里面的内容——> Bean对象———> 页面、视图
- controller:控制器。请求先分发到controller中,controller去调用模型的一个或者多个方法,比如请求分发到servlet,servlet去调用模型的注册方法,根据模型方法的返回值不同,调用不同的视图。
如果从json迁移到mysql,我们需要做的事情有哪些?
1、由RegisterJsonModel迁移到RegisterMysqlModel,如果希望代码的改动尽可能少,那么应当尽可能满足以下几点:①方法的名称要相同 ②方法的参数要相同 ③方法的返回值要相同
2、注册里面,变更,需要从RegisterJsonModel迁移到RegisterMysqlModel,如果还有其他的逻辑,比如登录、查询、修改、删除等逻辑。全部也都要将RegisterJsonModel迁移到RegisterMysqlModel(变更的地方依然有很多),于是想到接口,因为天然具有规范性,就能够规范这三点必须满足要求,否则会报错。
MVC三层架构
在MVC基础上,将程序的代码进行进一步的解耦,分为三个层:
展示层:servlet和视图组成的这个部分叫做展示层,做一些获取请求参数、校验、调用service
业务层:发起一个一个的dao方法调用,调用完毕之后,组装,形成需要的格式,返回给servlet(汽车工厂,会向各个零部件厂商发起订单,部件全部堆在生产车间之后,它取组装,形成一个整车)
数据层:就是单纯的一个一个的方法
变化过程
先是因为需求变更,不得不将可重复利用的代码片段复用,形成Bean及对Bean的操作、给用户的显示、用于解耦或是联系前两者的操作,这样的风格称为MVC设计模式。后来,在MVC设计模式的基础上,当遇到更复杂的逻辑时,可以将之前的操作进一步抽离,形成接口,以防止修改现有代码。
请求及执行过程
来自狂神说总结,链接点我