1、使用HttpServletRequest获取
@RequestMapping("/login.do") public String login(HttpServletRequest request){ String name = request.getParameter("name") String pass = request.getParameter("pass") }
2、Spring会自动将表单参数注入到方法参数,和表单的name属性保持一致。和Struts2一样
@RequestMapping("/login.do") public String login(HttpServletRequest request, String name, @RequestParam("pass")String password){ // 表单属性是pass,用变量password接收 syso(name); syso(password) }
3、自动注入Bean属性
<form action="login.do"> 用户名:<input name="name"/> 密码:<input name="pass"/> <input type="submit" value="登陆"> </form> //封装的User类 public class User{ private String name; private String pass; } @RequestMapping("/login.do") public String login(User user) { syso(user.getName()); syso(user.getPass()); }
向页面传值: 当Controller组件处理后,向jsp页面传值,
1、使用HttpServletRequest 和 Session 然后setAttribute(),就和Servlet中一样
2、使用ModelAndView对象
3、使用ModelMap对象
4、使用@ModelAttribute注解
Model数据会利用HttpServletRequest的Attribute传值到success.jsp中
@RequestMapping("/login.do") public ModelAndView login(String name,String pass){ User user = userService.login(name,pwd); Map<String,Object> data = new HashMap<String,Object>(); data.put("user",user); return new ModelAndView("success",data); }
使用ModelMap参数对象示例:
ModelMap数据会利用HttpServletRequest的Attribute传值到success.jsp中
@RequestMapping("/login.do") public String login(String name,String pass ,ModelMap model){ User user = userService.login(name,pwd); model.addAttribute("user",user); model.put("name",name); return "success"; } ModelMap对象的 addAttribute,put两个方法有什么区别? ModelMap是继承自LinkedHashMap的,则put方法是继承自 HashMap的方法,没什么特殊的 而addAttribute方法的定义 public ModelMap addAttribute(String attributeName,Object attributeValue){ Assert.notNull(attributeName, "Model attribute name must not be null"); put(attributeName, attributeValue); return this; } 其实也是调用的put方法,但是会在调用之前判断 key值是否为null,如果为null则会报错java.lang.IllegalArgumentException: Model attribute name must not be null,而put方法不会检查key值是否会空 综上,则 ModelMap对象的addAttribute,put两个方法有什么区别就是 addAttribute是不允许添加空值的key,put是允许的
使用@ModelAttribute示例
在Controller方法的参数部分或Bean属性方法上使用
@ModelAttribute数据会利用HttpServletRequest的Attribute传值到success.jsp中
@RequestMapping("/login.do") public String login(@ModelAttribute("user") User user){ //TODO return "success"; } @ModelAttribute("name") public String getName(){ return name; }
Session存储:
可以利用HttpServletReequest的getSession()方法
@RequestMapping("/login.do") public String login(String name,String pwd,ModelMap model,HttpServletRequest request){ User user = serService.login(name,pwd); HttpSession session = request.getSession(); session.setAttribute("user",user); model.addAttribute("user",user); return "success"; }
Spring MVC 默认采用的是转发来定位视图,如果要使用重定向,可以如下操作
1,使用RedirectView
2,使用redirect:前缀
public ModelAndView login(){ RedirectView view = new RedirectView("regirst.do"); return new ModelAndView(view); }
或者用如下方法,工作中常用的方法:
public String login(){ return "redirect:regirst.do"; }
SpringMVC数据绑定全面示例(复杂对象,数组等)
/** * 最简的配置,不是用@RequestParam,效果和get2一样,默认required=false * 请求方式不限 * @param p1 * @param map */ @RequestMapping(value="get0") public void get0(String p1,ModelMap map){ map.addAttribute("p1", p1);//往页面传递 } /** * value="p1"表示参数名称<br> * required=true表示如果没有传递参数"p1",则会报400参数异常<br> * 使用void表示约定的路径,即request/get1.jsp * @param p1 * @param map */ @RequestMapping(value="get1",method=RequestMethod.GET) public void get1(@RequestParam(value="p1",required=true)String p1,ModelMap map){ map.addAttribute("p1", p1);//往页面传递 } /** * 和get1不同的是,p1这个参数不一定非得需要,即使不给这个参数,也可以正常运行<br> * 返回String是视图的名称,只要将map赋值,给的值也会带到前抬 * @param p1 * @param map * @return */ @RequestMapping(value="get2",method=RequestMethod.GET) public String get2(@RequestParam(value="p1",required=false)String p1,ModelMap map){ map.addAttribute("p1", p1);//往页面传递 return "request/get2"; } /** * 和get2不同的是,返回的对象是ModelAndView * 表示绑定了视图和数据的对象,数据就是ModelMap中的Key-Value * @param p1 * @param map * @return */ @RequestMapping(value="get3",method=RequestMethod.GET) public ModelAndView get3(@RequestParam(value="p1",required=false)String p1,ModelMap map){ map.addAttribute("p1", p1); return new ModelAndView("request/get2",map); } /** * 跳转到页面 * @throws NoSuchAlgorithmException */ @RequestMapping("userForm") public String userForm(HttpServletResponse response) throws NoSuchAlgorithmException{ CookieUtils.writeCookie(response, -1, "x", "dddddddddddddd"); return "request/userForm"; } /** * 绑定数据到User对象,支持Map,Set,List,Array等,但是需要使用下标,不是很灵活 * 请查看user2的写法 * @param user * @param map */ @RequestMapping(value="user") public void user(User user,ModelMap map){ map.addAttribute("user", user); } /** * 这里可以接受List,Array,Set等,写法是一样的,注意前端写法<br> * 另外这个必须要使用MappingJacksonHttpMessageConverter这个消息转换器 * 请看我上面的配置 * @param user * @return */ @ResponseBody @RequestMapping("user2") public String user2(@RequestBody List<User> user){ System.out.println(user.size()); return ""; } /** * 这个方法只支持POST * @param s * @return */ @ResponseBody @RequestMapping("array") public String array(@RequestBody String[] s){ System.out.println(s.length); return ""; } /** * SpringMVC也是支持这种写法 * @param id * @return */ @ResponseBody @RequestMapping(value="array/{id}",method=RequestMethod.GET) public String array2(@PathVariable("id")Long[] id){ System.out.println(id.length); return "array length:"+id.length+""; } /** * 一个表单对应多个Bean对象,这些Bean中有相同的属性,那么需要在分装他们的一个整体的对象 * 使之支持object.property的表达式 * @param c */ @ResponseBody @RequestMapping("complex") public void complexObject(C c){ System.out.println(c.getA().getX()); System.out.println(c.getB().getX()); } /** * 读取Cookie的值 * @param x * @return */ @ResponseBody @RequestMapping("cookie") public String cookie(@CookieValue("x")String x){ return x; }