让人眼前一亮的前后端数据交互方式

在改测试提出的bug时,因为项目不是我写的,而且我刚到这个公司,看代码时苦苦找不到前端和后端是怎么交互的,没有看到http请求(其实是有,我眼瞎了),在大神简单的讲了一下,

哇好像突然开窍了,之前没有看到的后端的Controller层也都浮出水面。这里也算积累到了经验,搜索url时不要整段url搜,因为后端可能是用多个@RequestMapper拼装的url,所以几率最大的是从url后面截取搜。

在前端.jsp页面中只看到了${param},但没有看到后台到底是怎么传数据的,** 原来 **

下面讲讲SpringMVC的几种像页面传值的方式:

1. 使用HttpServletRequest 然后setAttribute(),就和Servlet中一样

2. 使用ModelAndView对象

Model数据会利用HttpServletRequest的Attribute传值到success.jsp中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
	@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);
}
```

#### 3. 使用ModelMap对象

ModelMap数据会利用HttpServletRequest的Attribute传值到success.jsp中

``` bash
@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";
}

4. 使用@ModelAttribute注解

在Controller方法的参数部分或Bean属性方法上使用

@ModelAttribute数据会利用HttpServletRequest的Attribute传值到success.jsp中

1
2
3
4
5
6
7
8
9
10
@RequestMapping("/login.do")  
public String login(@ModelAttribute("user") User user){
//TODO
return "success";
}

@ModelAttribute("name")
public String getName(){
return name;
}

5. Session存储

可以利用HttpServletReequest的getSession()方法

1
2
3
4
5
6
7
8
9
@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";
}

6. 自定义Map

1
2
3
4
5
6
7
8
9
10
11
@ResponseBody
@RequestMapping(value = "/updatestatus", method = RequestMethod.POST)
public Map<String, Object> updateStatus(HttpServletRequest request) {
Map<String, Object> result = new HashMap<String, Object>();
String id = request.getParameter("id");
SystemAdministrator sysadmin=systemAdminBiz.get(Integer.valueOf(id));
sysadmin.setStatus(1);
boolean flag = systemAdminBiz.update(sysadmin);
result.put("status", flag);
return result;
}