JavaWeb系列:Servlet
个人整理,欢迎转载与批评建议,转载请添加索引,谢谢。
---------------------------------------------------------------2017.06.10---------------------------------------------------------------
Servlet简介
Servlet是Java Web的技术核心之一,而且也是另一技术核心Java Server Pages(JPS)的支撑基础。文章的主要部分将介绍Servlet的使用以及原理,还有Servlet的载体,这里选用Tomcat。
一个Servlet是一个Java 类,经由Servlet容器创建、调用、销毁,也就是说Servlet容器管理着Servlet的生命周期。它在服务器工作期间将驻留在内存中,响应客户端发来的对应请求。下面是一个Servlet应用的基础架构,其中屏蔽了很多细节,我们将渐渐深入解析。

①浏览器接受到用户输入指令,转而生成Http响应指令发送至Servlet容器;
②Servlet容器是一种特殊的Http服务器,将分析Http请求是否是静态数据,如果是则直接发送静态数据;
③如果对应的是某一Servlet的第一次调用,则交给Servlet容器创建Servlet,并将Request和Response交由Servlet处理;
④处理完结果Response返回至Servlet容器,Servlet容器包装Response之后返回Http响应;
⑤浏览器接收Http响应并根据结果请求更多内容和渲染画面,一次交互结束。
Tomcat容器
Tomcat容器是一种大家比较熟悉的Servlet容器,解析Servlet容器的工作方式有利于大家理解Servlet。

Tomcat容器采用众多容器来管理,而底层是Servlet容器,Servlet容器又管理着Context容器,Context容器管理着的是Wrapper类。
Wrapper类是Servlet的包装类,也就是说真正管理Servlet的是Context容器,一个Context容器表示一个application,一个Context容器管理着很多Wrapper类(Servlet)。为了验证这一点,我们看以下Tomcat的一个启动类org.apache.catalina.startup.Tomcat源码:
public Context addWebapp(Host host, String url, String path) {
silence(url);
Context ctx = new StandardContext();
ctx.setPath( url );
ctx.setDocBase(path);
if (defaultRealm == null) {
initSimpleAuth();
}
ctx.setRealm(defaultRealm);
ctx.addLifecycleListener(new DefaultWebXmlListener());
ContextConfig ctxCfg = new ContextConfig();
ctx.addLifecycleListener(ctxCfg);
// prevent it from looking ( if it finds one - it'll have dup error )
ctxCfg.setDefaultWebXml("org/apache/catalin/startup/NO_DEFAULT_XML");
if (host == null) {
getHost().addChild(ctx);
} else {
host.addChild(ctx);
}
return ctx;
}
每当新增一个application,Tomcat容器会调用一次addWebapp()函数,也就是每次都会创建一个新的StandardContext;
public static Wrapper addServlet(Context ctx,
String servletName,
String servletClass) {
// will do class for name and set init params
Wrapper sw = ctx.createWrapper();
sw.setServletClass(servletClass);
sw.setName(servletName);
ctx.addChild(sw);
return sw;
}
Context可以添加Wrapper类,而Wrapper类接受的参数就可以明白它是一个Servlet的包装类。
Servlet层次结构
java.servlet

javax.servlet.http

