Spring boot Controller 学习笔记三

场景: 访问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);
   }

    //其他逻辑同上
}
假如有个多个@ModelAttribute注解的方法,他们会顺序执行,并且在请求方法之前。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容