博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Servlet-使用RequestDispathcher调派请求
阅读量:7232 次
发布时间:2019-06-29

本文共 3534 字,大约阅读时间需要 11 分钟。

版权声明:本文为博主原创文章,转载请注明出处。 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
"); RequestDispatcher dispatch = req.getRequestDispatcher("/Test1"); dispatch.include(req, resp);; output.println("Done
"); }
/Test1    protected void doGet(HttpServletRequest req, HttpServletResponse resp)            throws ServletException, IOException {            PrintWriter output = resp.getWriter();            output.println("Test1
"); }

forward()

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

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

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

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

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

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

请求范围属性

当调派请求的过程中有需要共享的属性,可以使用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
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
"); }
/Test1    protected void doGet(HttpServletRequest req, HttpServletResponse resp)            throws ServletException, IOException {            PrintWriter output = resp.getWriter();            output.println("Test1
"); List name = (List)req.getAttribute("name"); output.println(name.get(1)+"
"); }

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

你可能感兴趣的文章
[emacs org-mode小技巧] org-indent-mode 让文档更容易阅读
查看>>
java文件读写工具类
查看>>
多尺寸图片左右切换功能前端实现
查看>>
学习Entity Framework 中的Code First
查看>>
Python之Mac上搭建集成开发环境
查看>>
ui-router带参数的路由配置
查看>>
Python学习笔记8—语句
查看>>
ifconfig
查看>>
声音分贝的概念,dBSPL.dBm,dBu,dBV,dBFS
查看>>
Mysql找回root密码
查看>>
Odoo Email Template Problem
查看>>
8 -- 深入使用Spring -- 3...1 Resource实现类
查看>>
CSharpGL(41)改进获取字形贴图的方法
查看>>
ZooKeeper Recipes and Solutions
查看>>
利用 AttachThreadInput 改变其它进程的输入法状态
查看>>
UIScrollView 循环滚动,代码超简单
查看>>
1.数组中重复的数字
查看>>
『Python』PIL图像处理_形变操作
查看>>
monitor weblogic server ,Very simple to use, weblogic监控、巡检、故障简单小工具
查看>>
Android Touch事件分发过程
查看>>