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);
}
}