服务器就是一台电脑由硬件和软件(程序)组成
servlet就是 javaweb
服务器tomcat中的一个程序软件
servlet是一个小的java程序能够接收和响应前端数据
使用:
实现接口
servlet执行流程:
浏览器发送请求 --》tomcat 解析url
1.解析http请求
2.获取到uri
3.获取到虚拟路径
3.通过虚拟路径找到对应项目 --》项目初始化加载web.xml
1.解析web.xml获取uri和uri对应的servlet实现类存入一个map集合
2.浏览器解析的uri到map集合寻找对应的servlet实现类 --》找到servlet实现类XXXServlet
1.执行service方法响应
servlet体系结构
servlet三种执行实现方式
定义类直接实现servlet
定义类实现genericServlet (sun公司为了方便扩展其他协议以后如果有其他协议也可以实现继承这个接口)
定义类实现Httpservlet
对genericServlet的service方法进行封装单独抽取了get请求和post请求等
注意事项:必须有重写doget() 因为在父类Httpservlet中doget默认抛出400强制子类重写
servlet生命周期
init服务启动用户访问执行
service方法服务启动期间每次访问服务就会开始新线程执行一次service
destroy方法服务停止后执行
Servlet线程安全
由于servlet为单列类所以多个访问同时来用一个通用的成员变量会出现线程问题
解决不要使用成员变量使用局部变量
添加同步代码块(不推荐 加了就没法并发操作了)
servlet不同映射方式
1.(完全路劲)全路径 /userServlet
2.(目录配配)以xxx开始的 */userServlet
3.(扩展名匹配)以什么xxx结束的 *.xxx
优先级
1.>2.>3.
注意事项:*不能在中间不能以字母开头
一个servlet可以配置多个映射
servlet创建时机
1.在访问servlet实现类时创建加载servlet对象
2.在服务器启动时创建servlet实现类
在<servlet>中添加<load-on-startup>1</load-on-startup>值越小优先级越高
负数或不写都为第一次访问时创建
tomcat服务器的默认servlet
当浏览器的uri解析出来在servlet实现类中不存在就会默认访问tomcat默认的servlet返回一个友好的错误提示
servletConfig
介绍:每一个servlet类都有一个servletConfig
作用:在初始化时可以进行配置一些初始参数 然后在每个(servlet实现)类中可以获取(解耦)
servletConfig局部初始化参数配置方式(为啥不直接在java代码中写V而要在xml中写然后在通过代码从xml中获取 原因配置信息,数据与代码的解耦需要修改的时候修 改 xml而不需要修改代码)
使用:在servlet标签中以
<init-param>
<param-name>K</param-name>
<param-value>V</param-value>
</init-param>
形式配置相关配置(可以配置多个init-param)
获取<init-param>中的K,V值
在servlet实现类init方法形参中添加servlerConfig对象tomcat会自动传入一个servletConfig对象
在service方法中就可以使用该对象获取<init-param>中K,V
servlerConfig相关方法
根据参数名获取值getinitparameter(“K”)
获取所有参数名枚举(正常遍历即可)getInitParameterNames()
获取servlet名也就是<servlet-name>值ge'tServletName()
获取servletContext对象getServletContext()
servletContext
context:上下文 在这里上下的范围可以理解为一个项目的范围
每启动一个项目(tomcat服务器)就会有一个servletContext对象
定义:整个项目的域对象
作用:1.用于项目中各个servlet实现类之间的数据共享
2.可以获取项目中资源所在磁盘上的绝对路径
3.可以配置全局初始的初始的参数 然后类中获取全局初始 参数(解耦)
生命周期:服务启动创建关闭销毁
配置:
在根标签配置
<context-param>
<param-name>
</param-name>
<param-value>
</param-value>
</context-param>
相关方法:
获取路径相关的方法:
getMimeType(”a.jpg“);自动拆分解析a.jpg 然后查找到jpg的mime类型返回
获取文件在项目中的绝对路劲:
传入的参数是文件在项目中的相对路径
文件在web下:getRealpath("/a.txt");
文件在web/WEN-INF/下: getRealpath("/WEB-INF/a.txt");
文件在src下: getRealpath("/WEB-INF/classes/a.txt");
通过类加载器获取当前项目下a.txt文件this.getClass().getClassLoader().getResource("/a.txt").getpath();