重定向与请求转发
SpringMVC 默认采用服务器内部转发的形式展示页面信息。同样也支持重定向页面。
重定向
重定向是发一个302的状态码给浏览器,浏览器自己去请求跳转的网页。地址栏会发生改变。
重定向以 redirect: 开头
package com.xxxx.springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
/**
* 重定向
* 重定向以redirect:开头
* 地址栏会发生改变
* redirect:xxxx.jsp 重定向跳转到项目目录下的xxxx.jsp页面
* redirect:xxxx 重定向跳转到某个方法路径
*/
@Controller
public class JumpController {
/**
* 重定向跳转到Controller
* 返回ModelAndView
*/
@RequestMapping("/test01")
public ModelAndView test01(){
System.out.println("test01...");
ModelAndView mv = new ModelAndView();
mv.setViewName("redirect:hello");
return mv;
}
/**
* 重定向跳转到页面
* 返回ModelAndView
*/
@RequestMapping("/test02")
public ModelAndView test02(){
System.out.println("test02...");
ModelAndView mv = new ModelAndView();
//会从项目的根路径下查找页面
mv.setViewName("redirect:view.jsp");
return mv;
}
/**
* 重定向到jsp页面
* 返回视图名称
* @return
*/
@RequestMapping("/test03")
public String test03(){
System.out.println("test03...");
return "redirect:view.jsp";
}
/**
* 重定向到jsp页面,并传递参数
* 返回视图名称
* @return
*/
@RequestMapping("/test04")
public String test04(){
System.out.println("test04...");
return "redirect:view.jsp?uname=admin";
}
/**
* 重定向到jsp页面,并传递中文参数(传递中文参数会出现乱码)
* 返回视图名称
* @return
*/
@RequestMapping("/test05")
public String test05(){
System.out.println("test05...");
return "redirect:view.jsp?uname=张三";
}
/**
* 重定向到jsp页面,并传递中文参数
* 传递参数 (通过 RedirectAttributes 对象设置重定向参数,避免中文乱码问题)
* 返回视图名称
* @return
*/
@RequestMapping("/test06")
public String test06(RedirectAttributes redirectAttributes){
redirectAttributes.addAttribute("uname","张三");
redirectAttributes.addAttribute("upwd","123456");
return "redirect:view.jsp";
}
/**
* 重定向到Controller
* @return
*/
@RequestMapping("/test07")
public String test07(){
System.out.println("test07...");
return "redirect:hello";//hello对应的是方法的路径
}
}
请求转发
请求转发,直接调用跳转的页面,让它返回。对于浏览器来说,它无法感觉服务器有没有forward。地址栏不发生改变,可以获取请求域中的数据。
请求转发以forward:开头
package com.xxxx.springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
/**
* 请求转发
* 服务器内部默认使用请求转发
* 请求转发以forward: 开头
* 地址栏不发生改变
* forward:xxx.jsp 请求转发到xxx.jsp页面(项目目录下的页面,即webapp目录下)
* forward:xxx 请求转发到某个方法路径
*
* 如果是直接设置xxx(前面不添加forward)
* 比如 return("hello") 或 modelAndView.setViewName("hello");
* 此时是请求转发到hello.jsp视图,且路径是在WEB-INF目录下的jsp目录(配置文件中)
*
*/
@Controller
public class ForwardController {
/**
* 请求转发到jsp页面
* @return
*/
@RequestMapping("test08")
public String test08(){
System.out.println("test08...");
return "forward:view.jsp";
}
/**
* 请求转发到jsp页面
* 传递参数
*
*/
@RequestMapping("test09")
public String test09(){
System.out.println("test09...");
return "forward:view.jsp?uname=admin";
}
/**
* 请求转发到jsp页面
* 设置请求域
*/
@RequestMapping("test10")
public String test10(HttpServletRequest request){
System.out.println("test10...");
//设置作用域
request.setAttribute("userName","zhangsan");
return "forward:view.jsp";
}
/**
* 请求转发到jsp页面
* 默认会去指定目录下找jsp页面(配置文件中设置的)
*/
@RequestMapping("test11")
public String test11(){
System.out.println("test11...");
return "../../view";//值与WEB-INF下的jsp目录中的页面名称对应(如果jsp页面不在指定目录下,需要设置到指定目录)
}
/**
* 请求转发到Controller
*
*/
@RequestMapping("test12")
public String test12(){
System.out.println("test12...");
return "forward:hello";//如果前面添加了forward:,则访问的是方法路径
}
/**
* 请求转发到Controller
*/
@RequestMapping("test13")
public ModelAndView test13(){
System.out.println("test13...");
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("hello");//jsp视图
//modelAndView.setViewName("forward:hello");//controller方法
return modelAndView;
}
/**
* 请求转发到Controller
* 传递参数
*/
@RequestMapping("test14")
public ModelAndView test14(){
System.out.println("test14...");
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("forward:test01?uname=admin");
return modelAndView;
}
}
区别