Spring MVC请求转发与请求重定向的示例详解
作者:啊Q老师
Spring MVC 请求转发请求重定向
请求转发
转发( forward ),指服务器接收请求后,从一个资源跳转到另一个资源中。请求转发是一次请求,不会改变浏览器的请求地址。
简单示例:
1.通过 String 类型的返回值实现转发
package cn.edu.springmvcdemo.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class ForwardAndRedirectDemo { @RequestMapping("/forwardTest1") public String forwardTest1(){ return "ForwardAndRedirect"; } }
创建 ForwardAndRedirect.jsp
<%-- Created by IntelliJ IDEA. User: dell Date: 2023/7/28 Time: 22:35 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <body> <h3>请求转发</h3> </body> </html>
结果如图:
2.通过 ModelAndView 实现转发
package cn.edu.springmvcdemo.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller public class ForwardAndRedirectDemo { @RequestMapping("/forwardTest2") public ModelAndView forwardTest2(){ ModelAndView mav = new ModelAndView(); mav.setViewName("ForwardAndRedirect"); return mav; } }
结果如图:
3.通过 < mvc:view-controller > 标签实现转发
在 Spring MVC 配置文件 springmvc.xml 中配置
<!-- 配置请求转发实现 --> <!-- 在通过 mvc:view-controller 标签实现转发中,添加该配置可以解决同时也通过 Controller 类方法访问出错的问题 --> <mvc:annotation-driven /> <!-- path 映射地址;view-name 视图名字 --> <mvc:view-controller path="/forwardTest3" view-name="ForwardAndRedirect" />
结果如图:
注:< mvc:annotation-driven > 是 Spring MVC 框架中的一个标签,主要作用是自动注册 Spring MVC 的处理器( Handler )和视图解析器( ViewResolver ),以便在应用程序中处理 HTTP 请求并生成相应的响应。具体来说,< mvc:annotation-driven > 标签可以完成以下任务:
注册 RequestMappingHandlerMapping 处理器映射,用于将 Spring 控制器方法(带有 @RequestMapping 注释)映射到 HTTP 请求注册 ExceptionHandlerExceptionResolver 异常处理器解析器,用于处理在控制器方法执行期间发生的异常注册 MessageConverter 消息转换器,用于将请求消息转换为控制器方法参数的类型,并将响应消息转换为视图解析器所需的类型注册 RequestResponseBodyAdvice advice,用于在请求和响应之间进行转换和类型转换通过使用 < mvc:annotation-driven > 标签,开发人员可以更加简洁地配置 MVC 模式中的控制器部分,而无需手动注册这些组件,可以使代码更加清晰和易于维护。
请求重定向
重定向( redirect ),指服务器接收请求后,不能跳转到当前请求地址指向的资源中,但会指定新的资源地址返回给客户端,客户端再次请求访问指定资源。请求重定向是两次请求,会改变浏览器的请求地址。
简单示例:
1.通过 String 类型的返回值实现重定向
package cn.edu.springmvcdemo.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class ForwardAndRedirectDemo { //新的资源地址 @RequestMapping("/redirectIndex") public String redirect(){ return "ForwardAndRedirect"; } //请求重定向 @RequestMapping("/redirectTest1") public String redirectTest1(){ //指定新的资源地址 return "redirect:/redirectIndex"; } }
ForwardAndRedirect.jsp 内容简单修改
<%-- Created by IntelliJ IDEA. User: dell Date: 2023/7/28 Time: 22:35 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <body> <h3>请求重定向</h3> </body> </html>
结果如图:输入 redirectTest1 后自动跳转到 redirectIndex
2.通过 ModelAndView 实现重定向
package cn.edu.springmvcdemo.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller public class ForwardAndRedirectDemo { @RequestMapping("/redirectIndex") public String redirect(){ return "ForwardAndRedirect"; } @RequestMapping("/redirectTest2") public ModelAndView redirectTest2(){ ModelAndView mav = new ModelAndView(); mav.setViewName("redirect:/redirectIndex"); return mav; } }
结果如图:输入 redirectTest2 后自动跳转到 redirectIndex
3.通过 < mvc:view-controller > 标签实现重定向同理,只需在 springmvc.xml 中配置
<!-- 配置请求转发重定向 --> <!-- path 映射地址;view-name 指定新的资源地址 --> <mvc:view-controller path="/redirectTest3" view-name="redirect:/redirectIndex" />
结果如图:输入 redirectTest3 后自动跳转到 redirectIndex
附
自定义视图,指定义一个自定义的视图对象,用于渲染模型数据并生成响应。自定义视图可以继承 View 、AbstractExcelView 或 AbstractPdfView 来将内容以某种格式( Excel 、Pdf 等)显示。
简单示例:下载 Excel 文档的需求实现
首先,在 pom.xml 中添加以下依赖
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency>
接着,创建自定义视图类 ExcelViewDemo 继承 AbstractXlsxView ,设置文档的相关信息与数据写入
package cn.edu.springmvcdemo.web; import cn.edu.springmvcdemo.model.DomainObject; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.springframework.web.servlet.view.document.AbstractXlsxView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.OutputStream; import java.util.List; import java.util.Map; public class ExcelViewDemo extends AbstractXlsxView { @Override protected void buildExcelDocument(Map<String, Object> model, Workbook workbook, HttpServletRequest request, HttpServletResponse response) throws Exception { //设置文档名字 String file = "ExcelTest.xlsx"; //设置字符编码 response.setCharacterEncoding("UTF-8"); //设置内容类型,在 apache-tomcat-8.5.75/conf/web.xml 配置文件中查找 xlsx 可获取对应类型写法 response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); //设置头部信息(下载,下载文件名字) response.setHeader("Content-Disposition","inline;file" + new String(file.getBytes(),"UTF-8")); //获取 model 数据( controller 类处理方法中放进的数据) List<DomainObject> domainObjects = (List<DomainObject>) model.get("domainObjects"); //获取数据后转换成 Excel 视图返回 //1.创建 Excel 表(表中 sheet 的名字) Sheet sheet = workbook.createSheet("数据表"); //2.创建第一行 Row headRow = sheet.createRow(0); //3.创建第一行的1、2、3列 headRow.createCell(0).setCellValue("编号"); headRow.createCell(1).setCellValue("姓名"); headRow.createCell(2).setCellValue("年龄"); //遍历获取数据写入表中 int rowNum = 1; //从表的第二行开始 for(DomainObject domainObject:domainObjects){ //创建新的一行 Row row = sheet.createRow(rowNum++); //获取对应的数据 row.createCell(0).setCellValue(domainObject.getId()); row.createCell(1).setCellValue(domainObject.getName()); row.createCell(2).setCellValue(domainObject.getAge()); } OutputStream outputStream = response.getOutputStream(); //将数据写入输出流 workbook.write(outputStream); //清空输出流 outputStream.flush(); //关闭输出流 outputStream.close(); } }
然后,创建 controller 类的方法,获取数据
package cn.edu.springmvcdemo.controller; import cn.edu.springmvcdemo.model.DomainObject; import cn.edu.springmvcdemo.web.ExcelViewDemo; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @Controller public class ExcelDemo { @RequestMapping("/excelDownload") public ModelAndView excelViewTest(){ Map<String,Object> map = new HashMap<>(); //模拟:数据库中取出一个 domainObjects 的 list 集合 DomainObject domainObject1 = new DomainObject(); domainObject1.setId(728); domainObject1.setName("曹操"); domainObject1.setAge(24); DomainObject domainObject2 = new DomainObject(); domainObject2.setId(729); domainObject2.setName("刘备"); domainObject2.setAge(22); DomainObject domainObject3 = new DomainObject(); domainObject3.setId(730); domainObject3.setName("孙权"); domainObject3.setAge(18); //先将数据放入 list 集合 List<DomainObject> list = new ArrayList<>(); list.add(domainObject1); list.add(domainObject2); list.add(domainObject3); // list 集合再放入 map 集合中 // 键的名字与 (List<DomainObject>) model.get("domainObjects") 中的名字保持一致 map.put("domainObjects",list); //(自定义视图对象,数据) ModelAndView mav = new ModelAndView(new ExcelViewDemo(),map); return mav; } }
最后,重启服务器,测试结果输入地址,弹出下载窗口。结果如图:
Excel 表内容如图:
到此这篇关于Spring MVC请求转发与请求重定向的文章就介绍到这了,更多相关Spring MVC请求转发和重定向内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!