SpringMVC中如何在控制器里面同时使用接口类mapper和Service?

在做登录相关功能时,发现相关的功能有所冲突,在使用@Autowired自动装载时,不可以同时引用private UserMapper userMapper,和private UserService userService,在某度找了一圈,换了n种关键词都找不到解决方法。

在几天的学习和摸索中,我找到了两种方法:

第一种就是使用@Resource注解,引用mapper内容;一种就是不要UserService,把其实现的功能全部集成在控制类中,这个方法直接在根源上解决了无法同时使用的问题。

法一

经过下面链接的指点:基于springmvc+mysql+mybatis实现用户登陆功能_温酒YXY的博客-CSDN博客_mybatis实现用户登录https://blog.csdn.net/qq_16398505/article/details/79547655?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165512297316782395343115%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=165512297316782395343115&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-6-79547655-null-null.142%5Ev14%5Econtrol,157%5Ev14%5Enew_3&utm_term=springmvc%E6%80%8E%E4%B9%88%E5%9C%A8Service%E9%87%8C%E5%AE%9E%E7%8E%B0%E6%8F%92%E5%85%A5%E6%95%B0%E6%8D%AE%E5%88%B0%E6%95%B0%E6%8D%AE%E5%BA%93%E5%92%8C%E9%AA%8C%E8%AF%81%E7%9A%84%E5%8A%9F%E8%83%BD&spm=1018.2226.3001.4187

 终于是有所领悟:

我之前想对注册页面进行控制,又想同时将用户的注册信息插入到数据库里,发现行不通,预想代码:

@Autowired
    private UserService userService;
    private UserMapper userMapper;

//控制注册
    @RequestMapping("pre_reg")
    public String preReg(){
        return "user/reg";
    }
    @RequestMapping("add_user")
    public String reg(String uid, String uname, String address,
                      String password, String password1, Model model)
    {
        //不允许有空的信息:
        if(uid.equals("") || uname.equals("") || address.equals("")
                || password.equals("") || password1.equals("")){
            model.addAttribute("reg1_error","信息有误,请完整填入信息!");
            return "redirect:pre_reg";
        }
        //验证密码是否正确:
        if(!password.equals(password1)){
            model.addAttribute("reg_error","两次密码不一致,请重新输入!");
            return "redirect:pre_reg";
        }
        model.addAttribute("uid",uid);
        return "redirect:pre_login";
    }

    @RequestMapping("add_user")
    public String addUser(User user){
        int count = userMapper.addUser(user);
        return "redirect:pre_login";
    }
//注意这只是部分代码!!并不是全部的!!

但是在运行的时候,idea报错,说是有两个bean被引用,无法识别。因为我在下面已经使用UserService来进行登录验证,所以不能去掉UserService。

//这是控制类中剩下的部分:
//控制登录
    @RequestMapping("pre_login")
    public String preLogin(){
        return "user/login";
    }
    @RequestMapping("login")
    public String login(User user, HttpSession session, Model model)
    {
        if (userService.isValidatedUser(user))
        {
            session.setAttribute("uid", user.getUid());
            request.setAttribute("user",user);
            return "redirect:success";
        }
        model.addAttribute("login_error", "名称或密码错误!");
        return "redirect: pre_login";
    }

这是修改之后的,可以使用:

//引用mapper文件:
    @Resource
    private UserMapper userMapper;
    //主动装载服务类
    @Autowired
    private UserService userService;

    //控制注册
    @RequestMapping("pre_reg")
    public String preReg(){
        return "user/reg";
    }
    @RequestMapping("add_user")
    public String reg(User user, String uid, String uname, String address,
                      String password, String password1, Model model)
    {
        //不允许有空的信息:
        if(uid.equals("") || uname.equals("") || address.equals("")
                || password.equals("") || password1.equals("")){
            model.addAttribute("reg1_error","信息有误,请完整填入信息!");
            return "redirect:pre_reg";
        }
        //验证密码是否正确:
        if(!password.equals(password1)){
            model.addAttribute("reg_error","两次密码不一致,请重新输入!");
            return "redirect:pre_reg";
        }

        //添加用户:
        int count = userMapper.addUser(user);
        model.addAttribute("uid",uid);
        return "redirect:pre_login";
    }

//剩下的跟上面的控制登录一样。

修改之后,我使用了@Resource注解方式引用了接口类的Mapper,同时自动装载UserService服务类(这个功能是验证登录,不能缺乏!!)

//这个是在UserService类里面的内容,主要用于验证登录,从数据库中查询信息:
@Autowired
    private UserMapper userMapper;

    public boolean isValidatedUser(User user){
        if (user == null)
            return false;
        User dbUser = userMapper.findUserByUid(user.getUid().trim());
        if (dbUser != null && dbUser.getPassword().equals(user.getPassword()) ){
            return true;
        }
        return false;
    }

法二

在经过几天的折腾之后,我发现还有另外一种方式实现,就是把UserService实现的功能全部在控制类里面实现,代码如下:

@RequestMapping("login")
    public String login(String uid, String uname, String password, HttpServletRequest request, HttpSession session, Model model)
    {
        //实现方法1,无需Service类
        //下面的user是从数据库里找
        User user = userMapper.findUserByUid(uid);
        if (user != null) {
            if (password.equals(user.getPassword())) {
                //保存用户登录状态
                uname = user.getUname();
                session.setAttribute("user", user);
                session.setAttribute("uname", uname);
                request.getSession().setAttribute("user",user);
                return "redirect:success";
            }
            else {
                model.addAttribute("login_error", "名称或者密码错误");
                return "redirect: pre_login";
            }
        }
        model.addAttribute("login_error", "名称或密码错误!");
        session.setAttribute("uid", "");
        return "redirect: pre_login";
}

这里只是稍微修改了一下代码,直接从数据库里面抓取user:如果uid有效,则实体类user不为空,则判断密码是否正确;如果密码正确,则登录成功,如果不对,返回信息“名称或密码错误!”。

猜你喜欢

转载自blog.csdn.net/m0_54066656/article/details/125267926
今日推荐