暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SpringMVC 10 处理器方法的返回值(ModelAndView和String))

敲代码的人 2019-09-30
364

使用 @Controller 注解的处理器的处理器方法,其返回值常用的有四 种类型:

  • 第一种ModelAndView

  • 第二种String

  • 无返回值void

  • 第四种返回自定义类型对象(JSON数据的交互)


注:前三种的返回值的请求转发和重定向后面讲解


第一种ModelAndView(之前案例中就是)

若处理器方法处理完后需要跳转 到其它资源,且又要在跳转的资源间传递数据, 此时处理器方法返回 ModelAndView比较.当然,若要返回 ModelAndView则处理器方法中需要定义ModelAndView 对象。

在使用时,若该 处理器方法只是进行跳转而不传递数据,或只是传递数据而并不向任何资源 跳转(如对页面的 Ajax 异步响应),此时若返回 ModelAndView ,则 将总是有一部分多余 要么 Model 多余,要么 View 多余。即此时返回 ModelAndView 将不合适。


在之前的使用时,如果跳转到一个页面,使用视图解析器,就可以完成,这种模式相当于之前原生的请求转

request.getRequestDispather("/WEB-INF/jsp/show.jsp").forward(request,response)

model.setViewName("WEB-INF/jsp/show.jsp");


但是SpringMVC 框架把原来 Ser vlet 中的请求转发和重定向操作进行了封装。现在可以使用简单的方式实现转发和重定向。

forward: 表示转发,实现 request.getRequestDispatcher("xx.jsp").forward()

redirect: 表示重定向,实现 r esponse.sendRedirect("xxx.jsp")



forward

在返回ModelAndView时,需要在在 setViewName() 指定的视图前添加forward,此时不再与视图解析器一起工作(即使声明了),需要写对应的项目路径

index.jsp

<form action="test01/forward_test01.do" method="post">
姓名:<input type="text" name = "name"/><br>
年龄:<input type="text" name = "age"/><br>
<input type="submit" value="注册"/>
</form>

controller

    @RequestMapping(value = "forward_test01")
public ModelAndView forward_test01(String name, Integer age) {
ModelAndView model = new ModelAndView();
//如果需要传递参数,需要直接使用HttpServletRequest
//因为使用String框架不帮助我们封装
System.out.println("forward_test01 : " + name);
model.addObject("name",name);
//转发,不与视图解析器一起工作
model.setViewName("forward:/WEB-INF/jsp/show.jsp");
return model;
}

show.jsp

<body>
测试: modelAndView:forward${name }<br/>
</body>

测试:



redirect

注意:转发不能进入web_inf下的资源,所以show.jsp的结果页面拿到了外面

 model.setViewName("redirect:/show.jsp");

测试

注意:向之后页面没有取到值,是因为之前的请求中的数据是在request中,转发还是同一个请求,一旦重定向之后,request域也就没了,值也就取不到了

当重定向到目标资源时,若需要向下传递参数值,除了可以直接通过请求 URL 携带参数,通过 HttpSession 携带参数

页面通过:param获取参数

show.jsp结果页面

测试: modelAndView:redirect${param.name }<br/>

测试结果


直接get请求测试


第二种String

逻辑视图名:方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。

index.jsp页面

<form action="test01/string_test01.do" method="post">
姓名:<input type="text" name = "name"/><br>
年龄:<input type="text" name = "age"/><br>
<input type="submit" value="注册"/>
</form>

controller方法

    @RequestMapping(value = "string_test01")
public String string_test01(String name, Integer age, HttpServletRequest request) {
//如果需要传递参数,需要直接使用HttpServletRequest
//因为使用String框架不帮助我们封装
System.out.println("String_name : " + name);
System.out.println("String_age : " + age);
request.setAttribute("name",name);
return "show";
}

show.jsp显示页面

<body>
测试返回值String: ${name }
</body>

测试结果


注意:可以直接返回资源的物理视图名。不过,此时就不需要再在视图解析器中再配置前辍与后辍了。

如果使用物理视图和视图解析器的话

return "WEB-INF/jsp/show.jsp";

测试:


Redirect重定向

return "redirect:/show.jsp";


forward转发

return "forward:/WEB-INF/jsp/show.jsp";



喜欢转发

明天见

SpringMVC 09 请求参数中文乱码问题

SpringMVC 08 请求参数绑定

SpringMVC 07  @RequestMapping说明

SpringMVC 06 注解式开发入门

SpringMVC 05 再解<url pattern/>

SpringMVC 04 执行流程的简单原码分析分析

SpringMVC 03 视图解析器及简述执行流程

SpringMVC 02 概述及配置式入门

SpringMVC 01 前述 三层架构和MVC设计模式

文章转载自敲代码的人,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论