转发是对请求的转发,而重定向是对响应的要求。
希望大家能牢记这句话。
转发
下面来看一下这个示意图:
这里是一个转发的示意图,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的,也就应了我开头的那句话。
大家有什么问题,或者文章有错误,可以在评论区回复我,我会及时的修改。