重定向和转发的区别
重定向和转发可以实现资源跳转。
- 转发
- 请求转发是服务器内部的跳转
- 地址栏不发生变化
- 只有一个请求
- 可以通过request域对跳转目标的请求
- 重定向
- 请求重定向是浏览器自动发起对跳转目标的请求
- 地址栏会发生变化
- 两次请求相应
- 无法通过request域传递对象
注意在WEB-INF下的目录是外界不可访问的,所以只可以转发而不可以重定向到达
springmvc的重定向与转发
1.Servlet方式
通过HttpServletRequest实现转发
通过HttpServletResponse实现重定向
@Controller
public class ControllerDemo {
@RequestMapping("/h1")
public void test1(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
//重定向并输出信息
rsp.getWriter().println("redirect BY servlet API");
rsp.sendRedirect("/index.jsp");
}
@RequestMapping("/h2")
public void test2(HttpServletRequest req, HttpServletResponse rsp) throws Exception {
//转发
req.setAttribute("msg","/result/t3");
req.getRequestDispatcher("/WEB-INF/jsp/test.jsp").forward(req,rsp);
}
}
2.ModelAndView
根据view的名称结合视图解析器跳到指定页面
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
id="internalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/jsp/" />
<!-- 后缀 -->
<property name="suffix" value=".jsp" />
</bean>
页面位置=前缀+viewName+后缀
Controller类
public class HelloController implements Controller {
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
ModelAndView mv=new ModelAndView();
mv.addObject("msg","Hello,Controller");
mv.setViewName("to");
return mv;
}
}
在DispatcherServlet注册
<bean id="/hello" class="com.jas.controller.HelloController"/>
3.springmvc方式
首先关闭视图解析器
@Controller
public class ControllerDemo {
//转发
@RequestMapping("/h1")
public String hello1(Model model){
model.addAttribute("msg","HelloController");
return "/index.jsp";
}
//转发
@RequestMapping("/h2")
public String hello2(Model model){
model.addAttribute("msg","HelloController");
return "forward:/index.jsp";
}
//重定向
@RequestMapping("/h3")
public String hello3(Model model){
model.addAttribute("msg","HelloController");
return "redirect:/index.jsp";
}
}