Spring框架新手求助:如何用Controller实现通讯录应用注册登录功能
嘿,作为Spring新手能搭起UserController的框架已经很棒啦!针对你要做的通讯录应用,我来一步步帮你完善和推进:
一、完善UserController的注册与登录逻辑
你给出的UserController框架已经有了核心依赖注入,接下来可以补全注册和登录的完整实现:
@Controller public class UserController { @Autowired private UserService userService; @Autowired private SecurityService securityService; @Autowired private UserValidator userValidator; // 注册页面跳转 @RequestMapping(value = "/registration", method = RequestMethod.GET) public String registration(Model model) { model.addAttribute("userForm", new User()); return "registration"; } // 注册提交处理 @RequestMapping(value = "/registration", method = RequestMethod.POST) public String registration(@ModelAttribute("userForm") User userForm, BindingResult bindingResult, Model model) { // 调用验证器校验用户输入 userValidator.validate(userForm, bindingResult); if (bindingResult.hasErrors()) { return "registration"; } // 保存用户到数据库 userService.save(userForm); // 自动登录新注册用户 securityService.autologin(userForm.getUsername(), userForm.getPasswordConfirm()); return "redirect:/welcome"; } // 登录页面跳转 @RequestMapping(value = "/login", method = RequestMethod.GET) public String login(Model model, String error, String logout) { if (error != null) { model.addAttribute("error", "用户名或密码错误!"); } if (logout != null) { model.addAttribute("message", "已成功退出登录!"); } return "login"; } // 登录成功后的首页(可跳转到通讯录列表) @RequestMapping(value = {"/", "/welcome"}, method = RequestMethod.GET) public String welcome(Model model) { return "welcome"; } }
几个关键说明:
UserValidator需要实现org.springframework.validation.Validator接口,用来校验用户名是否重复、密码是否匹配等规则SecurityService里的autologin方法需要借助Spring Security的AuthenticationManager来手动触发登录逻辑User实体类要包含用户名、密码、密码确认、邮箱等核心字段,记得加上JPA注解映射数据库表
二、通讯录功能的实现思路
完成登录注册后,就可以开发通讯录核心功能了:
1. 定义Contact实体类
@Entity @Table(name = "contacts") public class Contact { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String phone; private String email; // 关联所属用户,多对一关系 @ManyToOne @JoinColumn(name = "user_id") private User user; // 构造方法、getter、setter省略 }
2. 实现ContactService与ContactRepository
ContactRepository继承JpaRepository<Contact, Long>,提供基本的CRUD方法ContactService封装业务逻辑,比如根据当前登录用户查询通讯录、新增/修改/删除联系人:
@Service public class ContactService { @Autowired private ContactRepository contactRepository; @Autowired private UserService userService; // 获取当前登录用户的所有联系人 public List<Contact> findAllByCurrentUser() { User currentUser = userService.getCurrentUser(); return contactRepository.findByUser(currentUser); } // 保存联系人 public Contact save(Contact contact) { User currentUser = userService.getCurrentUser(); contact.setUser(currentUser); return contactRepository.save(contact); } // 根据ID删除联系人(需校验归属) public void delete(Long id) { Contact contact = contactRepository.findById(id).orElseThrow(() -> new RuntimeException("联系人不存在")); if (contact.getUser().getId().equals(userService.getCurrentUser().getId())) { contactRepository.delete(contact); } else { throw new RuntimeException("无权限删除该联系人"); } } }
3. 创建ContactController处理请求
@Controller @RequestMapping("/contacts") public class ContactController { @Autowired private ContactService contactService; // 通讯录列表页面 @RequestMapping(method = RequestMethod.GET) public String listContacts(Model model) { model.addAttribute("contacts", contactService.findAllByCurrentUser()); return "contacts/list"; } // 新增联系人页面 @RequestMapping(value = "/add", method = RequestMethod.GET) public String addContactForm(Model model) { model.addAttribute("contact", new Contact()); return "contacts/add"; } // 提交新增联系人 @RequestMapping(value = "/add", method = RequestMethod.POST) public String saveContact(@ModelAttribute("contact") Contact contact) { contactService.save(contact); return "redirect:/contacts"; } // 删除联系人 @RequestMapping(value = "/delete/{id}", method = RequestMethod.GET) public String deleteContact(@PathVariable("id") Long id) { contactService.delete(id); return "redirect:/contacts"; } }
三、核心配置注意事项
- Spring Security配置:要确保只有登录用户才能访问
/contacts相关路径,允许匿名访问/registration和/login - 模板页面:配合Thymeleaf等模板引擎编写注册、登录、通讯录列表/新增页面,比如在
registration.html里绑定userForm的字段 - 数据库配置:在
application.properties里配置数据库连接信息,开启Hibernate自动建表(开发环境可用)
内容的提问来源于stack exchange,提问作者Adil Tokushev
相关产品推荐
相关产品推荐

