第四章 实现redirect和forward

zhanglei 2022年05月31日 639次浏览

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--注册springmvc核心对象DispatcherServlet
        需要在tomcat服务启动后,创建DispatcherServlet的对象实例
        为什么要创建DispatcherServlet对象的实例呢?
        因为DispatcherServlet在他的创建过程中,会同时创建springmvc容器对象,
        读取springmvc的配置文件,把这个配置文件中的对象都创建好,
        当用户发起请求时,就可以直接使用对象

        servlet初始化会执行init()方法。DispatcherServlet在init()方法中{
        //实现容器
        WebApplicationContext ctx=new ClassPathXmlApplicationContext("springmvc.xml")
        //把容器放到ServletContext中
        getServletContext().setAttribute(key,ctx);
        }

    -->
    <servlet>
        <servlet-name>myweb</servlet-name>
        <servlet-class >org.springframework.web.servlet.DispatcherServlet</servlet-class>

        <!--自定义springmvc读取配置文件的位置-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <!--tomcat启动后,就创建DispatcherServlet对象,执行init方法-->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>myweb</servlet-name>
        <!--
            使用框架时,url-pattern可以用两种值
            1. 使用扩展名方式,语法 *.xxx, xxx是自定义的扩展名
            http://localhost"8080/myweb/some.do
            http://localhost"8080/myweb/other.do
            2.使用斜杠
        -->
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
</web-app>

SpringMVC.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    <!--组件扫描器-->
    <context:component-scan base-package="package1"></context:component-scan>

    <!--声明视图解析器,帮助设置视图文件路径-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--前缀:视图文件的路径-->
        <property name="prefix" value="/WEB-INF/view/"></property>
        <!--后缀:视图文件的扩展名-->
        <property name="suffix" value=".jsp"></property>
    </bean>
</beans>

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <div>当处理方法返回ModelAndView实现显式转发</div>
    <form action="forward.do" method="get">
        姓名<input type="text" name="name"/><br/>
        年龄<input type="text" name="age"/><br/>
        <input type="submit" value="提交请求"/>
    </form>
<br/>
<br/>
<br/>
    <div>当处理方法返回ModelAndView实现显式重定向</div>
    <form action="redirect.do" method="get">
        姓名<input type="text" name="name"/><br/>
        年龄<input type="text" name="age"/><br/>
        <input type="submit" value="提交请求"/>
    </form>
</body>
</html>

控制器类

package package1;

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


@Controller
public class MyController {
/*
    处理器方法返回ModelAndView,实现转发操作
    语法:setViewName("forward:视图文件的完整路径")
    forward:不与视图解析器一起工作,就当没有视图解析器
* */
    @RequestMapping("/forward.do")
    public ModelAndView doforward(String name,int age){
        System.out.println("接收成功!name="+name+","+"age="+age);

        ModelAndView mv=new ModelAndView();

        mv.addObject("myname",name);
        mv.addObject("myage",age);

        mv.setViewName("forward:/WEB-INF/view/show.jsp");

        return mv;
    }

    /*
    处理器方法返回ModelAndView,实现重定向操作
    语法:setViewName("redirect:视图文件的完整路径")
    redirect:不与视图解析器一起工作,就当没有视图解析器

    !!重定向不能访问WEB-INF里的资源,只能访问静态资源
* */
    @RequestMapping("/redirect.do")
    public ModelAndView doredirect(String name,int age) {

        ModelAndView mv = new ModelAndView();

        mv.addObject("myname", name);
        mv.addObject("myage", age);

        mv.setViewName("redirect:/show1.jsp");
        
        return mv;
    }
}

show.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h3>show.jsp</h3>
    <h3>姓名:${myname}</h3><br/>
    <h3>年龄:${myage}</h3>
</body>
</html>

show1.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h3>show1.jsp</h3>
    <h3>姓名:${param.myname}</h3><br/>
    <h3>年龄:${param.myage}</h3>
</body>
</html>

启动tomcat服务器访问url

4.1

转发测试

4.2

转发测试结果

4.3

地址栏(重点关注)

4.4

重定向测试

4.5

重定向测试结果

4.6

地址栏(重点关注)

4.7