在做登录相关功能时,发现相关的功能有所冲突,在使用@Autowired自动装载时,不可以同时引用private UserMapper userMapper,和private UserService userService,在某度找了一圈,换了n种关键词都找不到解决方法。
在几天的学习和摸索中,我找到了两种方法:
第一种就是使用@Resource注解,引用mapper内容;一种就是不要UserService,把其实现的功能全部集成在控制类中,这个方法直接在根源上解决了无法同时使用的问题。
法一
终于是有所领悟:
我之前想对注册页面进行控制,又想同时将用户的注册信息插入到数据库里,发现行不通,预想代码:
@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不为空,则判断密码是否正确;如果密码正确,则登录成功,如果不对,返回信息“名称或密码错误!”。