请求转发

Posted yuyu666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请求转发相关的知识,希望对你有一定的参考价值。

实现不同servlet之间的数据传递,这样便可实现业务逻辑和显示逻辑的分离

实例:

(1) 第一个servlet,负责业务


package com.kettas.servlet ;

import javax.servlet.* ;

import javax.servlet.http.*;

import java.io.*; 

import java.util.* ;

public class ForwardA extends HttpServlet{

    @Override

    public void service( HttpServletRequest request , HttpServletResponse response )

        throws ServletException , IOException

    {       System.out.println( "=== This is forward A ===" ) ;

           // 将业务部分的数据存储在request对象中,传递给下一个servlet使用

           Date d = new Date();

           request.setAttribute( "date" , d ) ;

           /* 注意转发的过程

            * 首先获得一个知道下一棒地址的"接力棒"对象,然后将这个"接力棒"传给下一个

            * servlet,这样便将请求转发了。

            */

           RequestDispatcher disp = request.getRequestDispatcher( "/forwardB" ) ;

           disp.forward( request , response ) ;

    }

}

注意:

1,这种请求转发的方式是共用一个连接的,不管你中途经过了多少个servlet,正因如此,这些servlet才能共享request中存储的数据。

2,只有最后一个servlet,才能在客户端浏览器中显示。

(2) 第二个servlet,负责显示


package com.kettas.servlet ;

import javax.servlet.* ;

import javax.servlet.http.*;

import java.io.*; 

import java.util.* ;

public class ForwardB extends HttpServlet{

    @Override

    public void service( HttpServletRequest request , HttpServletResponse response )

        throws ServletException , IOException

    {       response.setContentType( "text/html" ); 

           PrintWriter out = response.getWriter();

           out.println( "<h2>This is forwared B</h2>" ) ;

           // 通过getAttribute方法,从request中取得数据

           // 由于此方法返回的是Object对象,故要强转

           Date d = (Date)request.getAttribute( "date" ) ;

           out.println( "<h2>" + d + "</h2>" ) ;

           System.out.println( "=== This is forward B ===" ) ;

           out.flush();

    }

}

(3) web.xml片段:


<servlet> 

    <servlet-name>a</servlet-name>

    <servlet-class>com.kettas.servlet.ForwardA</servlet-class>

</servlet>                                  

<servlet-mapping> 

    <servlet-name>a</servlet-name>  

    <url-pattern>/forwardA</url-pattern>

</servlet-mapping>

<servlet> 

    <servlet-name>b</servlet-name>

    <servlet-class>com.kettas.servlet.ForwardB</servlet-class>

</servlet>                                  

<servlet-mapping> 

    <servlet-name>b</servlet-name>  

    <url-pattern>/forwardB</url-pattern>

</servlet-mapping>

页面跳转的两种方式:

1)request.getRequestDispatcher(“/forwardA”).forward(request , response); 这种跳转是在服务器内部是servlet之间跳转,显示的总是最后一个servlet A-?B--?----?D

2)response.sendRedirect(“mayservlet/query”)它其实是在客户端的url发生改变,相当一次新的请求,故不能传递数据,但能在不同的应用中跳转

以上是关于请求转发的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段14——Vue的axios网络请求封装

VSCode自定义代码片段14——Vue的axios网络请求封装

Python 向 Postman 请求代码片段

Nginx转发TCP请求

Nginx转发请求过程解析

request重定向或者是response转发请求后面的代码依然执行