java spring(JAVA springmvc怎么实现重定向和转发)

java spring(JAVA springmvc怎么实现重定向和转发)当处理器完成请求处理后向其它资源进行跳转时 有两种跳转方式 请求转发 与 重定向 根据跳转的资源类型 分为两类 跳转到 页面 与跳转到 其它处理器 请求转发的页面 可以是 WEB INF 中页面 但重定向的页面不能为 WEB INF 中的页面的 因为重定向相当于用户重新发出一次请求 而用户是不可以直接访问 WEB INF 中的资源 本项目案例是以 Idea Maven 构建的项目 项目目录结构如下 pom xml 文件配置如下 spring config xml 文件配置如下



当处理器完成请求处理后向其它资源进行跳转时,有两种跳转方式:请求转发重定向。根据跳转的资源类型,分为两类:跳转到 页面 与跳转到 其它处理器。请求转发的页面,可以是 WEB-INF 中页面,但重定向的页面不能为 WEB-INF中的页面的,因为重定向相当于用户重新发出一次请求,而用户是不可以直接访问 WEB-INF 中的资源。

本项目案例是以 Idea+Maven 构建的项目,项目目录结构如下:

pom.xml 文件配置如下:

spring-config.xml 文件配置如下:

web.xml 文件配置如下:

当处理器方法返回ModelAndView 时,跳转到指定的ViewName,默认情况下使用的是请求转发,当然也可显式的进行请求转发。此时,需在setViewName()指定的视图前添加forward关键字,一旦添加了forward关键字,控制器方法返回的视图名称就不会再与视图解析器中的前辍与后辍进行拼接,所以必须写出相对于项目根的完整路径才能返回正确的视图。

当通过请求转发跳转到目标资源(页面或Controller)时,若需要目标资源传递数据,可以使用 HttpRequestServlet,HttpSession,还可以将数据存放于ModelAndView中的Model中。目标页面则通过 EL 表达式来访问该数据。下面案例演示使用ModelAndView的情形。

项目案例: 用户注册完毕后,显示用户的注册信息。

关键步骤:

【1】在 WEB-INF/jsp 下新建 register.jsp 和 info.jsp 页面

register.jsp 代码如下:

indo.jsp 代码如下:

【2】在 cn.hh.springmvc03.entity 包下,新建实体类 User,代码如下:

【3】在 cn.hh.springmvc03.controller 包下,新建 UserController 控制器,代码如下:

【4】运行测试,输入“http://localhost:8080/user/register.do”,注册和转发页面如下图所示:

注册页面:

转发页面:

  当前控制器的处理方法处理完毕后也可不返回视图,而是转发给下一个控制器方法继续处理。

项目案例: 用户注册成功后,转发给其他方法,由其他方法返回视图显示当前用户的基本信息。

关键步骤:

【1】 将 cn.hh.springmvc03.controller 包下的 UserController 控制器的 doRegister 方法替换成下面两个方法,代码如下:

  可以发现,参数仍然可以在两个方法之间传递,第一个方法把参数存进ModelAndView,第二个方法用同名形式参数接收。

  mv.setViewName(“forward:second.do”);这行代码实现转发到另一个方法second.do继续处理。

【2】运行测试,结果同前。

  当处理器方法返回String 时,该String 即为要跳转的视图。必须在其前面加上前辍 forward:,显式的指定跳转方式为请求转发。视图解析器将不会对其进行前辍与后辍的拼接,该String中的路径须是完整路径。

  请求转发的目标资源无论是一个页面,还是一个Controller,用法一样。

项目案例: 用户注册成功后,转发给其他方法,由其他方法返回视图显示当前用户的基本信息。

关键步骤:

  修改 UserController 控制器方法 doRegister 如下:

注意: 这种情况不能使用ModelAndView来传递数据,但可以使用HttpServletRequest等来传递数据。

  当处理器方法返回void时,可以使用HttpServletRequest实现请求转发。既可转发到页面,也可转发到其他控制器方法。若有数据需要向目标资源传递,可将数据放入到 HttpServletRequest或 HttpSession 中。但不能将数据放到 Model、RedirectAttributes中,因为这两者的数据都是通过拼接到处理器方法的返回值中,作为请求的一部分出现向下传递的。但这里没有返回值,所以它们中的数据无法向下传递。

  在重定向时,请求参数不能通过HttpServletRequest向目标资源中传递。可以通过以下方式之一来传递请求参数。

  当ModelAndView中的Model 存入数据后,视图解析器InternalResourceViewResolver 会将map中的key 与value,以请求参数的形式放到请求的URL后。 注意事项:

