Servlet


一.概念
Servlet => Server Applet  => 服务器端的小程序(类)

Servlet技术中的三大组件之一
Servlet 动态资源 
FIlter 过滤器
Listener 监听器

Servlet就是一个接口. 接口中定义了一些方法. 这些方法分为两部分。一部分是生命周期方法。 一部分没啥用。


二.实现servlet接口的方式
*实现接口
*继承GenericServlet
*继承HTTPServlet



三. 在MyEclipse中开发Servlet
1.创建项目
2.创建java类并实现Servlet接口
3.编译并将编译后的class文件方知道WEB-INF/classes目录下(Myeclipse会自动做这件事)
4.配置Servlet


四.Servlet生命周期详解
*Servlet对象创建时机? 第一次访问servlet时.
*Servlet对象创建的特点? 通过只在第一次访问时调用init的现象, 一个servlet实例在服务器中只有一个.
*当请求访问servlet时,service方法会处理请求.
*当服务器将要关闭,服务器会销毁服务器中的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方法获得.

功能:
1.可以获得项目参数
2.是Servlet技术中的3个域对象之一
3.获得项目内的资源
//-----------------------------------------------------------------------------------

功能详解:
1>获得项目参数
String getInitParameter(String name) 
Enumeration getInitParameterNames()
//-----------------------------------------------------
2>域功能
Servlet三大域
application
request
session
jsp技术中的域
page

域用于服务器组件之间的通讯(例如:两个servlet之间通讯).
域的实质就是map.
application域 就是在整个项目内共享数据的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");

十一.使用Class获得项目内资源

//获得当前servlet的Class文件
Class c  = this.getClass();
//2 根据Class 获得资源  
//也是根据相对路径获得字节流
// 填写相对路径时分为两种情况
// "/"开头        : "/"=>代表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());
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