springMVC(三)——返回值的应用场景以及后台响应json数据

一、springMVC返回值分类

1.1 返回值为String字符串

返回值为string的话,字符串的内容表示视图的名称,默认情况下时转发请求(视图解析器),其中也可以修改为重定向。

1.1.1 返回值为string,方法中存在请求转发

如果方法中返回值为请求转发,例如:return “forward:index.jsp”;那么程序就可以请求转发到指定的路径。相当于

“request.getRequestDispatcher(“url”).forward(request,response)”,请求可以转发到jsp,也可以到其他的控制器方法

注意:“forward:转发的JSP路径”,不走视图解析器,所以需要编写完整的路径。如果使用了forward,则路径必须写成实际视图的路径

    //如果方法体中也有请求转发重定向,则String也无效。
    @RequestMapping("show4")
    public String show4(){
   
        System.out.println("返回值是String");
        //默认情况就是请求转发回去index.jsp页面
        //  return "index";
        //另一种请求转发
        return "forward:index.jsp";
    }
1.1.2 返回值为string,方法中存在重定向

如果方法中返回值为重定向,就需要在返回值里面使用redirect

    //重定向 不支持视图解析器
    @RequestMapping("show5")
    public String show5(){
   
        System.out.println("返回值是String,重定向");
        return "redirect:index.jsp";
    }

相当于“response.sendRedirect(url)”,如果重定向到jsp页面的话,那么jsp页面不能写到WEB-INF目录下。否则无法找到

1.1.3 另一种返回方式
    @RequestMapping("show6")
    public String show6(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
        System.out.println("返回值是String,重定向");
        ModelAndView modelAndView = new ModelAndView();
        //请求会走这里 不会参与下面的return
        request.getRequestDispatcher("/index.jsp").forward(request,response);
        response.getWriter().write("返回值是string,且中间有一个请求转发");
        return "redirect:index.jsp";
    }

最后的返回值如果是重定向,方法中又存在请求转发的情况,那么请求则会按着请求转发去执行

1.2 返回字符串的应用场景
应用场景1:直接返回视图名称,例如跳转到某个功能主页。

问题:我们可以直接通过/+文件名称.jsp直接访问页面,为什么请求springMVC,由springMVC控制返回的页面
在这里插入图片描述

**结果:**对于webapp目录下面的页面,用户可以直接访问。但是,通常情况下为了页面安全的考虑,一般会将相关的页面资源放在

WEB-INF目录下,这个目录下面的资源用户不能直接访问,只能通过后台的资源跳转进行访问。

比如:登录之后才能查看的信息,我们就需要把这些资源放在该目录下,controller层根据用户是否登录来进行页面的跳转。可以保证资源的

安全。

应用场景2:controller在登录成功时候重定向主页面,失败请求转发回登录页面

这个时候就需要使用到上面方法中存在重定向和请求转发,这时候返回的资源路径不会走视图解析器,而是直接转发或重定向到指定的路径

重定向后的标签不能加WEB-INF,重定向是客户端重新发送的请求,WEB-INF目录下的页面依旧访问不到,请求转发的话可以加WEB-INF

问题:为什么controller在登录成功时候重定向主页面,失败请求转发回登录页面

回答:当客户端登录成功的话。使用请求转发会主页面的话,浏览器的地址栏的url保留的还是登录时候的请求信息,如果这时候我们重

新刷新页面,那么就会造成二次表单提交的情况,增大服务器的压力。所以登录成功的话需要重定向到主页面,这个时候浏览器的地址栏就

会是主页面的url。

当客户端登录失败,我们需要给用户提供一定的提示信息,比如:用户名还是密码输入错误的情况。如果使用重定向的话,这时候用户无法

获取到服务器响应回的提示信息。重定向是两次请求,第二次的请求是不能够获取第一次请求中的数据(除非将错误信息存放在session和

application域中,不建议这样做)。使用转发请求返回登录页面,那么就可以获取到request域中的数据。所以登录失败请求转发到登录页面

1.3 返回值为ModelAndView

ModelAndView对象是Spring提供的一个对象,可以用来调整具体的JSP视图。里面可以封装视图和模型(存储的数据在request域中)

1.3.1 正常的返回

前端请求Controller的资源,返回值为ModelAndView,并且其中的addObject存放的数据。前台可以使用el表达式进行获取存放的数据

    @RequestMapping("show1")
    public ModelAndView show1(){
   
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("index");
        modelAndView.addObject("msg","show1执行,返回值是ModelAndView");
        return modelAndView;
    }
1.3.2 方法中存在重定向或者请求转发

方法体中有请求转发和重定向操作,ModelAndView无效,请求会根据请求转发的内容进行发送。

其中springMVC的视图解析器在有请求转发或者重定向的时候无效,那么就需要填写实际视图的完整路径

@RequestMapping
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值