放入到Model中的value,只能是基本数据类型与 String,不能是自定义类型的对象数据。原因是视图解析器会将Map的value放入到URL后作为请求参数传递出去,任何类型的value,都会变为String。重定向的面页中是无法从request 中读取数据的。但由于map中的key与value,以请求参数的形式放到了请求的URL后,所以,页面可以通过EL表达式中的请求参数param读取。重定向的页面不能是/WEB-INF下的页面。因为重定向相当于客户端发出一次新的请求,而客户端是不可以请求/WEB-INF下的资源的。

项目案例: 用户登录成功后, 通过重定向页面实现登录后显示用户信息。

关键步骤:

【1.1】在WebContent 下创建页面 show.jsp,复制之前的 login.jsp 页面。

show.jsp 代码如下:

【注意】这里用到了 param 对象。

Login.jsp 代码如下:

【1.2】修改 UserController 控制器,添加方法 doLogin 如下:

【1.3】测试运行,输入“http://localhost:8080/user/login.do”。

再次测试:如果在 show.jsp 页面删除 param,能否接收到数据。

项目案例: 用户登录成功后, 通过重定向页面实现登录后显示用户信息。

关键步骤:

【2.1】在WebContent 下创建页面 show2.jsp,代码如下:

【2.2】修改方法 doLogin 代码如下:

【2.3】测试运行,输入“http://localhost:8080/user/login.do”。

  重定向到其它 Controller方法时,携带参数可以采用前面的其中一个方式。而目标Controller 接收这些参数,也有多种方式。

  目标Controller在接收这些参数时,只要保证目标 Controller的方法形参名称与发送 Controller 发送的参数名称相同即可接收。当然,目标 Controller 也可以进行参数的整体接收。只要保证参数名称与目标 Controller接收参数类型的类的属性名相同即可。

项目案例: 用户登录成功后, 通过重定向页面实现登录后显示用户信息。(

【1.1】修改doLogin方法,添加两个目标方法。

【1.2】测试运行,输入http://localhost:8080/user/login.do。

  注释掉mv.setViewName(“redirect:second.do”),添加mv.setViewName(“redirect:third.do”)再次测试。观察两次结果是否相同。

项目案例: 用户登录成功后, 通过重定向页面实现登录后显示用户信息。

关键步骤: 修改 UserController 代码如下:

  可以重定向到页面,也可以重定向到其他控制器方法。当处理器的方法返回类型为String时,可在字符串中添加前缀redired:即可实现重定向。如果还要传递参数,可以通过URL携带参数,通过HttpSession 携带参数,通过Model携带参数等多种办法。这里重点介绍Model和RedirectAttributes携带参娄和的办法。

【1】重定向到页面时携带参数

【1.1】通过 Model 形参携带参数

  在Controller形参中添加 Model 参数,将要传递的数据放入 Model 中进行参数传递。这种方式同样也是将参数拼接到了重定向请求的 URL后,因而放入其中的数据只能是基本类型数据,不能是自定义类型。

项目案例: 用户登录成功后, 通过重定向页面实现登录后显示用户信息。

关键步骤: 修改 UserController 代码如下:

【1.2】通过形参 RedirectAttributes 携带参数

  RedirectAttributes专门用于携带重定向参数的。它其实继承自Model的接口,底层仍然使用ModelMap 实现。所以,这种携带参数的方式,同样不能携带自定义对象。

项目案例: 用户登录成功后, 通过重定向页面实现登录后显示用户信息。

关键步骤: 修改 UserController 代码如下:

  要使用 RedirectAttributes 参数,还需要在 SpringMVC 的配置文件中注册MVC 的注解驱动。

【2】重定向到控制器时携带参数

  重定向到控制器时,携带参数的方式,可以使用请求 URL 后携带方式,HttpSession携带方式,Model 形参携带方式等,下面案例学习下使用Model 形参携带参数,注意传递与接收的要点就是接收方法的形参的名称要与传递方法的model中的key名称一致。可以整体接收,也可以逐个参数接收。

项目案例: 用户登录成功后, 通过重定向页面实现登录后显示用户信息。

关键步骤: 修改 UserController 代码如下:

  当处理器方法返回 void 时,使用 HttpServletResponse 的sendRedirect()方法实现重定向。若有数据需要向下一级资源传递,需要将数据放入到HttpSession中,不能放在HttpServletRequest中。

项目案例: 用户登录成功后, 通过重定向页面实现登录后显示用户信息。

关键步骤:

修改 UserController 代码如下:

在WebContent下添加页面 show3.jsp,代码如下:

到此这篇关于SpringMVC中转发和重定向的文章就介绍到这了,更多相关SpringMVC转发和重定向内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

编程小号
上一篇 2025-03-16 13:06
下一篇 2025-02-26 15:57

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/61937.html