执行修改个人资料的SQL语句是:
UPDATE
t_user
SET
phone=?,email=?,
gender=?,
modified_user=?,modified_time=?
WHERE
uid=?
在操作数据之前,还是应该执行相关的检查,检查数据是否存在,检查是否被标记为删除,当然,这些检查可以使用已有的查询功能来完成!
另外,在修改个人资料之前,还应该将当前登录的用户的资料显示在界面中,涉及的数据有:用户名、电话、邮箱、性别,则需要:
SELECT username,phone,email,gender FROM t_user WHERE uid=?
当然,根据uid查询数据的功能已经存在,只需要在其映射的SQL语句中补充查询的字段即可!
关于修改个人资料的抽象方法:Integer updateInfo(User user);
更新个人资料的映射:
UPDATE
t_user
SET
phone=#{phone},email=#{email},
gender=#{gender},
modified_user=#{modifiedUser},
modified_time=#{modifiedTime}
WHERE
uid=#{uid}
另外,修改原有`findByUid`方法的映射,补充查询的字段:
完成后,编写并执行单元测试:
@Test
public void updateInfo() {
User user = new User();
user.setUid(8);
user.setGender(0);
user.setPhone("13100131001");
user.setEmail("[email protected]");
user.setModifiedUser("超级管理员");
user.setModifiedTime(new Date());
Integer rows = mapper.updateInfo(user);
System.err.println("rows=" + rows);
}
修改个人资料之前,还是应该检查用户数据是否存在、是否被标记为删除,涉及`UserNotFoundException`,在执行更新时,涉及`UpdateException`。以上异常均已创建,无需创建新的异常。
void changeInfo(User user) throws UserNotFoundException, UpdateException;
首先,将持久层新添加的方法在业务层中实现为私有方法:
然后,实现接口中新添加的抽象方法:
public void changeInfo(User user) throws UserNotFoundException, UpdateException {
// 根据user.getUid()查询用户数据
// 判断查询结果是否为null
// 是:抛出UserNotFoundException
// 判断查询结果中isDelete是否为1
// 是:抛出UserNotFoundException
// 向user中封装modifiedUser和modifiedTime
// 执行更新
}
具体实现为:
@Override
public void changeInfo(User user) throws UserNotFoundException, UpdateException {
// 根据uid查询用户数据
User result = findByUid(user.getUid());
// 判断查询结果是否为null
if (result == null) {
// 是:抛出UserNotFoundException
throw new UserNotFoundException(
"修改密码失败!尝试访问的用户不存在!");
}
// 判断查询结果中isDelete是否为1
if (result.getIsDelete().equals(1)) {
// 是:抛出UserNotFoundException
throw new UserNotFoundException(
"修改密码失败!尝试访问的用户不存在!");
}
// 向user中封装modifiedUser和modifiedTime
user.setModifiedUser(result.getUsername());
user.setModifiedTime(new Date());
// 执行更新
updateInfo(user);
}
完成后,编写并执行单元测试:
@Test
public void changeInfo() {
try {
User user = new User();
user.setUid(8);
user.setGender(1);
user.setPhone("13100131009");
user.setEmail("[email protected]");
service.changeInfo(user);
System.err.println("OK.");
} catch (ServiceException e) {
System.err.println(e.getClass().getName());
System.err.println(e.getMessage());
}
}
此次业务层没有抛出新的异常,则无需处理!
请求路径:/users/change_info
请求参数:User user, HttpSesion session
请求方式:POST
响应数据:Void
是否拦截:是,无需修改配置,因为默认拦截 /**
@RequestMapping("/change_info")
public ResponseResult
// 封装uid
Integer uid = getUidFromSession(session);
user.setUid(uid);
// 执行修改个人资料
userService.changeInfo(user);
// 返回
return new ResponseResult<>(SUCCESS);
}
完成后,可以通过`http://localhost:8080/users/[email protected]&gender=0`进行测试。
在“执行修改”之前,应该保证“当页面打开时就能显示当前登录的用户的信息”!
这些信息应该是打开页面时就直接向服务器端发出请求,由服务器端响应时提供的!
这就要求服务器提供“获取当前登录的用户的信息”功能!由于目前没有这个功能,所以需要从持久层开始开发这个功能!
**获取当前登录的用户数据-持久层**
直接使用已有的`findByUid()`即可!无需再次开发!
**获取当前登录的用户数据-业务层**
需要在`IUserService`接口中添加抽象方法:
User getByUid(Integer uid);
然后,在`UserServiceImpl`类中实现这个方法:
@Override
public User getByUid(Integer uid) {
// 根据uid查询用户数据
User result = findByUid(uid);
// 判断查询结果是否为null
if (result == null) {
// 是:抛出UserNotFoundException
throw new UserNotFoundException(
"获取用户信息失败!尝试访问的用户不存在!");
}
// 判断查询结果中isDelete是否为1
if (result.getIsDelete().equals(1)) {
// 是:抛出UserNotFoundException
throw new UserNotFoundException(
"获取用户信息失败!尝试访问的用户不存在!");
}
// 在返回之前隐藏不向外提供的数据
result.setPassword(null);
result.setSalt(null);
result.setIsDelete(null);
// 执行返回
return result;
}
完成后,编写并执行单元测试:
@Test
public void getByUid() {
try {
Integer uid = 8;
User data = service.getByUid(uid);
System.err.println(data);
} catch (ServiceException e) {
System.err.println(e.getClass().getName());
System.err.println(e.getMessage());
}
}
**获取当前登录的用户数据-控制器层**
@GetMapping("/info")
public ResponseResult
// 获取uid
Integer uid = getUidFromSession(session);
// 查询用户数据
User data = userService.getByUid(uid);
// 返回
return new ResponseResult
}
完成后,在浏览器中通过`http://localhost:8080/users/info`直接访问即可测试。
**发出请求并处理结果**
当页面加载时,应该向服务器发出请求,获取当前登录的用户数据:
当点击按钮时:
创建新项目:
- Group Id:cn.tedu.spring
- Artifact Id:SPRINGMVC-03-UPLOAD
- Packaging:war
然后,按照传统方式完成项目的创建(添加web.xml;添加Tomcat Runtime,复制pom.xml中的依赖,复制web.xml中的配置,复制spring的配置文件。注意:检查spring的配置文件是否存在多余且不可用的配置,如果有,则删除)。
上传文件的页面只要求是html页面即可,不需要是jsp页面(可以使用jsp页面)。
上传使用的控件是:
并且,上传时的表单必须配置`enctype`属性,并且请求类型必须是`post`类型:
基于SpringMVC的文件上传需要添加`spring-webmvc`依赖,并添加`commons-fileupload`依赖:
在spring的配置文件中添加:
注意:此项配置中,`
该`
此次项目中,需要开启注解驱动:
创建控制器类`cn.tedu.spring.FileUploadController`,并添加处理请求的方法:
@Controller
public class FileUploadController {
@RequestMapping("/upload.do")
public String handleUpload(
@RequestParam("file") MultipartFile file) {
return null;
}
}
注意:客户端提交的上传的文件需要声明为`MultipartFile`类型(这是一个接口类型,实际类型是`CommonsMultipartFile`),并且,需要添加`@RequestParam`注解,如果没有添加该注解,在某些版本中可能会出错。
当然,以上控制器的方法确定后,前端页面中`