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

modelandview 中的model

1.原生方式request

thymeleaf 获得要访问页面的string 值之后,加上前缀加上后缀 ,请求转发,跳转至该页面,所以可以直接设置请求的参数。

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

 控制方法:

 @RequestMapping(value = "yuansheng_request")
    public String display_yuansheng_request_attribute(HttpServletRequest request)
    {   request.setAttribute("name","zyk");
        //thymeleaf加上前后缀之后,请求转发方式跳转该页面,所以可以使用request设置请求
        return "sucess";
    }

 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中已经有刚才传递的数据了

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