request请求转发相关知识点

请求转发是服务器端内部资源之间的交互方式,适用于MVC设计模式。通过HttpServletRequest对象的getRequestDispatcher方法获取RequestDispatcher,然后调用其forward方法实现转发。在转发过程中,请求数据可以通过request对象传递。注意,forward方法应在向客户端发送内容之前调用,否则可能抛出异常。转发的特点包括:一次客户端请求、多个服务器资源处理且URL不变。本文将展示转发与跳转的实战示例。

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

request对象实现请求转发:请求转发指一个WEB资源收到客户端请求后,

通知服务器去调用另外一个WEB资源进行处理。
请求转发应用场景:MVC设计模式
request对象提供了一个getRequestDispatcher方法,该方法返回一个

RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发。
request对象同时也是一个域对象,开发人员通过request对象在实现转发

时,把数据通过request对象带给其他web资源处理。
请求转发细节
forward方法用于将请求转发到RequestDispatcher对象封装的资源
如果在调用forward方法之前,在Servlet程序中写入部分内容已经真正被

传送到了客户端,forward方法将抛出lllgalStateException异常。

如果在调用forward方法之前向Servlet引擎的缓冲区(response)中写入内

容,只要写入到缓冲区中的内容还没有真正输出到客户端,forward方法

可以被正常执行,原来写入到输出缓冲区中的内容被清空,但是,已经写

入到HttpServletResponse对象中的响应头字段信息保持有效

请求转发的特点:
1.客户端只发一次请求,而服务端有多个资源调用

2.客户端浏览地址没有变化
转发,跳转演示:

package cn.huain.servlet;

import java.io.IOException;
import java.util.Random;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletDemo05 extends HttpServlet{


    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        //以UTF-8的码表发送数据
        /*
         这个地方有点绕,首先浏览器请求找到Servlet 然后message存到ServletContent域中然后转发给message.jsp;
            message.jsp读取发现<meta http-equiv='refresh'content='3;url=/day006/index.jsp'>
            跳转的头,然后3秒后跳转到index.jsp           
        */
                resp.setCharacterEncoding("UTF-8"); 
            resp.setContentType("text/html;charset=UTF-8");
        String message ="<meta http-equiv='refresh'content='3;url=/day006/index.jsp'>你将在3秒钟跳到首页";   
        this.getServletContext().setAttribute("message", message);
        this.getServletContext().getRequestDispatcher("/message.jsp").forward(req, resp);
    }

    private void test2(HttpServletResponse resp) throws IOException {
        //以UTF-8的码表发送数据
        resp.setCharacterEncoding("UTF-8"); 
        resp.setContentType("text/html;charset=UTF-8");
        resp.setHeader("refresh", "3;url='/day006/index.jsp'");
        String message ="你将在3秒钟跳到首页";
        resp.getWriter().write(message);
    }

    private void test1(HttpServletResponse resp) throws IOException {
        String data = new Random().nextInt(100000)+"";
        resp.setHeader("refresh", "3");
        resp.getWriter().write(data);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doGet(req, resp);
    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值