概念:运行在服务器端的小程序 Servlet就是一个接口,定义了Java类被浏览器访问到(被tomcat识别)的规则 自定义一个类,实现Servlet接口,实现方法
快速入门 1.创建JavaEE项目 2.定义一个类,实现Servlet接口 3.实现接口中的抽象方法 4.在web.xml中配置Servlet <!--配置Servlet-->
<servlet>
<!--servlet名字-->
<servlet-name>demo</servlet-name>
<!--servlet全类名-->
<servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class>
</servlet>
<!--配置servlet映射-->
<servlet-mapping>
<!--servlet名-->
<servlet-name>demo</servlet-name>
<!--虚拟路径-->
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
实现原理
1.当服务器接收到客户端浏览器的请求后,会解析请求的url路径,获取访问的Servlet的资源路径
2.查找web.xml文件,是否有对应的<url-pattern>标签体内容
3.如果有,则再找到对应的<servlet-class>全类名
4.tomcat将全类名对应的字节码文件加载进内存 Class.forName();
5.创建对象 cls.newInstance();
6.调用方法 service();
生命周期
1.被创建:执行init方法,只执行一次
2.提供服务:执行service方法,可以多次被执行
3.被销毁:执行destroy方法,只执行一次
Servlet中的方法
init()
| Servlet被创建时执行,Servlet在第一次被访问时被创建。只能执行一次
| getServletConfig()
| 获取Servlet的配置对象
| service()
| 每次Servlet被访问时执行,可以被执行多次
| getServletInfo()
| 获取servlet的信息:版本号、作者等
| destroy()
| 在服务器正常关闭时执行,只能执行一次
|
可以配置Servlet的创建时机,配值<servlet>标签下的<load-on-startup>
在服务器启动时创建:值为0或正数
在第一次被访问时创建:值为负数
Servlet的init方法只执行一次,说明Servlet是单例的
多个用户同时访问时,可能存在线程安全问题
解决:尽量不要在Servlet中定义成员变量,即使定义了成员变量也不要修改它的值。
Servlet3.0
好处
支持注解配置,可以不需要使用web.xml进行配置
使用步骤
1.创建JavaEE项目,选择Servlet的版本3.0以上,可以不用创建web.xml
2.定义一个类,实现Servlet接口
3.复写方法
4.在类上使用注解@WebServlet,进行配置
IDEA与tomcat的相关配置
1.IDEA会为每一个tomcat部署的项目单独建立一份配置文件
查看控制台的log:log:UsingCATALINA_BASE: "C:\Users\fqy\.IntelliJIdea2018.1\system\tomcat\_itcast"
2.工作空间项目和tomcat部署的web项目
tomcat真正访问的是tomcat部署的web项目,tomcat部署的web项目对应着工作空间的web文件夹下的文件
WEB-INF下的文件不能被浏览器直接访问
断点调试:使用”小虫子“启动debug
Servlet体系结构
Servlet --接口
GenericServlet --抽象类,实现了Servlet
enericServlet只把service方法做成了抽象方法,把其它的方法都做了空实现, 所以,继承GenericServlet只需要重写service方法
HttpServlet --抽象类,继承了GenericServlet,对http协议的一种封装
在HttpServlet中的service方法,会判断请求的方式
对于get方式获取数据:调用doGet()方法
post方式获取数据:调用doPost()方法
所以在使用HttpServlet时需要重写的是doGet和doPost方法
Servlet相关配置
urlpartten:servlet访问路径
1.一个Servlet可以定义多个访问路径:@WebServlet({"/d4","/ddd4","/dddd4"})
2.路径定义规则
/xxx:路径匹配
/xxx/zzz:多层路径,目录结构
*.do:扩展名匹配(前面不能加“/”)
|