1、Hello Servlet
Servlet是一种用于扩展服务器功能的服务器端组件技术,用于实现动态网页编程
因为Servlet接口不在JavaSE中,所以需要引入servlet-api依赖
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
直接实现Servlet接口,需要实现5个方法
public interface Servlet {
public void init(ServletConfig config) throws ServletException;
//servlet对象创建后执行初始化操作,例如通过config读取配置信息
public ServletConfig getServletConfig();
//获取当前Servlet对象的相关ServletConfig对象。ServletConfig对象用于封装
//当前Servlet对象的配置信息
public void service(ServletRequest req, ServletResponse res)throws
ServletException, IOException;
//对外提供服务。Servlet针对多用户会采用单实例多线程的方式对外提供服务
public String getServletInfo(); //获取当前Servlet的说明信息,一般供工具使用
public void destroy(); //在当前Servlet实例被GC回收前所运行的方法,一般用于资源回收
}
为了简化开发,所以Sun提供了一个通用抽象父类GenericServlet。针对大部分方法提供了默认的空实现,只需要Servlet提供service方法的实现即可,一般用于非通用协议开发中。采用的是适配器模式
为了进一步简化开发,提供针对http协议的支持,Sun提供了一个GenericServlet的子类HttpServlet,这个父类专门用于http协议的应用开发中,是模板设计模式
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String method = req.getMethod(); //获取客户端的请求方法,例如get/post之类
if (method.equals(METHOD_GET)) { //如果是GET请求则调用doGet方法
...
doGet(req, resp); //转向调用自己的doGet方法
} else if (method.equals(METHOD_HEAD)) {
doHead(req, resp);
} else if (method.equals(METHOD_POST)) {
doPost(req, resp);
} else if (method.equals(METHOD_PUT)) {
doPut(req, resp);
} else if (method.equals(METHOD_DELETE)) {
doDelete(req, resp);
} else if (method.equals(METHOD_OPTIONS)) {
doOptions(req,resp);
} else if (method.equals(METHOD_TRACE)) {
doTrace(req,resp);
} else { //如果是其它请求方法则报错
String errMsg = lStrings.getString("http.method_not_implemented");
Object[] errArgs = new Object[1];
errArgs[0] = method;
errMsg = MessageFormat.format(errMsg, errArgs);
resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
}
}
Servlet的特点
Servlet用MIME过滤数据,由javax.servlet和javax.servlet.http两个包组成Java Servlet API框架
编写Servlet必须直接或间接实现作为Servlet的核心javax.servlet.Servlet接口,通常是实现javax.servlet.http.HttpServlet的子类,可以覆盖继承doGet()或者doPost()方法,两者分别对应于Http(s)中的Get请求和Post请求。
优点
- 可以移植性:由于Servlet是用Java语言编写的,因此它可以在不同的操作系统和服务器上移植
- 安全:Servlet具有类型检查特征,并利用Java的垃圾收集和没有指针的设计,使得Servlet避免了内存管理等问题
- 高效:Servlet加载执行后会常驻服务器内存中,当再次受到客户端的请求时,服务器会产生新的线程而不是进程为客户端服务,这样就提高了响应速度。 – Java是最差的内存性价比
缺点
- 不能所见即所得开发
- 生成html文档需要通过一系列的输出完成,非常的繁琐低效
2、Servlet实例对象的生命周期
Servlet遵循严格的生命周期,在每个Servlet实例的生命中有三种类型的事件,这三种事件分别对应于由Servlet引擎所唤醒的三个方法:
- init()。当Servlet第一次被装载时,Servlet引擎调用这个Servlet的init()方法,只调用一次。如果某个Sevlet需要特殊的初始化需要。那么Servlet编写人员可以重写该方法来执行初始化任务。这是一个可选的方法。如果某个Servlet不需要初始化,那么默认情况下将调用它父类的init方法。系统保证,在init方法成功完成以前,是不会调用Servlet去处理任何请求的
- service()。这是Servlet最重要的方法,是真正处理请求的地方。对于每个请求,Servlet引擎将调用Servlet的service方法,并把Servlet请求对象和Servlet响应对象最为参数传递给它
- 常驻内存
- destroy()。这是相对于init的可选方法,当Servlet即将被卸载时由Servlet引擎来调用,这个方法用来清除并释放在init方法中所分配的资源。
Servlet技术的要点:
-
当前应用中的所有Servlet接口实现类的实例对象,只能由服务器负责创建,开发人不能不能手动创建
-
默认情况下以单实例多线程的方式对外提供服务
-
Servlet实例一旦创建则常驻内存,只有当服务器资源不足而导致当前Servlet对象被调度或者服务器关闭时才会被销毁
-
默认情况下,服务器接收到对于当前Servlet接口实现类的第一次请求时自动创建这个Servlet接口实现类的实例对象
- 可以手动配置要求服务器在启动时自动创建某个Servlet接口实现类对象
本文介绍Servlet的概念、特点及其实现方式,包括直接实现Servlet接口、继承GenericServlet抽象类和使用HttpServlet类。同时探讨Servlet实例的生命周期,从初始化到服务再到销毁的过程。
705

被折叠的 条评论
为什么被折叠?



