6、Servlet重点接口详解

一、概要

1、体系结构

img

一、Servlet接口

1、 概要

Servlet API主要由两个Java包组成:javax.servlet和javax.servlet.http

在javax.servlet包中定义了Servlet接口及相关的通用接口和类;

在javax.servlet.http包中主要定义了与HTTP协议相关的HttpServlet类,HttpServletRequest接口和HttpServletResponse接口

2、API介绍

  1. init(ServletConfig config)
    在Servlet实例化之后,Servlet容器会调用init()方法,来初始化该对象,
    主要是为了让servlet对象在处理客户请求前完成一些初始化工作。例如建立数据库的连接,获取配置信息等。
    对于每个Servlet实例,init()方法只能被调用一次。Servlet容器通过config参数向Servlet传递配置信息。
    可以通过config获取web应用程序的初始化参数,还可以获取ServletContext对象
    
  2. service(ServletRequest req,ServletResponse res)
    容器调用service()方法处理客户端的请求,在调用service()方法被容器调用之前,
    必须确保Init()方法正确完成,容器会构造一个ServletRequest对象和ServletResponse对象作为参数传递给service()方法。
    
  3. destroy();
    当容器检测到一个Servlet对象应该从服务中被移除的时候,容器会调用该对象的destory方法,
    以便让Servlet对象可以释放它所使用的资源,保存数据到数据库中。
    
  4. ServletConfig getServletConfig()
    返回容器调用init()方法时传递给Servlet对象的ServletConfig对象
    
  5. String getServletInfo()
    返回一个String类型的字符串,包含了关于Servlet的信息,例如版权,作者等。
    

二、ServletRequest

1、概要

ServletRequest 对象,用来封装请求数据

2、API介绍

  1. Object getAttribute(String name)
     返回以name为名字的属性的值,如果不存在,返回null
    
  2. Enumeration getAttributeNames();
    返回请求中所有可用的属性的名字。返回一个枚举集合
    
  3. void removeAttribute(String name);
    移除请求中名字为name的属性
    
  4. void setAttribute(String key,Object val);
    在请求中保存一个键值对。
    
  5. getCharacterEncoding()
     返回请求正文使用的字符编码的名字
    
  6. int getContentLength()
    以字节为单位,返回请求正文的长度。
    
  7. String getContentType()
    返回正文的MIME类型
    
  8. ServletInputStream getInputStream()
    得到从请求的字节输入流
    
  9. BufferedReader getReader()
    从请求中得到字符输入流
    
  10. String getLocalAddr()
     返回接收到请求的网络接口的IP地址。
    
  11. String getRemoteAddr()
    返回发送请求的客户端或最后一个代理服务器的IP地址
    
  12. String getRemoteHost()
    返回发送请求的客户端或者最后一个代理服务器的完整限定名
    
  13. String getLocalName()
    返回接收到请求的IP接口的主机名
    
  14. int getLocalPort()
    返回接收到请求的网络接口的IP端口号
    
  15. int getRemotePort()
    返回发送请求的客户端或最后一个代理服务器的IP源端口。
    
  16. String getParameter(String name)
    返回请求中name参数的值,如果name参数有多个值,该方法返回值列表中的第一个值。如果请求中没有找到该参数,返回null
    
  17. Enumeration getParameterNames()
    返回请求中包含的所有的参数的名字。
    
  18. String[] getParameterValues(String name);
    返回请求中name参数所有的值
    
  19. String getProtocal()
    返回请求使用的协议的名字和版本 例如: HTTP/1.1
    
  20. RequestDispatcher getRequestDispatcher(String path)
    返回RequestDispather对象,作为path所定位的资源的封装。
    
  21. String getServerName()
    返回请求发送到服务器的主机名
    
  22. int getServerPort()
    返回请求发送到服务器的端口号
    
  23. setCharacterEncoding(String env)
    覆盖在请求正文中所使用的字符编码的名字。
    

三、ServletResponse

1、概要

Servlet通过ServletResponse对象来生成响应结果

