美文网首页android开发技巧JavaWeb程序员
【Java框架型项目从入门到装逼】第十三节 用户新增功能完结篇

【Java框架型项目从入门到装逼】第十三节 用户新增功能完结篇

作者: 剽悍一小兔 | 来源:发表于2018-01-30 09:25 被阅读876次

    这一节,我们把用户新增的功能继续做一个完善。首先,新增成功后,需要给前台返回一个信息,就是告诉浏览器,这次用户新增的操作到底是成功了呢,还是失败了呢?为此,我们需要专门引入一个结果类,里面只有两个属性,分别为错误码和错误信息,这个类在之前的章节中有提到过。

    package com.app.bean;
    
    public class ResultData {
        
        private int errCode = 0;
        private String errMsg;
        
        public int getErrCode() {
            return errCode;
        }
        public void setErrCode(int errCode) {
            this.errCode = errCode;
        }
        public String getErrMsg() {
            return errMsg;
        }
        public void setErrMsg(String errMsg) {
            this.errMsg = errMsg;
        }
    }
    

    然后,改写UserController类:

    package com.app.controller;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import com.app.bean.ResultData;
    import com.app.bean.Student;
    import com.app.service.UserService;
    import com.app.service.impl.UserServiceImpl;
    
    @Controller
    public class UserController {
        
        //用户业务类的引用
        private UserService userService = new UserServiceImpl();
        
        @RequestMapping("/addUser")
        @ResponseBody
        public ResultData addUser(HttpServletRequest request , HttpServletResponse response,Student student){
            ResultData data = new ResultData();
            
            try{
                userService.addUser(student);
            }catch(Exception e){
                data.setErrCode(-1);
                data.setErrMsg(e.getMessage());
            }
            
            return data;
            
            
        }    
    }
    

    如果保存操作出现异常,我们就捕获一下异常,并且记录下异常信息,返回给浏览器。注意,这边我们还给addUser方法加了一个@ResponseBody注解。这样一来,当我们return数据的时候,就会自动转换成json对象,然后用IO流的方式写出到浏览器。

    后台控制器解决了之后,我们再来修改前台的ajax方法:

    //使用ajax传递到后台
    $.post("addUser.do",json,function(data){
        //这里是处理返回数据的回调函数 
        
        
        if(data.errCode < 0){
            alert('操作发生错误,原因是:' + data.errMsg);
        }else{
            alert('保存成功');
        }
        
    },"json");
    
    

    效果:


    现在,我们故意制造一个异常:

    @Controller
    public class UserController {
        
        //用户业务类的引用
        private UserService userService = new UserServiceImpl();
        
        @RequestMapping("/addUser")
        @ResponseBody
        public ResultData addUser(HttpServletRequest request , HttpServletResponse response,Student student){
            ResultData data = new ResultData();
            
            try{
                userService.addUser(student);
                int i = 1 / 0; //故意写一句错误代码
            }catch(Exception e){
                data.setErrCode(-1);
                data.setErrMsg(e.getMessage());
            }
            
            return data;
            
            
        }    
    }
    

    结果


    这样一来,浏览器就能清楚地知道后台报了什么错误了。

    但是这样有一个问题,虽然后台报错了,但是数据依然进了数据库。这里我们就需要规定,所有的业务操作不应该放在controller类中,都应该放到service类中。而且,这边还涉及到一个事务回滚的问题。这些知识点会在以后讲到。

    现在,我们来看一下数据库:

    发现一个问题,两条数据的用户名是重复的,在实际情况下,用户名和ID一样,是唯一的。所以,我们需要判断一下用户名是否重复?

    package com.app.controller;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import com.app.bean.ResultData;
    import com.app.bean.Student;
    import com.app.service.UserService;
    import com.app.service.impl.UserServiceImpl;
    
    UserController 
    
    @Controller
    public class UserController {
        
        //用户业务类的引用
        private UserService userService = new UserServiceImpl();
        
        @RequestMapping("/addUser")
        @ResponseBody
        public ResultData addUser(HttpServletRequest request , HttpServletResponse response,Student student){
            ResultData data = new ResultData();
            
            try{
                
                //先判断用户名是否重复
                
                int count = userService.getByUserName(student);
                
                if(count > 0){
                    data.setErrCode(-1);
                    data.setErrMsg("用户名已经存在啦,换一个吧。。。");
                }
                
                userService.addUser(student);
            }catch(Exception e){
                data.setErrCode(-1);
                data.setErrMsg(e.getMessage());
            }
            
            return data;
            
            
        }    
    }
    

    UserServiceImpl

    package com.app.service.impl;
    
    import com.app.bean.Student;
    import com.app.dao.UserDao;
    import com.app.dao.impl.UserDaoImpl;
    import com.app.service.UserService;
    
    public class UserServiceImpl implements UserService{
        
        private UserDao userDao = new UserDaoImpl();
    
        @Override
        public void addUser(Student student) {
            
            userDao.addUser(student);
            
        }
    
        @Override
        public int getByUserName(Student student) {
            
            return userDao.getByUserName(student);
        }
    
    }
    

    UserDaoImpl

    package com.app.dao.impl;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import com.app.bean.Student;
    import com.app.dao.UserDao;
    import com.simple.dao.SimpleDao;
    
    public class UserDaoImpl implements UserDao {
    
        @Override
        public void addUser(Student student) {
            
            SimpleDao dao = new SimpleDao();
            
            Map map = new HashMap();
            
            map.put("id", null);
            map.put("username", student.getUsername());
            map.put("password", student.getPassword());
            map.put("name", student.getName());
            map.put("sex", student.getSex());
            
            dao.save("db_student", "t_student", map);
            
        }
    
        @Override
        public int getByUserName(Student student) {
            
            String sql = "select count(1) from t_student where username = ?";
            
            SimpleDao dao = new SimpleDao();
            return dao.queryForInt(sql, student.getUsername());
        }
    
    }
    

    效果:

    在保存操作之前,我们先判断一下用户名在表里是否存在,只要存在了,就给他返回一个错误。OK,让我们看一下数据库:

    我去,怎么还是保存进去啦,喵喵喵?

    让我们再回过去看一下controller的方法:

    @Controller
    public class UserController {
        
        //用户业务类的引用
        private UserService userService = new UserServiceImpl();
        
        @RequestMapping("/addUser")
        @ResponseBody
        public ResultData addUser(HttpServletRequest request , HttpServletResponse response,Student student){
            ResultData data = new ResultData();
            
            try{
                
                //先判断用户名是否重复
                
                int count = userService.getByUserName(student);
                
                if(count > 0){
                    data.setErrCode(-1);
                    data.setErrMsg("用户名已经存在啦,换一个吧。。。");
                }
                
                userService.addUser(student);
            }catch(Exception e){
                data.setErrCode(-1);
                data.setErrMsg(e.getMessage());
            }
            
            return data;
            
            
        }    
    }
    

    发现问题了,我们只是给data对象设置了错误码和错误信息,但是保存方法依然执行了,所以,我们需要及时return:

    再来一次,就好了。

    我要下载源码

    相关文章

      网友评论

      • 3ffbf6e3ed46:现在不用jquery了吗?
      • 5a00fa7f350f:请问 学LT在哪里学比较好点 一点基础都没有
        5a00fa7f350f:@剽悍一小兔 对 打错了😣
        剽悍一小兔:@离之殇_6e76 LT是啥,你是想说IT吗?
      • 一滴水的坚持:有点简单哇 不过写这么多不容易 加油加油 谁都是这样过来的
        剽悍一小兔:@一滴水的坚持 谢谢
      • 奈文摩尔定律:可能这个有点过时了吧:smile:,可以尝试点新的
        剽悍一小兔:@奈文摩尔定律 easyui是有点过时了,但多少还是有公司在用,这个教程是入门用的,毕竟没有谁有那个闲心思把真实项目写成教程吧。😂
      • liudev:为了验证用户是否存在,在controller里进行了数据库查询,说好的松耦合呢?为什么不在serviceImpl和daoImpl里设置返回值,在controller里获取返回值,然后反馈到客户端。
        剽悍一小兔:@liudev 你可以尝试一下,主要我从来没这么做过😂,做肯定都是能做的,只是每个人想法不一样,方式也不一样。。。
        liudev:@剽悍一小兔 我的意思是能否进一步降低耦合度。比方new一个名为UserLogin的接口,包含loginSuccess()和loginFailed()两个方法。在UserServiceImpl中注册这个接口,并根据登录结果调用接口中的两个不同方法。在UserController实现UserLogin接口,引用UserService进行接口回调,实现loginSuccess()和loginFailed()方法,完成对resultData的封装。
        剽悍一小兔:@liudev 查询数据是在dao层啊,controller层只是做了请求处理和基本都逻辑判断。
      • 智哥热线:就这能装逼?面试都过不去吧……入门介绍还是符合的
        Mr小智:面试也可以吧!

      本文标题:【Java框架型项目从入门到装逼】第十三节 用户新增功能完结篇

      本文链接:https://www.haomeiwen.com/subject/yseqzxtx.html