一、Servlet概述
1、什么是Servlet
Servlet是一个运行在服务器端的Java小程序,通过HTTP协议用于接收来自客户端请求,并发出响应。
2、Servlet中的方法
public void service(ServletRequest req,ServletResponse res) throws ServletException,java.io.IOException
ServletRequest req:代表着请求对象,该对象中有HTTP协议的请求部分的所有内容。它的实现类由服务器提供的,封装数据也是服务器来做的。
ServletResponse res:代表着响应对象,该对象中由我们写数据(HTTP协议的响应部分)进去。它的实现类也是由服务器提供的。
service:由服务器调用,每次请求都会调用一次。服务器采用的是多线程机制。
二、Servlet的执行过程
三、Servlet的编写方式
实现javax.servlet.Servlet的接口或者继承javax.servlet.GenericServlet或者继承javax.servlet.http.HttpServlet类
1、javax.servlet.GenericServlet:通用的Servlet实现,抽象类
2、javax.servlet.http.HttpServlet:与HTTP协议有关的,抽象类。
注意:HttpServlet是继承GenericServlet的,不要覆盖service方法,需要覆盖doGet或doPost方法。
如果代码里没有doGet方法的话,服务器访问servlet是调用service方法,其实是调用httpservlet里的Service方法,最后是http里面的doGet方法。
Httpservlet(HttpServletRequest、HttpServletResponse)继承GenericServlet(ServletRequest、ServletRespone)
GenericServlet继承Servlet(接口)
3、Servlet规范中的核心接口类图
4、映射文件web.xml
<servlert>
<servlert-name>Servlet名字</servlert-name>
<servlert-class>Servlet所属类</servlert-class>
</servlet>
<servlert-mapping>
<servlert-name>Servlet名字</servlert-name>
<url-pattern>Servlet访问路径</url-pattern>
</servlet-mapping>
四、Servlet的生命周期
1、Servlet对象的生命周期
●诞生:用户第一次访问时,由容器创建他的实例。Init(Servlet ServlertConfig)
●活着:一旦创建就驻留内存(单例),内存中一个servlet的实例只有一个。每次用户的访问,容器都会调用sevice方法发出响应(多线程)。doPost(),doGet()
● 死亡:应用被卸载或者Tomcat关闭了.destory()
2、具体实现
void init(ServletConfig sc)-----void service(ServletRequset req,ServletRespone res)----void destory()
五、Servlet的线程安全
因为内存中一个servlet的实例只有一个,定义实例变量的时候,每次访问service(ServletRequset req,ServletRespone res)方法,会出现一个线程安全问题。
所以尽量使用局部变量,不要使用实例变量。
如果必须使用实例变量,只能做同步处理了,会对访问限制,就变成了一个单例应用了。
六、Servlet的一些细节
1、一个Servlet可以被映射到多个地址上
也可以:
2、可以使用地址通配符*
写法一:*.do结尾 。必须以*开头比如*.do
写法二(比一优先级略高):以/开头,必须以*结尾 比如/action/*
3、默认的Servlet(tomcat默认自带的)
默认的Servlet的映射路径是<url-pattern>/</url-pattern>。不需要大家配,因为默认的Servlet负责处理用户的请求URL找不到匹配的处理工作。一切都是Servlet。
4、应用在启动时就完成Servlet的实例化和初始化
在web.xml里进行配置<load-on-startup></load-on-startip>使其在应用加载时就完成实例化和初始化,避免第一个访问servlet访问太慢了。
注意这里的顺序只能从2开始,因为1已经用在默认的servlet里了,也就是tomcat里面自带的默认serclet.
七、ServletConfig:Servlet的参数配置
1、ServletConfig:代表着针对当前Servlet的参数配置(web.xml)
2、如何得到ServletConfig对象的引用:在初始化Servlet时,由容器(服务器)产生,并传递给你
关于test2里的方法中paramName的是值是param-name里的值。而config.getInitParameter(paramName)获取的是param_value里的值。
注意:每一个Servlet对象都有一个ServletConfig配置。
八、ServletContext
1、ServletContext代表着当前应用(个人认为是应用就是项目)。每个应用只有一个ServletContext对象的实例,由容器提供。是一个域(范围)对象。
2、如何获取ServletContext的实例:
ServletConfig.getServletContext();或者直接获取getServletContext()。
ServletContext实例是通过 getServletContext()方法获得的,由于HttpServlet继承GenericServlet的关系,GenericServlet类和HttpServlet类同时具有该方法。
3、ServletContext的生命周期
诞生:应用被加载时就由容器创建好
活着:应用不挂就一直活着
死亡:应用挂了,就挂了
4、域(存活范围)对象:
ServletContext称为应用范围域对象。
servletContext 是javaWeb的四大域对象中最大的域对象
5、配置全局的web.xml参数(又叫配置应用级的参数)
也是用servletContext 来取这个值。