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一样,都使用请求作用域进行数据传递.所以服务器端的跳转必须是请求转发.

相关推荐
哎呦没25 分钟前
大学生就业招聘:Spring Boot系统的架构分析
java·spring boot·后端
编程、小哥哥1 小时前
netty之Netty与SpringBoot整合
java·spring boot·spring
IT学长编程2 小时前
计算机毕业设计 玩具租赁系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·课程设计·毕业论文·计算机毕业设计选题·玩具租赁系统
莹雨潇潇2 小时前
Docker 快速入门(Ubuntu版)
java·前端·docker·容器
杨哥带你写代码2 小时前
足球青训俱乐部管理:Spring Boot技术驱动
java·spring boot·后端
郭二哈3 小时前
C++——模板进阶、继承
java·服务器·c++
A尘埃3 小时前
SpringBoot的数据访问
java·spring boot·后端
yang-23073 小时前
端口冲突的解决方案以及SpringBoot自动检测可用端口demo
java·spring boot·后端
沉登c3 小时前
幂等性接口实现
java·rpc
代码之光_19803 小时前
SpringBoot校园资料分享平台:设计与实现
java·spring boot·后端