路径写法:
1. 路径分类
1. 相对路径:通过相对路径不可以确定唯一资源
* 如:./index.html
* 不以/开头,以.开头路径
* 规则:找到当前资源和目标资源之间的相对位置关系
* ./:当前目录 注意:./资源名 可以省略./直接写成 资源名
* ../:后退一级目录
2. 绝对路径:通过绝对路径可以确定唯一资源
* 如:http://localhost/day15/responseDemo2 一般写成/day15/responseDemo2
* 以/开头的路径
* 规则:判断定义的路径是给谁用的?(通过判断请求将来从哪儿发出就知道路径给谁用,比如说:页面点击链接按钮和重定向就是给客户端用,内部转发就是给服务器用)
* 给客户端浏览器使用:需要加虚拟目录(项目的访问路径)
* 建议虚拟目录动态获取:request.getContextPath()
* <a> , <form> 重定向...
* 给服务器使用:不需要加虚拟目录
* 转发路径
ResponseDemo01.java
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/ResponseDemo01")
public class ResponseDemo01 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Demo01...");
//方式一、
//设置状态为重定向
resp.setStatus(302);
//设置响应头,重写是客户端请求,因此要写绝对路径(虚拟路径+资源路径)
//resp.setHeader("Location","/loginServlet/ResponseDemo02");
//可以使用方法getContextPath获取虚拟路径
String contextPath = req.getContextPath();
System.out.println(contextPath);
resp.setHeader("Location",contextPath+"/ResponseDemo02");
//方式二,使用简便方式,不用写状态302和Location类响应头
//resp.sendRedirect("ResponseDemo02");
//内部转发发送的对象是服务器,因此使用相对路径
//req.getRequestDispatcher("ResponseDemo02").forward(req,resp);
}
}
ResponseDemo02.java
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/ResponseDemo02")
public class ResponseDemo02 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//方式一
// resp.setStatus(302);
// resp.setHeader("Location","http://www.baidu.com");
//方式二:因为返回状态和响应头都是不变的,因此Response对象有一个方法可以简化操作。
System.out.println("demo02...1...");
resp.sendRedirect("http://www.baidu.com");
//放在这里不能打印
System.out.println("demo02...2...");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}