Servlet --- [Servlet,servlet的创建及使用,servlet的生命周期]

Posted 小智RE0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Servlet --- [Servlet,servlet的创建及使用,servlet的生命周期]相关的知识,希望对你有一定的参考价值。



什么是Servlet?


Servlet(Server Applet) 是Java Servlet的简称,意为用Java编写的服务器端的程序,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。
它运行在web服务器中,web服务器负责Servlet和客户的通信以及调用Servlet方法,Servlet和客户通信采用“请求/响应”的模式

狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
最早支持Servlet标准的是JavaSoft的Java Web Server,此后,一些其它的基于Java的Web服务器开始支持标准的Servlet。

Servlet 的主要功能在于交互式地浏览和修改数据,生成动态 Web 内容。这个过程为:

  • 客户端发送请求至服务器端;
  • 服务器将请求信息发送至 Servlet;
  • Servlet 生成响应内容并将其传给服务器。响应内容动态生成,通常取决于客户端的请求;
  • 服务器将响应返回给客户端。

servlet的创建及使用


首先在WEB-INF文件夹中创建名为libDirectory ;将需要的jar包文件导入.

将jar包添加到项目中.

按住Ctrl,将两个jar包同时选中,右键,选择Add as Library

(1)创建一个类继承javax.servlet.http包下的HttpServlet

/**
 * 登录功能的servlet
 */
public class LoginServlet extends HttpServlet {
    //构造方法:只被调用一次,仅创建一个servlet对象;
    //只有第一次访问Servelt时或服务器启动时创建Servlet实例。
    public LoginServlet() {
        System.out.println("无参构造方法");
    }
    //Init方法:只被调用一次,在Servlet实例创建好实例后立即执行,用于执行一些初始化Servlet的操作。
    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("init方法");
    }
    //service方法:多次调用,每次请求都调用service方法,根据请求方式调用doGet()或doPost()方法。
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("service方法");
    }
    //destroy:只被调用一次,在服务器关闭时调用,执行一些操作。
    @Override
    public void destroy() {
        System.out.println("destory方法");
    }
}

(2)在web.xml文件中配置Servlet

xml: 可扩展性标记语言; 主要用于存储数据.
web.xml:存储web项目的配置信息,在服务器启动时,由服务器读取.

<servlet>元素用于注册Servlet,它包含有两个主要的子元素:
<servlet-name><servlet-class>,分别用于设置Servlet的注册名称和Servlet的完整类名(取到类的字节码文件地址)。

<servlet-mapping>元素用于映射已注册的Servlet的对外访问路径,
它包含有两个子元素:<servlet-name><url-pattern>,分别用于指定Servlet的注册名称和Servlet的对外访问路径。
<servlet-name>对应<servlet>中的<servlet-name>

url-pattern配置模式”/”代表当前web应用的根目录
精确匹配 例如/test 访问http://10.43.11.143/myapp/test
匹配任意的url 例如/* 访问http://10.43.11.143/myapp/abc
同一个Servlet可以被映射到多个URL上

例如:
<servlet-mapping>
  <servlet-name>MyServlet</servlet-name>
  <url-pattern>/demo.html</url-pattern> 
  <url-pattern>/table</url-pattern>
</servlet-mapping>

关于在web.xml文件中配置Servlet以及映射文件配置

 <!--配置用于注册的Servlet-->
    <servlet>
        <servlet-name>login</servlet-name>
        <!--通过反射机制:可根据类的地址动态创建对象-->
        <servlet-class>com.lzq.startweb01.servlet.LoginServlet</servlet-class>
    </servlet>
    
<!--<servlet-mapping> 用于映射已注册的Servlet的对外访问路径-->
    <servlet-mapping>
        <servlet-name>login</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping>

(3)编写前端jsp文件

例如,写个 form 表单,发送的数据将会对应到<servlet-mapping>映射文件处,再映射<servlet>配置文件处;然后通过< servlet-class> 创建 LoginServlet 类对象.

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>初识JavaWeb</title>
  </head>
  <body>
  <form action="login">
    账号:<input type="text" name="account"/><br/>
    密码:<input type="password" name="password"/><br/>
    <input type="submit" value="登录"/>
  </form>
  </body>
</html>

(4)启动服务器

第一次点击登录提交时;控制台打印:

无参构造方法
init方法
service方法

第二次登录提交时;控制台打印:

service方法

关闭服务器时,销毁方法destroy 执行.



其他配置文件

web.xml文件配置<servlet>时,还可使用标签元素 < load-on-startup>
当值小于0或者没有指定时,在该servlet被选择时才会去加载。
当值为0或者大于0,就会在服务器启动时加载servlet;
值越小,加载顺序优先级越高.

案例:

<servlet>
        <servlet-name>login</servlet-name>
        <!--反射机制:可根据类的地址动态创建对象-->
        <servlet-class>com.lzq.startweb01.servlet.LoginServlet</servlet-class>
        <!--默认为负数,当改为非负数时,服务器一启动,就会创建该servlet对象,加载该servlet-->
        <load-on-startup>1</load-on-startup>
    </servlet>

启动服务器;此时还未提交表单;无参构造方法与init方法就已经调用了;也是由于<load-on-startup>设置了非负数的缘故,服务器已启动,登录的servlet就加载


web.xml文件配置<servlet>时,还可使用标签元素<init-param>;
用于配置初始化参数

案例:

<servlet>
        <servlet-name>login</servlet-name>
        <!--拿到这个类的字节码文件地址-->
        <!--反射机制:可根据类的地址动态创建对象-->
        <servlet-class>com.lzq.startweb01.servlet.LoginServlet</servlet-class>
        
        <!--配置初始化参数-->
        <init-param>
            <param-name>names</param-name>
            <param-value>9</param-value>
        </init-param>
    </servlet>

LoginServlet的init初始化方法中可以获取这个参数值;

//Init方法:只被调用一次,在Servlet实例创建好实例后立即执行,用于执行一些初始化Servlet的操作。
    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("init方法");
        //可获取到配置参数名为names的值;
        System.out.println(config.getInitParameter("names"));
    }

启动服务器;提交表单之后;获取到了在<init-param>param-value中设置的数值.



servlet的生命周期


实例化:

调用构造方法:只被调用一次,仅创建一个servlet对象;只有第一次访问Servelt时或服务器启动时创建Servlet实例。
无参构造方法默认隐式存在

初始化:

调用Init方法:只被调用一次,在Servlet实例创建好实例后立即执行,用于执行一些初始化Servlet的操作。
若没有初始化,则默认调用父类的方法.

相关服务

service方法:可以多次调用,提供服务;每次请求都会调用service方法,根据请求方式调用doGet()或doPost()方法。

销毁(死亡)

destroy:只被调用一次,在服务器关闭时调用,例如执行数据日志保存,数据备份
若最终没有需要执行的;可以不去重写方法,但是默认调用父类的destory方法

无参构造的实例化方式,默认存在;
初始化方法 init ,默认调用父类的;
service方法,可调用父类中的; 在父类中会判断请求方式 ; get对应doGet方法; post对应doPost 方法.
销毁方法 destory 默认调用父类的;


更改默认的前端文件;
在web.xml添加配置

<!--设置默认加载页面-->
    <welcome-file-list>
        <welcome-file>指定的页面</welcome-file>
    </welcome-file-list>

以上是关于Servlet --- [Servlet,servlet的创建及使用,servlet的生命周期]的主要内容,如果未能解决你的问题,请参考以下文章

创建servlet的三种方式

Servlet编程

Servlet的基本架构

Servlet

servlet编程

SERVLET 高效总结