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(); • 1
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; } }
sqlSession.commit(); //插入成功需要提交事务 return 200; //正常插入说明成功,返回200 }catch (Exception e){ return 404; //如果用户名存在,那就说明插入失败,会报错,返回404 } } @Override public int login(User login) { return 0; }
}