MVC模式的特点就在于将页面,业务逻辑,实体分层管理,那三层之间如何进行数据传输,Spring MVC与其他Web框架相比,有何独到之处。

在MVC框架模式中,大部分的参数传递都是通过发送请求请求到控制器控制器,控制器中调用后台服务业务,获取数据,回显查看界面。所以主要的参数传递是在Controller和View之间进行的。下面就来介绍控制器和视图之间数据的发送和接收方式。

一,控制器接收查看参数

1,通过HttpServletRequest的

通过HttpServletRequest进行页面与控制器间参数传递是典型的Servlet参数传递方式,像使用Servlet作为Web开发中控制器的角色,通过实现servlet接口,重写doGet \ doPost方法,两必不可少的参数便是HttpServletRequest和HttpServletResponce。所有使用HttpServletRequest接受请求请求参数,并非Spring MVC所特有的方式。

[java]   查看纯 文本  
  1. @RequestMapping“/getName.do”)  
  2.        公共  字符串toPerson(HttpServletRequest请求){  
  3.        String result = request.getParameter(“name”);  
  4.        的System.out.println(结果);  
  5.        返回  “索引” ;  
  6.       }  
String studentName = request.getParameter(“name”);

测试时,浏览器通过访问URL:http:// localhost:8091 / springMVC / getName。做?名称= MAX1209  传入名= MAX1209参数。   

2,直接定义参数名

控制器接收界面参数,还可直接指定参数名称

1)单个参数

[java]   查看纯 文本  
  1. @RequestMapping“/getName.do”)   
  2.   
  3.  public  String getName(String name){   
  4.   
  5.         的System.out.println(名);  
  6.   
  7.        返回  “/ index” ;   
  8.   
  9.  }  
       测试时,浏览器通过访问URL: http:// localhost:8091 / springMVC / getName .do?name = max1209  传入名称= max1209参数   
      。2)多个参数
[java]   查看纯 文本  
  1. @RequestMapping“/getName.do”)   
  2.   
  3.  public  String getName(String name,Integer age,String address,Date birthday){   
  4.   
  5.        System.out.println(name + " "+ age + " "+ address + " " +birthday);  
  6.   
  7.        return "/index";   
  8.   
  9.  }  

测试时,浏览器通过访问 URL:http://localhost:8091/springMVC/getName.do?name=max1209&age=30&address=London 传入多个参数。         

注意

1)要求前台传入的参数和controller方法中参数名必须相同,才可成功获取该参数值。

2)参数类型,如果前台出入String类型,后台方法参数为Integer,传入“123”数字字符串,SpringMVC可自动转换成Integer,但传入“jfjdk”字符串,就会参数类型转换错误。

3)时间类型参数需要指定时间格式

3、通过实体整合

当界面参数过多时,以2中指定参数名的形式进行接收未免过于繁琐。可以将参数整合成一个实体进行接收。例如:定义一个Person实体接受person的name、age、sex等参数值。

[java]  view plain  copy
  1. @RequestMapping("/getName.do")  
  2. public String getName(Person person){  
  3.     System.out.println(person);  
  4.     return "index";  
  5. }  

测试时,浏览器通过访问 URL:http://localhost:8091/springMVC/getName.do?name=max1209&age=30&address=London 传入多个参数。               

使用实体接收参数需要注意:

1、URL传递的参数必须跟person实体的set方法后面的名完全一样,才可以接收到这个参数。因为传入的name 、age ,都作为参数传入实体中,需要通过set方法为实体赋值。属性才能被注入进Person实体中,ps.Spring MVC中参数与set方法首字母大小写不敏感。

2、参数列表,如果有两个实体,person 和user ,俩都有name 和age 属性,不管哪个实体,只要传入的参数名能和实体中的set方法匹配,就能改该实体赋值。也就是说,如果url就传入name 、age参数,而person和User实体恰好也都有这两个参数,那么两个实体都能注入name、age参数值 

4、数组类型参数接收

这个适用于页面例如有多个checkbox时,名字都一样,传入多个checkbox值,则Controller中就需要使用数组接收参数。

[java]  view plain  copy
  1. @RequestMapping("/getName.do")  
  2. public String getName(String[] name){  
  3.     for(String result : name){  
  4.         System.out.println(result);  
  5.     }  
  6.     return "index";  
  7. }  

测试时,浏览器通过访问 URL:http://localhost:8091/springMVC/getName.do?name=max1209&name=li&name=zzz传入数组形式参数。                
二、Controller如何把业务数据返回View显示

1、通过ModelAndView 返回

将数据封装成一个实体,通过ModelAndView返回界面。实际就是把person对象放到map ,通过ModelAndView 封装到responce对象中去了,所以前台直接通过map key值,获取属性即可。

[java]  view plain  copy
  1. @RequestMapping("/getName.do")  
  2. public ModelAndView getName() throws Exception{  
  3.     Person person = new Person();  
  4.     person.setName("james");  
  5.     person.setAge(28);  
  6.     person.setAddress("maami");  
  7.     SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");  
  8.     Date date = format.parse("1985-04-22");  
  9.     person.setBirthday(date);  
  10.     Map<String, Object> map = new HashMap<String, Object>();  
  11.     map.put("p", person);  
  12.     return new ModelAndView("index", map);  
  13. }  

2、通过Map

在方法中加入map参数,ModelAndView视图管理器会自动把这个map参数装配到request中,方法通过返回String照样可以把person实体返回界面。

[java]  view plain  copy
  1. @RequestMapping("/getName.do")  
  2. public String getName(Map<String, Object> map) throws Exception{  
  3.     Person person = new Person();  
  4.     person.setName("james");  
  5.     person.setAge(28);  
  6.     person.setAddress("maami");  
  7.     SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");  
  8.     Date date = format.parse("1985-04-22");  
  9.     person.setBirthday(date);  
  10.     map.put("p", person);  
  11.     return "index";  
  12. }  

3、直接使用Model对象

最常用也最方便的就是直接通过Model对象返回

[java]  view plain  copy
  1. @RequestMapping("/getName.do")  
  2. public String getName(Model model) throws Exception{  
  3.     Person person = new Person();  
  4.     person.setName("james");  
  5.     person.setAge(28);  
  6.     person.setAddress("maami");  
  7.     SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");  
  8.     Date date = format.parse("1985-04-22");  
  9.     person.setBirthday(date);  
  10.     //把参数值放到request类里面去  
  11.     model.addAttribute(“p”,person);  
  12.     返回  “索引” ;  
  13. }  

这三种方式均可由前台通过JSTL + EL表达式获取的addAttribute中键值获取人的实体数据

[java]   查看纯 文本  
  1. <span style = “font-family:Comic Sans MS;” > <body>  
  2.         <H1> $ {p.name} </ H1>  
  3.         <H1> $ {p.age} </ H1>  
  4.         <H1> $ {p.sex}} </ H1>  
  5.         <H1> $ {p.address} </ H1>  
  6.     </ BODY> </跨度>