JSP重定向

JSP的重定向有两种:forward和sendRedirect,它们的原理以及区别是什么呢?

 

它们在使用上的区别有很多,那些都是表面现象,在理解了它们各自的原理以后,使用上的区别那就能容易掌握了。

一、原理.

1、 Forward

这种方式是在服务器端作的重定向。服务器往client发送数据的过程是这样的:服务器在向客户端发送数据之前,是先将数据输出到缓冲区,然后将缓冲区中数据发送给client端。什么时候将缓冲区里的数据发送给client端呢?(1)当对来自client的request处理完,并把所有数据输出到缓冲区,(2)当缓冲区满,(3)在程序中调用缓冲区的输出方法out.flush()或response.flushbuffer(),web container才将缓冲区中的数据发送给client。

这种重定向方式是利用服务器端的缓冲区机制,在把缓冲区的数据发送到客户端之前,原来的数据不发送,将执行转向重定向页面,发送重定向页面的数据,重定向调用页的数据将被清除。如果在<JSP:FORWORD>之前有很多输出,前面的输出已使缓冲区满,将自动输出到客户端,那么这种重定向方式将不起作用,这一点应该特别注意。

public void doPost(HttpServletRequest request,HttpServletResponse response)  throws ServletException,IOException

{

       response.setContentType("text/html; charset=UTF-8");

       ServletContext sc = getServletContext();

       RequestDispatcher rd = null;

       rd = sc.getRequestDispatcher("/index.jsp");

       rd.forward(request, response);

}

2、 sendRedirect

这种方式是在客户端作的重定向处理。该方法通过修改HTTP协议的HEADER部分,对浏览器下达重定向指令的,让浏览器对在location中指定的URL提出请求,使浏览器显示重定向网页的内容。该方法可以接受绝对的或相对的URLs。如果传递到该方法的参数是一个相对的URL,那么Web container在将它发送到客户端前会把它转换成一个绝对的URL。public void doPost(HttpServletRequest request,HttpServletResponse response)   throws ServletException,IOException

{

       response.setContentType("text/html; charset=UTF-8");

       response.sendRedirect("/index.jsp");

}

 

二、区别.

1、forward重定向是在容器内部实现的同一个Web应用程序的重定向,所以forward方法只能重定向到同一个Web应用程序中的一个资源,重定向后浏览器地址栏URL不变,而sendRedirect方法可以重定向到任何URL, 因为这种方法是修改http头来实现的,URL没什么限制,重定向后浏览器地址栏URL改变。

2、forward重定向将原始的HTTP请求对象(request)从一个servlet实例传递到另一个实例,而采用sendRedirect方式两者不是同一个application。

3、基于第二点,参数的传递方式不一样。forward的form参数跟着传递,所以在第二个实例中可以取得HTTP请求的参数。sendRedirect只能通过链接传递参数,response.sendRedirect(“login.jsp?param1=a”)。

4、sendRedirect能够处理相对URL,自动把它们转换成绝对URL,如果地址是相对的,没有一个‘/’,那么Web container就认为它是相对于当前的请求URI的。比如,如果为response.sendRedirect("login.jsp"),则会从当前servlet 的URL路径下找login.jsp: http://10.1.18.8:8081/dms/servlet/Servlet 重定向的URL: http://10.1.18.8:8081/dms/servlet/login.jsp,如果为response.sendRedirect("/login.jsp")则会从当前应用径下查找url:http://10.1.18.8:8081/login.jsp。而forward不能这样处理相对路径。

### 实现 Spring Boot 中 JSP 页面的重定向跳转 在 Spring Boot 应用程序中处理 JSP 页面之间的重定向可以通过控制器中的 `redirect:` 前缀来完成。当返回字符串前加上此前缀时,Spring 将其解释为重定向指令。 #### 控制器方法示例 为了展示如何执行重定向操作,在控制器类里定义的方法可以如下所示: ```java import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.servlet.mvc.support.RedirectAttributes; @Controller public class TodoController { @PostMapping("/addTodoItem") public String addNewTodo(RedirectAttributes redirectAttrs) { // 处理新增待办事项逻辑... // 添加闪存属性以便于目标页面访问数据 redirectAttrs.addFlashAttribute("message", "成功添加新项目"); // 返回带 'redirect:' 前缀的目标 URL 或视图名称 return "redirect:/todoList"; } } ``` 上述代码片段展示了向 `/addTodoItem` 发送 POST 请求后会触发该方法,并最终重定向到名为 `/todoList` 的路径上[^1]。 #### 使用 Flash 属性传递消息 有时希望在一次请求之后立即显示某些临时性的通知给用户,比如确认信息或错误提示。这可通过 `RedirectAttributes` 对象实现,它允许设置一次性使用的模型属性——即所谓的“flash attributes”。这些属性仅能在下一次 HTTP 请求期间被读取并自动清除。 #### 配置 Thymeleaf 和 JSP 支持 (如果尚未配置) 尽管本案例专注于 JSP 技术栈,但值得注意的是,默认情况下 Spring Boot 更倾向于像 Thymeleaf 这样的模板引擎而非传统的 JSP 文件作为前端渲染工具。因此,对于那些想要继续沿用 JSP 来构建界面的人来说,可能还需要额外调整应用程序的相关依赖项以及配置文件以确保正确加载和解析 JSP 资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值