一 概念 Servlet ==>Server Applet ==> 服务器端的小程序
Servlet 技术的三大组件之一
Servlet 动态资源
Filter 过滤器
Listener 监听器
Servlet 就是一个接口 接口里面定义了一些方法,这些方法分为生命周期方法和另外一部分没有用的方法‘’
二 实现方法
*实现接口
* 继承GenericServlet
* 继承HTTPServlet
三 在MyEclipser中开发Servlet
1创建项目
2创建类并实现Servlet接口
3.编译并将编译后的class文件方知道WEB-INF/classes目录下(Myeclipse会自动做这件事)
4.配置Servlet
四 Servlet 生命周期详解
*Servlet创建的时间? 第一次访问Servlet的时候
*Servlet对象创建的特点? 通过只在第一次调用init的对象,一个servlet实例在服务器中只有一个.
*当请求访问Servlet时候 servlet方法会处理请求
*当服务器要关闭是,服务器会销毁服务器中Servlet对象,在真正销毁之前调用destory方法.
五.Servlet 中其他方法
getServletInfo==>没用
getServletConfig==>获得启动信息
六.ServletConfig
string getInitParameter(String name) 获得配置信息 根据键获得值
Enumeration getInitParameterNames()获得配置的所有键
String getServletName() 获得Servlet的名称 <servlet-name>AServlet</servlet-name>
ServletContext getServletContext() 该方法返回ServletContext对象.
七.Servlet的优化.GenericServlet
1.init方法 妥善的保存config对象
2.空参init方法,为了防止开发人员重写 原生init方法
3.service方法空实现=> 声明城抽象
4.destory方法空实现
5.实现getServletInfo,getServletConfig
6.实现了servletConfig接口. 接口中的方法直接调用config实现类实现.
八.HTTPServlet => 在GenericServlet基础上进一步优化
1.强转
2.根据不同的请求方式调用不同的方法
九 Servlet细节
Servlet的线程安全问题
Servlet的实例在服务器运行期间只有一个实例存在所以是线程不安全的
线程不安全:如果使用成员变量来接受线程参数,如果发生并发那么就会出现线程问题(覆盖)
解决方法 将装载线程参数的变量放置到方法中去 编程局部变量
*Servlet 的创建实例时机
默认情况:第一次访问Servlet时候
让Servlet实例随着服务器的启动而启动
添加一个配置即可:<load-on-startup></load-on-startup>
在该配置中填入一个整数即可实现.
数字的数值,在有多个servlet需要随着服务器启动而启动时,决定启动顺序.
数字越小优先级越高. 最小就是0. 一般0~5. 3.
如果数字一样,谁先配置谁先创建.
Servlet 的路劲配置
<url-pattern></url-pattern>
该配置,配置方式有两种
路径匹配: 一定以"/"开头
/AServlet
/ABC/AServlet
/ABC/BCD/AServlet
/ABC/*
/*
/
后缀名匹配: 以*开头
*.do
*.action
*.html
注意:
匹配范围越大,优先级越低.
后缀名匹配和路径匹配不能同一配置中混合使用. 例如: /*.do
一个servlet可以配置多个路径. 直接在<servlet-mapping>元素中添加多个<url-pattern>配置即可.
优先级: /AServlet > /abc/* > *.do > /*
*tomcat/conf/web.xml 文件理解(了解)
该文件可视为所有项目中web.xml的父配置.
十.ServletContext
ServletContext 对象可以看做是web项目的法人.
一个web项目只有一个ServletContext
创建 随着项目的创建而创建
销毁 随着项目的销毁而销毁
获得:通过ServletConfig对象的 getServletContext方法获得.
功能 :获得项目参数 是servlet技术三个域对象之一 获得项目内部的资源
//-----------------------------------------------------------------------------------
功能:
1>获得项目参数
String getInitParameter(String name)
Enumeration getInitParameterNames()
//-----------------------------------------------------------------------------------
2>域功能
Servlet三大域
application request session
jsp技术的域 page
域实际上是服务器组件之间的通讯
域的实质就是map.
*操作域的方法:
void setAttribute(String key,Object value);
Object getAttribute(String key);
Enumeration<String> getAttributeNames();
void removeAttribute(String key);
//--------------------------------------------------------------------------------------
3>获得项目内资源
// 该方法使用相对路径获得 资源的流 其中 "/" ==> 项目根下 WebRoot
InputStream sc.getResourceAsStream();
// 使用相对路径获得绝对路径
String sc.getRealPath("/student.xml");
// "/"开头 : "/"=>代表classes目录
// 不以"/"开头: 会以当前class所在包为根
InputStream is = c.getResourceAsStream("student.xml");
System.out.println(is);
//获得web-inf/classes下的student.xml的流
InputStream is2 = c.getResourceAsStream("/student.xml");
System.out.println(is2);
//也可以获得绝对路径
URL url = c.getResource("/student.xml");
System.out.println(url.getPath());