[TOC]

servlet入门和单列设计模式

1. servlet

概念:运行在服务器端的小程序。

  • servlet其实是一个接口,定义了java类如何能够被浏览器访问到的规范。
  • 我们定义的servlet类需要实现servlet接口,重写servlet接口中的方法

1.1 创建一个Servlet类的步骤

  1. 创建javaEE的工程

  2. 定义一个Servlet实现类实现Servlet接口
    public class HelloServlet implements Servlet

  3. 实现Servlet接口中的所有方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    /**
    * @Date 2020/6/16 19:01
    * @Version 10.21
    * @Author DuanChaojie
    */
    public class HelloServlet implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
    return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {

    }

    @Override
    public String getServletInfo() {
    return null;
    }

    @Override
    public void destroy() {

    }
    }
  4. 配置servlet

    • 在web.xml中配置
1
2
3
4
5
6
7
8
9
10
11
12
13
<servlet>  
<!--指定当前servlet类的信息-->
<servlet-name>HelloServlet</servlet-name>
<!--servlet的名字:可以自定义,一般使用类名--> <servletclass>cn.justweb.servlet.HelloServlet</servlet-class>
<!--当前servlet对象的全路径名-->
</servlet>

<servlet-mapping>
<!--每个servlet标签有一个servlet-mapping与之对应。-->
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/helloServlet</url-pattern>
<!--要访问对应的servlet应该走的路径-->
</servlet-mapping>

1.2.执行原理

  1. 浏览器发送请求:http://localhost:8080/hello
  2. 服务器接收到请求后,解析url地址,要去找到对象的servlet,然后执行他的service方法。
  3. 服务器在加载web.xml的时候,会去解析servlet-mapping中的url-pattern的路径。
  4. 如果找到的对应的路径,根据路径找到servlet-class的全类名。
  5. tomcat将当前的class文件加载到内存中,并且创建它的对象。
  6. 调用servlet中的service方法。
    • servlet对象在第一次访问到当前servlet的时候才创建

1.3. servlet的生命周期

1.3.1 init方法

servlet对象被创建的时候,执行init方法。

1
2
3
4
5
6
7
8
9
/*
* 默认情况下,servlet对象在第一次被访问到的时候创建。
* servlet对象被创建的时机是可以修改的:
* 在<servlet>标签下配置
* <load-on-startup>数值</load-on-startup>
* 如果是0或者正数,tomcat启动的时候就加载当前的servlet对象。
* 如果是负数,第一次访问的时候创建servlet对象。
* 默认值是 -1;
*/

​ 对于servlet来说:只会执行一次init()方法。servlet对象被创建的时候执行当前方法==servlet对象是单例的==。多个用户同时访问的时候,拿到的servlet对象只有一个,而且是同一个。

​ 多个用户同时访问一个Servlet的时候,多线程访问同一个service方法。存在线程安全的问题。线程安全问题主要来源于共享数据并且修改数据。所以在servlet中尽量不要定义成员属性。如果定义了,在service中不要去修改它。

1.3.2 service方法:提供服务的方法。

每次访问servlet的时候,service方法就会被调用一次。

1.3.3 destory方法:销毁的方法。

服务器关闭的时候,servlet被销毁。
只有正常关闭服务器的时候,才会执行destory。
destory的方法会在servlet对象被销毁前执行,一般用来释放资源。

1
2
3
4
5
6
7
//获取servletConfig对象的方法。
//ServletConfig对象:servlet的配置信息。
ServletConfig getServletConfig();


//获取servlet的信息,版本,作者等。。。。
String getServletInfo();

==以上是servlet3.0以前的规范。==

1.3.4 servlet3.0开发的时候使用注解

Servlet3.0(WEB3.0)算是比较新的Servlet技术了,对应的JavaEE版本是6,目前最新的版本是3.1,对应版本JavaEE7

servlet3.0的配置步骤:

  • 1.可以省略web.xml不写。
  • 2.定义一个servlet类
  • 3.实现servlet接口
  • 4.重写方法
  • 5.使用注解配置。
1
2
3
4
5
@WebServlet(urlPatterns = {"/student","/student1"},loadOnStartup = 1)??????
@WebServlet("/mm")
public class HelloServlet implements Servlet{
//重写Servlet方法
}

1.4 单例设计模式在Java中的应用

  • servlet
  • 连接池