package cn.zj.springmvc.controller; import java.io.IOException; import java.util.Arrays; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; import cn.zj.springmvc.pojo.User; @Controller @RequestMapping("/response") public class ResponseController { //1,方法直接返回void,如果要响应,使用原始servlet的请求和响应对象进行页面跳转数据共享 @RequestMapping("/method1") public void method1(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { //1.共享数据 //request.setAttribute("username", "小明"); //使用请求转发跳转 //request.getRequestDispatcher("/WEB-INF/foward.jsp").forward(request, response); //使用url重定向(跨域访问) response.sendRedirect("https://www.jd.com"); } /* * ModelAndView * Model :模型(数据对象) * View :视图(浏览器页面显示) * SpringMVC 专门用于封装模型数据和视图地址的对象 * 注意:使用 ModelAndView只能使用请求转发,不能使用URL重定向 */ @RequestMapping("/method2") public ModelAndView method2() { ModelAndView mv = new ModelAndView(); //1.共享数据 mv.addObject("username", "小芳"); //2.设置视图地址 //配置视图解析器之前 //mv.setViewName("/WEB-INF/view/forward.jsp"); //配置视图解析器之后:配置一个逻辑视图名称 mv.setViewName("forward"); return mv; } /* * 方法直接返回一个String类型 * 返回的具体值就是要请求转发跳转的视图地址 * 问题:如何共享请求转发的数据呢? * 答 :使用 Model 接口直接注入到方法参数即可,再将需要的参数设置给Model对象 * 注意:使用方法直接返回String默认只能使用请求转发,不能使用URL重定向 */ @RequestMapping("/method3") public String method3(Model m) { //1.设置共享数据 m.addAttribute("username", "小泽"); //配置视图解析器之前 //return "/WEB-INF/view/response.jsp"; //配置视图解析器之后:配置一个逻辑视图名称 return "response"; } /* * 上述几个方法我们发现都只能请求转发跳转,而且跳转的页面必须在对应的视图解析器配置目录下面有对应的页面 * * 实际开发中 * 1,页面跳转可能是请求转发,也可能是重定向 * 2,就算是请求转发,跳转的页面也不一定是 视图解析器对应的页面 * 所以:SpringMVC默认的跳转和视图解析器配置没有办法满足实际开发需求 * * 解决方案:SpringMVC 提供开发者可以自定请求转发和重定向操作 * 打破默认的请求转发的规则 * * 在 : org.springframework.web.servlet.view.UrlBasedViewResolver 视图解析器下面 * public static final String REDIRECT_URL_PREFIX = "redirect:"; * public static final String FORWARD_URL_PREFIX = "forward:"; * * 我们开发者在使用的使用 ,让我们的方法返回 字符串 * * 返回的值 加上上面两个前缀即可 * * redirect:重定向的地址 * forward:自定义请求转发的地址 * */ /* * 自定义请求转发跳转的视图地址 * forward:地址 */ @RequestMapping("/method4") public String forward(Model m) { //共享数据 m.addAttribute("username", "小芳"); return "forward:/WEB-INF/hello.jsp"; } /* * 自定义重定向跳转 * redirect:地址 */ @RequestMapping("/method5") public String redirect() { return "redirect:https://www.jd.com"; } /* * SpringMVC的方法直接返回对象 * 问题:是重定向还是请求转发跳转?页面跳转到哪儿去? * User对象是否是共享了?共享的key(属性名称)是什么? * 如果有key,如果自定义设置key的名称 * * 答:1,返回对象默认使用就是请求转发 * 2,跳转的页面规则 :视图解析器前缀 + 模块名+@RequestMapping的值 + 后缀 * 地址如下 :/WEB-INF/view/response/method6.jsp * 3,User共享了 * 4,共享的名称默认是就是User类型的首字母小写 user * 5, 使用@ModelAttribute("设置共享模型的属性名称") */ @RequestMapping("/method6") @ModelAttribute("userKey") //设置共享模型的属性名称 public User getUser() { User user = new User(); user.setUsername("小明"); user.setPassword("123"); user.setPhone("135xxxx"); user.setEmail("xiaoming@qq.com"); return user; } }