2、API介绍

  1. flushBuffer()
    强制把任何在缓存中的内容发送到客户端
    
  2. int getBufferSize()
    返回实际用于响应的缓存的大小,如果没有使用缓存,这个方法返回0
    
  3. String getCharacterEncoding()
    返回响应中发送的正文所使用的字符编码(MIME字符集)
    
  4. String getContentType()
    返回响应中发送的正文所使用的MIME类型
    
  5. ServletOutputStream getOutputStream()
    返回字节输出流
    
  6. PrintWriter getWriter()
    返回字符输出流
    
  7. boolean isCommitted()
    返回一个布尔值,指示是否已经提交了响应。
    
  8. void reset()
    清除在缓存中的任何数据,包括状态代码和消息报头。
    
  9. void resetBuffer()
    清除在缓存中的响应内容,保留状态代码和消息包头。
    
  10. void setBufferSize(int size)
    设置响应正文的缓存大小。
    
  11. void setCharacterEncoding(String charset)
    设置发送到客户端的响应的字符编码
    
  12. void setContentLength(int len)
    设置内容正文的长度
    
  13. void setContentType(String type)
    设置要发送到客户端的响应的内容类型。例如:"text/html;charset=UTF-8"
    

四、ServletConfig

1、概要

Servlet容器使用ServletConfig对象在Servlet初始化期间向它传递配置信息,一个ServletConfig对象。

2、API介绍

  1. String getInitParameter(String name);
    返回名字为name的初始化参数的值,初始化参数在web.xml配置文件中进行配置。
    
  2. Enumeration getInitParameterNames()
    返回Servlet所有初始化参数的名字的枚举集合。
    
  3. ServletContext getServletContext()
    返回Servlet上下文对象的引用。
    
  4. String getServletName()
    返回Servlet实例的名字,这个名字是web应用程序的部署描述符中指定。
    

五、HttpServlet(重点)

1、概要

HttpServlet类是GenericServlet类的子类。HttpServlet类为Serlvet接口提供了与HTTP协议相关的通用实现,也就是说,HttpServlet对象适合运行在与客户端采用HTTP协议通信的Servlet容器或者Web容器中。

在我们自己开发的Java Web应用中,自定义的Servlet类一般都扩展自HttpServlet类

HttpServlet类实现了Servlet接口中的service(ServletRequest , ServletResponse)方法,而该方法实际调用的是它的重载方法HttpServlet.service(HttpServletRequest, HttpServletResponse);

在上面的重载service()方法中,首先调用HttpServletRequest类型的参数的getMethod()方法,获得客户端的请求方法,然后根据该请求方式来调用匹配的服务方法;如果为GET方式,则调用doGet()方法,如果为POST方式,则调用doPost()方法。

HttpServlet类为所有的请求方式,提供了默认的实现doGet(),doPost(),doPut(),doDelete()方法;这些方法的默认实现都会向客户端返回一个错误。

对于HttpServlet类的具体子类,一般会针对客户端的特定请求方法,覆盖HttpServlet类中的相应的doXXX方法。如果客户端按照GET或POST方式请求访问HttpsServlet,并且这两种方法下,HttpServlet提供相同的服务,那么可以只实现doGet()方法,并且让doPost()方法调用doGet()方法。

六、HttpServletRequest(重点)

1、概要

HttpServletRequest接口最常用的方法就是获得请求中的参数,这些参数一般是客户端表单中的数据。同时,HttpServletRequest接口可以获取由客户端传送的名称,也可以获取产生请求并且接收请求的服务器端主机名及IP地址,还可以获取客户端正在使用的通信协议等信息。下表是接口HttpServletRequest的常用方法

2、常用API介绍

方 法 说 明
getAttributeNames() 返回当前请求的所有属性的名字集合
getAttribute(String name) 返回name指定的属性值
getCookies() 返回客户端发送的Cookie
getsession() 返回和客户端相关的session,如果没有给客户端分配session,则返回null
getsession(boolean create) 返回和客户端相关的session,如果没有给客户端分配session,则创建一个session并返回
getParameter(String name) 获取请求中的参数,该参数是由name指定的
getParameterValues(String name) 返回请求中的参数值,该参数值是由name指定的
getCharacterEncoding() 返回请求的字符编码方式
getContentLength() 返回请求体的有效长度
getInputStream() 获取请求的输入流中的数据
getMethod() 获取发送请求的方式,如get、post
getParameterNames() 获取请求中所有参数的名字
getProtocol() 获取请求所使用的协议名称
getReader() 获取请求体的数据流
getRemoteAddr() 获取客户端的IP地址
getRemoteHost() 获取客户端的名字
getServerName() 返回接受请求的服务器的名字
getServerPath() 获取请求的文件的路径

