一.Servlet
Servlet介绍
是运行在java服务端上的程序,用于接收和响应来自客户端基于HTTP的请求
要想实现Servlet功能,可以实现Servlet接口,继承GenericServlet或者HttpServlet
每次请求都会执行service方法
关系视图
三种编写方式
第一种:实现Servlet接口,接口中的方法必须全部实现。
使用此种方式,表示接口中的所有方法在需求方面都有重写的必要。此种方式支持最大程度的自定义。
第二种:继承GenericServlet,service方法必须重写,其他方可根据需求,选择性重写。
使用此种方式,表示只在接收和响应客户端请求这方面有重写的需求,而其他方法可根据实际需求选择性重写,使我们的开发Servlet变得简单。但是,此种方式是和HTTP协议无关的。
第三种:继承HttpServlet,它是GenericServlet的子类。如果我们选择继承HttpServlet时,只需要重写doGet和doPost方法,不要覆盖service方法。
使用此种方式,表示我们的请求和响应需要和HTTP协议相关。(目前我们只知道GET和POST,而实际HTTP协议支持7种请求方式,GET POST PUT DELETE TRACE OPTIONS HEAD )。
生命周期
init初始化,出生:请求第一次到达Servlet时,对象就创建出来,并且初始化成功。只出生一次,就放到内存中。
service服务,活着:服务器提供服务的整个过程中,该对象一直存在,每次只是执行service方法。
destory,死亡:当服务停止时,或者服务器宕机时,对象消亡。
安全问题
- servlet是单例的, 被多个用户同时访问就有可能出现线程安全问题, 解决方案如下
- 1.不要去定义成员变量, 去定义局部变量
- 锁,现在就忘掉!!!这种效率太低, 需要排队执行
映射方式
第一种:指名道姓的方式
此种方式,只有和映射配置一模一样时,Servlet才会接收和响应来自客户端的请求。
例如:映射为:/servletDemo5
第二种:/开头+通配符的方式
此种方式,只要符合目录结构即可,不用考虑结尾是什么。
例如:映射为:/servlet/*
第三种:通配符+固定格式结尾
此种方式,只要符合固定结尾格式即可,其前面的访问URI无须关心(注意协议,主机和端口必须正确)
例如:映射为:*.do
三种映射方式的优先级为:第一种>第二种>第三种。
创建时机
第一种:请求第一次访问是创建Servlet
- 它的优势就是减少了对服务器内存的浪费,因为那些一直没有被访问过的Servlet对象都没有创建,因此也提高了服务器的启动时间。而它的弊端就是,如果有一些要在应用加载时就做的初始化操作,它都没法完成,从而要考虑其他技术实现。
第二种:应用加载时创建Servlet,在标签中添加
<load-on-startup>值</load-on-startup>,
负数或0代表第一访问时候才会被创建,正数代表服务器启动就创建Servlet, 但是值越小优先级越高
- 它的优势是在服务器启动时,就把需要的对象都创建完成了,从而在使用的时候减少了创建对象的时间,提高了首次执行的效率。它的弊端也同样明显,因为在应用加载时就创建了Servlet对象,因此,导致内存中充斥着大量用不上的Servlet对象,造成了内存的浪费。
场景
- 何时采用第一种方式,何时采用第二种方式。就是当需要在应用加载就要完成一些工作时,就需要选择第一种方式。当有很多Servlet的使用时机并不确定是,就选择第二种方式。
ServletConfig
介绍:它是Servlet的配置参数对象,在Servlet规范中,允许为每个Servlet都提供一些初始化配置
生命周期:由于它是在初始化阶段读取了web.xml中为Servlet准备的初始化配置,并把配置信息传递给Servlet,所以生命周期与Servlet相同。这里需要注意的是,如果Servlet配置了1,那么ServletConfig也会在应用加载时创建。
配置方式
<init-param>
<param-name>键1</param-name>
<param-value>值1</param-value>
</init-param>
<init-param>
<param-name>键2</param-name>
<param-value>值2</param-value>
</init-param>
........
常用方法
- String getInitParameter(String key)
- Enumeration getInitParameterNames
- Enumeration<String> keys = config.getInitParameterNames();
while (keys.hasMoreElements()){
String element = keys.nextElement();
System.out.println(keys+","+element);
}
- ServletContext getServletContext()
- String getServletName()
- 获取Servlet的名称,即servlet-name的内容
ServletContext
介绍:ServletContext对象,它是应用上下文对象。每一个应用有且只有一个ServletContext对象。它可以实现让应用中所有Servlet间的数据共享。
生命周期:
出生: 应用一加载,该对象就被创建出来了。一个应用只有一个实例对象。
活着:只要应用一直提供服务,该对象就一直存在。
死亡:应用被卸载(或者服务器挂了),该对象消亡。
配置方式
- 在<web-app>中添加标签
- <context-param>
<param-name>键1</param-name>
<param-value>值1</param-value>
</context-param>
<context-param>
<param-name>键2</param-name>
<param-value>值2</param-value>
</context-param>。。。。。
常用方法
- ServletContext getServletContext()
- String getInitParameter(“键”)
- String getContextPath("/")
- String getRealPath(“/”)
- setAttribute(“userName”,“zhangsan”)
- getAttribute(“userName”)
- removeAttribute(“userName”)
Servlet3.0注解
1.定义一个类继承HttpServlet 2.重写service方法 3.在service方法中编写逻辑 4.使用@WebServlet(“访问路径”)
|