Response重定向

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
                                            *以/开头的路径

                                             *规则:判断定义的路径是给谁用的?判断请求将来从哪儿发出
发布了263 篇原创文章 · 获赞 23 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_41998938/article/details/100056617