Servlet请求和响应
在Java Web中Servlet、请求和响应是最基本的三个对象,在Web容器的管理下,这三者能够完成基本的HTTP请求处理。
Servlet的作用是为客户提供服务。servlet的角色是接受一个客户的请求,再返回一个响应。请求可能非常简单,例如:给我提供一个欢迎页面;也可能非常复杂,例如:为当前的购物车结账,这个请求会带一些客户端传来的参数,servlet需要知道自己如何使用请求中的参数,还需要知道该返回什么样的响应。
一、Servlet
1. Servlet受容器管理
Java Web服务器处理用户请求的基本过程:用户在客户端点击一个链接,浏览器会向Web应用服务器发送一个URL请求,该URL会指向一个servlet;Web容器看出这个请求指向某个servlet A,就会创建两个对象(HttpServletRequest和HttpServletResponse),并分配或创建一个线程,调用servlet A对应的service方法(上述请求和响应对象作为参数);service根据HTTP请求区分出客户端发来的是GET还是POST请求,并调用对应的doGet()或doPost()方法;在doGet()或doPost()方法中进行业务逻辑的处理,处理完成后的结果通过响应对象返回写回给客户端。
2. Servlet的生命周期
在容器启动时,XXXServlet在JVM的管理下被实例化为一个对象,这时候它还不是servlet,需要在容器的管理下调用init()方法进行初始化,获得ServletConfig和ServletContext对象的引用后,才称为一个真正的Servlet。
1)init()
何时调用?servlet实例创建后,并在servlet能为客户请求提供服务之前,容器需要通过init方法初始化servlet。
作用?初始化servlet实例,使之获得web容器的相关信息
是否会被覆盖?有可能
2)service()
何时调用?当一个客户请求到来时,容器会创建(或从线程池分配一个线程),并调用servlet的service方法
作用?这个方法会确定HTTP方法(GET or POST),并调用对应的servlet方法——doGet或doPost;
是否会被覆盖?可以,但是不会
3)doGet()或doPost()
何时调用?
作用?具体的业务逻辑
是否会被覆盖?至少要覆盖其中之一
关键点:每个请求都在一个单独的线程中运行!
3. Servlet的继承体系
servlet接口:javax.servlet.Servlet,表示所有的Servlet都有这5个方法,其中init、service和destroy三个方法和servlet的生命周期有关;
GenericServlet:javax.servlet.GenericServlet,这是一个抽象类,它实现了开发者需要的大部分基本servlet方法,大多数servlet的“servlet行为”都来自这个类;
HttpServlet:javax.servlet.http.HttpServlet,这也是一个抽象类,它实现了自己的service()方法,处理servlet的HTTP特性(service方法不仅仅只处理HTTP请求)。
MyTestServlet:这是开发者自己编写的处理类,一般只需要实现doGet()和doPost()方法。
二、请求和响应
1. ServletRequest的继承体系
HttpServletRequest的API与HTTP有关,例如:Cookie、首部(Header)和会话(Session)等;
2. ServletResponse的继承体系
ServletResponse(响应)也是类似,用于帮助servlet给客户端返回处理结果,而HttpServletResponse增加了HTTP相关的内容(例如:错误、cookie和首部)等API。
HttpServletRequest和HttpServletResponse这些都是servlet规范里指定的接口,而web容器开发商(例如tomcat)会负责实现这些接口,例如:HttpServletResponseWrapper和ApplicationHttpResponse等,作为开发者,我们只需要知道,在处理doGet()和doPost方法时,容器会给这个方法传HttpServletRequest和HttpServletResponse两个参数。
3. GET和POST的区别
POST方法有请求体
GET方法的查询参数直接跟在URL后面,不够安全;
GET请求可以建立书签,POST请求则不能
GET请求是幂等的,POST请求不是(GET请求仅仅用于查询一些数据,POST请求则用于在服务器上更新数据),在业务上会遇到既需要POST请求,又需要保证请求幂等的情况(例如库存扣减),这种情况需要我们出具对应的实现方案。参见:
4. HTTP请求的API
getHeader(),可以获取首部信息,例如request.getHeader("User-Agent")可以获取客户端的平台和浏览器信息。
getIntHeader(),如果首部信息中的“key/value”对中的value是int类型的,可以使用这个方法直接获取值而不需要显式类型转换
getCookies(),可以获取与请求相关的cookie
getSession(),可以获取与请求相关的会话
getMethod(),可以获取http方法
getInputStream(),可以获取请求的输入流
求,可以获取查询字符串中的数据、对于POST请求,可以获取请求体中的数据
getRemotePort(),获取客户端的端口号
getServerPort(),获取服务端接受请求的端口号(请求一开始发送服务端的哪个端口?)
getLocalPort(),获取服务端处理请求的端口号(请求最后是发送到服务端的哪个端口?)
5. HTTP响应的API
大多数情况下,使用响应只是为了向客户发回数据。会对响应调用两个方法:setContentType()和getWriter()。在此之后,可以将HTML或其他内容写入到流。不过,你也可以使用响应设置首部、发送错误或增加Cookie。
setContentType(),设置响应返回的MIME类型
getOutputStream(),获取HTTP输出字节流
getWriter(),获取HTTP输出字符流
addCookie(Cookie cookie),给响应首部中增加cookie对象,注意这里不是增加“key/value”对
addHeader(),在响应首部中添加一个“key/value”对
setHeader(),在响应首部中设置一个“key/value”对;和addHeader()的区别是,如果响应首部中已经有对应的key存在,setHeader()会覆盖现有的值,而addHeder()会新增一个“key/value”对,使用时需要注意;
encodeRedirectURL(),对包含session ID的URL进行编码。使用场景:在浏览器不支持使用cookie跟踪会话时,可以使用URL重写(即将URL重定向到另一个URL,而这个URL的后面会带上session id传给客户端,这个URL在返回给客户端之前需要经过编码)
6. 重定向和请求派发
重定向是让浏览器访问新的URL完成工作,用户会在浏览器地址栏看到新的URL;
请求派发是服务端的工作,是当前servlet委托另外的servlet完成请求,并给客户端发回响应,用户的浏览器地址栏的URL没有改变;
原文链接:https://mp.weixin.qq.com/s/TTE364IxyqI4Gl9kVEVFXw
Servlet请求和响应的更多相关文章
- 对Servlet请求或响应进行JMockit测试
对Servlet请求及响应进行mock方法, 通过getMockInstance方法对servlet进行打桩,对servlet提供的方法进行mock,替代真正的servlet请求或响应. 参考链接: ...
- 2.Servlet 请求、响应及重定向
PS:以下仅为个人学习笔记,涩及方面略窄 ####################### Request ####################### /** * reque ...
- servlet servlet请求与响应
request 客户端浏览器发出的请求被封装成一个HttpServletRequest对象.所有的信息包括请求的地址,请求的参数,提交的数据,上传的文件,客户端的Ip地址甚至客户端操作系统都包含在Ht ...
- servlet请求和响应的过程
1.加载 Servlet类被加载到Java虚拟机中,并且实例化.在这个过程中,web容器(例如tomcat)会调用Servlet类的公开无参构造函数,产生一个Servlet类的实例对象.默认情况下Se ...
- HeadFirst Jsp 04 (请求和响应作为servlet)
servlet 的存在就是为了客服服务, servlet的任务是得到一个客户的请求, 再发回一个响应. 由上图可知, web 容器会在启动后就加载所有的servlet类, 并为之创建实例和初始化 注意 ...
- J2EE请求和响应—Servlet
一.什么是Servlet? Servlet是执行Webserver上的一个特殊Java类.其特殊用途是响应client请求并做出处理.使得client与server端进行交互. 二.生命周期 Ser ...
- servlet请求编码与响应编码问题(编码不一致可能会导致乱码)
html中的编码 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&g ...
- Java Servlet (1) —— Filter过滤请求与响应
Java Servlet (1) -- Filter过滤请求与响应 版本: Java EE 6 参考来源: Oracle:The Java EE 6 Tutorial: Filtering Reque ...
- Java Web之请求和响应
Servlet最主要作用就是处理客户端请求并作出回应,为此,针对每次请求,Web容器在调用service()之前都会创建两个对象,分别是HttpServletRequest和HttpServletRe ...
随机推荐
- 去除弹窗自带url提示
window.alert = function(name){ var iframe = document.createElement("IFRAME"); iframe.style ...
- Javascript调试技巧整理
整理一下网上看到的实用调试技巧! 1. 不要使用alert 首先,alert只能打印出字符串,如果打印的对象不是String,则会调用toString()方法将该对象转成字符串(比如转成[object ...
- ThinkPHP系统常量
_ROOT__ : 网站根目录地址 __APP__ : 当前项目(入口文件)地址 __URL__ : 当前模块地址 __ACTION__ : 当前操作地址 __SELF__ : 当前 URL 地址 _ ...
- 认识并安装RabbitMQ(以Windows系统为例)
一.初识RabbitMQ 百度百科有这么一句话: MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息, 而另一端则可以读取或者订阅队列中的消息. MQ和JMS类似,但不同的是JMS是 ...
- python-matplotlib-2
figure的使用 x = np.linspace(-1, 1, 50) y1 = 2 * x + 1 #figure 1 plt.figure() plt.plot(x, y1) # figure ...
- oracle报错:The Network Adapter could not establish the connection的解决
进入oracle安装目录\product\11.2.0\dbhome_1\NETWORK\ADMIN,修改listener.ora和tnsnames.ora,修改host 我的网络IP为192.168 ...
- jupyter notebook + MobaXterm Linux端远程部署
$jupyter notebook --generate-config $python In []: from notebook.auth import passwd In []: passwd() ...
- Linux 常用命令之df du
1.du 命令:显示每个文件或目录的磁盘使用空间 1) du -h --max-depth [root@ip101 app]# pwd /opt/app [root@ip101 app]# du -h ...
- PHP 封装POD 类
使用POD的过程 //1.造DSN:驱动名:dbname=数据库名;host=服务器地址 $dsn = "mysql:dbname=mydb;host=localhost"; // ...
- mybatis的mapper映射文件
1概述1.1应用架构 mybatis框架用于支持对关系数据库的操作,该体系的应用架构如下图所示: 在mybatis框架体系中,主要的组件是:SqlSessionFactoryBean和Mapp ...