Servlet跳转有两种方式

本文深入解析了HTTP中两种跳转方式:redirect和forward的区别,包括它们的工作原理、应用场景以及如何在实际开发中应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


  1、sendRedirect()方式

 response.sendRedirect(String targetUrl);

  2、RequestDispather方式

 RequestDispatcher requestDispatcher = request.getRequestDispatcher(String targetUrl);
  requestDispatcher.forward(request, response);

  第一种方式是给用户浏览器发送通知,然后由浏览器再给服务器发送跳转请求,所以比较类似用户自己去点URL的跳转,这种方式如果需要传参给跳转页面,需要使用Session或者使用GET方式将参数显式的写在targetUrl里(如:ooxx.jsp?id=1),而且大部分情况下由于GET方法的局限性,这种跳转方式只能带较为简单的参数。

  而第二种方式有点类似C#中的Server.Transfer()方法,即服务器端跳转,从现象上看就是用户的浏览器内容发生了变化,但是浏览器的地址栏不变还是老地址。这种方式由服务器直接控制request及response的走向及参数,从命令行的参数上就可以看出这一点。这样方便程序员控制参数的传递,几乎可以传递任何类型的参数,只要简单的使用setAttribute()方法即可:

  request.setAttribute(String attriName, Object attriValue);

  但是也就是因为它是服务器端跳转,所以用户浏览器的地址栏是不发生变化的
<think>我们正在讨论Servlet的响应方式。根据引用,我们知道一个Servlet请求只能有一个响应,任何尝试生成多个响应的代码都会导致IllegalStateException(引用[1])。因此,我们关注的是如何正确地生成这一个响应。从引用中可以看出,Servlet生成响应的主要方式是通过HttpServletResponse对象。具体来说,有两种常见方式:1.通过PrintWriter对象返回文本内容(如HTML、JSON等)2.通过OutputStream对象返回二进制数据(如图片、文件等)这两种方式不能同时使用,因为响应只能有一个(引用[1])。在代码实现上,我们通常根据返回内容的类型选择其中一种。引用[2]提到Servlet是用Java编写的服务器端程序,用于生成动态Web内容。引用[3]和[4]则展示了Servlet的配置方式和示例代码,其中在doGet或doPost方法中通过response对象设置响应内容。下面我们详细说明这两种响应方式:</think>### Servlet实现响应的两种方式 Servlet 通过 `HttpServletResponse` 对象实现响应,核心方式如下: #### 1. **字符流响应(文本/HTML)** 使用 `PrintWriter` 对象返回文本内容,适用于 HTML、JSON、XML 等: ```java protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置响应类型(可选) response.setContentType("text/html;charset=UTF-8"); // 获取字符输出流 PrintWriter out = response.getWriter(); // 写入响应内容 out.println("<h1>Hello World</h1>"); out.println("<p>当前时间:" + new Date() + "</p>"); } ``` **特点**: - 自动处理字符编码(通过 `setContentType()` 设置) - 适用于文本类响应 - 示例:生成动态 HTML 页面或 API 的 JSON 响应 #### 2. **字节流响应(二进制数据)** 使用 `ServletOutputStream` 返回二进制数据,适用于图片、文件等: ```java protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置响应类型(必须) response.setContentType("image/png"); // 获取字节输出流 ServletOutputStream out = response.getOutputStream(); // 读取图片文件并写入响应 InputStream imageStream = getServletContext().getResourceAsStream("/images/logo.png"); byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = imageStream.read(buffer)) != -1) { out.write(buffer, 0, bytesRead); } } ``` **特点**: - 直接操作原始字节流 - 必须明确设置 `Content-Type`(如 `image/jpeg`, `application/pdf`) - 适用于文件下载、图片传输等场景 --- ### 关键注意事项 1. **二选一原则** 在同一个响应中只能使用一种输出流(`PrintWriter` 或 `ServletOutputStream`),同时使用会抛出 `IllegalStateException`[^1]。 2. **编码设置** 字符流需显式设置编码(如 `response.setCharacterEncoding("UTF-8")`),否则可能乱码。 3. **响应头控制** 可通过 `response` 对象设置头信息: ```java response.setHeader("Cache-Control", "no-cache"); // 控制缓存 response.setDateHeader("Expires", 0); // 设置过期时间 ``` 4. **重定向** 另一种特殊响应方式(非内容输出): ```java response.sendRedirect("https://example.com/new-page"); // 返回302跳转 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值