【JavaWeb】请求转发和重定向

        这两天接触了一下请求转发和重定向的两个概念。今天用一个实例总结一下。

请求转发:(浏览器可以看做目的地,服务器可以看做去目的地途中做的火车)

       比如小编想去廊坊车站,于是在网上搜票,发现,可以在滨海站坐车到天津车站下车,然后在天津倒车然后在去廊坊。

请求转发特点:

     1)浏览器发送了一次的请求(直接在滨海出发)

     2)servlet可以共享request(滨海-->天津,天津-->廊坊)

     3)地址栏不发生改变(人在滨海,在滨海做的车)

     4)浏览器地址栏显示第一次访问的地址(始发地址)

     5)可以跳转到项目内部资源(站内换乘)

     6)第二次请求的是内部路径(站内换乘)

     7)第二次请求是服务器发出的(站内换乘)

请求转发代码:

web.xml文件:(两个servlet,test使用的是xml开发,result使用注解开发)

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
		  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5">
    <servlet>
        <servlet-name>TestServlet</servlet-name>
        <servlet-class>com.itheima.Test.TestServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>TestServlet</servlet-name>
        <url-pattern>/test</url-pattern>
    </servlet-mapping>
</web-app>

testServlet:

package com.itheima.Test;

import javax.servlet.RequestDispatcher;
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 {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // System.out.println("我在滨海站出发");
        //请求转发
        /*
        * 1.获得请求调度器
        * */
        request.setAttribute("first","我在滨海站出发");
        RequestDispatcher rd = request.getRequestDispatcher("result");
        /*
        * 2.调用另一个资源
        * */
        rd.forward(request,response);
    }
}

resultServlet:

package com.itheima.Test;

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(name = "ResultServlet",urlPatterns="/result")
public class ResultServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取test穿过来的信息
        System.out.println(request.getAttribute("first"));
        System.out.println("到达天津换乘");
        System.out.println("到达廊坊车站");
    }
}

显示结果:

测试地址栏没有发生改变。

重定向:

        小编同样坐车去廊坊车站,但是内不想倒车,比较懒,害怕迷路,到滨海站发现没有直达廊坊的火车,于是放弃了在滨海买票,售票员说塘沽有直达廊坊的火车,于是放弃在滨海坐车,然后去塘沽车站坐车去了廊坊。

重定向特点:

     1)浏览器发送了两次以上的请求(人在滨海,但是先去滨海没有车,然后在发出请求,去塘沽做坐的车)

     2)servlet不可以共享request(本想在滨海-->廊坊,然后没有车,不能携带这滨海-->廊坊的请求,去塘沽坐车,去塘沽,得携带塘沽-->廊坊的请求)

     3)地址栏发生改变(最后在塘沽车站始发)

     4)浏览器地址栏显示第二次访问的地址(起初预定的始发地址是滨海,但最终始发地址发生改变)

     5)可以跳转到项目任意资源(滨海没有直达,可以去塘沽一次直达,也或者去天津一次直达)

     6)第二次请求的是绝对路径(最终的乘车地点)

     7)第二次请求是浏览器发出的(小编改变了最后的乘车地址)

重定向代码:

xml文件配置不变!!

testServlet代码:

package com.itheima.Test;

import javax.servlet.RequestDispatcher;
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 {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setAttribute("first","计划滨海出发");
        response.setStatus(302);
        request.setAttribute("second","滨海没有直达,去塘沽坐车");
        response.setHeader("location","http://localhost:8080/day09/result");
    }
}

resultServlet代码:

package com.itheima.Test;

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(name = "ResultServlet",urlPatterns="/result")
public class ResultServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println(request.getAttribute("second"));
        System.out.println("我再塘沽出发");
        System.out.println("到达廊坊车站");
    }
}

通过测试地址栏发生改变:

                             如有不足之处,还望各位大神提出指正!!!!

猜你喜欢

转载自blog.csdn.net/weixin_43267344/article/details/108465552