假如Servlet无法回应用户的请求,必要时可以将这个请求转交给其他Servlet处理,这个动作称为“Request Dispatching”(请求转送)。
“请求转送”方式:例如ServletRequest.getRequestDispatcher()与ServletContext.getRequestDispatcher().
ServletRequest接口所提供的“请求转送”方法
ServletRequest.getRequestDispatcher()方法
在javax.servlet.ServletRequest接口内定义了一个getRequestDispatcher()方法,其方法标记式为:
public RequestDispatcher getRequestDispatcher(String path)
getRequestDispatcher()方法需传入一个字符串,表示被转送的 Servlet位置(可以是绝对路径或相对路径)。此方法将回传一个RequestDispatcher对象。接着您可以利用 javax.servlet.RequestDispatcher接口所定义的forward()或include()方法来转送HTTP请求。
笔者以实例来说明“请求转送”的基本步骤。
(1)当Servlet A收到用户的HTTP请求时,准备将这个HTTP请求转送给Servlet B。
(2)在Servlet A的doXXX()方法内调用getRequestDispatcher()方法,并指定Servlet B所在位置,例如:
String path = "/servlet/ServletB";
RequestDispatcher rd = request.getRequestDispatcher(path)
;
(3)取得RequestDispatcher对象后,再利用forward()或include()方法来转送HTTP请求。无论调用哪个方法都必须传入HttpServletRequest与HttpServletResponse对象,例如:
rd.forward(request, response);
rd.include(request, response);
RequestDispatcher.forward()方法
RequestDispatcher接口所定义的forward()方法可以将HTTP请求转送给其他Web资源(例如Servlet、JSP或HTML)进行处理,并产生HTTP回应。
调用forward()方法时必须注意下列两点:
在HTTP回应被“确认”(committed)以前才能调用forward()方法(这里的“确认”是指将HTTP回应的内容主体送回用户端),否则将拋出IllegalStateException异常。
调用forward()方法后,原先存放在HttpResponse对象中的内容将会自动被清除(本章稍后的实例演练2-3将探讨此议题)。
RequestDispatcher.include()方法
RequestDispatcher接口的include()方法与forward()方法非常类似,惟一的不同在于:利用include()方法将HTTP请求转送给其他Servlet后,被调用的Servlet虽然可以处理这个HTTP请求,但是最后的主导权仍然是在原来的Servlet。换言之,被调用的Servlet如果产生任何HTTP回应,将会并入原来的HttpResponse对象。
ServletContext接口所提供的“请求转送”方法
ServletContext.getRequestDispatcher()方法
除了ServletRequest接口外,javax.servlet.ServletContext接口也提供一个getRequestDispatcher()方法,其方法标记式为:
public RequestDispatcher getRequestDispatcher(String path)
getRequestDispatcher()方法将回传一个RequestDispatcher对象,您可以用这个对象来转送HTTP请求。值得注意的是,传入ServletContext.getRequestDispatcher()方法的路径名称必须以 “/” 开头,这里的 “/” 代表Web应用程序的起始位置(context root)。
以下是两个合法的ServletContext.getRequestDispatcher()使用范例。
String path = "/Servlet/ServletB";
RequestDispatcher rd = getServletContext().getRequestDispatcher(path);
rd.forward(request, response);
String path = "/Servlet/ServletB";
ServletContext sc = getServletContext();
RequestDispatcher rd = sc.getRequestDispatcher(path);
rd.forward(request, response);
下面这个范例却是不合法的。
String path = "../index.html";
RequestDispatcher rd = getServletContext().getRequestDispatcher(path);
rd.forward(request, response);
在第三个范例中,path变量设定为“../index.html”,因此无法调用ServletContext接口的getRequestDispatcher()方法。在这种情况下,您必须改用ServletRequest接口所提供的getRequestDispatcher()方法,例如:
String path = "../index.html";
RequestDispatcher rd = request.getRequestDispatcher(path);
rd.forward(request, response);
getNamedDispatcher()方法
ServletContext接口还提供了另一个getNamedDispatcher()方法,其方法标记式为:
public RequestDispatcher getNamedDispatcher(String name)
此方法与getRequestDispatcher()方法类似,也会传回一个RequestDispatcher对象,由此可转送HTTP请求。不同之处在于:传入getNamedDispatcher()方法的字符串并非Servlet或JSP的路径,而是其名称。
以下是getNamedDispatcher()方法的使用范例:
ServletContext sc = getServletContext();
RequestDispatcher rd = sc.getNamedDispatcher("ServletB");
rd.forward(request, response);
上例准备将HTTP请求转送给ServletB,问题是一个Web应用程序说不定包含好几个ServletB(位于不同组件包内),为此,您可以在web.xml内定义ServletB究竟是哪个类或是位于哪个组件包内,例如:
<servlet>
<servlet-name>ServletB</servlet-name>
<servlet-class>scwcd.ch02.ServletB</servlet-class>
</servlet>
这样一来,getNamedDispatcher()方法才能确定ServletB的真实位置为scwcd.ch02.ServletB,然后传回RequestDispatcher对象。
分享到:
相关推荐
在Python中,分派是一种将任务或请求分配给适当的处理程序的方法,通常与面向对象编程中的方法分派有关。Dispatching库允许我们创建基于参数类型、值甚至计算结果的动态多态行为。 Dispatching-1.4.0-py33-none-...
1. 出租车调度方法:TESLA(centralized taxi dispatching with global fairness),即一种集中式出租车调度方法,旨在通过实时匹配出租车与乘客来提升司机的收入效率,同时解决司机收入公平性问题。 2. 传统出租车...
此外,该库可能还支持异步查询,以提高性能并减少延迟,这对于需要处理大量DNS请求的应用至关重要。 在实际应用中,`dispatching-dns`可能适用于各种情况。例如,在构建CDN(内容分发网络)服务时,通过高效的DNS...
这个是用支持向量机求解AGVs调度的python代码,需要的可以拿去,有研究车间调度和AGV调度或者两者集成调度的可以参考。
通过MATLAB,使用粒子群算法(PSO)实现电力系统的经济调度。调度代码清晰,适合做电力系统经济调度的相关学习
经济调度(Economic Dispatching)是电力系统运营中的核心问题之一,主要目标是优化发电机的输出功率分配,以最小化整个系统的运行成本,同时确保电网的稳定性和供电可靠性。在这个主题中,"Nested Particle Swarm ...
《PyPI官网下载 | Dispatching-1.3.0-py33-none-any.whl》 在Python的世界中,PyPI(Python Package Index)是官方的第三方软件仓库,它为开发者提供了一个平台来分享和发现Python库。"Dispatching-1.3.0-py33-none...
然而,两者可以协同工作,通过请求分发(Request Dispatching)实现MVC(Model-View-Controller)设计模式。在Servlet中处理请求,然后使用requestDispatcher.forward()或response.sendRedirect()方法将控制权传递给...
城市规模上下文感知出租车调度使用深度强化学习 摘要——主动的出租车调度对于平衡城市不同地点的出租车需求与供应差距至关重要。近年来,主要依赖深度强化学习(DRL)直接学习最优调度策略。然而,这些方法在效率...
在本压缩包文件"Economic-Dispatching.rar"中,重点探讨的是使用粒子群优化算法(PSO, Particle Swarm Optimization)解决经济调度问题。 粒子群优化是一种基于群体智能的全局优化算法,由Kennedy和Eberhart于1995...
9. **Request Dispatching** - Struts通过请求分发机制如forward,实现Controller的功能,控制请求流向特定的Action和JSP页面。 10. **Model(模型)** - Model组件主要由JavaBeans构成,它们包含了业务逻辑和...
本压缩包文件“01 Economic Dispatching using PSO.rar”提供了使用PSO解决电力系统经济调度问题的MATLAB实现。 粒子群优化是一种仿生优化算法,灵感来源于鸟群觅食行为。在PSO中,每只“粒子”代表可能的解,它们...
- **Request Dispatching**:Struts1.2通过ActionServlet接收HTTP请求,然后根据`struts-config.xml`中的配置信息转发到相应的Action。 - **Validation机制**:Struts1.2提供了强大的验证功能,可以在客户端或...
基于粒子群算法(Nested PSO)的电力系统经济调度,matlab平台。
"Reactor: An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events." In _Pattern Languages of Program Design_, edited by Jim Coplien and Douglas C. Schmidt, ISBN...
\ dispatching \ dispatch-java-7 \ target \ dispatch-7.1.0-SNAPSHOT.jar \ dispatching \ dispatch-java-8 \ target \ dispatch-8.1.0-SNAPSHOT.jar 请参阅以启动。 ##调度员 ### 由所有调度程序实现的主接口...
- **Request.cs**:乘客请求类,存储乘客上/下楼的需求信息。 - **其他.cs文件**:可能包含额外的辅助类或接口。 通过对这些源码的阅读和分析,可以深入了解C#编程、面向对象设计以及电梯调度算法的实际应用。这...