老版Tomcat使用catalina作为其连接器和容器的架构,当一个request请求到达时,Tomcat会对其做一系列的封装,并传递给容器进行处理,处理完之后,又会有一些解析工作来获取相应的response。
这里简单的介绍一下request在catalina中的体系结构。
我们都知道当我们进行web开发时,一个servlet只会接收类型为HttpServletRequest的对象,并返回类型为HttpServletResponse的结果。两个类中分别包含了许多web开发人员需要调用的方法,通常这些方法足够使用。
然后作为web container,Tomcat还需要在request中保存许多内部信息及使用方法,这些信息和方法不应该暴露给web开发人员,否则会造成不必要的麻烦。
那么,Tomcat中是如何实现只向开发人员提供有限接口,而内部提供更多接口的呢?
我们以Request为例子来看:
从这张图看,整个request的设计是相当复杂(这还不是全部,有些内容已经被省略掉),我们先看最基础的四个接口:
ServletRequest: 这个接口来自javax包,是JSP Spec中定义必须要实现的。
Request: Catalina内部的Request接口,为ServletRequest提供了许多补充方法,供 Catalina内部使用。
HttpServletRequest: 来自javax包,是JSP Spec中定义作为Http的request必须要实现的。
HttpRequest: Catalina内部的Request接口,为HttpServletRequest提供了许多补充方法,供Catalina内部使用。
整个设计中共用到了三种设计模式:
Default Pattern缺省模式,实际上这本身并不能算是一种模式,最多只能是一种编程方法,对于接口的所有子类,提供一个默认实现,在这里就是RequestBase及HttpRequestBase所做的工作,HttpRquestBase向HttpRquestImpl提供了HttpRequest和HttpServletRequest的默认实现。这样以后添加新的继承就只需要实现几个方法。
Adapter Pattern适配器模式,我们已经知道HttpRequestImpl中包含了HttpRequest和HttpServletRequest定义的所有方法的实现,然而对于Catalina组件,他们并不需要知道任何关于HttpServletRequest接口中定义的内容。因此,我们可以通过适配器模式将任何继承了HttpRequest和HttpServletRequest的类封装起来,并只提供HttpRequest提供的接口(可以看到HttpRequestWrapper继承HttpRequest)。
Facade Pattern门面模式,门面模式将内部复杂的实现隐藏起来,并提供一个简单的接口给外部的用户使用。在这里,HttpRequestFacade类将只提供HttpServletRequest中定义的方法给web开发人员。
从某种角度上讲,适配器模式和门面模式有一定的类似,都是将已有接口进行封装,并提供新的接口,然而适配器着重于将一个接口转换成另一个接口,门面模式则着重于将复杂的内部实现隐藏起来,提供一个简单的通用接口。
然而在我们这个例子中,似乎并没有这些所谓的区别,两种实现方法几乎一致。
- 大小: 57.8 KB
分享到:
相关推荐
Java Web开发是构建Web应用程序的一种常见方式,它主要基于Java技术栈。在"09_Java Web——Request&Response案例"这个主题中,我们...通过分析和运行这些代码,你可以更深入地理解Java Web中的Request和Response机制。
Request&Response是JavaWeb开发中最基本最重要的概念之一,它们是服务器和客户端之间交互的桥梁。Request对象表示客户端的请求,而Response对象表示服务器端的响应。 响应对象概述 响应对象是指服务器端收到请求...
通过地址解析一张图说明浏览器和Tomcat服务器之间的通信关系。相关技术点有servlet、request、response、(XML小配置)等等。
Tomcat/Servlet/Response/Cookie/Session/HTTP/Request
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // Conditionally select and set the character encoding to be used if...
Request&Response编程 Cookie&Session XML语言 JSP技术入门 EL表达式语言 JSTL标签库: JSP标准标签库 MVC程序架构思想&案例 [总结]Path路径问题 [总结]JavaWeb乱码问题 [转自IBM]中文编码问题 JDBC入门 Jdbc事务...
在Web开发中,Request和Response是核心概念,它们代表了客户端与服务器之间的通信。本章主要探讨的是如何使用ServletResponse,特别是HttpServletResponse对象来构建响应,以及如何处理HTTP请求。 7.1 Response简介...
例如,在 Tomcat 或 WebLogic 服务器中,request 和 response 的编码方式可能不同,这将导致中文乱码问题的出现。 解决方案 解决中文乱码问题最好的方法是增加过滤器。关键代码只有三行: ```java response.set...
Adapter作为适配器,将Tomcat的Request和Response对象转换为标准的ServletRequest和ServletResponse,供容器处理。 容器部分的核心是Catalina框架,其层次结构包括Engine、Host、Context和Wrapper。Engine是顶级...
本书以Tomcat的4.1.12和5.0.18版本为基础,对Servlet容器如何处理请求的三个主要步骤进行了阐述:创建request和response对象,以及调用servlet的service方法。request对象包含了客户端请求的所有信息,而response...
在IT行业中,尤其是在Java Web开发领域,Tomcat服务器在处理中文字符时经常遇到乱码问题。这主要涉及两个方面:JSP页面显示中文乱码和表单提交乱码。为了解决这些问题,我们需要理解字符编码的基本原理,并采取相应...
此外,Tomcat 5还简化了查找子组件的映射组件,使得代码结构更加简洁。 全书共分为20章,前两章作为导言,紧接着的章节将对Tomcat的各个组件进行详细解释和讨论。书中还包括了针对Java技术的预备知识介绍,这包括...
在Tomcat 4.1 下使用POST方式提交表单时,表单中的中文字符显示为乱码,而在Tomcat 4.0 下通常不会出现该问题。 **可能原因**: POST提交的数据默认为ISO8859-1编码,需要将其转换成中文编码。 **解决方法**(适用...
书中指出,servlet容器之所以复杂,是因为它需要处理三个基本任务:创建request对象和response对象,并调用servlet的service方法。request对象包含了所有可能被servlet使用的请求信息,如参数、头部、cookies等;而...
在本文中,我们将讨论如何解决 Tomcat 下中文乱码问题。该问题是由于 Tomcat 默认的字符编码设置不正确引起的。我们将通过设置 Connector 元素的 URIEncoding 属性和在过滤器中设置字符编码来解决该问题。 一、...
编译后的Servlet文件通常存储在服务器的特定目录中,如 Tomcat 的 `${CATALINA_HOME}/work` 目录。这些文件被称为JSP的“真身”,包含了将JSP页面转换为Servlet后的源代码。 在这些“真身”文件中,可以看到原本的...
在这个方法中,我们可以对Request和Response对象进行操作。以下是一个简单的Filter示例: ```java public class ParameterModifyFilter implements Filter { @Override public void init(FilterConfig ...