掌握上述接口和类就可以熟练地进行servlet编程,下面我们重点描述其中几个,其余就进行功能描述:
①Servlet
所有Servlet都必须实现这一接口,主要用于容器配置Servlet,实现初始化,调用,销毁等功能,也就是servlet的生命周期管理函数;
void init(ServletConfig config) throws ServletException //初始化 ServletConfig getServletConfig() //获取servletConfig对象 void service(ServletRequest req,ServletResponse res)throws ServletException,IOException //当每次有一个对应的servlet请求时,容器会调用service方法 void destroy() //销毁servlet
②servletconfig和servletcontext
这两个类是用于配置servlet环境。
servletconfig是用于配置单独当前servlet环境,主要的功能是获取ServletContext;
String getInitParameter(String name) //获取初始化参数,使用者可制定servlet如何初始化 ServletContext getServletContext() //获取servletcontext,后面将介绍
servletcontext是用于配置context环境,还记得刚说过context管理着servlet的包装类?
void setAttribute(String name,Object object) //在context上下文中设置保存一个对象 Object getAttribute(String name) //获取保存的对象 Enumeration getInitParameterNames() //获取初始化参数 String getRealPath(String path) //获取对应path的物理路径 URL getResource(String path)throws MalformedURLException //获取对应path的相对路径 void log(String message,Throwable throwable) //当异常发生时记录日志
③HttpServlet
protected void doGet(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException protected void doPost(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException
④RequestDispatcher
RequestDispatcher是一个Web资源的包装器,可以用来把当前request传递到该资源,或者把新的资源包括到当前响应中。
void forward(ServletRequest request,ServletResponse response)throws ServletException,IOException //把request转发至服务器中的另一资源 void include(ServletRequest request,ServletResponse response)throws ServletException,IOException //把资源包含到响应中
⑤Cookie和HttpSession
Http是无状态协议,所以需要有一个“地方”用来保存某些状态信息,Cookie是保存在客户端的“地方”,而Session是服务端的“地方”。
Cookie和HttpSession是javaBean,被用来进行传输保存的对象,没什么好说的。
⑥HttpServletRequest和HttpServletResponse
HttpServletRequest
Cookie[] getCookies() //获取浏览器的cookies Enumeration getHeaders(String name) //获取requset包含的请求头信息 HttpSession getSession(boolean create) //create参数为true并没有session创建一个session,有session则获取之前创建的session void setAttribute(String name,Object o) //设置attribute对象 Object getAttribute(String name) //获取request中设定的attribute对象 void setCharacterEncoding(String env)throws UnsupportedEncodingException //设置编码集 String getCharacterEncoding() //获取编码集 ServletInputStream getInputStream() //获取request输入字节流 BufferedReader getReader()throws IOException //获取request输入字符流 RequestDispatcher getRequestDispatcher(String path) //获取RequestDispatcher String getParameter(String name) //获取浏览器设置的参数
HttpServletResponse
void addCookie(Cookie cookie) //添加cookie void addHeader(String name,String value) //添加头信息 void setHeader(String name,String value) //设置头信息 String encodeURL(String url) //编码一个url使之追加sessionID,用于一些浏览器禁止cookie时使用,可和getSession(boolean create)配合使用 String getCharacterEncoding() void setCharacterEncoding(String charset) ServletOutputStream getOutputStream()throws IOException //获取输出字节流 PrintWriter getWriter()throws IOException //获取输出字符流
⑦Filter和FilterChain
Filter过滤器可以用来过滤http请求和响应,使之调用特定servlet的service之前或之后执行特定的任务,如:
1) Authentication Filters
2) Logging and Auditing Filters
3) Image
conversion Filters
4) Data compression Filters
5) Encryption Filters
6) Tokenizing Filters
7) Filters that trigger resource access events
8) XSL/T filters
9) Mime-type chain Filter
<web-app> <filter> <filter-name> Basic Filter </filter-name> <filter-class> BasicFilter </filter-class> </filter> /*********************************/ <filter-mapping> <filter-name> Basic Filter </filter-name> <servlet-name> FilteredServlet </servlet-name> </filter-mapping> /*********************************/ <servlet> <servlet-name> FilteredServlet </servlet-name> </servlet> </web-app>
void init(FilterConfig filterConfig)throws ServletException //初始化过滤器,其中config可以在web.xml这种配置文件中配置 void doFilter(ServletRequest request,ServletResponse response, FilterChain chain) throws IOException,ServletException
//FilterChain是一条过滤器链,这个方法使之跳转到下一个Filter void destroy() //被容器调用,销毁这个filter
⑧其他
其他接口或者对象是Listener、event、exception等,在整个生命周期里可以设计监听对象,用专门的事件来进行通知,按接口来就可以了,没什么好讲。
参考书籍和文章:
java for the web with servlet,jsp and ejb
深入Java Web技术内幕
---------------------------------------------------------------2017.06.11---------------------------------------------------------------
JavaWeb系列:Servlet的更多相关文章
- 06-码蚁JavaWeb之Servlet生命周期与基本配置
学习地址:[撩课-JavaWeb系列1之基础语法-前端基础][撩课-JavaWeb系列2之XML][撩课-JavaWeb系列3之MySQL][撩课-JavaWeb系列4之JDBC][撩课-JavaWe ...
- JavaWeb学习——Servlet相关的接口和类
JavaWeb学习——Servlet相关的接口和类 摘要:本文主要学习了Servlet相关的接口和类. Servlet的接口和类 三种方式 实现Servlet有三种方式: 实现javax.servle ...
- JavaWeb之Servlet入门(二)
1. 准备 在JavaWeb之Servlet入门(一)中,我们完成了第一个Servlet程序,完成了从URL到后台控制器的中转过程,接下来我们延续JavaWeb之Servlet入门(一)学习下如何传参 ...
- Spring mvc源码分析系列--Servlet的前世今生
Spring mvc源码分析系列--Servlet的前世今生 概述 上一篇文章Spring mvc源码分析系列--前言挖了坑,但是由于最近需求繁忙,一直没有时间填坑.今天暂且来填一个小坑,这篇文章我们 ...
- JavaWeb学习--Servlet认识
Servlet开发 用户在浏览器中输入一个网址并回车,浏览器会向服务器发送一个HTTP请求.服务器端程序接受这个请求,并对请求进行处理,然后发送一个回应.浏览器收到回应,再把回应的内容显示出来.这种请 ...
- IDEA新建javaWeb以及Servlet简单实现
刚开始用IDEA开发,还不太熟悉,因此写一个教程,加深印象 1.新建一个Web项目 两种方法:java 和 Java Enterprise(推荐) 第一种)通过Java工程创建,这个方法需要手动导入T ...
- Intellij IDEA创建javaWeb以及Servlet简单实现
1.创建web工程 File --> New --> Project...
- javaweb之servlet 全解
①Servlet概述 ⑴什么是Servlet Servlet是JavaWeb的三大组件之一,它属于动态资源.Servlet的作用是处理请求, 服务器会把接收到的请求交给Servlet来处理,在Serv ...
- JavaWeb学习—Servlet
1.什么是Servlet Servlet是一个继承HttpServlet类的Java类 Servlet必须部署在web服务器端,用来处理客户端的请求 2.Servlet运行过程 Web Client ...
随机推荐
- js解决苹果移动端300ms延迟的问题
做移动端页面开发的可能会了解到,ios系统click事件会有卡顿的现象,这个问题的根源是苹果本身自带的safari有双击放大页面的功能,再次双击会返回到原始尺寸,所以在第一次点击的系统会延迟300ms ...
- 开启新模式WinForm
从今天开始咱们正式进入WinForm开发模式 首先很官方的介绍下什么是winform:客户端应用程序:C/S 这就是winform 有什么特别特别重要的特点呢:可以操作用户电脑上的文件 举个简单的例子 ...
- 简谈-Python的输入、输出、运算符、数据类型转换
输出: 格式化输出: 看到了 % 这样的操作符,这就是Python中格式化输出. 换行输出: 在输出的时候,如果有 \n 那么,此时 \n 后的内容会在另外一行显示 输入: 在python2.7当中, ...
- DFB系列 之 Clear清空surface缓存
1. 函数原型解析 函数声明: DFBResult Clear ( IDirectFBSurface * thiz, u8 r, u8 g, ...
- 关于li标签之间的间隔如何消除!
问题:li标签用了display:inline之后虽然成功的合并在一行,但是li标签之间出现了间距. 原因:按enter键换行之后li标签之间存在着空格,正是这些空格占据了li标签之间的空间. 解决方 ...
- ASP.NET Core开发之HttpContext
ASP.NET Core中的HttpContext开发,在ASP.NET开发中我们总是会经常用到HttpContext. 那么在ASP.NET Core中要如何使用HttpContext呢,下面就来具 ...
- 创建并发布npm包
1.npm官网创建npm账户 npm网站地址:https://www.npmjs.com/ npm网站注册地址:https://www.npmjs.com/signup 2.命令行工具登录npm np ...
- hdu 1978 How many ways 记忆化搜索+DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1978 思路很好想: 定义f[i][j]表示从点(i,j)出发到达(n,m)的方法数: 那么对于一切从( ...
- ionic之$ionicHistory
$ionicHistory 定义:当用户通过导航栏切换视图页面的时候,ionicHistory起到跟踪视图的作用,类似的浏览器的行为方式,一个ionic应用程序能够保持以前的视图,当前视图,和前视图( ...
- Spring3.0配置多个事务管理器(即操作多个数据源)的方法
大多数项目只需要一个事务管理器.然而,有些项目为了提高效率.或者有多个完全不同又不相干的数据源,最好用多个事务管理器.机智的Spring的Transactional管理已经考虑到了这一点,首先分别定义 ...