SpringMVC——参数和返回值

Spring MVC——参数和返回值

0. 介绍

SpringMVC 是一种基于Java的实现MVC设计模型的请求驱动类型的轻量级 Web 框架,属于 Spring FrameWork的后续产品,已经融合在 Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。

它通过一套注解,让一个简单的Java类成为处理请求的控制器,而无须实现任何接口。同时它还支持RESTful编程风格的请求。

Spring MVC的执行流程如下

1. 常用注解

@RequestMapping:建立请求URL和处理方法之间的对应关系,作用在类或者方法上。

@RequestParam:把请求中的指定名称的参数传递给控制器中的形参赋值

举例:

1
2
3
4
5
6
@RequestMapping("/useRequestParam")
public String useRequestParam(@RequestParam("name")String username,
@RequestParam(value="age",required=false) Integer age){
System.out.println(username+","+age);
return "success";
}

@RequestBody:直接以key=value的形式获取请求体内容(String类型)或者Java对象。用于POST请求。

@PathVaribale:用于绑定 url中的占位符。例如:请求 url 中 /delete/{id},这个{id}就是 url 占位符。

@ModelAttribute:出现在方法上,表示当前方法会在控制器方法之前执行。也可以出现在参数上,获取指定的数据给参数赋值。

应用场景:当表单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用数据库对象原来的数据。

举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
@Controller
@RequestMapping("modelAtrributionByObject")
public class ModelAtrributionByObject {


@ModelAttribute
public User showModel(String userName) {
System.out.println("showModel中接收的参数userName:"+userName);
//模拟去数据库查询
User user = findUserByName(userName);
System.out.println("执行了 showModel 方法" + user);
return user;
// return;
}

/**
* 模拟修改用户方法
*
* @param user
* @return
*/
@RequestMapping("/updateUser")
public String testModelAttribute(User user) {
System.out.println("控制器中处理请求的方法:修改用户:" + user);
return "success";
}

/**
* 模拟去数据库查询
*
* @param userName
* @return
*/
private User findUserByName(String userName) {
User user = new User();
user.setUserName("数据库中的姓名");
user.setAge(19);
user.setPassword("123456");
return user;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
@Controller
@RequestMapping("modelAtrributionByMap")
public class ModelAtrributionByMap {

@ModelAttribute
public void showModel(String userName, Map<String, User> map) {
//模拟去数据库查询
User user = findUserByName(userName);
System.out.println("执行了 showModel 方法" + user);
map.put("abc", user);
}

/**
* 模拟修改用户方法
*
* @param user
* @return
*/
@RequestMapping("/updateUser")
public String testModelAttribute(@ModelAttribute("abc") User user) {
System.out.println("控制器中处理请求的方法:修改用户:" + user);
return "success";
}


private User findUserByName(String userName) {
User user = new User();
user.setUserName(userName);
user.setAge(19);
user.setPassword("123456");
return user;
}
}

@SessionAttribute:用于多次执行控制器方法间的参数共享。 value为存入属性的名称,type为存入属性的类型。

2.数据响应

1. 返回字符串

controller 方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。

视图解析器的配置:

1
2
3
4
5
<!-- 配置视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>

2. 返回空值(使用原生Servlet)

  1. 转发
    1
    request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
    (此外,如果不使用原生ServletSpringMVC也提供了转发的方式)
    1
    return "forward:/WEB-INF/pages/success.jsp";
  2. 重定向
    1
    response.sendRedirect(request.getContextPath()+"/index.jsp");
    (此外,如果不使用原生ServletSpringMVC也提供了重定向的方式)
    1
    return ""redirect:/index.jsp";
  3. 通过response指定响应结果
    1
    2
    3
    response.setCharacterEncoding("utf-8");
    response.setContentType("application/json;charset=utf-8");
    response.getWriter().print("你好");

3. 返回ModelAndView

1
2
3
4
5
//加入数据
modelAndView.addObject("users",users);
指定跳转页面的名字
modelAndView.setViewName("list");
return modelAndView;

4. 返回Json(常用于前后端分离项目)

使用ResponseBody注解,将Java对象转化为Json字符串

1
2
3
4
5
6
7
8
9
10
11
12
@RequestMapping("/testAjax")
@ResponseBody
public User testAjax(@RequestBody User user){
System.out.println("testAjax方法执行了....");
System.out.println(user);

//做响应
user.setUsername("feng");
user.setMoney(1000f);
//返回
return user;
}