MVC
JSON
json是js中的对象,主要作为数据交换的格式,运用在客户端与服务器通信的过程中
json就是对于key=value类型数据格式的补充
使用
{}表示的是一个对象
[]表示的是一个数组、集合
var country = {name:"中国", province:[{name:"黑龙江", cities:["哈尔滨","大庆"]},{name:"广东", cities:["广州","深圳"]},{name:"台湾", cities:["台北","高雄"]}]}
var country ={
"name":"中国",
"province":[{"name":"黑龙江",”cities”:["哈尔滨","大庆"]},
{"name":"广东","cities":["广州","深圳","珠海"]},
{"name":"台湾","cities":["台北","高雄"]},
{"name":"新疆","cities":["乌鲁木齐"]}]}
成员变量不加引号,说明表示的是json对象,加上了引号表示的就是字符串
两者之间的关系类似于对象和tostring
一般在数据交换的时候使用的是json字符串,传输在请求体中
JAVA对象和JSON字符串之间的转换
借助第三方API来完成,Gson:api简单
实质上就是java对象的tostring变成了json的形式
如果对象中的属性为null,那么gson会自动判断,不会转换为null的数据
单个对象转JSON
public void testJavaToJson(){
User zs = new User();
zs.setAge(24);
zs.setUsername("zhangsan" );
Gson gson = new Gson();
String s = gson.toJson(zs);
System.out.println(s);
}
List中存放的对象转Json
List<User> list = new ArrayList<>();
list.add(zs);
list.add(ls);
list.add(wu);
Gson gson = new Gson();
String s = gson.toJson(list);
System.out.println(s);
本质上都是一样的,toJson里面可以传Object,传List进去也是可以的
Json转成单个对象
调用fromJson方法,第一个参数是要转换的字符串,第二个参数是转换对象的字节码文件
String jsonStr = "{\"username\":\"zhangsan\",\"age\":24}";
Gson gson = new Gson();
User user = gson.fromJson(jsonStr, User.class);
System.out.println(user);
Json转为多个对象数组
String jsonStr = "[{\"username\":\"zhangsan\",\"age\":24},{\"username\":\"lisi\",\"age\":25}]";
Gson gson = new Gson();
JsonParser jsonParser = new JsonParser();
JsonElement parse = jsonParser.parse(jsonStr);
JsonArray asJsonArray = parse.getAsJsonArray();
for (JsonElement jsonElement : asJsonArray) {
User user = gson.fromJson(jsonElement, User.class);
System.out.println(user);
}
步骤:1.首先创建一个Gson解析器对象
2.创建自定义的一个解析格式,JsonParser
3.使用JsonParser对字符串进行解析,调用的是parse方法,里面传入要解析的字符串
4.解析完毕后调用指定的方法得到想要的格式, parse.getAsJsonArray()
5.得到的是一个Json数组,最后还需要对具体的每个元素进行解析得到我们想要的对象
5.最后输出即可
整合Maven与EE
1.src\main目录下新建webapp目录
2.设置webapp为应该根目录的映射
3.pom.xml文件设置
<packaging>war</packaging>
4.导包
servlet包—provided,因为只需要编译通过即可,tomcat内部有自带的
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
servlet-provided
junit-test
mysql-connector-java-runtime
注册登录案例
接口
如果需要代码变更较少,那么就需要采取接口编程的方式
接口的优势:制定方法的规范
方法的名称相同、方法的参数相同、方法的返回值类型相同
那么具体的逻辑可以根据不同的需求,生成不同的子实现,这样在更换需求的时候就只需要改变子实现的名称,更换的代价非常小
三层架构
展示层—Controller
业务层—Service
数据层—Dao
在Controller和Dao之间引入service层,使用接口来制定规范,并在具体的实现类中调用方法,以实现不同的功能
这样在使用的时候就只需要使用service即可,具体的操作方法都放在service里面,降低耦合率
在本案例中的具体思路:
展示层—>Controller—>Servlet
用于处理分发方法,只实现展示的业务逻辑,耦合service,通过service来调用方法得到返回的状态码,以此展示不同的页面
UserService userService = new UserServiceImpl();
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String requestURI = request.getRequestURI(); //首先分发请求
String op = requestURI.replace(request.getContextPath() + "/user/", "");//替换,取出分发的部分
if ("register".equals(op)){
register(request,response); //处理注册的逻辑
}else if ("login".equals(op)){
login(request,response);
}
}
private void register(HttpServletRequest request, HttpServletResponse response) throws IOException {
User registerUser = new User(); //存放新注册的用户
//从表单中获取数据,然后使用BeanUtils来封装
try {
BeanUtils.populate(registerUser,request.getParameterMap());//对数据进行封装
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
//参数校验
if (StringUtils.isEmpty(registerUser.getUsername())||StringUtils.isEmpty(registerUser.getPassword())||StringUtils.isEmpty(registerUser.getGender())){
response.getWriter().println("参数为空!请检查数据是否正常");
return;
}
int result = userService.register(registerUser); //得到返回的状态码
if (result==404){
response.getWriter().println("当前用户名已经被注册!");
return;
}else if (result==500){
response.getWriter().println("服务器繁忙");
}
response.getWriter().println("注册成功!");
}
业务层—Service—
通过接口来制定具体执行的方法的规范,在实现类中与Dao耦合,执行具体的业务逻辑
public interface UserService {
int register(User reg);
int login(User login);
}
public class UserServiceImpl implements UserService {
private UserDao userDao = new UserSqlDao(); //维护一个userDao,在这里面调用方法
@Override
public int register(User reg) {
return userDao.register(reg);
}
@Override
public int login(User login) {
return userDao.login(login);
}
}
数据层—Dao
同样的以接口为标准,这样在更换Service中方法的时候代价最小
public interface UserDao {
int register(User user);
int login(User login);
}
public class UserSqlDao implements UserDao {
static SqlSession sqlSession;
static UserMapper mapper;
static {
sqlSession = MyBatisUtil.getSqlSession();
mapper = sqlSession.getMapper(UserMapper.class);
}
@Override
public int register(User user) {
try {
mapper.insertInUser(user);
sqlSession.commit(); //插入成功需要提交事务
return 200; //正常插入说明成功,返回200
}catch (Exception e){
return 404; //如果用户名存在,那就说明插入失败,会报错,返回404
}
}
@Override
public int login(User login) {
return 0;
}
}