zoukankan      html  css  js  c++  java
  • JavaWeb学习之Servlet

    一、Servlet:其实就是一个java程序,运行在我们的web服务器上,用于接收和响应 客户端的http请求。

    二、Hello Servlet

    1、新建一个web工程,要有一个服务器

    2、新建一个实现Servlet接口的类

    3、配置Servlet,用意:匹配客户端请求,指向具体Servlet

    3.1、具体配置文件路径在webContent/WEB-INF/web.xml

    3.2、配置信息

    4、启动Run AS 

    浏览器地址栏:http://localhost:8080/p02_HellowServlet/a

    分析:http://localhost:8080/项目名称+<url-pattern>节点内容(/a)

    <url-pattern>写法:

    Ⅰ、全路径匹配
       以 / 开始   /a /aa/bb
       localhost:8080/项目名称/aa/bb
    Ⅱ、路径匹配 , 前半段匹配
      以  / 开始 , 但是以 * 结束  /a/* /* 
      星号(*)其实是一个通配符,匹配任意文字
      localhost:8080/项目名称/aa/bb
    Ⅲ、以扩展名匹配
      写法: 没有/  以 * 开始   *.扩展名    *.aa *.bb

    三、Servlet执行过程

    1、通过URL请求找到对应Web项目(发布在tomcat服务器上的web项目)

    2、查找web.xml文件中url-pattern节点中是否有符合URL格式的,如果没有就404,有的话获取其兄弟节点servlet-name内容

    3、根据servlet-name查找servlet节点下servlet-class指向servlet的类全名称,并执行Servlet中的service方法

    四、Servlet接口方法分析

     1 public class HelloServlet implements Servlet {
     2     @Override
     3     public void init(ServletConfig config) throws ServletException {
     4     System.out.println("Servlet init");
     5     }
     6 
     7     @Override
     8     public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
     9     System.out.println("Servlet service");
    10     }
    11     
    12     @Override
    13     public void destroy() {
    14     System.out.println("Servlet destroy");
    15     }
    16 
    17     @Override
    18     public ServletConfig getServletConfig() {
    19 
    20     return null;
    21     }
    22 
    23     @Override
    24     public String getServletInfo() {
    25 
    26     return null;
    27     }
    28 }

    运行结果:

     Ⅰ、Init方法:在创建该servlet的实例时,就执行该方法。
            一个servlet只会初始化一次, init方法只会执行一次
            默认情况下是 : 初次访问该servlet,才会创建实例。

    Ⅱ、service方法:只要客户端来了一个请求,那么就执行这个方法了。
              该方法可以被执行很多次。 一次请求,对应一次service方法的调用

    Ⅲ、destroy方法:servlet销毁的时候,就会执行该方法

          1. 该项目从tomcat的里面移除。

            

          2. 正常关闭tomcat就会执行 shutdown.bat

    Ⅳ、getServletConfig方法:对外提供可获取ServletConfig对象的公共方法

        ServletConfig对象所对应的实体,如下图:

          

         ServletConfig对象对应是上图servlet节点,那么就应该有方法可以获取子节点内容的方法

        三个方法:

          getServletName

          getInitParameter(String name)

          getInitParameterNames

          演示:

          servlet节点配置  

     1     <servlet>
     2         <servlet-name>HelloServlet</servlet-name>
     3         <servlet-class>com.marw.servlet.HelloServlet</servlet-class>
     4         <init-param>
     5             <param-name>params01</param-name>
     6             <param-value>1</param-value>
     7         </init-param>
     8         <init-param>
     9             <param-name>params02</param-name>
    10             <param-value>2</param-value>
    11         </init-param>
    12         <init-param>
    13             <param-name>params03</param-name>
    14             <param-value>3</param-value>
    15         </init-param>
    16         <init-param>
    17             <param-name>params04</param-name>
    18             <param-value>4</param-value>
    19         </init-param>
    20         <load-on-startup>2</load-on-startup>
    21     </servlet>

          service方法中的代码

     1     @Override
     2     public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
     3     System.out.println("Servlet service");
     4     
     5     // 获取到的是配置servlet里面servlet-name 的文本内容
     6     String servletName = config.getServletName();
     7     System.out.println("servletName=" + servletName);
     8 
     9     // 2、。 可以获取具体的某一个参数。
    10     String str = config.getInitParameter("params01");
    11     System.out.println("params01=" + str);
    12 
    13     // 3.获取所有的参数名称
    14     Enumeration<String> names = config.getInitParameterNames();
    15     // 遍历取出所有的参数名称
    16     while (names.hasMoreElements()) {
    17         String key = (String) names.nextElement();
    18         String value = config.getInitParameter(key);
    19         System.out.println("key===" + key + "   value=" + value);
    20 
    21     }
    22     }

          结果:

            

     Ⅴ、getServletInfo方法:可以自定义信息

    补充:load-on-startup改变Servlet初始化(Init)方法执行时机

    1. 默认情况下,只有在初次访问servlet的时候,才会执行init方法。

    2. 初始化方法做一些比较耗时的逻辑,可能会在init方法中逗留太久的时间。 那么有没有方法可以让这个初始化的时机提前一点。

    3. 在配置的时候, 使用load-on-startup元素来指定, 给定的数字越小,启动的时机就越早。 一般不写负数, 从2(服务器启动时机)开始即可。

  • 相关阅读:
    (SQL)如何将exec执行结果放入外面的变量中--动态sql语句
    Building and Installing ACE on Win32 with MinGW/ MSYS
    TAO和CIAO 简介
    Papervision3D 基础
    ACE网络开发中,各种Reactor实现的总结
    [转]第四期FLASH专家交流会 7月24日 广州东方国际饭店
    ACE介绍及简单服务器实例
    ACE相关资源
    Windows下用Eclipse搭建C/C++开发环境
    ACE的编译和安装,for windows、Linux
  • 原文地址:https://www.cnblogs.com/WarBlog/p/12221660.html
Copyright © 2011-2022 走看看