springmvc (四种跳转方式)重定向,转发到页面和action的区别

重定向与转发的区别:

1.重定向访问服务器两次,转发只访问服务器一次。

2.转发页面的URL不会改变,而重定向地址会改变

3.转发只能转发到自己的web应用内,重定向可以重定义到任意资源路径。

4.转发相当于服务器跳转,相当于方法调用,在执行当前文件的过程中转向执行目标文件,两个文件(当前文件和目标文件)属于同一次请求,前后页 共用一个request,可以通过此来传递一些数据或者session信息,request.setAttribute()和 request.getAttribute()。而重定向会产生一个新的request,不能共享request域信息与请求参数

5.由于转发相当于服务器内部方法调用,所以转发后面的代码仍然会执行(转发之后记得return);重定向代码执行之后是方法执行完成之后进行重定向操作,也就是访问第二个请求,如果是方法的最后一行进行重定向那就会马上进行重定向(重定向也需要return)。

6.无论是RequestDispatcher.forward方法,还是HttpServletResponse.sendRedirect方法,在调用它们之前,都不能有内容已经被实际输出到了客户端。如果缓冲区中已经有了一些内容,这些内容将被从缓冲区中移除。

可以这么理解:

转发相当于,张三向你借钱,但是你兜里没钱,所以你去找李四借到钱之后借给张三。对于张三而言并不知道你的钱是和李四借的。

重定向相当于,张三向你借钱,你兜里没钱,你告诉他李四有钱,所以张三再次去找李四借钱。

重定向和转发是Spring MVC中用于控制请求的两种方式。

重定向是指将请求重新发送到一个新的URL,新的URL可以是另一个控制器方法、一个静态资源或者一个外部URL。通过重定向可以实现页面跳转和访问其他资源。在Spring MVC中,可以使用redirect:前缀来实现重定向。例如,return "redirect:/index.jsp";表示重定向到index.jsp页面。

转发是指将请求转发给另一个控制器方法或者一个JSP页面进行处理,转发不改变客户端的URL。在Spring MVC中,可以使用forward:前缀来实现转发。例如,return "forward:/url";表示将请求转发到/url地址。转发可以在服务器内部进行,因此可以共享请求和响应对象。

重定向和转发的选择取决于具体的需求。如果需要跳转到一个新的URL或者访问其他资源,可以使用重定向。如果需要将请求转发给另一个控制器方法或者JSP页面进行处理,可以使用转发

前端请求发送页面

javascript 复制代码
<br>
<a href="${pageContext.request.contextPath}/one.action">1.请求转发页面</a><br>
<a href="${pageContext.request.contextPath}/two.action">2.请求转发action</a><br>
<a href="${pageContext.request.contextPath}/three.action">3.重定向页面</a><br>
<a href="${pageContext.request.contextPath}/four.action">4.重定向action</a><br>
<br>

具体的Controller类,实现请求与转发

java 复制代码
package com.powernode.controller;

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

@Controller
public class JumpAction {
    @RequestMapping("/one.action")
    public String one(){
        System.out.println("这是请求转发页面。。。。");
        return "main";//默认这是请求转发,使用视图解析器进行前后缀拼接进行页面跳转
    }
    @RequestMapping("/two.action")
    public String two(){
        System.out.println("这是请求转发action跳转。。。。");
        //forward:这组字符串可以屏蔽前后缀的拼接
        return "forward:/other.action";
    }
    @RequestMapping("/three.action")
    public String three(){
        System.out.println("这是重定向页面。。。。");
        //redirect: 这组字符串可以屏蔽前缀后缀的拼接,实现重定向跳转
        return "redirect:/admin/main.jsp";
    }
    @RequestMapping("/four.action")
    public String four(){
        System.out.println("这是重定向 action跳转。。。。");
        //redirect: 这组字符串可以屏蔽前缀后缀的拼接,实现重定向跳转
        return "redirect:/other.action";
    }
}

springmvc.xml的配置文件

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"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       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 http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--添加包扫描-->
    <context:component-scan base-package="com.powernode.controller">
    <!--不用添加试图解析器,因为处理的是ajax请求-->
    <!--必须要添加注解驱动,专门用来处理ajax请求的,日期转换需要它-->
    </context:component-scan>
    <mvc:annotation-driven></mvc:annotation-driven>
    <!--添加视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--配置前缀-->
        <property name="prefix" value="/admin/"></property>
        <!--配置后缀-->
        <property name="suffix" value=".jsp"></property>
    </bean>
</beans>

不需要去创建,直接拿来使用即可.

1)HttpServletRequest

2)HttpServletResponse

3)HttpSession

4)Model

5)Map

6)ModelMap

//做一个数据,传到main.jsp页面上

Users u = new Users("张三",22);

java 复制代码
    //传递数据
    request.setAttribute("requestUsers",u);
    session.setAttribute("sessionUsers",u);
    model.addAttribute("modelUsers",u);
    map.put("mapUsers",u);
    modelMap.addAttribute("modelMapUsers",u);

注意:Map,Model,ModelMap和request一样,都使用请求作用域进行数据传递.所以服务器端的跳转必须是请求转发.

相关推荐
四谎真好看13 分钟前
Java 黑马程序员学习笔记(进阶篇18)
java·笔记·学习·学习笔记
桦说编程19 分钟前
深入解析CompletableFuture源码实现(2)———双源输入
java·后端·源码
java_t_t19 分钟前
ZIP工具类
java·zip
lang201509281 小时前
Spring Boot优雅关闭全解析
java·spring boot·后端
pengzhuofan2 小时前
第10章 Maven
java·maven
百锦再2 小时前
Vue Scoped样式混淆问题详解与解决方案
java·前端·javascript·数据库·vue.js·学习·.net
刘一说2 小时前
Spring Boot 启动慢?启动过程深度解析与优化策略
java·spring boot·后端
壹佰大多2 小时前
【spring如何扫描一个路径下被注解修饰的类】
java·后端·spring
百锦再2 小时前
对前后端分离与前后端不分离(通常指服务端渲染)的架构进行全方位的对比分析
java·开发语言·python·架构·eclipse·php·maven
DokiDoki之父3 小时前
Spring—注解开发
java·后端·spring