zoukankan      html  css  js  c++  java
  • JavaWeb学习笔记:Servlet

    Servlet

    JavaWeb

    概念

    Java Web应用由一组Servlet、HTML页面、类、以及其他能够被绑定的资源构成。

    他能够在各种供应商提供的实现Servlet规范的Servlet容器中执行。

    包括内容

    • Servlet
    • JSP
    • 有用类
    • 静态文档如HTML、图片等
    • 描写叙述Web应用的信息(web.xml)

    Servlet与Servlet容器

    Servlet

    简单介绍

    Java Servlet是和平台无关的server端组件。它执行在Servlet容器中。

    Servlet容器负责Servlet和客户的通信以及调用Servlet的方法。Servlet和客户的通信採用“请求/响应”的模式。

    功能

    • 创建并返回基于客户请求的动态HTML页面。
    • 创建可嵌入到现有HTML页面中的部分HTML页面(HTML片段)。
    • 与其他server资源进行通信。

    生命周期相关的方法

    下面方法都是由 Serlvet 容器负责调用:

    1. 构造器:仅仅被调用一次. 仅仅有第一次请求 Servlet 时, 创建 Servlet 的实例. 调用构造器。 这说明 Serlvet 的单实例的!
    2. init 方法:仅仅被调用一次。 在创建好实例后马上被调用. 用于初始化当前 Servlet。

    3. service:被多次调用。 每次请求都会调用 service 方法. 实际用于响应请求的。
    4. destroy:仅仅被调用一次。 在当前 Servlet 所在的 WEB 应用被卸载前调用. 用于释放当前 Servlet 所占用的资源。

    Servlet容器

    概念

    Servlet容器也称为JavaWeb应用容器,或者Servlet/JSP容器,比方Tomcat。

    感性认识:执行 Servlet、JSP、Filter 等的软件环境。

    Servlet容器为JavaWeb应用提供执行时环境,它负责创建 Servlet、管理Servlet和JSP的生命周期,以及管理它们的共享数据。

    訪问流程

    第一种是訪问静态页面。另外一种情况是訪问动态页面。事实上也就是通过Servlet来和后台数据库进行交互。

    • Web浏览器–>Webserver–>静态页面
    • Web浏览器–>Webserver–>Servlet容器(JSP、Servlet)<–>数据库

    Servlet容器响应客户请求的过程

    客户<-->Servlet容器<-->Servlet

    Servlet配置參数

    load-on-startup

    配置

        <servlet>
            <!-- Servlet 注冊的名字 -->
            <servlet-name>secondServlet</servlet-name>
            <!-- Servlet 的全类名 -->
            <servlet-class>com.buaa.zhao.SecondServlet</servlet-class>
            <!-- 能够指定 Servlet 被创建的时机 -->
            <load-on-startup>2</load-on-startup>
        </servlet>

    说明

    load-on-startup能够指定 Serlvet 被创建的时机。若为负数, 则在第一次请求时被创建(也就是说不请求訪问它。不会被创建)。若为 0 或正数, 则在当前 WEB 应用被Serlvet 容器载入时创建实例, 且数组越小越早被创建。

    serlvet-mapping

    说明

    同一个Servlet能够被映射到多个URL上,即多个 <servlet-mapping> 元素的<servlet-name>子元素的设置值能够是同一个Servlet的注冊名。

    配置

    在Servlet映射到的URL中也能够使用 * 通配符,可是仅仅能有两种固定的格式:一种格式是“.扩展名”,还有一种格式是以正斜杠(/)开头并以“/”结尾。

    两种方式仅仅能选其一,也就是说带/的不能带扩展名

    <servlet-mapping>
        <servlet-name>secondServlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

    OR

    <servlet-mapping>
        <servlet-name>secondServlet</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

    Servlet測试程序

    通过一个程序,观測Servlet的方法功能。

    创建一个 Servlet 接口的实现类

    package com.buaa.zhao;
    
    import java.io.IOException;
    
    import javax.servlet.Servlet;
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    
    public class HelloServlet implements Servlet{
    
        @Override
        public void destroy() {
    
            System.out.println("destory.....");
    
        }
    
        @Override
        public ServletConfig getServletConfig() {
            System.out.println("getServletConfig....");
            return null;
        }
    
        @Override
        public String getServletInfo() {
            System.out.println("getServletInfo....");
            return null;
        }
    
        @Override
        public void init(ServletConfig arg0) throws ServletException {
            System.out.println("init....");
    
        }
    
        @Override
        public void service(ServletRequest arg0, ServletResponse arg1)
                throws ServletException, IOException {
            System.out.println("service....");
    
        }
    
        public HelloServlet() {
    
            System.out.println("HelloServlet's constructor");
        }
    
    
    }
    

    配置web.xml文件

    在文件里加入例如以下内容:

    <!-- 配置和映射Servlet -->
        <servlet>
            <!-- Servlet 注冊的名字 -->
            <servlet-name>helloServlet</servlet-name>
            <!-- Servlet 的全类名 -->
            <servlet-class>com.buaa.zhao.HelloServlet</servlet-class>
        </servlet>
    
        <servlet-mapping>
            <!-- 须要和某一个 servlet 节点的 serlvet-name 子节点的文本节点一致 -->
            <servlet-name>helloServlet</servlet-name>
            <!-- 映射详细的訪问路径: / 代表当前 WEB 应用的根文件夹. -->
            <url-pattern>/hello</url-pattern>
        </servlet-mapping>

    执行測试

    启动Tomcatserver,打开http://localhost:8989/JavaWebTest/hello

    控制端部分输出信息:

    信息: Server startup in 375 ms
    HelloServlet's constructor
    init....
    service....
    service....
    service....
    service....
    service....
    service....
    service....
    service....
    七月 26, 2015 11:46:49 上午 org.apache.catalina.core.StandardServer await
    信息: A valid shutdown command was received via the shutdown port. Stopping the Server instance.
    七月 26, 2015 11:46:49 上午 org.apache.coyote.AbstractProtocol pause
    信息: Pausing ProtocolHandler ["http-apr-8989"]
    七月 26, 2015 11:46:49 上午 org.apache.coyote.AbstractProtocol pause
    信息: Pausing ProtocolHandler ["ajp-apr-8009"]
    七月 26, 2015 11:46:50 上午 org.apache.catalina.core.StandardService stopInternal
    信息: Stopping service Catalina
    destory.....
    七月 26, 2015 11:46:50 上午 org.apache.coyote.AbstractProtocol stop
    信息: Stopping ProtocolHandler ["http-apr-8989"]

    通过输出信息能够观測到:

    • 当訪问http://localhost:8989/JavaWebTest/hello时,执行顺序是HelloServlet()–>init()–>service()
    • 每次刷新页面,会仅仅调用service(),也就是仅仅输出“service….”
    • 关闭server的时候会输出“destory…..”,即调用了destory()
  • 相关阅读:
    进击Node.js基础(一)
    关于bootstrap两个模态框的问题
    系列博文-Three.js入门指南(张雯莉)-网格 setInterval方法 requestAnimationFrame方法 使用stat.js记录FPS
    系列博文-Three.js入门指南(张雯莉)-照相机
    系列博文-Three.js入门指南(张雯莉)-静态demo和three.js功能概览
    for循环执行效率
    c/c++多维数组动态分配与释放
    C/C++数组指针与指针数组详解
    C/C++语言参数传递----值传递、引用传递、指针传递、指针引用传递
    float类型最大值和最小值
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/7228459.html
Copyright © 2011-2022 走看看