Servlet概念框架
以 Servlet 3.0 源代码为基础。Servlet 是 Javaweb 应用的基础框架,犹如孙子兵法之于作战指挥官,不可不知。
概念框架
机制: 事件 Event, 监听器 Listener
数据: 配置 Config, 上下文 Context, 会话 Session,Cookie; 属性 Attribute, 参数 Parameter, 首部 Header
服务: 核心 Servlet, 过滤 Filter, 转发 Dispatcher
IO: 请求 Request, 响应 Response ; 输入流 InputStream, 输出流 OutputStream
行为: 链 Chain, 注册 Register
方式: 同步 Syn , 异步 Asyn
协议: HTTP, SSL
其他: Characterset, URL, URI, Path, Encode, Decode
概念组合
Servlet: init(ServletConfig) -> service(ServletRequest,ServletResponse) -> destroy() ;Servlet 必须是线程安全的;
ServletConfig: Servlet配置数据,在初始化Servlet实例后获得, 包括 ServletName, ServletContext, initParameters;
ServletRequest: 客户端请求数据,包括 属性名值,参数名值,字符编码集,内容长度及类型,输入流,Servlet信息, Locale等;
ServletResponse:服务端返回数据,包括 字符编码集,内容长度及类型,输出流,Locale,Buffer及操作等。
ServletInputStream: 从客户端请求中读取字节流数据;从 ServletRequest 中获取。
ServletOutStream: 将字节流数据写入响应内容中;从 ServletResponse 中获取。
ServletContext:Servlet运行时上下文,主要与 Servlet容器通信。
Filter: init(FilterConfig) -> doFilter(ServletRequest,ServletResponse,FilterChain) -> destroy() ; Filter在Servlet处理之前对客户端请求作预处理,在Servlet处理之后对响应数据做后处理。实际应用中通常包括字符编码、日志审计、安全访问控制等过滤器。
FilterConfig: Filter 配置数据,在初始化Filter实例后获得,包括 FilterName, ServletContext, initParameters
FilterChain: 在过滤器中调用 chain.doFilter(ServletRequest,ServletResponse), 将请求传递给过滤器链上的下一个过滤器进行处理。
HttpServlet: 子类化 HttpServlet 用于定义处理请求的服务程序;一般覆写 doGet 或 doPost 方法。
HttpServletRequest:Servlet请求数据,包括请求头、Cookie, 请求方法,请求路径,登录用户,Session等。
HttpServletResponse: HTTP响应码定义,添加、设置或获取【响应头,Cookie,状态码,错误码】,重定向,URL编码等。
HttpSession: 包括 ID,创建时间,最近访问时间,ServletContext, 会话失效时间,属性名值,属性名集,属性值集等。
Cookie: 客户端标识信息,Servlet 实例可以在 HttpServletResponse.addCookie 方法中添加 Cookie 信息并发送给客户端。Cookie 在请求头或响应头里添加。
- ServletRequestEvent, ServletRequestListener, ServletRequestAttributeEvent, ServletRequestAttributeListener,ServletContextEvent, ServletContextListener, ServletContextAttributeEvent, ServletContextAttributeListener, HttpSessionEvent, HttpSessionListener, HttpSessionBindingEvent, HttpSessionBindingListener, HttpSessionAttributeListener: 当相应的对象或值改变时对应的事件及监听器。
Servlet3.0增强
注解
有了注解,就不需要在 web.xml 部署文件中声明 servlet, filter, listener 等,减少部署文件的体积,提高可维护性。
WebServlet: 声明一个 Servlet,属性主要有 name, value, urlPatterns, initParams, asyncSupported, description, displayName;
WebFilter: 声明一个 Filter, 属性主要有 name, value, urlPatterns, initParams, servletNames, dispatcherTypes
asyncSupported, description, displayName;
WebListener: 声明一个Web监听器,属性为name, 值为【ServletContextListener, ServletContextAttributeListener, javax.servlet.ServletRequestListener,ServletRequestAttributeListener,HttpSessionListener,HttpSessionAttributeListener】之一。
WebInitParam: 在 Servlet, Filter 上声明初始化参数,属性有name, value, description
MultipartConfig: 应用于 Servlet 用于处理文件上传,属性有location, maxFileSize, maxRequestSize,fileSizeThreshold
ServletSecurity: 声明 Servlet 的安全约束,属性有value, httpMethodConstraints
HandlesTypes: 声明 ServletContainerInitializer 的实现类的方法参数中所能处理的类型集合。
异步
AsyncEvent: 当调用 servletRequest.startAsync方法或该方法【完成|超时|产生错误】时,将产生一个异步事件。
AsyncListener:异步事件监听器,需要实现 【onStartAsync|onComplete|onTimeout|onError】(AsyncEvent)方法。
AsyncContext: 异步上下文。
ServletRequest.startAsyn方法提供了在Servlet中进行异步处理的特性。
Servlet要点
事件机制
当事件源发生某种变化时,运行容器将分派对应的监听器处理程序来处理相应的事件。Servlet里的事件源主要有Request, Context, Attribute 等。
事件机制的底层实现可基于观察者/订阅者模式,使用多线程或多进程与信号机制实现。主线程或主进程执行具体逻辑产生事件并发送信号来通知变化,守护线程或守护进程监听到信号和通知后分派相应的监听器程序来处理。可以在应用启动时预先注册事件类型与监听器程序的对应关系,亦可在运行中动态绑定或解绑。
以 ServletRequestAttributeEvent 为例。只要编写相应的监听器类 RequestAttributeListenerImpl (实现 ServletRequestAttributeListener ) , 并在 web.xml listener 元素 ( 或使用注解 WebListener ) 声明该监听器后,当在应用中写下 request.setAttribute(name, value) 或 request.removeAttribute(name,value) 就会自动触发 RequestAttributeListenerImpl 里的逻辑。
数据信息
Servlet, Filter 可以从请求 Request (参数 Parameter)、配置 Config 、环境 Context、环境或自定义属性 Attribute 以及会话 (Session, Cookie) 中获取处理请求所需要的信息;
Dispatcher 可以从部署文件或项目配置文件中读取 URL 映射配置, 将来源于客户端的 URL 请求映射到指定的 Servlet / Controller 。
输入输出
最底层是字节流(InputStream, OutputStream) 和 字符流 (Reader, Writer)
其上是各种源的字节流和字符流。源主要有: String, File, NetworkResource 等
语义层面是请求与响应: HttpServletRequest , HttpServletResponse。
会话追踪
- 为了始终如一地标识和处理同一个客户端发出的有紧密业务关联的请求链,使用客户端 Cookie 和 服务端 Session 机制。浏览器可以检测客户端Cookie 以判断用户是否登录, 服务器可以检测 Session 里的登录信息判断用户是否登录。
Ajax与异步Servlet
Ajax 是浏览器实现的通信封装。当与服务器通信时,在发送请求后会立即返回,不阻塞用户后续操作;而在之后会检查请求状态,在完成后获取服务器返回的数据并更新页面。Ajax 是客户端异步技术,改善客户端响应体验。
Ajax 通常应用于富客户端应用场景。在这种场景中,静态内容和交互设计占据页面内容的绝大部分,而动态内容仅占其中一小部分。如果服务端每次都返回整个页面内容,势必耗费大量网络带宽。而 Ajax 通信仅返回客户端刷新所需要的数据。在 Ajax 应用中,服务端提供的是一段数据, 而不是页面或文件。
Servlet 本身是同步的。处理客户端请求之后才返回响应。异步 Servlet 则会将请求中耗时长的部分抽离出来异步处理,耗时短的部分完成后就退出线程,减少长耗时请求对Servlet线程的占用,改善应用系统的吞吐量和负载。异步 Servlet 是服务端异步技术。【异步Servlet 待实验】
首部
请求头:主要包括 【Host, Connection, Cache-Control, Accept, Upgrade-Insecure-Requests, User-Agent, Accept-Encoding, Accept-Language, If-Modified-Since】
响应头: 主要包括【Content-Length,Content-Type,Server,Set-Cookie】
请求头示例:【Host=localhost:8082;Connection=keep-alive;Cache-Control=;max-age=0;Accept=text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8
Upgrade-Insecure-Requests=1;User-Agent=Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36;Accept-Encoding=gzip, deflate, sdch;Accept-Language=zh-CN,zh;q=0.8;If-Modified-Since=Wed, 17 Feb 2016 02:20:01 GMT】
- 响应头示例:【Content-Type: text/plain;charset=UTF-8;Set-Cookie: me=qinshuq;Domain=localhost;Content-Length: 5;Server: Jetty(7.2.2.v20101205)】
路径
Request: http://localhost:8082/servlets/AutoCompleteServlet?inputText=sh
RequestUrl = http://localhost:8082/servlets/AutoCompleteServlet ; RequestUrl: [协议]://servName:servPort/contextPath/servletPath ; RequestUrl 不包括 QueryString 。
RequestURI = /servlets/AutoCompleteServlet ; 资源标识符。 ContextPath (不含) 到 QueryString (不含) 之间的部分。
ServletPath = /servlets/AutoCompleteServlet ; 映射到 Servlet 实例的路径标识。
ContextPath = ; 应用路径,可在Servlet服务器部署文件中指定。若Servlet在根路径下,默认为空字符串“” ;若 请求为 http://localhost:8082/autocomplete/servlets/AutoCompleteServlet?inputText=sh , 则 ContextPath = /autocomplete
QueryString: inputText=sh 。 查询字符串,通常是请求中问号之后的部分。
若请求为 Request: http://localhost:8082/, 则: RequestUrl = http://localhost:8082/ , RequestURI = /, ServletPath = /,ContextPath = “”, QueryString = null
示例
代码阅读小记
边读代码边做笔记是一个好习惯。
概念-属性-联系-模型-架构。
Servlet概念框架的更多相关文章
- servlet文件下载
创建web工程servlet,新建DownloadServlet.java package com.xmyself.servlet; import java.io.File; import java. ...
- java中servlet的各种路径
1. web.xml中<url-pattern>路径,(叫它Servlet路径!) > 要么以“*”开关,要么为“/”开头 2. 转发和包含路径 > *****以“/”开头:相 ...
- Servlet监听器笔记总结
监听器Listener的概念 监听器的概念很好理解,顾名思义,就是监视目标动作或状态的变化,目标一旦状态发生变化或者有动作,则立马做出反应. Servlet中的也有实现监听器的机制,就是Listene ...
- JavaWeb——Servlet
一.基本概念 Servlet是运行在Web服务器上的小程序,通过http协议和客户端进行交互. 这里的客户端一般为浏览器,发送http请求(request)给服务器(如Tomcat).服务器接收到请求 ...
- servlet 简介,待完善
什么是Servlet?① Servlet就是JAVA 类② Servlet是一个继承HttpServlet类的类③ 这个在服务器端运行,用以处理客户端的请求 Servlet相关包的介绍--javax. ...
- java web学习总结(五) -------------------servlet开发(一)
一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向 ...
- servlet使用入门
创建web工程servlet,然后新建TestServlet.java package com.xmyself.servlet; import java.io.IOException; import ...
- 基于jsp+servlet图书管理系统之后台万能模板
前奏: 刚开始接触博客园写博客,就是写写平时学的基础知识,慢慢发现大神写的博客思路很清晰,知识很丰富,非常又价值,反思自己写的,顿时感觉非常low,有相当长一段时间没有分享自己的知识.于是静下心来钻研 ...
- [Servlet] 初识Servlet
什么是Servlet? 定义 Servlet的全称是 Server Applet,顾名思义,就是用 Java 编写的服务器端程序. Servlet 是一个 Java Web开发标准,狭义的Servle ...
随机推荐
- zero1--hibernate注解02
- php实现斐波那契数列以及由此引起的联想
斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一 ...
- APICloud上openFrameGroup把菜单挡住了,怎么处理?
问:openFrameGroup把菜单挡住了,怎么处理? 试了sendFrameToBack没反应,又不能页面自己openFrameGroup,不知道该怎么办.而且用另外的页面先openFrameGr ...
- 视差效果原理 background-attachment:fixed
<html> <head> <style type="text/css"> body { background-image:url('http: ...
- eclipse报jvm terminated.exitcode=2异常解决办法
由于安转了oracle,而oracle又自带了jdk,版本好像是1.1的,冲突了.具体可以查看path值.解决方法:删掉oracle的,或者是将oralce的path配置项移到java的配置项后面,建 ...
- IDE硬盘 SCSI硬盘 SATA硬盘
IDE一般是有扁平电缆连接的,一个扁平电缆可以连接2个IDE硬盘,而一个计算机一般提供2个扁平电缆,所以一般允许4块IDE硬盘.IDE经过多年的发展,成熟,廉价,稳定.一般老式的电脑中装的都是这种硬盘 ...
- NSAttributedString
1. 使用这个类,必须先导入CoreText框架. 2. 给UILabel设置attributedText了会导致给UILabel中text,font,textColor,shadowCo ...
- 关键字 self
self 总是指向调用方法的对象. self总是代表当前类的对象.当它出现在某个方法体中时,它所代表的对象是不确定的,但它的类型是确定的,它所代表的是当前类的实例对象: 当这个方法被调用时,它所代表的 ...
- tomcat下jndi配置
jndi(Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API.命名服务将名称和对象联系起来,使得我们可以用 ...
- SQL2008 R2 SP3中使用pivot实现行转列
同事遇到一个问题,怎么实现行转列,参考了别人的示例,我是这样解决的. 创建数据源: create table #temp ( objectid int, sitename ), cities ), p ...