Springmvc中响应数据和结果视图的情况有很多,以下是小编总结的内容。
@RequestMapping("/hello")
public String hello(){
return "success";
}
springmvc会通过走视图解析器的方式去跳转返回的’success’界面,视图解析器中,自己定义的前缀prefix 和后缀 subffix再和返回的’success’拼接起来,最终就会跳转到对应的/WEB-INF/pages/success.jsp
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
这里需要注意的就是,如果自己在开发的过程中没有配置视图解析器,那么就会默认跳向根目录下的返回值(return “success”),这里当然会抛404,因为success是无法找到的,所以要在webapp下创建success.jsp文件并且,将返回值完善为(return “success.jsp”)才可以访问到
@GetMapping("/success")
public void index(){
System.out.println("index method ...");
}
如果控制器的方法返回值编写成void,执行程序报404的异常,默认查找JSP页面没有找到。
1. 默认会跳转到@GetMapping(value="/success") success.jsp的页面(如果配置了视图解析器,没配置会抛500异常)如下图
2. 可以使用请求转发或者重定向跳转到指定的页面
2.1 forward请求转发:
System.out.println("重定向或者请求转发");
// 请求转发
request.getRequestDispatcher("/WEB-INF/pages/forward.jsp").forward(request, response);
2.2 redirect重定向:
// 重定向
response.sendRedirect(request.getContextPath()+"/redirect.jsp");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
// 直接响应数据
response.getWriter().print("你好");
转发和重定向需要注意的地方是,重定向是没有权限访问WEB-INF下的文件的,也可以说是WEB-INF下的文件受保护,无法被重定向到,所以如果是请求WEB-INF下的文件一定会报404(如下图所示,所以小伙伴们就不要过多去纠结这个问题了)
@GetMapping("/model")
public ModelAndView getView(){
ModelAndView mv = new ModelAndView();
// 跳转到list.jsp的页面
mv.setViewName("success");
return mv;
}
ModelAndView底层实现其实也是request的转发请求,他也有mv.addObject()方法,携带参数可以在此次转发请求中获取生效,mv.setViewName()方法也是会走视图解析器的,所以最终会去视图解析器配置的/Prefix+‘设置的路径’+Subfix路径
/* 使用forward关键字进行请求转发
* forward:转发的JSP路径",不走视图解析器了,所以需要编写完整的路径
* @return
* @throws Exception
*/
@RequestMapping("/test")
public String delete() throws Exception
{
System.out.println("test...");
// return "forward:/WEB-INF/pages/success.jsp";
return "forward:/forward/test.jsp";
}
@GetMapping("/guess")
public String guess(){
return "redirect:/forward/test.jsp";
}
这里注意,转发和重定向都不会走视图解析器的,会直接在webapp下寻找forward文件夹下的test.jsp文件,但是请求转发(forward)是可以请求WEB-INF文件下的资源,而重定向(redirect)不能
小编自己总结了一下:
要素 | forward | redirect |
---|---|---|
请求次数 | 1次 | 2次 |
请求路径 | 无变化 | 重定向网址 |
数据共享 | 同一个request,可以共享数据 | 两次请求两个request,不能共享数据 |
请求写法 | request.getRequestDispatcher(资源路径).forward(request, response) | response.sendRedirect(资源路径); |
本质区别 | 转发是服务器行为 | 重定向是客户端行为 |
转向速度 | 较快 | 较慢 |
权限访问 | 可以访问WEB-INF文件夹下的文件 | 不可以访问WEB-INF文件夹下的文件 |
通过以后的学习,小编会不断的补充和完善,希望能够帮助到大家