`
l4432848
  • 浏览: 257671 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JavaEE——HttpServletRequest对象

    博客分类:
  • java
阅读更多

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。

HttpServletRequest对象

我们都知道浏览器通过http协议与Tomcat(web服务器)通信时,会生成两个对象,一个是HttpServletRequest对象,一个是HttpServletResponse对象。它们是一对数据封装对象,前者封装客户端的请求头,后者封装服务器的响应头。而在这里要介绍的是HttpServletRequest对象,HttpServletRequest实际上是个接口,是Java所定制的接口,这个接口是由开发web服务器的人员去做实现的。
可以看一下HttpServletRequest的源码:

image

我们可以看看Tomcat中实现这个接口的两个类:
Request类:

image

RequestFacade类:

image

可以看到以上这两个类都各自实现了HttpServletRequest接口,但实际上这个两个类是有关联的,具体的代码实现其实是由Request类完成的,而RequestFacade类只是作为一个转发的存在。而且从类的名称上也可以看得出来,Facade是外观、正面的意思,所以这是一个外观类,而在这个RequestFacade类后面的真正实现类是Request。可以想象成RequestFacade是Request的前端、门面,Request则是RequestFacade的后台、后端。
看一下RequestFacade的构造器和部分代码就知道了:

image

再来看看RequestFacade的部分代码:

image

而且这个类的代码行数也不到一千行:

image

下面再来看看Request类的代码:

image

可以看到getContextPath这个方法是在Request类上实现的,并且因为实现代码在这个类里,所以代码行数比RequestFacade类多:

image

示意图:

image

从上图可以看到HttpServletRequest接口和Request、RequestFacade实现类之间构成了一个模式,这个设计模式就是外观模式。外观模式为子系统中的一组接口提供了一个一致的界面,这个界面就是RequestFacade,并且定义了一个高层接口这个接口就是HttpServletRequest,这个接口使得这一子系统更加容易使用。
外观模式好处在于隐藏了系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口(HttpServletRequest)。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性,这个模式实现了子系统与客户端之间的松耦合关系。所以我们都是通过HttpServletRequest接口对象去调用方法的,而实现类和界面类都隐藏在背后,而且这两个类也不是Java实现的,而是开发web服务器的人员实现的(Java的尿性一贯如此)。

关于对象池:
HttpServletRequest和HttpServletResponse对象是存放在一个对象池中的,这是一个活动的能够自动增长的对象池,就和自动增长的线程池一样,每当对象不够用的时候就会新增加对象。这个对象池可以优化服务器资源,因为这两个对象可以反复的利用,不会造成资源的浪费。如果没有这个对象池的话,每次用户访问就会新建一次对象的话,这么做十分耗费资源,而且速度还慢。所以从这一点可以知道,这个对象池就是起到了一个优化资源的作用(好像池子都是这么回事)。
我们可以打印这个两个对象的hash值查看一下就知道了(需要不断的刷新访问页面):

image

运行结果:

image

从图中可以看到有几个hash值重复了好几次,所以从这一点就可以得知它使用了对象池机制。

好了,以上简单介绍完HttpServletRequest中接口与实现类的一些关系和使用到了什么设计模式与对象池机制,接下来介绍一下HttpServletRequest中较为常用的一些方法:
获得服务器相关信息方法:

image

代码示例:

image

运行结果:

image

获得请求头信息方法(请求头中的信息是键/值对形式的):

image

代码示例:

image

运行结果:

image

获得客户端的IP和端口方法:

image

代码示例:

image

运行结果:

image

获得和设置表单数据方法(如果是上传文件的话则无法获取文件中的数据):

image

Html代码示例:

image

Java代码示例:

image

image

浏览器表单:

image

控制台结果:

image

获得和设置表单属性相关方法:

image

注意:以上这几个方法只是在web容器内部流转,仅在具有转发关系的Web组件之间共享,也就说只在这个范围内有效,所以不能直接把值获得到代码中打印,以下使用实际示例演示一下就知道无法直接获得值了:

代码示例:

image

浏览器:

image

控制台结果:

image

0
0
分享到:
评论

相关推荐

    JavaEE知识体系总结DOC

    ### JavaEE知识体系总结——文件上传下载 #### 文件上传的重要性及应用场景 文件上传作为JavaEE开发中的重要组成部分,在实际的应用场景中发挥着不可替代的作用。无论是个人博客上传头像、电商平台上传商品图片...

    JavaEE技术-试验四.zip_JavaEE_API_struts2 Action

    HttpServletRequest对象代表了一个HTTP请求,我们可以从中获取请求参数、请求头、请求路径等信息。例如,我们可能通过`request.getParameter()`来获取POST或GET请求中的参数值,或者通过`request.getAttribute()`来...

    JavaEE实验报告.pdf

    3. **GET/POST请求处理**:Servlet可以通过`HttpServletRequest`对象的`getParameter()`方法获取HTTP请求参数,无论是GET还是POST方式提交的数据都能被正确处理。 **网上购物系统实现** 1. **用户登录**:用户通过...

    用java实现购物车

    当我们谈论"用Java实现购物车"时,我们通常是指在JavaEE(Java Enterprise Edition)环境中构建一个电子商务网站的核心功能——购物车模块。购物车是在线购物体验的重要组成部分,它允许用户临时存储想要购买的商品...

    java web 帮助文档 chm

    这个"java web 帮助文档 chm"是一个压缩包,其中包含了一份关于Java Web开发的重要资源——中文_JavaEE_API.chm文件。这个CHM(Compiled HTML Help)文件是一种微软的帮助文档格式,用于组织和呈现技术文档,它在...

    框架技术--面试常用

    ### 框架技术——Java面试中的关键技术点详解 #### JavaEE软件三层结构与MVC设计模式的区别 JavaEE(Java Platform, Enterprise Edition)是一种基于Java的应用程序开发平台,主要针对企业级应用的设计和开发。...

    Java最简单的maven版helloword

    首先,我们需要理解Maven的核心概念——`pom.xml`文件。这个文件是项目的聚合模型,定义了项目的基本信息、依赖关系、构建配置等。在创建新的Maven项目时,我们需要在项目根目录下创建一个`pom.xml`文件,并配置如下...

    J2EE武功秘籍

    - **工具**:可以利用J2EE中的`HttpServletRequest`和`HttpServletResponse`对象记录开始和结束时间。 **2. Forword和SendRedirect的区别** - **Forword**: - 客户端地址栏不会发生变化。 - 请求转发只发生在...

Global site tag (gtag.js) - Google Analytics