请求转发的用处:
比如说我们登录验证,我们验证过了之后,服务器会把我们转到管理页面。如果验证不过,会把我们再继续转到登录页面。知道我们验证通过了,才会把我们转到管理页面。
请求转发
请求派发
xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>PostFormServlet</servlet-name>
<servlet-class>edu.xalead.PostFormServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>OtherServlet</servlet-name>
<servlet-class>edu.xalead.OtherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>PostFormServlet</servlet-name>
<url-pattern>/pfs</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>OtherServlet</servlet-name>
<url-pattern>/os</url-pattern>
</servlet-mapping>
</web-app>
servlet2
package edu.xalead;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class OtherServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//向客户端发送一个响应
response.getWriter().println("Hello World !");
//这里为了防止转发之后的servlet再写响应,
//我们这里需要刷新一下。
response.getWriter().flush();
}
}
servlet1
package edu.xalead;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class PostFormServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
//这里转给OtherServlet之后的内容,
//需要用doGet方法处理。
//因为,service判断请求中的method属性值,
//如果是get,service就会调用doGet()方法,
//如果是Post,就会调用doPost()方法。
//所以,我们在转发的以后,
//request里面的字符串没有变化,
//方法还是不变。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setCharacterEncoding("utf-8");
/**
* 请求转发
*/
//设置响应码:
//在响应头里面,300~399是转发的响应码,
//200~299是成功响应,
//但是这里面还有细分。
/*
*这个是通过改头属性和响应码的方法转发
*/
//这种转发的好处是可以实现跨域转发。
// response.setStatus(302);
// response.setHeader("location","http://www.sohu.com");
// response.sendRedirect("http://www.sohu.com");//重定向
/**
* 请求派发:
* 就是说,如果我们不跨域进行转发的话。
* (这里不跨域的意思是,我们访问这个域里的seervlet,
* 然后想转给这个域里头的另一个servlet。
* 这里两个servlet所在的域名是一样的,都是localhost:8080。
* 也就是这两个servlet都在服务器端的servlet容器里,
* 没有必要经过客户端。)
* 因为没有响应,所以A给B的request里的东西是不会丢的,因为没有响应。
* (request里面放的请求的东西,在服务器端不响应是不会丢的。)
*/
response.getWriter().println("Hi everybody!");
//因为没有引用,我们要用web.xml里面的了路径来进行请求派发。
//这里没有response(响应),
//只能用request.getRequestDispatcher("/bbc")
/*得到请求派发对象*/
RequestDispatcher dispatcher = request.getRequestDispatcher("/os");
//方法一:转发
//这里forward需要向request.getRequestDispatcher()的括号里面的路径转。
//但是forward里需要两个参数去进行派发。
//我们这里如果是给index.jsp进行派发,
//那么,在javascript里,
//jsp和servlet我们可以看成是一样的,
//都是处理请求和响应的。
//而这里的request和response,
//是未处理完的被服务端封装的客户端请求。
// dispatcher.forward(request,response);
//我们这里要注意,
//写在响应后面的"Hi every body!"这个字符串在servlet响应并且刷新之后。
//既不能显示在控制台底下,
//也不能不能显示到浏览器里头的。
//如果将响应写在前面,就会报错。
//而如果没有下面的dispatcher.include(request,response);(include方法)
//在页面同样也不会显示。
//总结来说,就是用forward方法,
//我们只能看到第一个转发的输出("Hello World !"),
//而看不到第二个输出("Hi everybody!")。
// response.getWriter().println("Hi everybody!");
// response.getWriter().flush();
//方法二:包含
//这个方法与上面的转发不同的是,
//在RequestDispatcher dispatcher = request.getRequestDispatcher("/os");之前的
//第一个servlet响应结束了之后
//(即转发第一个"Hi everybody!"字符串之后),
//服务端会接着通过"/os"路径用include方法执行第二个servlet响应
//(即转发"Hello World !"字符串之后)。
//最后,再去响应dispatcher.include(request,response);
//后面的servlet响应(即转发"Hi everybody!"字符串)。
//结果就是两个servlet的输出,都输出到客户端了,
//形成了一种包含的关系。
dispatcher.include(request,response);
response.getWriter().println("Hi everybody!");
System.out.println("asdfsdasdafafdsa");
}
}