Spring MVC之数据回写、异常处理
一、数据回写
1、默认方式
Controller定义如下:
@RequestMapping("/doLogin")
public String doLogin(String username, String password, Model model) {
if ("zhangsan".equals(username) && "123".equals(password)) {
return "index";
}
model.addAttribute("username", username);
model.addAttribute("password", password);
return "forward:/login";
}
form表单定义如下:
<form action="/doLogin" method="post">
<table>
<tr>
<td>用户名</td>
<td><input type="text" name="username" value="${username}"></td>
</tr>
<tr>
<td>密码</td>
<td><input type="password" name="password" value="${password}"></td>
</tr>
<tr>
<td><input type="submit" value="登录"></td>
</tr>
</table>
</form>
2、Model方式数据回写
表单定义如下:
<form action="h5" method="post">
<table>
<tr>
<td>编号:</td>
<td><input type="text" name="id" value="${user.id }"></td>
</tr>
<tr>
<td>姓名:</td>
<td><input type="text" name="name" value="${user.name }"></td>
</tr>
<tr>
<td>地址:</td>
<td><input type="text" name="address" value="${user.address }"></td>
</tr>
<tr>
<td>出生日期:</td>
<td><input type="date" name="birth" value="${user.birth }"></td>
</tr>
<tr>
<td>破游戏:</td>
<td><input type="checkbox" name="str" value="cs">CS</td>
<td><input type="checkbox" name="str" value="lol">LOL</td>
<td><input type="checkbox" name="str" value="csgo">CSGO</td>
</tr>
<tr>
<td>集合:</td>
<td><input type="checkbox" name="list" value="cs1">CS11</td>
<td><input type="checkbox" name="list" value="lol1">LOL11</td>
<td><input type="checkbox" name="list" value="csgo1">CSGO11</td>
</tr>
<tr>
<td>猫咪编号:</td>
<td><input type="text" name="cat.id" value="${user.cat.id }"></td>
</tr>
<tr>
<td>猫咪姓名:</td>
<td><input type="text" name="cat.name" value="${user.cat.name }"></td>
</tr>
<tr>
<td>猫咪颜色:</td>
<td><input type="text" name="cat.color" value="${user.cat.color }"></td>
</tr>
<tr>
<td><input type="submit" name="提交"></td>
</tr>
</table>
</form>
Controller定义如下:
/**
* 数据回写
* @param user
* @return
*/
@RequestMapping("/h5")
public String hello05(User user) {
user.setName("王五");
System.out.println(user);
return "/user.jsp";
}
页面访问
提交,数据回写
3、@ModelAttribute注解
此注解整体有两种不同的用法:
1、修改参数回显变量名:
修该方法如下:
@RequestMapping("/doLogin")
public String doLogin(@ModelAttribute("bbb") User user) {
if ("zhangsan".equals(user.getUsername()) && "123".equals(user.getPassword())) {
return "index";
}
return "forward:/login";
}
2、配置全局响应值:
例如:在某一Controller层中,接口中的每一个方法都返回某一个集合,此时可以使用@ModelAttribute统一返回。
@ModelAttribute("as")
public List<String> getAllAddress() {
List<String> as = new ArrayList<>();
as.add("深圳");
as.add("广州");
as.add("海口");
return as;
}
注意:
@ModelAttribute(“as”)注解中的as就是返回数据的key,通过as去访问数据。
二、异常处理
项目中的异常需要统一处理,正常情况下,需要提前准备好一个错误页面,当项目出错了,将该页面展示给用户。
1、自定义异常(可选)
public class CustomException extends Exception {
private String message;
public CustomException(String message) {
super(message);
this.message = message;
}
@Override
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
2、定义异常处理器(注意,异常处理器要被注册为bean)
@Component
public class MyExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest req, HttpServletResponse resp, Object o, Exception e) {
ModelAndView mv = new ModelAndView();
mv.setViewName("error");
mv.addObject("error", e.getMessage());
return mv;
}
}
在异常处理的bean中,指定视图名和错误信息。
3、提前定义好错误页面:
<body>
${error}
<h1>系统维护中,请稍后访问...............</h1>
</body>
4、最后,在项目需要的地方抛出异常
@GetMapping("/reg")
public String reg(Integer i) throws Exception {
if (i==0){
throw new CustomException("i不能为0");
}else if (i==1){
throw new Exception("i不能为1");
}
return "reg";
}