Servlet 的转发和重定向详解

转发是对请求的转发,而重定向是对响应的要求。

希望大家能牢记这句话。


转发

下面来看一下这个示意图:

这里写图片描述

这里是一个转发的示意图,navigator代表的是一个浏览器客户端,它发送了一个请求给TomCat 服务器下的MyServlet ,这个MyServlet又将请求转发给MySecondServlet ,最后MySecondServlet 又返回一个响应给客户端,从而实现了一次转发,主要注意的是,转发从开始到结束,url都不会发生任何的变化。

下面来看一段代码,我自己编写了一个jsp文件,这个文件含一个表单,表单内部有一个input输入框,我需要让Myservlet通过转发到MySecondServlet,然后让它最终把获取到的值打印出来。

index.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
    <form method ="post" action="first">
        <label for="input">请输入一个内容</label>
        <input type="text" name="input" />
        <input type="submit" value="点击我提交">
    </form>
</body>
</html>

下面是我的MyServlet

MyServlet.java

package com.bikeqx.test5;

import java.io.IOException;

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

public class MyServlet extends HttpServlet{
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //注意这里的字符编码也是比较重要的。
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        RequestDispatcher rd = request.getRequestDispatcher("second");
        rd.forward(request, response);
        }
    }

下面是我的MySecondServlet
MySecondServlet.java

package com.bikeqx.test5;

import java.io.IOException;
import java.io.PrintWriter;

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

public class MySecondServlet extends HttpServlet{

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        // TODO Auto-generated method stub
                PrintWriter out = resp.getWriter();
                out.println("<!DOCTYPE html>");
                out.println("<html><body>");
                out.println("<p>接收的数据</p>");
                String str1 = req.getParameter("input");
                if(str1 == null){
                    out.println("null");
                }
                else{
                    out.println(str1);
                }
                out.println("</body></html>");
    }

}

通过上面的代码我们可以看出,其实MySecondServlet是可以获取到表单里的input的值的,因为我们转发的仅仅是请求,而请求里封装了提交的表单的值,整个转发的过程浏览器客户端是一无所知的

下面我来介绍一下代码里用到的转发的方法。

RequestDispatcher并不能直接产生对象,需要通过封装好的request来返回一个RequestDispatcher的对象。这个方法包含一个字符串参数,为要提交的地方。

RequestDispatcher getRequestDispatcher("address")

而requestdispatcher 可以调用forward方法,这个方法能够把信息转发到需要转发的地址上去,并且接受两个参数,一个是request,另一个是response,这两个都是被封装好的。我们之所以可以在转发后的页面上获取到表单的值,就是因为发送了封装好的request过去。


重定向

下面是重定向的示意图

这里写图片描述

这样看上去确实好看一点,QWQ我还是花了点时间试图把线拉直。

它的原理也并不难,实际上它是这样运作的:

客户端浏览器发送一条request 到TomCat服务器的MyServlet,之后服务器返回一条response给客户端,这条response要求客户端定向到MySecondServlet,于是客户端又发送一条request给TomCat服务器的MySecondServlet,然后再由MySecondServlet来返回一个response。

实际上重定向的过程是两条request和两条response,而转发的过程实际上只有一条request和一条response。

实际上表单信息被封装到第一条request里面,而第二条request则只是获取内容,对于重定向来说,url是会发生明确的变化的。

下面来看一下重定向的代码。这里我只贴上MyServlet 的代码,其他的代码不变。

MyServlet.java

package com.bikeqx.test5;

import java.io.IOException;

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

public class MyServlet extends HttpServlet{
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        //response封装一个重定向信息返回给客户端
        response.sendRedirect("second");
        }
    }

这样我们就可以完成一次重定向,然而从运行结果看来,MySecondServlet 并没有获取到input的值。

实际上重定向信息是被封装到response的,也就应了我开头的那句话。

大家有什么问题,或者文章有错误,可以在评论区回复我,我会及时的修改。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值