Servlet-使用RequestDispathcher调派请求

简介: 版权声明:本文为博主原创文章,转载请注明出处。 https://blog.
版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/twilight_karl/article/details/70214759

RequestDispathcher

使用HttpServletRequest的getRequestDispatcher(“Servlet-URL”) 获得对象

RequestDispatcher dispatch = req.getRequestDispatcher(“/Test1”);

include()

将另一个servlet包括进进目前的操作流程中。

以下代码会输出
Dispatch
Test1
Done

/Dispatch
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {

        PrintWriter output = resp.getWriter();
        output.println("Dispatch<br/>");
        RequestDispatcher dispatch = req.getRequestDispatcher("/Test1");
        dispatch.include(req, resp);;

        output.println("Done<br/>");
    }
/Test1
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
            PrintWriter output = resp.getWriter();
            output.println("Test1<br/>");
    }

forward()

将请求转发给另一个servlet,只是服务器端的转发,对于客户端并无任何影响

PS:调用forWard()之前不能有任何相应确认,如果设置了相应但还未确认(例如println()后还没有flush()),则所有相应会被忽略.如果已经有相应确认,会报出java.lang.IllegalStateException异常

以下代码会转向Test1,而忽略之forward之前的println输出

        PrintWriter output = resp.getWriter();
        output.println("Dispatch<br/>");
        RequestDispatcher dispatch = req.getRequestDispatcher("/Test1");
        dispatch.forward(req, resp);;

        output.println("Done<br/>");

以下代码会直接报错,因为已经有相应确认

        PrintWriter output = resp.getWriter();
        output.println("Dispatch<br/>");
        output.flush(); 
        RequestDispatcher dispatch = req.getRequestDispatcher("/Test1");
        dispatch.forward(req, resp);;

        output.println("Done<br/>");

请求范围属性

当调派请求的过程中有需要共享的属性,可以使用HttpServletRequest的方法

**setAttribute() 指定名称与对象** **getAttribute() 指定名称获取对象** **getAttributeNames() 获取所有属性名称** **removeAttribute() 移除属性**

以下代码的Test1通过getAttribute(“name”)获取到name的集合,需要通过强制转换后才能使用。

/Dispatch
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        PrintWriter output = resp.getWriter();
        List<String> list = new  ArrayList<>();
        list.add("Tom");
        list.add("jerry");

        req.setAttribute("name", list);     // 传入字符串和对象

        RequestDispatcher dispatch = req.getRequestDispatcher("/Test1");
        dispatch.forward(req, resp);

        output.println("Done<br/>");
    }
/Test1
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
            PrintWriter output = resp.getWriter();
            output.println("Test1<br/>");
            List name = (List)req.getAttribute("name");
            output.println(name.get(1)+"</br/>");

    }

sendRedirect()

要求浏览器重新请求一个URL,客户端的地址栏会改变

    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        String url = req.getParameter("url");
        resp.sendRedirect(url);
    }

在跳转之前不可以有相应被确认,否则会产生java.lang.IllegalStateException 异常

    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        PrintWriter output = resp.getWriter();
        output.println("2333");
        output.flush();
        String url = req.getParameter("url");
        resp.sendRedirect(url);
    }

跳转时可以附带参数,方式类比于GET方式的URL

        String name = req.getParameter("name");
        PrintWriter output = resp.getWriter();
        resp.sendRedirect("http://localhost:8080/Test/Redirect_Para?name="+name);

PS:


只能用转向方式来访问WEB-INF目录下的JSP,不用采用重定向的方式请求该目录里面的任何资源 同一个请求周期中,HttpServletResponse的getWriter()与getOutputStream()只能择一使用,否则会丢出IllegalStateException

相关文章
|
7天前
|
安全 Java 网络安全
Servlet 教程 之 Servlet 客户端 HTTP 请求 2
Servlet教程介绍了如何在Servlet中处理HTTP请求,包括获取Cookie、头信息、参数、Session等。方法如:`getCookies()`、`getAttributeNames()`、`getHeaderNames()`、`getParameterNames()`等。还能获取身份验证类型、字符编码、MIME类型、请求方法、远程用户信息、URL路径、安全通道状态以及请求内容长度等。此外,可通过`getSession()`创建或获取Session,并以`Map`形式获取参数。
20 8
|
7月前
|
缓存 Java 数据库
Servlet 处理请求的原理
Servlet 处理请求的原理
175 0
|
4月前
|
Web App开发 前端开发 JavaScript
AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式
AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式
32 0
|
6月前
|
Java 容器
Jsp之四 servlet请求响应
Jsp之四 servlet请求响应
48 0
|
7月前
|
应用服务中间件 API
JavaWeb 速通Servlet(请求转发和请求重定向)
JavaWeb——HttpServletRequest 和 HttpServletResponse 内容分享。
129 0
|
11月前
|
应用服务中间件
Tomcat - 源码分析Tomcat是如何处理一个Servlet请求的
Tomcat - 源码分析Tomcat是如何处理一个Servlet请求的
55 0
|
11月前
|
Java 应用服务中间件 API
【Servlet篇】如何解决Request请求中文乱码的问题?
【Servlet篇】如何解决Request请求中文乱码的问题?
208 0
|
XML 编解码 前端开发
JavaWeb《二》Servlet、Request请求
本文是javaweb的第二篇,介绍了Servlet,Servlet是JavaWeb最为核心的内容,它是Java提供的一门动态web资源开发技术。 概述了Request请求与响应,并且主要分析了Request请求。
102 0
JavaWeb《二》Servlet、Request请求
Servlet学习(九):请求重定向(例如:页面搬迁后的跳转)
Servlet学习(九):请求重定向(例如:页面搬迁后的跳转)
Servlet学习(九):请求重定向(例如:页面搬迁后的跳转)
Servlet学习(七):获取请求的参数值(简单的前后端交互)
Servlet学习(七):获取请求的参数值(简单的前后端交互)
102 0
Servlet学习(七):获取请求的参数值(简单的前后端交互)