Day25 SpringMVC 方法返回值类型***

it2023-06-08  73

处理器的返回值介绍

(1)Servlet将结果返回浏览器的方式

请求转发:带数据重定向:不带数据异步:json数据发给页面的js,js组织标签显示 Servlet里面编写响应浏览器的代码都要调用response

(2)springmvc的方法设计了多种返回值类型

ModelAndViewvoidString :请求转发,重定向,json数据

处理器的返回值-ModelAndView

(1)ModelAndView 是SpringMVC提供模型视图 (2)作用 设置数据

addObject(key,value) 这个方法相当于request.setattribute,在页面上直接使用${attributeName}取值;

设置页面

setViewName(逻辑视图) 逻辑视图:就是文件的名称 跳转的时候,视图解析器会对内容拼接前缀与后缀

@Controller public class Demo02ReturnController { @RequestMapping("demo01.action") public ModelAndView test01(){ Person p1 = new Person(1,"jack","1234"); Person p2 = new Person(2,"rose","1234"); List<Person> list = new ArrayList<Person>(); list.add(p1); list.add(p2); ModelAndView mv = new ModelAndView(); mv.addObject("list",list); mv.setViewName("demo04_update_person"); return mv; }

处理器的返回值-void

(1)方法返回值类型写上void 此时,参数写上request,response,调用它们带设置参数与请求转发或者重定向。 (2)因为返回值类型为void,没有返回值,所以视图解析器不对内容拼接前缀与后缀。 (3)没有体现springmvc的优势

@RequestMapping("demo02.action") public void test02(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //请求转发 req.setAttribute("name","请求转发"); req.getRequestDispatcher("demo05.jsp").forward(req,resp); }

处理器的返回值-String

(1)方法返回值类型写上String 方法内返回 页面名称 return语句加一个普通的字符串,其本质就是请求转发。 (2)如果携带数据呢? 方法参数写上Model,比ModelAndView 少了View 》Model是SpingMVC提供的一个模型类,该类不需要自己创建对象,系统自动创建。 (3)Model作用 Model可以用来向页面传递参数,其本质就是向request域对象中存数据。 (4)后台代码 model.addAttribute(“item”, item);就相当于request.setAttribute(“item”,item);

@RequestMapping("demo03.action") public String test03(Model model){ //Model 可以设置数据,自动由视图解析器带到页面 model.addAttribute("data","Hello"); //逻辑视图,也就是文件名字 return "success"; }

处理器的返回值-String-转发和重定向

(1)什么是逻辑视图与物理视图 页面名称叫逻辑视图,不是真正的页面地址 但是可以由视图解析器进行拼接,前缀+逻辑视图+后缀,得到真正的页面地址,即物理视图。 前缀和后缀在springmvc.xml配置文件中配置。 (2)返回值可以添加指令 》1:forward 请求转发 forward 指令:物理视图。 》2:redirect 重定向 redirect 指令:物理视图 特点:视图解析器不对指令后的内容拼接前缀与后缀 springmvc会为我们在访问路径上自动添加项目名 (3)指令也可以访问控制器方法 如果该方法所属类上也设置了@RequestMapping()路径,就应该这样写好路径。 return "redirect:/类上路径名/方法上路径名" 重定向指令后的第一个 / 表示项目名

@RequestMapping("demo04.action") public String test04(Model model){ //Model 可以设置数据,自动由视图解析器带到页面 model.addAttribute("data","Hello"); // return "forward:WEB-INF/jsp/success.jsp"; // return "redirect:http://www.baidu.com";//访问外网 // return "redirect:demo05.jsp";//访问内部 return "redirect:demo01.action";//访问控制器方法 }

附:SpringMVC重定向传参数的实现

在springmvc中,要通过controller传参数到页面,先配置视图解析器,Model(或者request、session)中添加参数,页面用el取到。 这样使用的是 请求转发 forward,浏览器的地址栏不变, 但浏览器刷新,会使表单重复提交。

我们可以使用重定向,改变浏览器地址栏,防止表单因刷新重复提交。 重定向相当于2次请求,所以无法把参数传过去。但 spring 能帮我们在地址栏上拼接url,把参数随着重定向传到页面。

demo05.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %> <html> <head> <title>Title</title> </head> <body> ${data} </body> </html>

Controller

@RequestMapping("demo04.action") public String test04(Model model){ //Model 可以设置数据,自动由视图解析器带到页面 model.addAttribute("data","Hello"); return "redirect:demo05.jsp";//访问内部 }

但是页面不能用el获取,还需另外处理。 让 设置数据的控制方法 重定向 到一个新的控制方法。

使用@ModelAttribute注解,获取传过来的数据。

@RequestMapping("demo04.action") public String test04(Model model){ //Model 可以设置数据,自动由视图解析器带到页面 model.addAttribute("data","Hello"); return "redirect:demoPass.action"; } @RequestMapping("/demoPass.action") public String home(@ModelAttribute("data")String data,Model model){ System.out.println("重定向传过来的参数"+data); model.addAttribute("data",data); return "forward:/demo05.jsp"; }

页面效果 控制台打印

最新回复(0)