Servlet概述
Servlet是接收请求并处理响应的JavaEE规范
Servlet实现类是可以运行在web服务器中,用来接收浏览器客户端的请求,并给浏览器客户端响应数据的
服器类.
Servlet运行原理
从url如何匹配到servlet的服务方法
1.http://localhost:8080/day06/helloWorld?mes=str
2.通过localhost:8080匹配到tomcat
3.通过/day06匹配到tomcat中部署的工程
4.通过/helloWorld匹配到工程web.xml中的映射
5.通过servlet映射匹配到servlet实例
6.执行servlet实例的服务方法
Servlet生命周期
Servlet默认在
通过调用 init () 方法进行初始化
第一次调用服务的时候才创建初始化,且创建初始化只能执行一次
调用 service() 方法来处理客户端的请求
服务可以执行无数次
通过调用 destroy() 方法终止(结束)
销毁在tomcat停止运行时,销毁一次
最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的
doGet() 方法
GET 请求来自于一个 URL 的正常请求,或者来自于一个未指定 METHOD 的 HTML 表单,它由 doGet() 方法处理
doPost() 方法
POST 请求来自于一个特别指定了 METHOD 为 POST 的 HTML 表单,它由 doPost() 方法处理
事列代码
public class LifeServlet implements Servlet {
public LifeServlet(){
System.out.println("\"构造 创建出生\" = " + "构造 创建出生");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("\"初始化 成长发育\" = " + "初始化 成长发育");
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("\"服务器 接待客人\" = " + "服务器 接待客人");
}
@Override
public void destroy() {
System.out.println("\"销毁 死亡\" = " + "销毁 死亡");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public String getServletInfo() {
return null;
}
}
第一个到达服务器的 HTTP 请求被委派到 Servlet 容器。
Servlet 容器在调用 service() 方法之前加载 Servlet。
然后 Servlet 容器处理由多个线程产生的多个请求,每个线程执行一个单一的 Servlet 实例的 service() 方法
tomcat中的默认Servlet
tomcat本质上也可以看做一个特殊的DefaultServlet 所有请求都走他
默认servlet会先匹配Servlet动态资源,匹配不到才页面匹配静态资源
1.创建一个servlet映射 /static/default.html
public class MyDefaultServlet implements Servlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("\"动态Servlet资源\" = " + "动态Servlet资源");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
2.配置映射 XML
<servlet>
<servlet-name>myDefault</servlet-name>
<servlet-class>com.itheima.com.itheima.defaul.MyDefaultServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>myDefault</servlet-name>
<url-pattern>/static/default.html</url-pattern>
</servlet-mapping>
Servlet初始化顺序
load-on-startup用来标记一个servelt在tomcat容器启动的时候就创建初始化
数字值越小,启动优先级越高
<servlet>
<servlet-name>life</servlet-name>
<servlet-class>com.itheima.life.LifeServlet</servlet-class>
**<load-on-startup>2</load-on-startup>**
</servlet>
<servlet>
<servlet-name>life2</servlet-name>
<servlet-class>com.itheima.life.LifeServlet2</servlet-class>
**<load-on-startup>3</load-on-startup>**
</servlet>
<servlet-mapping>
<servlet-name>life</servlet-name>
<url-pattern>/lifeServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>life2</servlet-name>
<url-pattern>/lifeServlet2</url-pattern>
</servlet-mapping>
Servlet项目的两种配置
给Servlet配置网络映射有两种方式
除了使用xml形式,在servlet3.0以后可以使用注解形式
格式@WebServlet("/映射")
Servlet映射模式
Servlet映射的优先级
精确匹配(用) > 路径匹配(不用) > 后缀匹配(不用)
例如
/aa > /aa/* > *.php
步骤分析
创建三个servlet映射分别为 /aa /aa/* *.php
启动测试
http://localhost:8080/day06/aa
http://localhost:8080/day06/aa/bb.php
http://localhost:8080/day06/bb/cc.php
Servlet线程安全问题
1.每一个Servlet实例都是单例模式,它的实例属性是线程不安全的.
2.每个Servlet实现类在tomcat中都是只有一个实例对象 实例属性是线程不安全
3.servlet是线程不安全的,而造成这种原因主要是以为实例变量不正确的使用(只实例化第一次servlet)
尽量不使用synchronized来解决Servlet线程安全问题
Servlet项目环境
1.ServletContext 当前项目环境
项目环境域对象
ServletContext.SetAttribute() 设置自定义属性
ServletContext.getAttribute() 获取自定义属性
ServletContext.removeAttribute() 移除一个属性值
项目环境常用方法
servletContext.getRealPath("") //取出当前项目的真实地址 ,项目根目录真实地址
servletContext.getResourceAsStream("") //获取当前项目下的文件的字节输入流
ServletConfig 每个Servlet自己的配置对象
servletConfig.getInitParameter() 取出当前Servlet配置对象中的参数值
ServletConfig和ServletContext 区别
从作用范围来说,ServletConfig作用于某个特定的Servlet,即从该Servlet实例化,那么就开始有效,但是该Servlet之外的其他Servlet不能访问;ServletContext作用于某个webapp,即在一个webapp中相当于一个全局对象,在Servlet容器启动时就已经加载,对于不同的webapp,有不同的ServletContext
三个域对象理论总结
Servlet中有三个域对象:
request ServletRequest 表示一次请求
创建: 每一个请求都创建一个request对象,同时还会创建一个唯一对应的response
销毁: 响应完成,response销毁
存入数据的作用范围:在该request对象的的有效范围内,注意,请求转发一直都是这一个request
session HttpSession表示一次会话
创建: 浏览器开始访问服务器,服务器执行到request.getSession()方法时.
销毁: 四种销毁session方式
用户行为: 关闭浏览器
服务器被动: session超时时间到
服务器主动:session.invalidate() 安全退出
服务器异常: 服务器炸了.
存入数据的作用范围:当前会话对象session中. 关闭浏览器session销毁
ServletContext 表示项目环境
创建:项目部署启动
销毁: 项目停止运行
存入数据的作用范围:当前项目环境中