场景: 访问localhost:8080/user.html?id=1 显示用户信息界面
本节我们将学会如何使用视图模板创建一个视图页面,使用如下几种方式:
- Model
- ModelView
- ModelAttribute
- ModelMap
添加freeMarker模板依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
在/resource下新建一个template目录
添加userInfo.ftl文件如下
<html>
<head><Title>user info</></head>
<body>
<div>
name: ${user.name}
age: ${user.age}
</div>
</body>
</html>
使用Model进行界面数据的交互
@RestController
public class UserController
{
@GetMapping(path = "/user.html")
@ResponseBody
public String getUser(Loing id, Model model)
{
User user = getUserById(id);
if(user != null)
{
model.addAttribute("user", user);
}
return "userInfo";
}
}
@GetMapping(path = "/friends")
public String getFriends(Long id)
{
}
//merAllAttribute asMap
使用ModelAndView添加model数据
@RestController
public class UserController
{
@GetMapping(path = "/user.html")
public ModelAndView getUser(Long id)
{
ModelAndView model = new ModelAndView();
User user = service.getUserById(id);
if(user != null)
{
model.addObject("user", user); //TODO 假如没有把对象放到model中,我也不知道会出什么问题,所以后面有时间还是要验证的
}
model.setName("/userInfo");
return model;
}
}
其实ModelAndView也是可以放到参数中自动构造的 //TODO实验
使用@ModelAttribute添加model数据
ModelAttribute一般注解在方法上,有两个特性
- 它注解的方法会在所有请求方法之前调用
- 可以向Model中添加数据
方法没有返回值的情况
@Controller
@RequestMapping("/user")
public class UserController
{
@ModelAttribute
public void init(Long id, Model model)
{
//我之前尝试过,不同的请求之间Model是不能共用的,所有在这里把数据写到model中,可以保证每个model都可以拿到一份统一的数据
model.addAttribute("user", service.getUserById(id));
}
@GetMapping(path = "/info")
public String getInfo()
{
return "user";
}
}
方法有返回值的情况
@Controller
public class UserController
{
@ModelAttribute
public User init(Long id)
{
return service.getUserById(id);
}
//其他逻辑同上
}