• Servlet里的学问(一)


    Servlet : Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容。

    它是和平台无关的服务器端组件,运行在servlet容器中,用来处理用户的请求与服务器的交互,通过调用servlet的方法,来实现用户的请求,大体模式如下图所示:

    一、servlet的生命周期

    那么废话不多说,我们先来创建一个servlet,在eclipse中创建web应用就不提了,这里我们建立一个java类来实现servlet接口,最本质的servlet

     1 package com.servlet;
     2 
     3 import java.io.IOException;
     4 
     5 import javax.servlet.Servlet;
     6 import javax.servlet.ServletConfig;
     7 import javax.servlet.ServletException;
     8 import javax.servlet.ServletRequest;
     9 import javax.servlet.ServletResponse;
    10 
    11 public class HelloServlet implements Servlet{
    12 
    13     @Override
    14     public void destroy() {
    15         // TODO Auto-generated method stub
    16       System.out.println("服务器关闭了???");
    17       System.out.println("我被销毁了。。。。");
    18     }
    19 
    20     @Override
    21     public ServletConfig getServletConfig() {
    22         // TODO Auto-generated method stub
    23         return null;
    24     }
    25 
    26     @Override
    27     public String getServletInfo() {
    28         // TODO Auto-generated method stub
    29         return null;
    30     }
    31 
    32     @Override
    33     //servlet初始化
    34     public void init(ServletConfig arg0) throws ServletException {
    35         System.out.println("在这里初始化....");
    36         
    37     }
    38 
    39     @Override
    40     //每执行一次请求都会调用这个方法
    41     public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
    42         // TODO Auto-generated method stub
    43         System.out.println("只要向浏览器发送请求就会调用我....");
    44     }
    45 
    46 }

    在相应的web.xml中配置当前servlet信息

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
     3   <display-name>webdemo01</display-name>
     4   <!-- 配置servlet信息 -->
     5   <servlet>
     6   <servlet-name>helloServlet</servlet-name>
     7   <servlet-class>com.servlet.HelloServlet</servlet-class>
     8   </servlet>
     9   <!-- 配置访问信息 -->
    10   <servlet-mapping>
    11   <servlet-name>helloServlet</servlet-name>
    12   <url-pattern>/huha</url-pattern>
    13   </servlet-mapping>
    14 </web-app>

    OK,接下来我们就启动tomcat服务器看看servlet的整个运行

    我们在浏览器里输入请求地址,huha就是<url-pattern>/huha</url-pattern>的内容,然后我们看servlet方法调用的情况,看控制台:

    可以看到,第一次请求时先是调用了init()方法,其实在调用init()之前应该最先被调用的是默认的构造方法,因为毕竟servlet要被创建嘛

    然后会调用service()方法,而且每请求一次,就会调用一次。不断的刷新页面,就可以看到下图的效果。

     接下来就关闭服务器,看看会怎样,不过这里有一个很蛋疼的问题,就是直接在eclipse里关闭服务器,并不会显示调用destory()方法,我是通过如下方式关闭才验证的,shutdown命令执行完成以后,控制台就会输出如下:

     整个上面就验证了servlet的完整的生命周期,创建之后第一次请求时即被初始化,请求就会不断执行service(),关闭服务器就会被destory掉。

    二、我们看看init()的时候都会有哪些操作?

    (1)获取当前servlet里的初始化参数以及对应的值,首先要做的就是在web.xml里配置当前servlet方法时,就要配置初始化参数。如下所示:

     1  <servlet>
     2     <servlet-name>helloServlet</servlet-name>
     3     <servlet-class>com.servlet.HelloServlet</servlet-class>
     4     <!-- 配置servlet的初始化参数 -->
     5     <init-param>
     6     <param-name>username</param-name>
     7     <param-value>yao</param-value>
     8     </init-param>
     9     <init-param>
    10     <param-name>pwd</param-name>
    11     <param-value>123456</param-value>
    12     </init-param>
    13     
    14   </servlet>
    15   <servlet-mapping>
    16     <servlet-name>helloServlet</servlet-name>
    17     <url-pattern>/huha</url-pattern>
    18   </servlet-mapping>

    获取初始化参数的代码如下所示:

     1     public void init(ServletConfig servletConfig) throws ServletException {
     2         System.out.println("在这里初始化....");
     3         // 获取当前servlet的初始化参数,方法一
     4         String username = servletConfig.getInitParameter("username");
     5         System.out.println("username:" + username);
     6         String password = servletConfig.getInitParameter("pwd");
     7         System.out.println("password:" + password);
     8         // 接下来是方法二,使用枚举
    Enumeration<String> params = servletConfig.getInitParameterNames();
    while (params.hasMoreElements()) {
    String name = (String) params.nextElement();
    String value = servletConfig.getInitParameter(name);
    System.out.println("-->" + name + ":" + value); 9 System.out.println("=====================");
    10 } 11

    结果如下图所示:

    (2)获取servletContext对象,这个很重要,而且使用servletContext的时候要多于servletConfig,所以看看init()的时候还可以干些什么事;servletContext对象,它是整个web应用程序的“大管家”。

    每个应用都会有一个ServletContext对象与之关联,当容器分布在在多个虚拟机上时,web应用在所分布的每个虚拟机上都拥有一个ServletContext实例.缺省情况下,ServletContext不是分布式的,并且只存在于一个虚拟机上

    首先它可以获取多个servlet公用的初始化参数,比如说配置的数据库连接信息啊这些,如下所示:

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
     3   <display-name>webdemo01</display-name>
     4   <!-- 配置整个web应用,多个servlet公用的初始化参数 -->
     5   <context-param>
     6   <param-name>driver</param-name>
     7   <param-value>com.mysql.jdbc.Driver</param-value>
     8   </context-param>
     9   <context-param>
    10   <param-name>jdbcUrl</param-name>
    11   <param-value>jdbc:mysql://localhost:3306/db20180129</param-value>
    12   </context-param>
    13   <context-param>
    14   <param-name>user</param-name>
    15   <param-value>root</param-value>
    16   </context-param>
    17   <context-param>
    18   <param-name>password</param-name>
    19   <param-value>root</param-value>
    20   </context-param>
    21   
    22   <servlet>
    23     <servlet-name>helloServlet</servlet-name>
    24     <servlet-class>com.servlet.HelloServlet</servlet-class>
    25     <!-- 配置servlet的初始化参数 -->
    26     <init-param>
    27     <param-name>username</param-name>
    28     <param-value>yao</param-value>
    29     </init-param>
    30     <init-param>
    31     <param-name>pwd</param-name>
    32     <param-value>123456</param-value>
    33     </init-param>
    34     
    35   </servlet>
    36   <servlet-mapping>
    37     <servlet-name>helloServlet</servlet-name>
    38     <url-pattern>/huha</url-pattern>
    39   </servlet-mapping>
    40 </web-app>

    使用servletContext对象获取初始化参数的程序如下所示:其实也是有两种方法,单独获取或者通过枚举,这里只给出比较简单的一种吧

        ServletContext servletContext = servletConfig.getServletContext();
            String driver = servletContext.getInitParameter("driver");
            String url = servletContext.getInitParameter("jdbcUrl");
            String user = servletContext.getInitParameter("user");
            String pwd = servletContext.getInitParameter("password");
            System.out.println("初始化参数,driver:" + driver + ",url:" + url + ",user:" + user + ",password:" + pwd);
            System.out.println("=====================");
    这个也是在init()方法中执行的

    运行结果如下图所示:

    (3)servletContext对象可以获取某一个文件在服务器上的路径,比如我们在 WebContent下新建一个文件,a.txt

    1 // 获取文件在服务器上绝对路径,而不是发布前的文件在磁盘上的物理路径
    2         String path = servletContext.getRealPath("/a.txt");
    3         System.out.println("路径:" + path);

    运行结果如下图:

    三、另外的一些东西,怕以后忘了

    (1)配置servlet 时,会有<load-on-startup>3</load-on-startup>这样一个配置

    说明: init()方法一般在第一次请求时会被调用,但是加了load-up,启动服务就会调用init()方法

    load-on-startup的参数值若为负数,则在第一次请求时被创建,并直接调用init()方法;若为正数,值越小 就越先被启动 

    (2)同一个servlet可以被多次映射,即<servlet-mapping>可以配置多个,以处理不同的访问需求,例如下面的例子:

     1  <!-- 同一个servlet可以被多次映射 -->
     2   <servlet>
     3   <servlet-name>HelloServlet</servlet-name>
     4   <servlet-class>com.demo.servlet.HelloServlet</servlet-class>
     5   <!-- 配置初始化参数 -->
     6   <init-param>
     7   <param-name>user</param-name>
     8   <param-value>root</param-value>
     9   </init-param>
    10   
    11    <init-param>
    12   <param-name>password</param-name>
    13   <param-value>1235</param-value>
    14   </init-param>
    15   <load-on-startup>1</load-on-startup>
    16   </servlet>
    17   <servlet-mapping>
    18   <servlet-name>HelloServlet</servlet-name>
    19   <url-pattern>/hey</url-pattern>
    20   </servlet-mapping>
    21   <!-- ===========所有请求为html后缀的都由HelloServlet来处理 -->
    22   <servlet-mapping>
    23   <servlet-name>HelloServlet</servlet-name>
    24   <url-pattern>*.html</url-pattern>
    25   </servlet-mapping>

     JSP编译运行原理:F:Program FilesWorkSpace.metadata.pluginsorg.eclipse.wst.server.core mp0workCatalinalocalhostwebdemo01orgapachejsp

  • 相关阅读:
    目标检测评价指标
    DALSA相机SDK不完全教程
    windows 安装pycocotools
    keras第二课:后端函数
    Python中os.mkdir()与os.makedirs()的区别
    ARM知识
    神经网络结构
    PIL 中的 Image 模块
    Matplotlib使用
    keras第一课:Cifar分类
  • 原文地址:https://www.cnblogs.com/yaoruozi/p/8728212.html
Copyright © 2020-2023  润新知