【SSH】SpringMVC接收请求参数和页面传参


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;
}


赞(52) 打赏
未经允许不得转载:优客志 » JAVA开发
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