Servlet基本原理和配置

1.Servlet概述

  1. 概念:server applet,运行在服务器端的小程序

    • servlet是一个接口,定义了Java类被浏览器访问到(Tomcat识别)的规则
    • 自定义类,实现servlet接口,复写方法
  2. 简单项目

    • 创建按JavaEE项目

    • 定义一个类,实现servlet接口

      • 注:将tomcat安装目录下的bin/servlet-api.jar包导入项目中
      • public class servletdemo1 implements Servlet
    • 实现接口中的抽象方法

    • 在web.xml文件中配置servlet ,写在根标签里

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      <servlet>
      <!--给servlet取名,任意 -->
      <servlet-name>demo</servlet-name>
      <!-- 指明servlet路径,包名.类名 -->
      <servlet-class>cn.hxx.servletdemo1</servlet-class>
      </servlet>
      <servlet-mapping>
      <!--servlet映射,必须与servlet-name同名 -->
      <servlet-name>demo</servlet-name>
      <!--这是浏览器中输入的访问该servlet的url-->
      <url-pattern>/hxx</url-pattern>
      </servlet-mapping>
    • servlet注解配置方法

      在实现类前面加注解 @WebServlet(资源路径)

2.执行原理

  1. 当服务器接收到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径

  2. 查找web.xml文件,是否有对应的 <url-pattern>标签体内容

  3. 如果有,则再找到对应的 <servlet-class>全类名

  4. tomcat将字节码文件加载进内存,并且创建其对象

  5. 调用方法

3.生命周期

  1. 被创建:执行init方法,只执行一次
    • 默认情况下,第一次被访问时,servlet被创建
    • 可以配置执行Servlet的创建时机:在web.xml中 <servlet> 标签体中配置
      1.第一次被访问时,创建,<load-on-startup> 的值为负数
      2.在服务器启动时,创建 ,<load-on-startup> 为0或者正数
    • servlet的init方法,只执行一次,说明一个servlet在内存中只存在一个对象,servlet是单例的。多个用户同时访问时可能存在线程安全问题,所以尽量不要在servlet定义成员变量。即使定义了成员变量,也不要修改值。
  2. 提供服务:执行service方法,执行多次
  3. 被销毁:执行destroy方法,执行一次。服务器正常关闭时,servlet被销毁。在销毁之前被执行,用于释放资源。
  4. getServletInfo:获取servlet的一些信息:版本、作者等等
  5. getServletConfig:获取ServletConfig对象(servlet的配置对象)

4. IDEA、tomcat、servlet相关配置

  1. 启动tomcat控制台或命令窗口中文乱码,将tomcat安装目录/conf/logging.properties中的所有UTF-8修改为gbk格式

  2. IDEA会为每一个tomcat部署的项目单独简历一份配置文件

    • 查看控制台的log:Using CATALINA_BASE: “C:\Users\97130\AppData\Local\JetBrains\IntelliJIdea2020.2\tomcat\Unnamed_tomcat_2”
  3. 工作空间项目 和tomcat部署的web项目

    • tomcat真正访问的是“tomcat部署的web项目”,其存放在整个项目的out\artifacts目录

    • tomcat部署的web项目对应着“工作空间项目”的web目录下的所有资源

    • tomcat断点调试

5.servlet体系结构

  • servlet —- 接口
  • GenericServlet :将servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象方法。在定义servlet类时,可以直接集成GenericServlet类,实现service方法
1
2
3
4
5
6
7
@WebServlet("/demo2")
public class servletdemo2 extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("hello demo2.service....");
}
}
  • HttpServlet:对HTTP协议的一种封装,简化操作
    1. 定义类继承HttpServlet
    2. 复写doGet或doPost
1
2
3
4
5
6
7
8
9
10
11
@WebServlet("/demo3")
public class servletdemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo3 doGet......");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo3 doPost......");
}
}
  • urlpattern:servlet访问路径
    1. 一个servlet可以定义多个访问路径:@WebServlet({“/demo3”,”/dd3”})
    2. 路径定义规则
      • /xxx
      • /xxx/xxx:多层路径,目录结构
      • *.后缀名