小白学习SpringMVC(转发和重定向)

21 篇文章 0 订阅
9 篇文章 0 订阅
本文介绍了SpringMVC中如何通过ModelAndView实现请求转发与重定向,包括转发的`forward:`关键字、视图解析器的使用规则,以及重定向的`redirect:`特性。实例演示了如何在转发中避免视图解析器限制和传递数据,以及重定向时参数的处理和跨资源限制。
摘要由CSDN通过智能技术生成

一、请求重定向和转发

在这里插入图片描述
SpringMVC框架把原来的Servlet中的请求转发和重定向操作进行了封装。现在可以使用简单的方式实现转发和重定向。
forward:表示转发,实现request.getRequestDispatcher(“xx.jsp”).forward()
redirect:表示重定向,实现response.sendRedirect(“xxx.jsp”)

1.1请求转发

处理器方法返回ModelAndView时,**需在setViewName()指定的视图前添加 forward:,且此时的视图不再与视图解析器一同工作,这样可以在配置了解析器时指定不同位置的视图。**视图页面必须写出相对于项目根的路径。forward操作不需要视图解析器。
处理器方法返回String,在视图路径前面加入forward:视图完整路径。

forward :表示转发
redirect :表示重定向
forward和redirect都是关键字,有一个共同的特点不和视图解析器一同工作

#1.1.1显示转发

打开项目:
编写jsp首页

<%--
  Created by IntelliJ IDEA.
  User: Hou
  Date: 2021/8/2
  Time: 21:33
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    String basePath = request.getScheme()+"://"+
            request.getServerName()+":"+request.getServerPort()+
            request.getContextPath()+"/";
%>
<html>
<head>
    <title>功能入口</title>
    <base href="<%=basePath%>"/>
</head>
<body>
   <p>当处理器方法返回ModelAndView实现forward</p>
<form action="doForward.do" method="post">
    姓名:<input type="text" name="name"><br/>
    年龄:<input type="text" name="age"><br/>
    <input type="button" value="提交请求">
</form>
</body>
</html>

编写MyController.java文件

package com.hjs.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class MyController {

    /*
    * 处理器方法返回ModelAndView实现转发forward
    * 语法:setViewName(forward:视图文件完整路径)
    * forward特点:不和视图解析器一同使用,就当项目中没有视图解析器
    * */
    @RequestMapping(value = "/doForward.do")
    public ModelAndView doSome(){
        /*
        * 处理some.do请求了。相当于service调用处理完成了。
        * */
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","欢迎使用springmvc做web开发");
        mv.addObject("fun","执行的是doSome方法");
        mv.setViewName("forward:/WEB-INF/jsp/show.jsp");
        return mv;
    }
}

项目结构
在这里插入图片描述
在这里插入图片描述
当前项目存在springmvc.xml配置文件中存在视图解析器

<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!--前缀-->
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <!--后缀-->
    <property name="suffix" value=".jsp"/>
</bean>

运行项目得到此结果
在这里插入图片描述
在这里插入图片描述
以上我们使用的显示转发

如果我们项目中有视图解析器,但我们的页面没在WEB-INF目录之下 我需要使用显示转发,这样就可以不被视图解析器限制了。

#1.1.1重定向

在MyController中添加新的方法

/*
* 处理器方法返回ModelAndView,实现重定向redirect
* 语法:setViewName("redirect:路径")
* redirect特点:不和视图解析器同一使用,就当项目中没有视图解析器
* */
@RequestMapping(value = "/doRedirect.do")
public ModelAndView doWithRedirect(){
    /*
     * 处理some.do请求了。相当于service调用处理完成了。
     * */
    ModelAndView mv = new ModelAndView();
    //数据放入到request作用域
    mv.addObject("msg","欢迎使用springmvc做web开发");
    mv.addObject("fun","执行的是doSome方法");
    mv.setViewName("redirect:hello.jsp");
    return mv;
}

index.jsp

<%--
  Created by IntelliJ IDEA.
  User: Hou
  Date: 2021/8/2
  Time: 21:33
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    String basePath = request.getScheme()+"://"+
            request.getServerName()+":"+request.getServerPort()+
            request.getContextPath()+"/";
%>
<html>
<head>
    <title>功能入口</title>
    <base href="<%=basePath%>"/>
</head>
<body>
    <p>当处理器方法返回ModelAndView实现forward</p>
    <form action="doForward.do" method="post">
        姓名:<input type="text" name="name"><br/>
        年龄:<input type="text" name="age"><br/>
        <input type="button" value="提交请求">
    </form>
   <p>当处理器方法返回ModelAndView实现forward</p>
<form action="doRedirect.do" method="post">
    姓名:<input type="text" name="name"><br/>
    年龄:<input type="text" name="age"><br/>
    <input type="submit" value="提交请求">
</form>
</body>
</html>

hello.jsp中的代码

<%--
  Created by IntelliJ IDEA.
  User: Hou
  Date: 2021/8/21
  Time: 21:46
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h3>/WEB-INF/jsp/show.jsp从request作用域获取数据</h3>
<h3>msg数据:${msg}</h3>
<h3>fun数据:${fun}</h3>
</body>
</html>

在这里插入图片描述
运行项目显示不能获得数据
在这里插入图片描述

将Controller改为参数获取

/*
* 处理器方法返回ModelAndView,实现重定向redirect
* 语法:setViewName("redirect:路径")
* redirect特点:不和视图解析器同一使用,就当项目中没有视图解析器
* */
@RequestMapping(value = "/doRedirect.do")
public ModelAndView doWithRedirect(String name,Integer age){
    /*
     * 处理some.do请求了。相当于service调用处理完成了。
     * */
    ModelAndView mv = new ModelAndView();
    //数据放入到request作用域
    mv.addObject("myname",name);
    mv.addObject("myage",age);
    mv.setViewName("redirect:hello.jsp");
    return mv;
}

在这里插入图片描述
将hello.jsp中的内容改为

<%--
  Created by IntelliJ IDEA.
  User: Hou
  Date: 2021/8/21
  Time: 21:46
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h3>/WEB-INF/jsp/show.jsp从request作用域获取数据</h3>
<h3>myname数据:${param.myname}</h3>
<h3>myage数据:${param.myage}</h3>
<h3>取参数数据:<%=request.getParameter("myname")%></h3>
</body>
</html>

param代表参数集合 在目标hello.jsp页面可以使用参数集合对象${param}获取请求参数值 ${param.myname}

在这里插入图片描述

验证定向到redirect:/WEB-INF/jsp/show.jsp中

  @RequestMapping(value = "/doRedirect.do")
    public ModelAndView doWithRedirect(String name,Integer age){
        /*
         * 处理some.do请求了。相当于service调用处理完成了。
         * */
        ModelAndView mv = new ModelAndView();
        //数据放入到request作用域
        mv.addObject("myname",name);
        mv.addObject("myage",age);

        mv.setViewName("redirect:/WEB-INF/jsp/show.jsp");
//        http://localhost:8080/ssm03_war/hello.jsp?myname=lisi&myage=324
        return mv;
    }

在这里插入图片描述

**

#处理器方法返回ModelAndView,实现重定向redirect

语法:setViewName(“redirect:路径”)
redirect特点:不和视图解析器同一使用,就当项目中没有视图解析器
框架对重定向的操作:
1.框架会把Model中的简单类型的数据,转为String使用, 作为hello.jsp和get请求参数使用 目的是在doRedirect.do 和hello.jsp两次请求之间传递数据
2.在目标hello.jsp页面可以使用参数集合对象${param}获取请求参数值 ${param.myname}

3.重定向不能访问/WEB/INF资源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值