Servlet学习笔记(一)之Servlet原理、初始化、生命周期、结构体系
2016-11-14 20:55
417 查看
Servlet是用java语言编写的应用到Web服务器端的扩展技术,与java对象的区别是,Servlet对象主要封装了对HTTP请求的处理,并且它的运行需要Servlet容器的支持(以下会介绍原因,也可以看之前的一篇介绍Servlet容器的博客,(http://blog.csdn.net/megustas_jjc/article/details/52923132)),在JavaWeb中,Servlet主要用于处理各种业务逻辑,并且还可以输出HTML代码来显示指定页面。
Servlet 用来 动态web资源 开发:
静态web资源 : 固定数据文件
动态web资源 : 通过程序动态生成数据文件
Servlet技术基于Request-Response编程模型 ,HTTP协议也是基于请求响应 模型 ,因此 Servlet技术 用来 开发基于HTTP web 应用程序 。
接触 JavaEE API —— 程序 接口 和 已经实现接口 类的 使用 (JavaEE —- Java Platform, Enterprise Edition 缩写 )
建立一个简单servlet的步骤:
1、创建web project
2、编写 class 继承 HttpServlet
3、在web.xml 配置 Servlet程序 虚拟访问路径 (用户在浏览器上通过这个路径 访问编写Servlet程序 )
4、覆盖doGet或者doPost方法 进行输出
其中,Servlet程序在编写和运行时,需要javaee 类库 (API支持),例如在学习javase List 需要 import java.util.List 需要 jre/lib/rt.jar,对于eclipse需要自行导入jar包,先要找到文件所在的路径,如下。
C:\Tomcat 5.0\common\lib\servlet-api.jar。 然后在eclipse里面 Project ->Properties,在左边找到Java Builder Path,单击,在右边找到Libraries,然后Add External Jars,找到C:\Tomcat 5.0\common\lib\servlet-api.jar。完毕,接着可以使用 import javax.servlet.*
Servlet运行原理分析
编写Servlet程序没有 main函数(意味着不能独立执行,需要tomcat) —- tomcat调用Servlet程序执行
1、用户在客户端发起url请求 : http://localhost/day05/hello 。
2、web.xml /hello 映射 HelloServlet程序。
3、用户提交请求时,get方式提交执行HelloServlet的doGet方法,post方式提交执行 HelloServlet的doPost 方法 。
手动编写Servlet运行(servlet在运行时需要依赖外界的jar包)
手动编写Servlet运行(servlet在运行时需要依赖外界的jar包)
1、在webapps 新建 day05test目录 — 虚拟应用
2、在day05test 新建 WEB-INF/classes
3、将编写Servlet的java源码文件 放入 classes ,在 WEB-INF 配置web.xml (进行虚拟路径配置)
4、编译Servlet的 java程序
javac -classpath E:\apache-tomcat-6.0.14\lib\servlet-api.jar HelloServlet.java // 通过 -classpath 指定 Servlet需要jar 包
生成Servlet package结构
javac -d . -classpath E:\apache-tomcat-6.0.14\lib\servlet-api.jar HelloServlet.java
Servlet生命周期与初始化
(1)Servlet生命周期
(2)init(ServletConfig config) 初始化
(3)service(ServletRequest req, ServletResponse res) 提供服务方法
(4)destroy() 销毁
原理:
1、tomcat服务器启动时,没有创建Servlet对象
2、第一次访问时,tomcat构造Servlet对象,调用 init,执行service
3、从第二次以后访问 tomcat 不会从新创建Servlet对象,也不会调用init —- 每一次访问都会调用service
4、当服务器重启或正常关闭时 调用destroy (正常关闭 shutdown.bat)
servlet生命周期小结:
针对客户端多次Servlet请求,通常情况下,服务器只会创建一个Servlet实例对象,也就是说Servlet实例对象一旦创建,它就会驻留在内存中,为后续的其他请求服务,直至web容器退出,servlet实例对象才会销毁。
在整个Servlet生命周期内,Servlet的init方法只被调用一次。而对一个Servlet的每次访问请求导致Servlet引擎调用一次servlet的service方法,对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doXXX方法。
因此,Servlet对象是tomcat创建的,每次请求调用Servlet中service方法,tomcat服务器会在每次调用Servlet的service方法时,为该方法创建Request对象和Response对象(在 JavaEE API 中没有Request和Response实现类(HttpServlet是包装类,因此不能产生Servlet对象) —– 实现类由Servlet服务器提供的,tomcat提供实现类 weblogic 提供实现类 ) 。
service方法 和 HttpServlet doGet/doPost 关系区别
在HttpServlet代码实现中,根据请求方式不同 调用相应doXXX方法 get方式请求 — doGet post方式 — doPost (必须阅读HttpServlet源代码 )
其中可以通过对Servlet进行配置,使其启动时进行初始化,而不是之前的调用时进行初始化,其实现可以通过< load-on-startup>(< load-on-startup > 参数可以是一个数字 0-9 代表服务器加载优先级 0 最高 ,例如:在tomcat启动时,想通过Servlet加载一些框架配置文件 配置随服务器启动 )
Servlet结构体系
GenericServlet和HttpServlet都是Servlet接口的两个默认实现类,GenericServlet对Servlet接口及ServletConfig接口提供了部分实现,但是并没有对Http请求处理进行实现,这一操作由其子类HttpServlet进行实现,其为Http请求中的POST、GET等类型提供了具体的操作方法,所以通常情况下,编写的Servlet对象都是继承与HttpServlet。因此,编写Servlet 不需要覆盖service方法,只需要覆盖doGet和doPost 方法;Servlet初始化时覆盖init() ,无需覆盖init(config),因为init(Config) 调用了init()。并且,当doGet方法与doPost方法逻辑相同时,可以互相调用,简化编程,例如:
Servlet 用来 动态web资源 开发:
静态web资源 : 固定数据文件
动态web资源 : 通过程序动态生成数据文件
Servlet技术基于Request-Response编程模型 ,HTTP协议也是基于请求响应 模型 ,因此 Servlet技术 用来 开发基于HTTP web 应用程序 。
接触 JavaEE API —— 程序 接口 和 已经实现接口 类的 使用 (JavaEE —- Java Platform, Enterprise Edition 缩写 )
建立一个简单servlet的步骤:
1、创建web project
2、编写 class 继承 HttpServlet
3、在web.xml 配置 Servlet程序 虚拟访问路径 (用户在浏览器上通过这个路径 访问编写Servlet程序 )
4、覆盖doGet或者doPost方法 进行输出
其中,Servlet程序在编写和运行时,需要javaee 类库 (API支持),例如在学习javase List 需要 import java.util.List 需要 jre/lib/rt.jar,对于eclipse需要自行导入jar包,先要找到文件所在的路径,如下。
C:\Tomcat 5.0\common\lib\servlet-api.jar。 然后在eclipse里面 Project ->Properties,在左边找到Java Builder Path,单击,在右边找到Libraries,然后Add External Jars,找到C:\Tomcat 5.0\common\lib\servlet-api.jar。完毕,接着可以使用 import javax.servlet.*
Servlet运行原理分析
编写Servlet程序没有 main函数(意味着不能独立执行,需要tomcat) —- tomcat调用Servlet程序执行
1、用户在客户端发起url请求 : http://localhost/day05/hello 。
2、web.xml /hello 映射 HelloServlet程序。
3、用户提交请求时,get方式提交执行HelloServlet的doGet方法,post方式提交执行 HelloServlet的doPost 方法 。
手动编写Servlet运行(servlet在运行时需要依赖外界的jar包)
手动编写Servlet运行(servlet在运行时需要依赖外界的jar包)
1、在webapps 新建 day05test目录 — 虚拟应用
2、在day05test 新建 WEB-INF/classes
3、将编写Servlet的java源码文件 放入 classes ,在 WEB-INF 配置web.xml (进行虚拟路径配置)
4、编译Servlet的 java程序
javac -classpath E:\apache-tomcat-6.0.14\lib\servlet-api.jar HelloServlet.java // 通过 -classpath 指定 Servlet需要jar 包
生成Servlet package结构
javac -d . -classpath E:\apache-tomcat-6.0.14\lib\servlet-api.jar HelloServlet.java
Servlet生命周期与初始化
(1)Servlet生命周期
(2)init(ServletConfig config) 初始化
(3)service(ServletRequest req, ServletResponse res) 提供服务方法
(4)destroy() 销毁
import java.io.IOException; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; // 实现Servlet 接口 --- 感受生命周期 public class InitServlet implements Servlet { int i; public InitServlet() { System.out.println("构造了 InitServlet对象 ..."); } @Override public void destroy() { System.out.println("销毁..."); } @Override public void init(ServletConfig arg0) throws ServletException { System.out.println("初始化 ..."); } @Override public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { System.out.println("服务..."); System.out.println("i:" + i); i++; } @Override public ServletConfig getServletConfig() { // TODO Auto-generated method stub return null; } @Override public String getServletInfo() { // TODO Auto-generated method stub return null; } }
原理:
1、tomcat服务器启动时,没有创建Servlet对象
2、第一次访问时,tomcat构造Servlet对象,调用 init,执行service
3、从第二次以后访问 tomcat 不会从新创建Servlet对象,也不会调用init —- 每一次访问都会调用service
4、当服务器重启或正常关闭时 调用destroy (正常关闭 shutdown.bat)
servlet生命周期小结:
针对客户端多次Servlet请求,通常情况下,服务器只会创建一个Servlet实例对象,也就是说Servlet实例对象一旦创建,它就会驻留在内存中,为后续的其他请求服务,直至web容器退出,servlet实例对象才会销毁。
在整个Servlet生命周期内,Servlet的init方法只被调用一次。而对一个Servlet的每次访问请求导致Servlet引擎调用一次servlet的service方法,对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doXXX方法。
因此,Servlet对象是tomcat创建的,每次请求调用Servlet中service方法,tomcat服务器会在每次调用Servlet的service方法时,为该方法创建Request对象和Response对象(在 JavaEE API 中没有Request和Response实现类(HttpServlet是包装类,因此不能产生Servlet对象) —– 实现类由Servlet服务器提供的,tomcat提供实现类 weblogic 提供实现类 ) 。
service方法 和 HttpServlet doGet/doPost 关系区别
在HttpServlet代码实现中,根据请求方式不同 调用相应doXXX方法 get方式请求 — doGet post方式 — doPost (必须阅读HttpServlet源代码 )
其中可以通过对Servlet进行配置,使其启动时进行初始化,而不是之前的调用时进行初始化,其实现可以通过< load-on-startup>(< load-on-startup > 参数可以是一个数字 0-9 代表服务器加载优先级 0 最高 ,例如:在tomcat启动时,想通过Servlet加载一些框架配置文件 配置随服务器启动 )
<servlet> <servlet-name>InitServlet</servlet-name> <servlet-class>cn.itcast.servlet.InitServlet</servlet-class> <!--配置servlet在服务器启动时进行加载--> <load-on-startup>1</load-on-startup> </servlet>
Servlet结构体系
GenericServlet和HttpServlet都是Servlet接口的两个默认实现类,GenericServlet对Servlet接口及ServletConfig接口提供了部分实现,但是并没有对Http请求处理进行实现,这一操作由其子类HttpServlet进行实现,其为Http请求中的POST、GET等类型提供了具体的操作方法,所以通常情况下,编写的Servlet对象都是继承与HttpServlet。因此,编写Servlet 不需要覆盖service方法,只需要覆盖doGet和doPost 方法;Servlet初始化时覆盖init() ,无需覆盖init(config),因为init(Config) 调用了init()。并且,当doGet方法与doPost方法逻辑相同时,可以互相调用,简化编程,例如:
public class HelloServlet3 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { for (int i = 1; i <= 10; i++) { response.getWriter().println(i + "<br/>"); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // for (int i = 1; i <= 10; i++) { // response.getWriter().println(i + "<br/>"); // } // 当doPost 和 doGet 代码逻辑完全相同 --- 为了简化编程 互相调用 doGet(request, response); } }
相关文章推荐
- Tomcat中Servlet的创建初始化体系结构及工作
- Tomcat中Servlet的创建初始化体系结构及工作
- servlet体系结构
- java类加载器体系结构(含hotswap原理)
- Servlet建立 生命周期 继承结构 Servlet的配置 ServletConfig ServletContext
- servlet 基础原理 (映射方式、运行初始化参数)
- thrift之TTransport类体系原理及源码详细解析1-类结构和抽象基类
- java类加载器体系结构(含hotswap原理)
- Servlet 各个类之间的体系结构
- thrift之TTransport类体系原理及源码详细解析1-类结构和抽象基类
- 处理器体系结构(了解CPU的基本运行原理)——《深入理解计算机系统》
- Android 体系结构和Activity应用生命周期,Service 应用生命周期
- mysql体系结构及原理(innodb)
- 网规:第1章计算机网络原理-1.3网络体系结构
- Servlet原理与生命周期
- 复杂系统的层级原理与模型驱动软件体系结构
- Servlet概述(原理、生命周期)
- JVM体系结构与sun GC的实现原理
- openHAB 体系结构与编程模型 (2) --- Web Application Servlet 架构
- Linux系统体系架构初始化过程(AM335X体系结构初始化)