1.什么叫重定向
定义:重定向就是资源跳转的一种方式
2.重定向的代码实现
首先创建一个web项目,然后设置Tomcat服务器,将该项目导入Tomcat服务器
然后在src目录下创建两个servlet文件,分别命名为ResponseDemo1 ResponseDemo2
ResponseDemo1.java
package cn.itcast.web.servlet;
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("/responseDemo1")
public class ResponseDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo1.......");
//访问/responseDemo1,会自动跳转到/responseDemo2资源
//1.设置状态码为302
response.setStatus(302);
//2.设置响应头location
response.setHeader("location","/day15_response_war_exploded/responseDemo2");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
ResponseDemo2.java
package cn.itcast.web.servlet;
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("/responseDemo2")
public class ResponseDemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo2.......");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
启动Tomcat服务器,输入网址:http://localhost:8080/day15_response_war_exploded/responseDemo1 (这里设置的端口号和虚拟目录可能不同)
控制台输出:
demo1…
demo2…
在操作的过程中遇见了一些问题与大家分享一下,ResponseDemo1文件我的虚拟目录写错了,和tomcat中设定的不一样,所以输入网址后会出现404的错误。这里建议大家用虚拟目录动态获取:
request.getContextPath(),ResponseDemo1代码如下:
package cn.itcast.web.servlet;
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("/responseDemo1")
public class ResponseDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo1.......");
//访问/responseDemo1,会自动跳转到/responseDemo2资源
//1.设置状态码为302
response.setStatus(302);
//动态获取虚拟目录
String contextPath = request.getContextPath();
//简单的重定向方法
response.sendRedirect(contextPath + "/responseDemo2");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
ResponseDemo2保持不变,打印效果和之前一样,这样做的好处是:每次在配置服务器中更换虚拟目录时,不用手动改写访问路径,动态获取可以大大减低错误。
3.forward和 redirect 区别
之前学过转向forward,同样是跳转,有什么区别呢?
*重定向的特点:redirect
1.地址栏发生变化
2.重定向可以访问其他站点(服务器)的资源
3.重定向是两次请求,不能使用request对象共享数据
*转发的特点:forward
1.转发地址栏路径不变
2.转发只能访问当前服务器的资源
3.转发是一次请求
解析1:上面代码中输入http://localhost:8080/day15_response_war_exploded/responseDemo2之后,地址栏路径发生变化,变为:http://localhost:8080/day15_response_war_exploded/responseDemo2, 因为这里使用的什重定向.
解析2:
改动ResponseDemo2中的代码,将跳转路径设置为其他站点
ResponseDemo2.java
package cn.itcast.web.servlet;
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("/responseDemo1")
public class ResponseDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo1.......");
//1.设置状态码为302
response.setStatus(302);
response.sendRedirect("http://www.itcast.cn");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
结果:网址跳转到站点:http://www.itcast.cn/ 可以证明重定向可以访问其他站点
解析3:
输入网址后点击F12,可以看到有两次抓包过程。
4.路径写法
1.相对路径:通过相对路径不可以确定唯一资源
*如:./index.html
*不以/开头,以.开头路径
*规则:找到当前资源和目标资源之间的相对位置关系
*./:当前目录
*../:后退一级目录
2.绝对路径:通过绝对路径可以确定唯一资源
*如:http://localhost/day15/responseDemo2 /day15/responseDemo2
*以/开头的路径
*规则:判断定义的路径是给谁用的?判断请求将来从哪儿发出