zl程序教程

您现在的位置是:首页 >  后端

当前栏目

【web后端(四)】jsp、servlet_请求转发、请求派发

JSPWeb后端Servlet 请求 转发
2023-09-11 14:20:37 时间

请求转发的用处:

比如说我们登录验证,我们验证过了之后,服务器会把我们转到管理页面。如果验证不过,会把我们再继续转到登录页面。知道我们验证通过了,才会把我们转到管理页面。

 

请求转发

                                     

 

请求派发

                                  

 

xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>PostFormServlet</servlet-name>
        <servlet-class>edu.xalead.PostFormServlet</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>OtherServlet</servlet-name>
        <servlet-class>edu.xalead.OtherServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>PostFormServlet</servlet-name>
        <url-pattern>/pfs</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>OtherServlet</servlet-name>
        <url-pattern>/os</url-pattern>
    </servlet-mapping>
</web-app>

 

servlet2

package edu.xalead;

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 OtherServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //向客户端发送一个响应
        response.getWriter().println("Hello World !");
        //这里为了防止转发之后的servlet再写响应,
        //我们这里需要刷新一下。
        response.getWriter().flush();
    }
}

 

 servlet1

package edu.xalead;

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 PostFormServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       
    }

    //这里转给OtherServlet之后的内容,
    //需要用doGet方法处理。
    //因为,service判断请求中的method属性值,
    //如果是get,service就会调用doGet()方法,
    //如果是Post,就会调用doPost()方法。
    //所以,我们在转发的以后,
    //request里面的字符串没有变化,
    //方法还是不变。
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setCharacterEncoding("utf-8");

        /**
         * 请求转发
         */

        //设置响应码:
        //在响应头里面,300~399是转发的响应码,
        //200~299是成功响应,
        //但是这里面还有细分。

        /*
         *这个是通过改头属性和响应码的方法转发
         */
            //这种转发的好处是可以实现跨域转发。
//      response.setStatus(302);
//      response.setHeader("location","http://www.sohu.com");
//      response.sendRedirect("http://www.sohu.com");//重定向




        /**
         * 请求派发:
         * 就是说,如果我们不跨域进行转发的话。
         * (这里不跨域的意思是,我们访问这个域里的seervlet,
         * 然后想转给这个域里头的另一个servlet。
         * 这里两个servlet所在的域名是一样的,都是localhost:8080。
         * 也就是这两个servlet都在服务器端的servlet容器里,
         * 没有必要经过客户端。)
         * 因为没有响应,所以A给B的request里的东西是不会丢的,因为没有响应。
         * (request里面放的请求的东西,在服务器端不响应是不会丢的。)
         */

        response.getWriter().println("Hi everybody!");

            //因为没有引用,我们要用web.xml里面的了路径来进行请求派发。
            //这里没有response(响应),
            //只能用request.getRequestDispatcher("/bbc")

            /*得到请求派发对象*/
        RequestDispatcher dispatcher = request.getRequestDispatcher("/os");

            //方法一:转发
            //这里forward需要向request.getRequestDispatcher()的括号里面的路径转。
            //但是forward里需要两个参数去进行派发。
            //我们这里如果是给index.jsp进行派发,
            //那么,在javascript里,
            //jsp和servlet我们可以看成是一样的,
            //都是处理请求和响应的。
            //而这里的request和response,
            //是未处理完的被服务端封装的客户端请求。
//      dispatcher.forward(request,response);
            //我们这里要注意,
            //写在响应后面的"Hi every body!"这个字符串在servlet响应并且刷新之后。
            //既不能显示在控制台底下,
            //也不能不能显示到浏览器里头的。
            //如果将响应写在前面,就会报错。
            //而如果没有下面的dispatcher.include(request,response);(include方法)
            //在页面同样也不会显示。
            //总结来说,就是用forward方法,
            //我们只能看到第一个转发的输出("Hello World !"),
            //而看不到第二个输出("Hi everybody!")。
//      response.getWriter().println("Hi everybody!");
//      response.getWriter().flush();

            //方法二:包含
            //这个方法与上面的转发不同的是,
            //在RequestDispatcher dispatcher = request.getRequestDispatcher("/os");之前的
            //第一个servlet响应结束了之后
            //(即转发第一个"Hi everybody!"字符串之后),
            //服务端会接着通过"/os"路径用include方法执行第二个servlet响应
            //(即转发"Hello World !"字符串之后)。
            //最后,再去响应dispatcher.include(request,response);
            //后面的servlet响应(即转发"Hi everybody!"字符串)。
            //结果就是两个servlet的输出,都输出到客户端了,
            //形成了一种包含的关系。
        dispatcher.include(request,response);
        response.getWriter().println("Hi everybody!");

        System.out.println("asdfsdasdafafdsa");
    }
}

 

include方法响应的的客户端结果