zoukankan      html  css  js  c++  java
  • Servlet

    Servlet:

    Servlet(Server Applet)是Java Servlet的简称,可以运行在Web服务器中的小型Java程序,有时也叫做服务器端的小应用程序。以通过 HTTP协议接收和响应来自 Web 客户端的请求。

     1 package com.monkey1024.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 FirstServlet implements Servlet {
    12 
    13     @Override
    14     public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
    15         System.out.println("Hello Servlet");
    16     }
    17 
    18     @Override
    19     public void destroy() {
    20 
    21     }
    22     @Override
    23     public ServletConfig getServletConfig() {
    24         return null;
    25     }
    26 
    27     @Override
    28     public String getServletInfo() {
    29         return null;
    30     }
    31 
    32     @Override
    33     public void init(ServletConfig arg0) throws ServletException {
    34 
    35     }
    36 
    37 }

    执行过程:

    1. 客户端向tomcat发送请求
    2. tomcat根据请求的URL找到servlet的应用
    3. tomcat根据请求的URI”/hello”找到web.xml文件中url-pattern与之对应的标签
    4. tomcat根据url-pattern标签中的servlet-name定位到com.monkey1024.servlet.FirstServlet类。
    5. tomcat实例化FirstServlet类
    6. 调用FirstServlet类中的init方法
    7. 调用FirstServlet类中的service方法
    8. FirstServlet将数据响应给客户端
    9. 调用distroy方法销毁FirstServlet

    生命周期

    Servlet第一次请求执行构造方法、init()方法、service()方法

    以后每次请求执行一次service()方法

    关闭Tomcat 执行destroy()方法

    由于 Servlet 是单例多线程的,所以为了保证其线程安全性,一般情况下是不建议在 Servlet类中定义可修改的成员变量,因为每个线程均可修改这个成员变量,会出现线程安全问题。

    在tomcat启动时,默认不会创建servlet实例,如果想要让tomcat在启动时创建servlet实例的话,只需要在web.xml中添加load-on-startup标签即可

    <servlet>
          <servlet-name>lifeServlet</servlet-name>
          <servlet-class>com.monkey1024.servlet.LifeServlet</servlet-class>
          <load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping>
          <servlet-name>lifeServlet</servlet-name>
          <url-pattern>/life</url-pattern>
      </servlet-mapping>
    View Code

    添加load-on-startup的作用是,标记是否在 Tomcat启动时创建并初始化这个 Servlet实例。它的值必须是一个整数。

    • 当值大于等于 0 时,表示容器在启动时就加载并初始化这个 Servlet,数值越小,该 Servlet的优先级就越高,其被创建的也就越早;
    • 当值相同时,容器会自己选择创建顺序。

    ServletConfig接口

    Servlet 规范将Servlet 的配置信息全部封装到了 ServletConfig 接口对象中。在tomcat调用 init()方法时,首先会将 web.xml 中当前 Servlet 类的配置信息封装为一个对象。传给ServletConfig参数

    ServletConfig中的方法

    • getInitParameter(): 获取指定名称的初始化参数值。例如从下面的servlet中调用 getInitParameter("userName");方法会返回字符串"monkey1024"。
    • getInitParameterNames():获取当前 Servlet 所有的初始化参数名称。其返回值为枚举类型 Enumeration。
    • getServletName():获取当前 Servlet 的中指定的 Servlet名称。如下面中的 ServletName 为"configServlet"。
    • getServletContext():获取到当前 Servlet 的上下文对象 ServletContext,这是个非常重要的对象,将在下一节中详细介绍

    ServletContext接口(application)

    ServletContext中不仅包含了 web.xml 文件中的配置信息,还包含了当前应用中所有Servlet可以共享的数据。

    常用方法

    • String getInitParameter ():获取 web.xml 文 件 的 中 指 定 名 称 的上下文参数值 。
    • Enumeration getInitParameterNames():获取 web.xml 文件的中的所有的上下文参数名称。其返回值为枚举类型 Enumeration。
    • void setAttribute(String name, Object object):在 ServletContext 的公共数据空间中,也称为域属性空间,放入数据。这些数据对于 Web应用来说,是全局性的,与整个应用的生命周期相同。当然,放入其中的数据是有名称的,通过名称来访问该数据。
    • Object getAttribute(String name):从 ServletContext 的域属性空间中获取指定名称的数据。
    • void removeAttribute(String name):从 ServletContext 的域属性空间中删除指定名称的数据。
    • String getRealPath(String path):获取当前 Web 应用中指定文件或目录在本地文件系统中的路径。
    • String getContextPath():获取当前应用在 Web 容器中的名称。

    欢迎页面

    1 <welcome-file-list>
    2     <welcome-file>index.html</welcome-file>
    3     <welcome-file>index.htm</welcome-file>
    4     <welcome-file>index.jsp</welcome-file>
    5     <welcome-file>default.html</welcome-file>
    6     <welcome-file>default.htm</welcome-file>
    7     <welcome-file>default.jsp</welcome-file>
    8   </welcome-file-list>

    由上到下依次加载

    url-pattern

    精确路径

    1 <servlet-mapping>
    2       <servlet-name>contextServlet02</servlet-name>
    3       <url-pattern>/context02</url-pattern>
    4       <url-pattern>/servlet/context02</url-pattern>
    5       <url-pattern>/test/servlet/context02</url-pattern>
    6  </servlet-mapping>

    通配符

    1 <servlet-mapping>
    2       <servlet-name>contextServlet02</servlet-name>
    3       <url-pattern>/servlet/*</url-pattern>
    4   </servlet-mapping>

    使用/*,表示当前的 Servlet 会拦截用户对于静态资源(.css、.js、.html、.jpg、.png…..)与动态资源(.jsp)的请求。

    1   <servlet-mapping>
    2       <servlet-name>contextServlet02</servlet-name>
    3       <url-pattern>/*</url-pattern>
    4   </servlet-mapping>

    使用/,表示当前的 Servlet 会拦截用户对于静态资源(.css、.js、.html、.jpg、.png…..),
    但对于动态资源的请求,是不进行拦截的。

    1   <servlet-mapping>
    2       <servlet-name>contextServlet02</servlet-name>
    3       <url-pattern>/*</url-pattern>
    4   </servlet-mapping>

    后缀名模式

    1 <servlet-mapping>
    2       <servlet-name>contextServlet02</servlet-name>
    3       <url-pattern>*.do</url-pattern>
    4 </servlet-mapping>

    路径匹配原则匹配过程 4->3->2->1

    1. /xxx/*
    2. /xxx/*.do
    3. /some
    4. /some/other/*

    继承GenericServlet类

    只需要重写service()即可

    HttpServlet类

    重写doGet()、doPost()等方法

    创建servlet的三种方式

    • 定一个类实现javax.servlet.Servlet接口
    • 定义一个类继承javax.servet.GenericServlet类
    • 定义一个类继承javax.servlet.http.HttpServlet类

    如果是通过参数传过来的对象,就叫依赖
    通过方法得到的对象,就叫关联

  • 相关阅读:
    monkeyrunner 进行多设备UI测试
    python Pool并行执行
    python 字符串函数
    python Map()和reduce()函数
    python re模块使用
    3.6 C++继承机制下的构造函数
    3.5 C++间接继承
    3.4 C++名字隐藏
    3.3 C++改变基类成员在派生类中的访问属性
    3.2 C++继承方式
  • 原文地址:https://www.cnblogs.com/feichangnice/p/10836815.html
Copyright © 2011-2022 走看看