3、详解

ServletRequest代表一个HTTP请求,请求在内存中是一个对象,这个对象是一个容器,可以存放请求参数和属性。

  1. 请求对象何时被创建,当通过URL访问一个JSP或者Servlet的时候,也就是当调用Servlet的service()、doPut()、doPost()、doXxx()方法时候的时候,执行Servlet的web服服务器就自动创建一个ServletRequest和ServletResponse的对象,传递给服务方法作为参数。
  2. 请求对象由Servlet容器自动产生,这个对象中自动封装了请求中get和post方式提交的参数,以及请求容器中的属性值,还有http头等等。当Servlet或者JSP得到这个请求对象的时候,就知道这个请求时从哪里发出的,请求什么资源,带什么参数等等。
  3. ServletRequest的层次结构
    javax.servlet.ServletRequest
    javax.servlet.http.HttpServletRequest
  4. 通过请求对象,可以获得Session对象和客户端的Cookie。
  5. 请求需要指定URL,浏览器根据URL生成HTTP请求并发送给服务器,请求的URL有一定的规范:

七、HttpServletResponse(重点)

1、概要

在Servlet中,当服务器响应客户端的一个请求时,就要用到HttpServletResponse接口。设置响应的类型可以使用setContentType()方法。发送字符数据,可以使用getWriter()返回一个对象。下表是接口HttpServletResponse的常用方法

2、API介绍

方 法 说 明
addCookie(Cookie cookie) 将指定的Cookie加入到当前的响应中
addHeader(String name,String value) 将指定的名字和值加入到响应的头信息中
containsHeader(String name) 返回一个布尔值,判断响应的头部是否被设置
encodeURL(String url) 编码指定的URL
sendError(int sc) 使用指定状态码发送一个错误到客户端
sendRedirect(String location) 发送一个临时的响应到客户端
setDateHeader(String name,long date) 将给出的名字和日期设置响应的头部
setHeader(String name,String value) 将给出的名字和值设置响应的头部
setStatus(int sc) 给当前响应设置状态码
setContentType(String ContentType) 设置响应的MIME类型

3、详解

  1. ServletResponse 也是由容器自动创建的,代表Servlet对客户端请求的响应,响应的内容一般是HTML,而HTML仅仅是响应内容的一部分。请求中如果还包含其他资源会依次获取,如页面中含有图片,会进行第二个http请求用来获得图片内容。
  2. 相应对象有以下功能:
    1. 向客户端写入Cookie
    2. 重写URL
    3. 获取输出流对象,向客户端写入文本或者二进制数据
    4. 设置响应客户端浏览器的字符编码类
    5. 设置客户端浏览器的MIME类型。

八、RequestDispatcher接口(重点)

1、概要

该对象由Servlet容器创建,用于封装一个由路径标识的服务器资源。利用该对象可以将请求转发给其他的Servlet或jsp页面。

2、常用API介绍

  1. forword(ServletRequest req,ServletResponse resp)
    该方法用于将请求从一个Servlet传递给服务器上的另外的Servlet,jsp或者html文件,在forword方法调用之后,
    之前在响应缓存中没有提交的内容将会被自动清除。该方法将请求转发给其他Servlet,
    将又被调用的Servlet负责对请求做出响应,原先Servlet执行终止。
    
  2. include(ServletRequest req,ServletResponse resp)
    该方法用于将请求转发给其他Servlet,被调用的Servlet对该请求做出的响应将并入原来的响应对象中,
    原先的Servlet还可以继续输出响应信息。
    
3. forword(),include()

属于内部请求,浏览器地址不发生改变,客户端仅向服务器端发送一次请求

4. sendRedirect()

该方法由HttpServletResponse对象提供,
表示重定向到另外一个请求中。属于外部请求。重定向相当于重新向服务器发送请求,浏览器地址发送改变

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容