Servlet的基础知识总结

Posted *King*

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Servlet的基础知识总结相关的知识,希望对你有一定的参考价值。

1、Servlet技术的核心是Servlet,Servlet API有4个jar包

  • javax.servlet:包含定义了Servlet与Servlet容器之间签约的类和接口
  • javax.servlet.http:包含定义了HttpServlet与Servlet容器之间签约的类和接口
  • javax.servlet.annotation:包含对Servlet、Filter和Listener进行标注的注解,即Servlet3.0的注解配置
  • javax.servlet.descriptor:包含为Web应用的配置信息提供编程式访问的类型

2、Servlet的实现方式

(1)实现Servlet接口来开发Servlet程序

/**
 * 实现Servlet接口来开发Servlet程序
 * @author wanglu
 * @since 1.0, 2021/9/5 8:25
 */
public class ServletDemo implements Servlet {

    // 创建servlet实例时,初始化servlet参数
    @Override
    public void init(ServletConfig config) throws ServletException {
    }

    // 返回一个ServletConfig对象,该对像表示Servlet配置信息
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    // 根据请求方式,处理客户端请求,并发出响应结果
    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
    }

    // 返回关于该Servlet的说明信息
    @Override
    public String getServletInfo() {
        return null;
    }

    // Web应用销毁(停止运行)时,执行该方法,通常用于回收资源
    @Override
    public void destroy() {
    }
}

(2)扩展GenericServlet实现Servlet程序

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

/**
 * 扩展GenericServlet实现Servlet程序
 * @author wanglu
 * @since 1.0, 2021/9/5 8:25
 */
public class ServletDemo2 extends GenericServlet {
    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {

    }
}

(3)扩展HttpServlet实现Servlet程序

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 扩展HttpServlet实现Servlet程序
 * @author wanglu
 * @since 1.0, 2021/9/5 8:26
 */
public class ServletDemo3 extends HttpServlet {
    // 如果浏览器是以get方式提交,则覆写doGet()方法
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
    }

    // 如果浏览器是以post方式提交,则覆写doPost()方法
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

3、Servlet的生命周期

  1. 当浏览器第一次访问Servlet时,服务器会根据浏览器访问的路径,例如/demo,在Web.xml文件中找到该Servlet的全路径进行反射
  2. 调用init()为Servlet作初始化工作
  3. 调用doXxx()为浏览器响应
  4. 如果浏览器再次访问相同的Servlet,只实现从服务端维护的Servlet实例集合中取得对应的实现,为浏览器响应
  5. 同个Servlet实例,在服务端只有一个
  6. 服务器在决定销毁Servlet实例之前,调用destory()方法,每个Servlet实例只会调用一次,在重新部署情况下会发生destory

创建Servlet实例有两种机制

1、客户端发起请求,相应的Servlet实例才开始创建
2、Web应用一启动,就创建Servlet实例,这里方式需要配置一下:<Servlet>中配置<load-on-startup>1</load-on-startup>,值越小,实例化优先级越高,注解配置Servlet,指定参数loadOnStartup=1

4、手写Servlet程序步骤

1、继承HttpServlet

2、重写doGet()或者doPost()方法

public class DemoServlet extends HttpServlet {
    public DemoServlet(){
        System.out.println("加载构造方法:"+this.hashCode());
    }
    
    @Override
    public void init() throws ServletException {
        System.out.println("加载init方法:"+this.hashCode());
        super.init();
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("加载doGet方法:"+this.hashCode());
        super.doGet(req, resp);
    }

    @Override
    public void destroy() {
        System.out.println("加载destroy方法:"+this.hashCode());
        super.destroy();
    }
}

3、在web.xml中注册Servlet

使用普通的方法对Servlet进行注册

<servlet>
        <!-- servlet的名字 -->
        <servlet-name>DemoServlet</servlet-name>
        <!-- servlet类的名字(包括整包名) -->
        <servlet-class>com.demo.servlet.DemoServlet</servlet-class>
        <!--配置参数-->
        <init-param>
            <param-name>encoding</param-name>
            <param-value>GBK</param-value>
        </init-param>
        <!-- 创建servlet实例优先级,值越小,实例化优先级越高-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <!-- 与上面的Servlet的名字要一一对应-->
        <servlet-name>DemoServlet</servlet-name>
        <!-- 表示该servlet的访问路径  /表示项目的根目录-->
        <url-pattern>/DemoServlet</url-pattern>
    </servlet-mapping>

Servlet访问URL使用*通配符,但是只有两种固定格式:

<url-pattern>*.do</url-pattern>
<url-pattern>/*</url-pattern>

5、@WebServlet注解的使用

在servlet3.0以后,我们可以不用在web.xml里面配置servlet,只需要加上@WebServlet注解就可以修改该Servlet属性了,web.xml可以配置的servlet属性,在@WebServlet注解上也都可以配置

@WebServlet属性列表:

属性名类型描述
nameString指定Servlet 的 name 属性,等价于 。如果没有显式指定,则该 Servlet 的取值即为类的全限定名。
valueString[]该属性等价于 urlPatterns 属性。两个属性不能同时使用。
urlPatternsString[]指定一组 Servlet 的 URL 匹配模式。等价于标签。
loadOnStartupinit指定 Servlet 的加载顺序,等价于 标签。
initParamsWebInitParam[]指定一组 Servlet 初始化参数,等价于标签。
asyncSupportedboolean声明 Servlet 是否支持异步操作模式,等价于 标签。
descriptionString该 Servlet 的描述信息,等价于 标签。
displayNameString该 Servlet 的显示名,通常配合工具使用,等价于 标签。

以上是关于Servlet的基础知识总结的主要内容,如果未能解决你的问题,请参考以下文章

JSP基础学习

Servlet的基础知识总结

SERVLET 高效总结

线程学习知识点总结

JSP知识总结

jsp基础知识总结