SpringBoot项目—功能完善
1.在DAO实现类里,selectUserById(Integer id)这个方法还有另一种写法
@Override
public Users selectUserById(Integer id) {
String sql = "select * from users where userid = ?";
return jdbcTemplate.queryForObject(sql, Users.class, id);
}
这里的queryForObject(sql, Users.class, id)方法,参数是sql语句、需要的Object对象类别、sql语句中?要传入的参数名
同样是在DAO实现类里得到selectUsersAll()方法,不能写成
@Override
public List<Users> selectUsersAll(){
String sql = "select * from users";
return jdbcTemplate.queryForList(sql, Users.class);
}
原因是queryForList(sql,class)方法里的class只能是单数据类型,也就是我们说的Integer、String、Double、Float等,不能是自己定义的类
2.在Controller类里会抛异常,由于这个类里有许多方法,所以可以把异常拿出来,单独封装为一个方法
@ExceptionHandler(Exception.class)
public String handleException(Exception e){
e.printStackTrace();
return "error";
}
这里要注意@ExceptionHandler(Exception.class)注解
return就是返回指定错误页面
3.关于页面跳转
return "forward:/user/findUserAll";
一定是请求转发或者重定向,标注好
路径名也要按照mapping()映射的路径写全
对数据进行修改、删除、添加操作的时候,应该用response.sendRedirect()。如果是采用了request.getRequestDispatcher().forward(request,response),那么操作前后的地址栏都不会发生改变,仍然是修改的控制器,如果此时再对当前页面刷新的话,就会重新发送一次请求对数据进行修改,这也就是有的人在刷新一次页面就增加一条数据的原因
@PostMapping("/addUser")
public String showInfo(Users users){
this.userService.addUser(users);
return "redirect:/user/findUserAll";
}
@GetMapping("/findUserAll")
public String findUserAll(Model model){
List<Users> list = null;
list = this.userService.findUsersAll();
model.addAttribute("list",list);
return "showUsers";
}
@GetMapping("/preUpdateUser")
public String preUpdateUser(Integer id,Model model){
Users user = this.userService.findUserById(id);
model.addAttribute("user",user);
return "updateUser";
}
@PostMapping("/updateUser")
public String updateUser(Users users){
this.userService.modifyUser(users);
return "redirect:/user/findUserAll";
}
这里会发现@PostMapping如果要跳转到@GetMapping的URL,就需要重定向
所以可以把注解改为@RequestMapping
如果页面HTML中表单提交方式为post,那么对应的controller类中的方法就只能是@PostMapping或者@RequestMapping
请求转发方式解析:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ba0VJko1-1590455546258)(E:\李小兔的Java总结\get请求转发.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pylPtJPk-1590455546260)(E:\李小兔的Java总结\post请求转发.png)]
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@PostMapping("/addUser")
public String showInfo(Users users){
this.userService.addUser(users);
return "redirect:/user/findUserAll";
}
@RequestMapping("/findUserAll")//这里改成@RequestMapping,后边就可以通过forward请求转发方式来实现跳转了
public String findUserAll(Model model){
List<Users> list = null;
list = this.userService.findUsersAll();
model.addAttribute("list",list);
return "showUsers";
}
@GetMapping("/preUpdateUser")
public String preUpdateUser(Integer id,Model model){
Users user = this.userService.findUserById(id);
model.addAttribute("user",user);
return "updateUser";
}
@PostMapping("/updateUser")
public String updateUser(Users users){
this.userService.modifyUser(users);
return "forward:/user/findUserAll";//通过forward请求转发方式跳转
}
@GetMapping("/deleteUser")
public String deleteUser(Integer id){
this.userService.dropUser(id);
return "forward:/user/findUserAll";//通过forward请求转发方式跳转
}
@ExceptionHandler(Exception.class)
public String handleException(Exception e){
e.printStackTrace();
return "error";
}
}
重定向方式解析:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tHSPP9D5-1590455546261)(E:\李小兔的Java总结\重定向.png)]