您的位置:首页 > 其它

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() 销毁

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);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Servlet