前两天写了SSM 重构注册登录界面,而后添加了一点功能:保持登陆状态,修改当前登陆用户信息,查看登陆状态前端
可经过点击 tag 来查看 v0.1:git
登陆成功后主页面:github
修改用户信息(用户名没法修改):数据库
电话号码和邮箱不能为空:bash
修改为功:session
检测登陆状态:app
若未登陆就检测登陆状态:dom
用户的信息添加了电话号码和描述,因此要在实体类和数据库中都作一点改动:jsp
private String gender;
private String description;
public void setGender(String gender) {
this.gender = gender;
}
public String getGender() {
return gender;
}
public void setDescription(String description) {
this.description = description;
}
public String getDescription() {
return description;
}
复制代码
MySQL 中对表作一点改动:ide
alter table user add gender varchar(10), add description varchar(200);
复制代码
为了添加新功能,须要在 MyBatis 映射器中添加两步:
<select id="showInfo" parameterType="String" resultType="domain.User">
SELECT *
FROM user
WHERE username = #{username}
</select>
复制代码
<update id="setUserInfo" parameterType="domain.User">
UPDATE user SET phone = #{phone}, email = #{email},
gender = #{gender}, description = #{description}
</update>
复制代码
而后在接口中添加对应方法:
User showInfo(String username);
void setUserInfo(User user);
复制代码
先写异常的接口 ExceptionService 吧:
void setInfoException(User user) throws UserException;
void statusException(String username) throws UserException;
复制代码
而后写实现类:
//重置信息检测,关键信息不能为空
@Override
public void setInfoException(User user) throws UserException {
if (user.getPhone() == null || user.getPhone().trim().isEmpty()){
throw new UserException("电话号码不能为空");
} else if (user.getEmail() == null || user.getEmail().trim().isEmpty()){
throw new UserException("邮箱不能为空");
}
}
//用户状态检测,若是在 Session 中未找到有用户登录,就抛出异常
@Override
public void statusException(String username) throws UserException {
if (username == null){
throw new UserException("请先登陆");
}
}
复制代码
在 UserService 中新增三个功能,其中有两个有异常检测:
User showInfo(String username);
String getStatus(String username) throws UserException;
void setUserInfo(User user) throws UserException;
复制代码
而后是实现类:
//显示用户信息
@Override
public User showInfo(String username) {
return userMapper.showInfo(username);
}
//显示当前登陆状态
@Override
public String getStatus(String username) throws UserException {
exceptionService.statusException(username);
return username;
}
//修改用户信息
@Override
public void setUserInfo(User user) throws UserException{
exceptionService.setInfoException(user);
userMapper.setUserInfo(user);
}
复制代码
在登陆时,须要添加一点代码,将用户名写入 Session,以保持登陆状态:
public ModelAndView login(User user, HttpServletRequest request) {
ModelAndView modelAndView = new ModelAndView("main");
try {
userService.login(user);
userService.verifyCode(request.getParameter("verifyCode"), verifyCode.getText());
//建立 Session,保持登陆状态
request.getSession().setAttribute("username", user.getUsername());
//在模型中添加对象,用于 JSP 读取
modelAndView.addObject("username", request.getSession().getAttribute("username"));
} catch (UserException e){
//若是未登陆成功,就从新登陆
modelAndView.setViewName("login");
modelAndView.addObject("message", e.getMessage());
}
return modelAndView;
复制代码
而后是登出的操做:
//登出帐户,不须要具体用户名称,直接废除 session 就行
@RequestMapping("/logout")
public ModelAndView logout(HttpServletRequest request){
request.getSession().invalidate();
return new ModelAndView("login").addObject("message", "已登出");
}
复制代码
新增查看用户状态的功能:
//查看用户状态,显示是哪一个用户在登陆,若是没有登陆的用户,就会提示你先登陆
@RequestMapping("/userStatus")
public ModelAndView userState(HttpServletRequest request){
ModelAndView modelAndView = new ModelAndView("userStatus");
try {
modelAndView.addObject("username",
userService.getStatus((String)request.getSession().getAttribute("username")));
} catch (UserException e){
modelAndView.addObject("message", e.getMessage());
}
return modelAndView;
}
复制代码
而后是用户信息相关的操做,若是在修改信息时抛出异常,就带着错误信息回到信息修改页面:
//显示用户信息
@RequestMapping("showInfo")
public ModelAndView showInfo(HttpServletRequest request){
return new ModelAndView("userInfo")
.addObject("user", userService.showInfo(
((String)request.getSession().getAttribute("username"))));
}
//对用户信息进行修改
@RequestMapping("setUserInfo")
public ModelAndView setUserInfo(User user){
ModelAndView modelAndView = new ModelAndView("userInfo");
try {
userService.setUserInfo(user);
//设置提示信息
modelAndView.addObject("message", "修改为功");
//跳转
modelAndView.setViewName("main");
} catch (UserException e){
modelAndView.addObject("message", e.getMessage());
}
return modelAndView;
}
复制代码
新增两个前端页面:userInfo.jsp 和 userStatus.jsp,都是差很少的页面,这里就不演示了
接下来的 v0.2.2 是采用过滤器来实现相同功能