【Java之MVC】

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;
    }
}
  • 10
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值