javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;
public class AServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,
IOException {
// 设置,在浏览器上响应的格式类型
Date nowTime = new Date(); // 创建当前时间的 Date 对象
// 将 nowTime 的数据存储(绑定)到请求域当中
request.setAttribute("sysTime",nowTime);
// 第一步: 获取到转发对象,注意:/ 开始,不家项目名 , / + 对应跳转的 Servlet 当中的 web.xml 当中的url映射的路径
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/B");
// 第二步: 调用转发器的forward方法完成跳转/转发
requestDispatcher.forward(request,response);
}
}
package com.RainbowSea.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class BServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,
IOException {
// 设置,在浏览器上响应的格式类型
response.setContentType("text/html;charSet=utf-8");
PrintWriter writer = response.getWriter();
// 取出请求域当中的数据: 这里的name值与上面setAttribute(String name,Object obj) 保持一致。
Object sysTime = request.getAttribute("sysTime");
writer.println("sysTime = " + sysTime); // 显示到浏览器页面当中的数据
}
}
转发的下一个资源必须是一个Servlet吗 ?
不一定,只要是Tomcat服务器当中的合法资源,都是可以转发的。例如:html....
举例:转发一个html文件
注意: 如果对应的不是 Servlet ,默认是从项目的中的web目录开始的,如果是转发web的目录下的子目录的话,需要指定对应的子目录的文件。
package com.RainbowSea.servlet;
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 TestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,
IOException {
// 转发的下一个资源不一定是Servlet 资源,
// 只要是Tomcat服务器当中合法的资源,都是可以转发的,例如: html...
// 注意:转发的时候,路径的写法要注意,转发的路径以 “/” 开始,不加项目名
// 默认是从项目的中的web目录开始的,如果是转发web的目录下的子目录的话,需要指定对应的子目录
// 如下是含有子目录的 / 表示 web目录
request.getRequestDispatcher("/test/test.html").forward(request,response);
}
}
2. Redirect重定向
重定向: 是指当浏览器请求一个 URL
时,服务器返回一个重定向指令,告诉浏览器地址已经变了,麻烦使用新的URL
再重新发送新请求。
重定向有两种: 一种是302响应,称为临时重定向,一种是301响应,称为永久重定向。两者的区别是,如果服务器发送301永久重定向响应,浏览器会缓存/hi
到/hello
这个重定向的关联,下次请求/hi
的时候,浏览器就直接发送/hello
请求了。
说明: 所谓的重定向是将新的路径交给浏览器的地址栏上,然后自动执行的,而前端的信息获取是需要指明项目名的,所以:注意:重定向 response.sendRedirect("/项目名/xxx/xx");
的跳转路径是需要写明项目名的 。
// 下面这种是 302 响应,临时重定向
// 注意:路径上要加一个项目名。为什么?
// 浏览器发送请求,请求路径上是需要添加项目名的。
// 以下这一行代码会将请求路径“/oa/dept/list”发送给浏览器
// 浏览器会自发的向服务器发送一次全新的请求:/oa/dept/list
response.sendRedirect("/oa/dept/list");
HttpServletResponse
提供了快捷的redirect()
方法实现302重定向。如果要实现301永久重定向,可以这么写:
response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); // 301
response.setHeader("Location", "/hello");
举例: 浏览器向 AServlet 发送请求,A