一.
@requestMapping(value="/list",method=RequestMethod.GET)
public String list(Model model1,Model model2,Model model3,Map<String,Object> map1){//不管几个model和map 都是同一个Map表
model1.addAttribute("userList1",userList1);
model1.addAttribute("userList2",userList2);
model1.addAttribute("userList3",userList3);
System.out.println("model1 -->" + model1);
System.out.println("model2 -->" + model2);
System.out.println("model3 -->" + model3);
//三个model的结果是一样的,三个model放的是同一个Map里面
model1.addAttribute("userList",userList1);
model1.addAttribute("userList",userList2);
//结果userList1会被userList2覆盖掉,因为是同一个Map里面,key相同,后赋值会覆盖前面赋的值
return "user/userlist";
}
二.
return "user/add" 和 return "redirect:/user/userList";的区别:
return "user/add"是返回逻辑视图名 服务端行为
return "redirect:/user/userList"是URL,是request请求 客户端重新发出请求,forward:URL
三.
public String add(@ModelAttribute("user" User user)){}//的意思是:以user为key放入User对象到model中
等价于:
public String add(User user){model.addAttribute(new User);}
等价于:
public String add(User user)){} //注:springMVC自动将对象名User转换成开头字母小写user作为key值放入model中
如果改为prublic String add(User userlist)){}则无法自动绑定
<body>
<!-- 没有写action,直接提交给/add -->
<sf:form method="post" modelAttribute="user">
UserName:<sf:input path="userName"/><sf:errors path="userName"/><br/>
password:<sf:password path="password"/><sf:errors path="password"/><br/>
position:<sf:input path="position"/><br/>
email:<sf:input path="email"/><sf:errors path="email"/><br/>
<input type="submit" value="保存"/>
</sf:form>
</body>
四.
//用户登录 HttpSession session用于将登陆用户放到session里面
@RequestMapping(value="/login",method=RequestMethod.POST)
public String login(String userName,String password,HttpSession session){
if(!userList.containsKey(userName)){
throw new UserException("用户名不存在!");
}
User _user = userList.get(userName);
if(!_user.getPassword().equals(password)){
throw new UserException("密码不正确!");
}
session.setAttribute("loginUser", _user);
return "redirect:/user/userlist"; //跳转到URL = /user/userlist中
}
@RequestMapping(value="/userlist",method=RequestMethod.GET)
public String list(Model model){
model.addAttribute("userlist",userList);
return "user/list"; //跳转到user/list.jsp页面中
}
五.
局部异常
局部异常处理: @ExceptionHandle
全局异常处理: SimpleMappingExceptionResolve
使用Servlet API 对象作为入参
HttpSession
HttpServletRequest
HttpServletResponse
//全局异常处理: SimpleMappingExceptionResolve
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="cn.bdqn.pojo.UserException">error</prop>
</props>
</property>
</bean>
public class UserException extends RuntimeException{}
if(!userList.containsKey(userName)){
throw new UserException("用户名不存在!"); //抛出来的异常信息
}
error.jsp里面写着 ${exception.message} 获得抛出来的信息
@responseBody // 用于返回对象(而不是逻辑视图名) 常用于ajax请求
// controller 里的方法返回对象,返回的结果写入到 http response body的数据区内 一般作异步时候用到
总结:
DispatcherServlet
Handler
@Controller
@RequestMapping(value method params)
@PathVariable
@RequestParam
@ResponseBody
方法的返回值
ModelAndView
View
Model
String
Object
void