Servlet入门篇
Servlet: server applet
1.概念
运行在服务器端的小程序
- Servlet就是一个接口,定义了一个Java类被浏览器访问到(Tomcat识别)的规则。
- 将来我们就是自定义一个类,实现Servlet接口,复写方法。
- 浏览器请求动态资源,找的就是这个继承Servlet的Java类,这个Java类依赖Web服务器软件才能运行,它没有main方法,相当于是Tomcat来执行它。Web服务器软件会创建这个类的对象,调用它复写的方法。
- 不是任意的Java类,Tomcat都可以执行,那这个Java类肯定得遵守一定的规范,Tomcat才能执行它。
- 在java中,接口就是用来定义规则的,这个接口就是Serlet。
2.快速入门
- 创建JavaEE项目
- 定义一个类,实现Servlet接口
public class ServletDemo1 implements Servlet { 类体 } - 实现接口中的抽象方法
- 配置Servlet
在项目WEB-INF文件夹的web.xml中配置:
<!--配置Servlet -->
<servlet>
<servlet-name>demo1</servlet-name>
<servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class>
</servlet>
<!--cn.itcast.web.servlet.ServletDemo1是全类名 -->
<!--<servlet>中仅仅是对这个类的名称配置了个名字demo1 -->
<servlet-mapping>
<servlet-name>demo1</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
<!--<servlet-mapping>做一个映射,demo1对应着cn.itcast.web.servlet.ServletDemo1这个类。 -->
<!--这个类将来能被哪个路径访问到,<url-pattern>中就写着一个资源路径/demo1。 -->
补充小知识点
- run->Edit Configuration->Deployment->Application context中的’/‘改成:’/+项目名’.
- 那url是:localhost:8080/day13_tomcat/demo1,才能访问到,将来会以每个项目名称作为虚拟目录(day13_tomcat).
- 如果虚拟目录是’/’,那浏览器访问时,url不加项目名称,可以直接访问.
- 但如果后期项目多了,你每一个都设置为’/’,那肯定不合适.所以一般是’/’+项目名称.
分析:
- localhost:8080找到Tomcat.
- /day13_tomcat找到Tomcat下部署的项目,(虚拟目录可以找到项目).
- /demo1,其中的demo1是资源名称,把java类映射成资源路径,Tomcat内部检索,找web.xml,有没有
<url-patturn>
是/demo1,找到了之后.- 接着找跟它一对的demo1,相当于找到下的demo1,进而找到全类名.
- 找到全类名后,进行反射机制操作,调用继承Servlet类的重写方法servlet.
- 全类名的反射过程
- 1.tomcat将全类名对应的字节码文件加载进内存.Class.forName();
- 2.创建对象,cls.newInstance();
- 3.调用方法–service();
3.执行原理
- 当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
- 查找web.xml文件,是否有对应的标签体内容(与资源路径一致)。
- 如果有,则在找到对应的全类名
- tomcat会将字节码文件加载进内存,并且创建其对象
- 调用其方法
- 服务器处理浏览器的请求过程(个人概括):
服务器获取浏览器请求的url,解析url,获取资源路径;然后Tomcat在web.xml里找到与该资源路径对应的全类名;接着将全类名的字节码文件加载进内存,然后创建继承Servlet接口的对象;最后调用service()方法。
Servlet的5个方法
- init、getServletConfig、service、getServletInfo、destroy;
4.Servlet中的生命周期方法
(要分清servlet与三个方法的关系,不能混淆了。servlet是接口,那三个是接口中的方法。)
- 被创建:执行init方法,只执行一次
- Servlet什么时候被创建?
- 默认情况下,第一次被访问时,Servlet被创建
- 可以配置执行Servlet的创建时机。
在
<servlet>
标签下配置
- 第一次被访问时,创建
<load-on-startup>
的值为负数- 在服务器启动时,创建
<load-on-startup>
的值为0或正整数
Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的
- 多个用户同时访问时,可能存在线程安全问题。
- 解决:尽量不要在Servlet中定义成员变量。
- 即使定义了成员变量,也不要对修改值。
- 或者变量放在局部变量里。
- 提供服务:执行service方法,执行多次
- 每次访问Servlet时,Service方法都会被调用一次。
- 被销毁:执行destroy方法,只执行一次
- 只有服务器正常关闭时,才会执行destroy方法。
- 提个问题,destroy方法执行的时机是在销毁servlet之前,还是之后?
- destroy方法在Servlet被销毁之前执行,一般用于释放资源.
个人小结:
- Servlet什么时候被创建?
- 默认情况下,第一次被访问时,Servlet被创建;
- 通过配置,第一次被访问时创建,或者在服务器启动时创建。
- Servlet什么时候被调用?
- 每次访问Servlet时,Service方法都会被调用一次。
- Servlet什么时候被销毁?
- 服务器关闭时,Servlet被销毁。
5.Servlet3.0
-
好处:
- 支持注解配置。可以不需要web.xml了。
-
步骤:
- 创建JavaEE项目,
File->new->Module-> Java Enterprise->JavaEE 7->在勾选web Application的时候,选择Servlet的版本3.0以上,可以不创建web.xml - 定义一个类,实现Servlet接口
- 复写方法
- 在继承Servlet接口的类上使用@WebServlet注解,进行配置
- @WebServlet("urlPatterns = “资源路径”)
WebServlet源码:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WebServlet {
String name() default "";//相当于<Servlet-name>
String[] value() default {};//代表urlPatterns()属性配置
String[] urlPatterns() default {};//相当于<url-pattern>
int loadOnStartup() default -1;//相当于<load-on-startup>
WebInitParam[] initParams() default {};
boolean asyncSupported() default false;
String smallIcon() default "";
String largeIcon() default "";
String description() default "";
String displayName() default "";
}
6.IDEA与tomcat的相关配置
- IDEA会为每一个tomcat部署的项目单独建立一份配置文件
- 查看控制台的log:Using CATALINA_BASE:
“C:\Users\fqy.IntelliJIdea2018.1\system\tomcat_itcast”
- 工作空间项目 和 tomcat部署的web项目
- 工作空间项目–>D:\IdeaProjects\day13_tomcat\out\artifacts\day13_tomcat_war_exploded
- tomcat部署的web项目–>D:\IdeaProjects\day13_tomcat\web
- tomcat真正访问的是“tomcat部署的web项目”,
- “tomcat部署的web项目"对应着"工作空间项目” 的web目录下的所有资源
- 断点调试:使用"小虫子"启动 dubug 启动(debug Tomcat)
小知识点:
- WEB-INF目录下的资源不能被浏览器直接访问。
- src下的java文件将来被编译成之后,它会放到WEB-INF目录下的class目录下.