Servlet详解

1.什么是Servlet?

Servlet(Servlet Applet),官方解释是运行在服务器端的小程序。

严格来说,Servlet就是一个接口,里面定义了JAVA类被浏览器访问到(被TOMCAT识别)的规则。

Servlet接口里面有5个抽象方法,类实现这个接口的方法就可以被访问,从而提供动态数据。

类似这样:

public class ServletDemo 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 {
        return null;
    }

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

    @Override
    public void destroy() {

    }
}

 

2.Servlet接口的几个方法有什么用

(1)void init()    初始化方法,在Servlet被创建时执行,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的。

(2)ServletConfig getServletConfig()    获取Servlet的配置对象。

(3)void service()    提供服务方法,每一次Servlet被访问时都会执行,可以执行多次。

(4)String getServletInfo()    获取Servlet的一些信息,版本,作者等。

(5)void destroy()   销毁方法,在服务器正常关闭时执行,执行一次,只有服务器正常关闭时,才会执行destroy方法,而且destroy方法在Servlet被销毁之前执行的。

可以看出,基本上用的比较多的就是void service()。其他的基本没太大用处。

 

3.Servlet3.0以前的Servlet配置

一个类实现了Servlet接口,但是我们应该访问什么URL才能到达这个类呢?这时候需要对Servlet进行配置。而且Servlet3.0(JAVAEE 6)以前的配置十分麻烦。

首先要说下一般JAVAEE的项目目录:

                    -- 项目的根目录

                        --静态资源(html等)
                        -- WEB-INF目录:
                            -- web.xml:web项目的核心配置文件
                            -- classes目录:放置字节码文件的目录
                            -- lib目录:放置依赖的jar包

Servlet3.0的配置就是在web.xml里面修改的。

        <!--配置Servlet -->
        <servlet>
            <servlet-name>demo</servlet-name>
            <servlet-class>com.pr.web.servlet.ServletDemo</servlet-class>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>demo</servlet-name>
            <url-pattern>/demo</url-pattern>
        </servlet-mapping>

当我们访问localhost:8080/demo时就可以到达ServletDemo类了。

执行原理如下:

    1. 当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
    2. 查找web.xml文件,是否有对应的<url-pattern>标签体内容。
    3. 如果有,则在找到对应的<servlet-class>全类名
    4. tomcat会将字节码文件加载进内存(Class.forName("com.pr.web.servlet.ServletDemo")),并且创建其对象(clazz.newInstance())
    5. 调用其方法

关于配置文件,还有一个比较常用的配置项:

            * 可以配置执行Servlet的创建时机。
                * 在<servlet>标签下配置
                    1. 第一次被访问时,创建
                        * <load-on-startup>的值为负数
                    2. 在服务器启动时,创建
                        * <load-on-startup>的值为0或正整数

 

4.Servlet3.0以后的Servlet配置(Servlet注解配置)

在类上使用@WebServlet注解,进行配置。

@WebServlet("资源路径")

类......

原理:

@WebServlet 里面的全部配置都有默认值,urlPatterns是一个数组,默认值为空。

故可以写成:@WebServlet(urlPatterns = "/demo")

当然也可以写多个。

看源码发现有个value。代表的是最重要的属性,故可以写成:

@WebServlet(value = "/demo")

value又可以省略,故可以写成:

@WebServlet("/demo")

 

5.GenericServlet与HttpServlet

Servlet -- 接口
        |
    GenericServlet -- 抽象类
        |
    HttpServlet  -- 抽象类

    * GenericServlet:将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象
        * 将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可

    * HttpServlet:对http协议的一种封装,简化操作
        1. 定义类继承HttpServlet
        2. 复写doGet/doPost方法

所以一般项目开发直接重写HttpServlet抽象类的doGet()或者doPost()方法即可。如果用GenericServlet抽象类,虽然只需要实现service方法,但是还要对请求进行判断,判断是get请求还是post请求。

 

posted @ 2019-01-24 03:08  苦瓜爆炒牛肉  阅读(213)  评论(0编辑  收藏  举报