- Servlet:Server Applet
1. Servlet本质是一个接口,定义了Java类被浏览器访问(Tomcat识别)到的规则
2. 任务就是自定义类,实现Servlet接口,重写方法
- 使用步骤:
1. 创建JavaEE项目
2. 定义一个类,实现Servlet接口
public class ServletDemo01 implements Servlet{}
3. 实现接口中的抽象方法
* public void init(ServletConfig servletConfig)
* public ServletConfig getServletConfig()
* public void service(ServletRequest servletRequest, ServletResponse servletResponse)
-- 该方法用于提供服务,当浏览器访问一次配置后的该类对象,便调用一次该方法
* public String getServletInfo()
* public void destroy()
4. 配置Servlet -- 在web.xml文件根标签中配置
<!--配置Servlet名称和其实际对应的类名(要写全类名)-->
<servlet>
<servlet-name>demo1</servlet-name>
<servlet-class>cn.mysilentcat.web.servlet.ServletDemo01</servlet-class>
</servlet>
<!--servlet-mapping配置的是servlet名称与访问的虚拟目录-->
<servlet-mapping>
<servlet-name>demo1</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
5. 实现细节:
1. 浏览器地址栏中输入URL:
http://localhost:8080/Project_Tomcat/demo1
2. 本地Tomcat接收到请求,查找部署的Project_Tomcat项目
3. 到该项目的下的web.xml文件中查找url-pattern标签是否有/demo1
3. 找到/demo1中后,在获取该<servlet-mapping>标签中映射的servlet-name值
4. 然后依据定义的servlet-name值查找对应的类名(全类名)
5. 获取到全类名后,利用反射机制,Tomcat将全类名对应的字节码文件加载进内存 -- Class.forName()
6. Tomcat会创建一个类对象,用该类对象调用service方法 --> 由于该类实现了Servlet接口,因此一定有该方法
- Servlet成员方法与生命周期
1. 成员方法:
1. 初始化方法:
* public void init(ServletConfig servletConfig)
-- 仅在Servlet被创建时执行,仅执行一次
-- Servlet默认在第一次被访问时创建的,即第一次被访问会先后执行init和service方法
2. 获取Servlet配置对象
* public ServletConfig getServletConfig()
--
3. 提供服务的方法:
* public void service(ServletRequest servletRequest, ServletResponse servletResponse)
-- 该方法用于提供服务,当浏览器访问一次配置后的该类对象,便调用一次该方法
4. 获取Servlet的一些信息:版本,作者等
* public String getServletInfo()
5. 销毁方法:
* public void destroy()
-- 在服务器正常关闭时执行,仅执行一次
2. 生命周期:
1. 被创建:
-- Servlet默认在第一次被访问时创建,但可以修改配置使得在服务器启动时创建
-- 可以同修改web.xml文件属性使得init方法在服务器启动时执行
* 在Servlet标签内创建标签<load-on-startup></load-on-startup>
* 如果该标签的值配置为负数,则表示服务器启动时创建Servlet对象
<servlet>
<load-on-startup>-1</load-on-startup>
</servlet>
* 如果值配置为非负数,则表示第一次被访问时创建Servlet对象
<servlet>
<load-on-startup>1</load-on-startup>
</servlet>
-- Servlet的init方法只执行一次,说明内存中只存在一个Servlet对象,即Servlet是单例的
-- 此时多个用于访问共享资源的用户会产生安全问题
* 尽量不要在Servlet中定义类的成员变量。即使定义楼成员变量,也不要创建修改成员变量的方法
2. 提供服务:
-- 每次访问Servlet时,service方法就会被调用一次
3. 被销毁:
-- 只有服务器正常关闭时,才会执行destroy方法
-- destroy方法通常用于释放资源,它在Servlet销毁前执行,执行完后Servlet被销毁
- Servlet3.0+的注解配置
1. 在Servlet3.0+的版本中支持注解配置,即不再需要配置web.xml文件
2. 注解配置方式:
1. 定义一个类实现Servlet接口
2. 实现接口的抽象方法
3. 在类定义上加上注解(@WebServlet)
4. 在web.xml文件的配置中,我们关心的是全类名到urlpattern的映射
-- 即如何从地址栏中的资源文件信息找到对应的类
-- 现在直接将注解加在类定义上,就不再关心类的查找,仅关心该定义的类的urlpattern为什么
5. 为该类上的注解添加属性urlPatterns和属性值(即虚拟目录名称)
@WebServlet(urlPatterns="/demo")
可以省略属性名,使用默认的value属性,即
@WebServlet("/demo")
3. 注解的属性和属性值:
a. urlPatterns:Servlet的访问路径
1. 可以为一个Servlet定义多个访问路径
* urlPatterns的属性值为String[]类型
* 即可以为一个Servlet定义多个访问路径
* 例如:@WebServlet({"/demo","/demo2","/demo3"})
2. 访问路径的定义规则:
1. /xxx:单层路径
-- @WebServlet("/demo")
2. /xxx/xxx:多层路径,目录结构
-- /*表示任意路径都可以访问到该servlet
-- @WebServlet("/user/*")表示/user/a可以访问;/user/b也可以访问;/user/接任意字符都可以访问
3. xx.do:单层路径
-- @WebServlet("demo.do")
- IDEA与Tomcat的相关配置
1. IDEA会为每一个Tomcat部署的项目单独建立一份配置文件
* Using CATALINA_BASE: "C:\Users\Xxx\.IntelliJIdeaxxx.x\system\tomcat\Tomcat_8_5_31_Xxx"
* 控制台输出的第一行表示该项目的配置文件所在
2. 工作空间项目与tomcat部署的web项目的区别
* 在IDEA中编辑的项目称为工作空间项目
* tomcat真正访问的才是tomcat部署的web项目,该项目在当前项目文件夹下的out文件夹artifacts目录下
3. WEB-INF目录下的资源文件是不能被正常访问到的
4. 断点调试:debug启动
- Servlet体系结构
1. Servlet实现类:
a. GenericServlet类
-- 抽象类
1. 该抽象类实现Servlet接口时,对除了service方法外的其余4个抽象方法进行了空实现
2. 使得自定义类继承GenericServlet类后,仅需要重写service方法即可
3. 于是,如果没有特殊需求,可以简单继承GenericServlet类,至于其他4个方法需要哪个重写哪个即可
b. HttpServlet类
-- 抽象类
-- HttpServlet继承自GenericServlet
1. 初始情况下在service方法中我们要区分提交数据的方式是GET还是POST
2. 依据不同的提交方式来调用不同的方法来提取数据
3. HttpServlet类中已经书写好了if/else的逻辑判定,并提供了doGet和doPost方法用于获取两种数据
4. 因此,自定义类继承HttpServlet类后,不再需要复写service方法,而是重写不同方式的获取数据方法doXxx()
例如:doGet()/doPost()