文章目录
一、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