Spring MVC
JSP 页面的转发和重定向
Spring MVC 默认以转发的形式响应 JSP,可以手动设置为重定向。
@RequestMapping("test")
public String test(){
return "redirect:/test.jsp";
}
转发
@RequestMapping("test")
public String test(){
return "forward:/test.jsp";
}
@RequestMapping("test")
public String test(){
return "test";
}
Spring MVC 数据绑定
- 基本数据类型
@RequestMapping("/int")
@ResponseBody
public String intTest(@RequestParam("id") int num){
return "num:"+num;
}
- 包装类
@RequestMapping("/package")
@ResponseBody
public String packageTest(Integer num){
return "num:"+num;
}
- 数组
@RequestMapping("/array")
@ResponseBody
public String arrayTest(String[] name){
for (String str:name){
System.out.println(str);
}
return name.toString();
}
- POJO
@RequestMapping("/pojo")
@ResponseBody
public String pojoTest(User user){
return user.toString();
}
- List
自定义包装类
package com.southwind.entity;
import java.util.List;
public class UserList {
private List<User> users;
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
}
@RequestMapping("/list")
@ResponseBody
public String listTest(UserList userList){
for(User user:userList.getUsers()){
System.out.println(user);
}
return "ok";
}
<%--
Created by IntelliJ IDEA.
User: southwind
Date: 2019-08-15
Time: 21:00
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="/data/list" method="post">
<input type="text" name="users[0].id"/><br/>
<input type="text" name="users[0].name"/><br/>
<input type="text" name="users[1].id"/><br/>
<input type="text" name="users[1].name"/><br/>
<input type="text" name="users[2].id"/><br/>
<input type="text" name="users[2].name"/><br/>
<input type="submit"/>
</form>
</body>
</html>
JSON
pom.xml
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.18</version>
</dependency>
springmvc.xml
<mvc:annotation-driven>
<!-- 消息转换器 -->
<mvc:message-converters register-defaults="true">
<!-- fastjson -->
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter4"></bean>
</mvc:message-converters>
</mvc:annotation-driven>
JSP
<%--
Created by IntelliJ IDEA.
User: southwind
Date: 2019-08-15
Time: 21:11
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<script type="text/javascript" src="js/jquery-1.8.3.min.js"></script>
<script type="text/javascript">
$(function(){
var user = {
"id":1,
"name":"张三"
};
$.ajax({
url:"/data/json",
data:JSON.stringify(user),
type:"POST",
contentType:"application/json;charset=UTF-8",
dataType:"text",
success:function(data){
alert(data);
}
})
});
</script>
</head>
<body>
</body>
</html>
Handler
@RequestMapping("/json")
@ResponseBody
public String json(@RequestBody User user){
System.out.println(user);
return user.toString();
}
Spring MVC 视图解析
业务数据的绑定是指将业务数据绑定给 JSP 域对象,并且在客户端进行展示。
pageContext、request、session、application
业务数据的绑定是由 ViewResolver 完成。
Spring MVC 提供了以下几种方式绑定业务数据:
- Map
- Model
- ModelAndView
- @SessionAttribute
- @ModelAttribute
业务数据绑定到 request 域对象
Map
Spring MVC 在内部使用 Model 接口存储业务数据,在调用业务方法之前会创建一个隐含对象作为业务数据的存储容器。设置业务方法的入参为 Map 类型,Spring MVC 会将隐含对象的引用传递给入参。
开发者可以对模型中的所有数据进行管理,包括访问和添加、修改、删除。开发者只需要在业务方法处添加 Map 类型的入参,方法体中便可以通过对入参的操作来完成业务数据的添加。
@RequestMapping("/map")
public String mapTest(Map<String,User> map){
User user = new User();
user.setId(1);
user.setName("张三");
map.put("user",user);
return "show";
}
Model
与 Map 类似,业务方法通过入参来完成业务数据的绑定。
@RequestMapping("/model")
public String modelTest(Model model){
User user = new User();
user.setId(1);
user.setName("张三");
model.addAttribute("user",user);
return "show";
}
HttpServletRequest
@RequestMapping("/request")
public String request(HttpServletRequest request){
User user = new User();
user.setName("李四");
user.setId(2);
request.setAttribute("user",user);
return "show";
}
ModelAndView
与 Map、Model 不同的是,ModelAndView 不但包含了业务数据,同时也包含了视图信息,将视图和业务数据进行了整合,封装成一个对象,如果使用 ModelAndView 来处理业务数据,业务方法的返回值必须是 ModelAndView 对象。
业务方法中对 ModelAndView 进行两个操作:
- 填充业务数据
- 绑定视图信息
@RequestMapping("/modelAndView")
public ModelAndView modelAndView(){
User user = new User();
user.setId(3);
user.setName("王五");
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("user",user);
modelAndView.setViewName("show");
return modelAndView;
}
@RequestMapping("/modelAndView2")
public ModelAndView modelAndView2(){
User user = new User();
user.setId(11);
user.setName("小明");
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("user",user);
View view = new InternalResourceView("/show.jsp");
modelAndView.setView(view);
return modelAndView;
}