servlet介绍
Servlet是运行在java服务端的程序 用于接收和响应来自客户端基于HTTP的请求
理解:servlet可以接收到请求,然后还可以对客户端就行响应
实现响应和接收请求就得实现其接口然后就行你想要的操作。
实现其功能要实现他的接口
Servlet的实现方式
1、实现servlet接口 实现其所有的抽象方法 : 最大程度的自定义
2、继承GenericServlet抽象类 重写service方法 与http协议无关 开发简单
3、继承httpServlet抽象类 重写doget、dopost方法 和http协议相关
其实httpServlet的doget和dopost是由service方法转换来的
servlet的执行过程:
1、客户端发起请求
2、Tomcat服务器接收到请求解析请求地址url
3、通过解析到的url找到对应的项目-----就是虚拟路径对应的war包
4、然后在找到改项目的配置文件web.xml
5、解析请求资源地址URI—就是虚拟路径后面的地址
6、通过每一个servlet类都对应的映射里面相应的地址找到对应的类
7、执行该类中的方法,响应给客户端服务器。
Servlet的生命周期
出生:init
活着:service/doget、dopost
死亡:destroy
Servlet对象只会创建一次 销毁一次 只有一个实例
Servlet线程安全问题
首先:servlet线程是不安全的
一个浏览器可以代表一个线程,那么多个浏览器就是代表多个线程,可能会出现数据混乱的问题
我们可以将不共用的成员变量、或者说每次使用都需要进行赋值的成员变量定义到doget和dopost方法里面去,或者使用同步代码块
如果共用变量只在初始化时赋值。其他时间都是只获取的话,那么就没有问题。
Servlet映射方式
1、具体名称:访问路径必须和映射配置完全相同
2、/开头 + * :只要符合目录结构 不用考虑结尾是什么
3、* + 固定格式 :只要符合固定结尾格式即可,不用考虑前面的路径
注意:三种方式可能会出现都匹配的情况冲突 那么越具体的优先级越高
1 > 2 > 3
Servlet创建时机
1、第一次访问是创建:不写标签时或者里面的参数为负整数时
优点:不会影响服务器启动的效率
缺点:无法在应用加载时做初始化操作
2、在服务器加载时创建:添加了标签,且里面的参数为正整数时,
值越小优先级越高,因为一个项目可以有多个servlet对象
优点:提前创建好对象,提高执行效率,完成应用加载时需要的操作
缺点:影响服务器启动效率,占用内存
默认的Servlet
是服务器提供的一个servlet,在配置文件conf中的web.xml中,当请求没有访问到资源时,就会将显示这个默认servlet资源信息。
ServletConfig
每一个Servlet都有一个对应的ServletConfig配置信息
比如:
<servlet>
<servlet-name>ServletDemo1</servlet-name>
<servlet-class>ServletDemo1</servlet-class>
//配置ServletConfig初始化参数
//注意:需要写到servlet标签里面 可以写多个 但是一个init-param标签只能写一个键值对
<init-param>
<param-name>name1</param-name>
<param-value>jace</param-value>
</init-param>
<init-param>
<param-name>name2</param-name>
<param-value>sara</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo1</servlet-name>
<url-pattern>/servletdemo1</url-pattern>
</servlet-mapping>
作用:在Servlet初始化时,将这些配置信息传递给Servlet
生命周期和Servlet相同
方法:
首先要获取ServletConfig对象
因为每一个servlet都有一个对应的servletConfig对象,我们可以使用gitServletConfig得到这个对象
1、getInitParameter(key):得到对应的value
2、getInitParameterNames():得到所有的name的枚举项 然后可以使用迭代器遍历进行操作
3、getServletName():得到该Servlet的servlet-name中的参数----servlet的名字
4、getServletContext():得到全局共享数据对象—应用域对象—应用上下文对象
ServletContext对象
全局共享数据对象—应用域对象—应用上下文对象
实现数据共享
生命周期:和应用生命周期一样
//单独存在 因为是共享的 使用不能放在某一个servlet中
<context-param>
<param-name>desc</param-name>
<param-value>utf-8</param-value>
</context-param>
方法:
getInitParameter(key):获取对应的值
getContextPath():获取虚拟路径
getRealPath(“文件名”):获取文件在磁盘绝对路径-----重要
解:当我们开启服务器之后,上传项目,每一客户端项目中的文件的路径都是不一样的,后续需要路径的操作时,我们就需要得到准确的对应的路径,所以需要使用该方法
在src下的文件最为复杂:比如src目录下的a.txt文件:他的绝对路径:是在该客户端磁盘中war包中的classes文件中
在web目录下的文件,比如在web目录下的b.txt文件:他的绝对路径:是在该客户端磁盘war包下
在web/WEB-INF目录下,和上面类似,多了一层而已
setAttribute(name,value):设置应用域中的存储数据
getAttribute(name):获取name对应的value
removeAttribute(name):移除应用域对象中的数据
自动注解开发
每一个servlet都有一个对应的映射配置,当一个项目中有很多servlet时,配置这些映射就很繁琐了,自动注解就很好的解决了这个问题
首先,这个注解是别人帮我们弄好了滴。。。。会用就行
@WebServlet(‘uri’):找到该类的uri----也就是里面对应的值
注解里面还有很多的东西都是跟映射配置相关。
模板
一个项目中servlet的太多,我们可以搞一个模板,这样提高开发效率。需要有不同名字的地方用 ${NAME}.