SpringMVC 学习笔记心得(五)响应数据和结果视图

Springmvc中响应数据和结果视图的情况有很多,以下是小编总结的内容。

1.返回值分类

1)、字符串

   @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”)才可以访问到

2)、void

 @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(如下图所示,所以小伙伴们就不要过多去纠结这个问题了)

在这里插入图片描述

3)、ModelAndView

@GetMapping("/model")
    public ModelAndView getView(){
        ModelAndView mv = new ModelAndView();
        // 跳转到list.jsp的页面
        mv.setViewName("success");
        return mv;
    }

ModelAndView底层实现其实也是request的转发请求,他也有mv.addObject()方法,携带参数可以在此次转发请求中获取生效,mv.setViewName()方法也是会走视图解析器的,所以最终会去视图解析器配置的/Prefix+‘设置的路径’+Subfix路径

2. SpringMVC框架提供的转发和重定向

1)、forward请求转发

 /* 使用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";
    }

2)、redirect重定向

 @GetMapping("/guess")
    public String guess(){
        return "redirect:/forward/test.jsp";
    }

这里注意,转发和重定向都不会走视图解析器的,会直接在webapp下寻找forward文件夹下的test.jsp文件,但是请求转发(forward)是可以请求WEB-INF文件下的资源,而重定向(redirect)不能

3)、redirect和forward区别?

小编自己总结了一下:

要素 forward redirect
请求次数 1次 2次
请求路径 无变化 重定向网址
数据共享 同一个request,可以共享数据 两次请求两个request,不能共享数据
请求写法 request.getRequestDispatcher(资源路径).forward(request, response) response.sendRedirect(资源路径);
本质区别 转发是服务器行为 重定向是客户端行为
转向速度 较快 较慢
权限访问 可以访问WEB-INF文件夹下的文件 不可以访问WEB-INF文件夹下的文件

通过以后的学习,小编会不断的补充和完善,希望能够帮助到大家

猜你喜欢

转载自blog.csdn.net/weixin_43409994/article/details/106379291