thymeleaf给响应页面传递参数(modelandview 中的model)

从控制器类向前端页面跳转时,传递参数

modelandview 中的model

1.原生方式request

<a th:href="@{/yuansheng_request}">
点我使用原生的request设置request的attribute</a>

控制方法:

sucess页面:

servlet原生方式获取数据:<h1 th:text="${name}"></h1>

2.原生session方式

<a th:href="@{/test_session}">点我使用原生设置session的attribute</a>

控制方法

@RequestMapping(value = "/test_session")
    public String display_session(HttpSession session)
    {
        session.setAttribute("sesson","session_zyk");
        return "sucess";
    }

success页面

session获取:<h1 th:text="${session.sesson}"></h1>

3.原生application方式

@RequestMapping(value = "/test_application")
    public String display_application(HttpSession session)
    {
        ServletContext application= session.getServletContext();
        application.setAttribute("testapplication","application_zyk");
        return "sucess";
    }
<a th:href="@{/test_application}">点我使用原生设置application的attribute</a>

success页面

application获取:<h1 th:text="${application.testapplication}"></h1>

4.ModelAndView设置参数(官方推荐)

<a th:href="@{/ModelAndView_request}">
点我使用ModelAndView设置request的attribute</a>

控制方法:

@RequestMapping(value = "ModelAndView_request")
    public ModelAndView display_modelandview()
    {
        ModelAndView mav=new ModelAndView();
        mav.addObject("modelandview_name","zyk_mvn");
        mav.setViewName("sucess");
        return mav;
    }

sucess页面

modelandview方式获取:<h1 th:text="${modelandview_name}"></h1>

5.model设置参数

控制方法

@RequestMapping(value = "/Model_Request")
    public String display_model(Model model)
    {
        model.addAttribute("model_name","zyk_model");
        System.out.println(model.getClass().getName());
        return "sucess";
    }
<a th:href="@{/Model_Request}">点我使用Model设置request的attribute</a>

sucess页面

model方式获取:<h1 th:text="${model_name}"></h1>

6.map方式设置参数

<a th:href="@{/testMap}">点我使用testMap设置request的attribute</a>

控制方法

@RequestMapping(value = "/testMap")
    public String display_model(Map<String,Object> map)
    {
       map.put("test_map","zyk_map");
        System.out.println(map.getClass().getName());
        return "sucess";
    }

success页面

map方式获取:<h1 th:text="${test_map}"></h1>

7.modelmap设置参数

<a th:href="@{/testmodelmap}">点我使用testMap设置request的attribute</a>
@RequestMapping(value = "/testmodelmap")
    public String display_model(ModelMap modelmap)
    {
        modelmap.addAttribute("testscope","zyk_modelmap");
        System.out.println(modelmap.getClass().getName());
        return "sucess";
    }

success页面

modelmap方式获取:<h1 th:text="${testscope}"></h1>

学习源码

在每个方法设置参数的地方打断点debug调试,在方法栈(就是进入栈中的方法,方法只有进入栈中才可以执行)中,

发现他们都被DispatcherServlet方法调用了

即DispatcherServlet是先于控制方法中的添加属性语句( modelmap.addAttribute("testscope","zyk_modelmap");举个栗子)执行的,并在执行过程中调用了控制方法中添加属性的语句

DispatherServlet这个方法,点进去会发现是这一句 mv=....

而mv是个modelandview对象 所以得出结论如下

看源码的结论:不管用如上的哪种方式,即使是原生request,也会把请求数据放入model,请求页面放入view,最后返回一个modelandview对象

验证:

在mv=...下面打个断点,等它执行完控制器中添加的属性的语句,会发现 mv中已经有刚才传递的数据了

经验分享 程序员 微信小程序 职场和发展