sevlet概述

1 概念

  • servlet是连接web服务器和服务端java程序的协议,是一种通信规范,是一套接口。
  • 通常来讲,servlet是servle规范的一个具体接口
  • servlet是serlet接口实现类的一个实例对象,是运行在服务器上的一段java小程序,即sever Applet。
  • servlet的主要功能是根据客户端提交的请求,调用服务端的相关方法,完成对请求的处理。
http
servlet
JDBC
浏览器
web服务器
服务器端程序
DB

2 执行过程

  • servlet由servlet容器创建,servlet容器是指Tomcat、 weblogic、Jboss
  • 相同Servlet的实例在一个应用中只有一个,可以被不同浏览器访问,是多线程的。
  • servlet创建时机:默认是第一次请求的时候去创建
  • 用户每提交一次对当前servlet的请求,就会执行一次service()方法
  • 一个servlet实例只会执行一次destory()方法,在应用停止时执行。
  • 由于servlet是单例多线程的,一般不为servlet定义可修改的成员变量。
Y
N
url
web容器,将请求映射为Servlet
serlet是否被实例化
执行service
执行无参构造器
执行init
执行destory

2.1 web.xml

    <!--注册servlet -->
    <servlet>
        <servlet-name>some-servlet</servlet-name>
        <servlet-class>com.cc.</servlet-class>
    <servlet>
    <!--建立servlet和URl映射关系-->
    <servlet-mapping>
        <servlet-name>some-servlet</servlet-name>
        <url-pattern>/some</url-pattern>
    </servlet-mapping>

2.1.1 url-pattern

url-pattern匹配方式有四种:完全匹配、目录匹配、扩展名匹配、默认匹配

  • 完全匹配(/a):根据路径精确匹配,通常一个servlet只能处理一个请求。若一个servlet配置多个url-pattern,则可以匹配多个请求
  • 目录匹配(/*):通配符匹配,不建议这种配置,会拦截jsp请求,tomcat无法处理jsp请求
  • 扩展名匹配(*.do)
  • 默认匹配(/):建议使用

2.1.2 tomcat中的web.xml

web.xml是所有发布到tomcat中的web应用共享。

url-patternservlet-class
.jsp,*.jspxjspServlet
/DefaultServlet

2.1.3 webapp中的web.xml

url-patternservlet-class
/DefaultServlet

2.1.4 DefaultServlet

  • 除了jsp,接收所有的请求url
  • 不处理具体业务,只做调度者,分发请求。
  • 响应处理结果,由具体业务处理器返回给DispatcherServlet

2.1.5 loadOnStartup

在web.xml中,每个servlet标签都拥有一个子标签load-on-startup标签,作用是在servlet容器启动时,定义创建servlet对象的顺序。数字越小,加载优先级越高。

  • loadOnStartup <0,即负数的情况下,web容器启动的时候不做实例化处理,servlet首次被调用时做实例化,这种情况和没有设置loadOnStartup是一样的。
  • loadOnStartup > =0 web容器启动的时候做实例化处理,顺序是由小到大,正整数小的先被实例化
  • 如果没有设置loadOnStartup,则第一次请求的时候实例化

2.2 dome

在web.xml中注册Servlet,并编写一个实现servlet接口的类

    <!-- 注册servlet
   ServletConfig对象-->
  <servlet>
    <servlet-name>configTest</servlet-name>
    <servlet-class>servlet.ConfigTest</servlet-class>
    <init-param>
      <param-name>name</param-name>
      <param-value>ccc</param-value>
    </init-param>
    <init-param>
      <param-name>address</param-name>
      <param-value>yyyy</param-value>
    </init-param>
  </servlet>
      <!--建立servlet和URl映射关系-->
  <servlet-mapping>
    <servlet-name>configTest</servlet-name>
    <url-pattern>/config</url-pattern>
  </servlet-mapping>

package com.cc.servlet;

import javax.servlet.*;
import java.io.IOException;
import java.util.Enumeration;

public class ConfigTest implements Servlet {
    private ServletConfig config;
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        this.config =servletConfig;
        System.out.println("初始化实例");
        System.out.println(config.toString());
    }

    @Override
    public ServletConfig getServletConfig() {
        return config;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        String name = config.getServletName();
        System.out.println("ServletName:"+name);
        //遍历初始化参数
        Enumeration<String> names = config.getInitParameterNames();
        while (names.hasMoreElements()){
            String n= names.nextElement();
            String v = config.getInitParameter(n);
            System.out.println(n+":"+v);
        }
        // 获取ServletContext对象,一个应用只有一个
        ServletContext context = config.getServletContext();
        System.out.println("ServletContext:"+context);
        System.out.println("执行service");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

3 ServletConfig

2.2demo所示,ServletConfig是根据web.xml中信息解析的配置对象。在调用==init()==对象时,将ServletConfig对象传递给当前Servlet

4 ServletContext

web.xml配置

<!-- ServletContext 参数 -->+
  <context-param>
    <param-name>name</param-name>
    <param-value>ccStudy</param-value>
  </context-param>
 // 获取ServletContext对象,一个应用只有一个
        ServletContext context = config.getServletContext();
        System.out.println("ServletContext:"+context);
        //获取context初始化参数
        Enumeration<String> scNames = context.getInitParameterNames();
        while (scNames.hasMoreElements()){
            String n= scNames.nextElement();
            String v= context.getInitParameter(n);
            System.out.println(n+":"+v);
        }
        // 设置域属
        context.setAttribute("a","ceshiAttribute");
        String a= (String) context.getAttribute("a");
        System.out.println(a);
        //获取应用名
        String contextPath = context.getContextPath();
        System.out.println(contextPath);
        //获取绝对路径
        String realPath = context.getRealPath("/test");
        System.out.println(realPath);

5 web.xml加载顺序

context-param
Listener
filter
servlet

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值