Servlet

1.介绍

1.1 servlet是什么?

  • Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层
    即处理请求和发送响应的过程是由一种叫做Servlet的程序来完成的,并且Servlet是为了解决实现动态页面而衍生的东西
  • Java Servlet是和平台服务器无关的一种web组件
  • Java Servlet API由两个软件包组成:一个是对应HTTP的软件包,另一个是不对应HTTP的通用的软件包。这两个软件包的同时存在使得Java Servlet API能够适应将来的其他请求-响应的协议。

在这里插入图片描述
在这里插入图片描述

1.2 servlet规范目录结构

在这里插入图片描述

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

  • 1.Servlet引擎检查是否已经装载并创建了该Servlet的实例对象,若是,则直接执行第4步,否则,执行第2步
  • 2.装载并创建该Servlet的一个实例对象,调用构造方法
  • 3.调用Servlet实例对象的init方法
  • 4.创建一个用于封装请求的ServletRequest对象和一个代表相应消息的ServletResponse对象,然后调用Servlet的
    service方法并将请求和相应对象作为参数传递进去
  • 5.WEB应用程序(容器)停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy方法

2.常用接口

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.1 Servlet

public class HellowServlet implements Servlet{
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("*****HellowServlet****【init】********");
    }

    @Override
    public ServletConfig getServletConfig() {
        System.out.println("****HellowServlet*****【getServletConfig】********");
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("*****HellowServlet****【service】********");
    }

    @Override
    public String getServletInfo() {
        System.out.println("****HellowServlet*****【getServletInfo】********");
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("****HellowServlet*****【destroy】********");
    }
}
public class HellwServletStart implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("*****HellwServletStart****【init】********");
    }

    @Override
    public ServletConfig getServletConfig() {
        System.out.println("****HellwServletStart*****【getServletConfig】********");
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("*****HellwServletStart****【service】********");
    }

    @Override
    public String getServletInfo() {
        System.out.println("****HellwServletStart*****【getServletInfo】********");
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("****HellwServletStart*****【destroy】********");
    }
}

web.xml

  <servlet>
    <servlet-name>HellowServlet</servlet-name>
    <!--访问才实例化-->
    <servlet-class>com.zy.crud.servlet.HellowServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>HellowServlet</servlet-name>
    <!--/表示web的根目录,比如http://10.12.80.16:9922/ssm-crud就是根目录-->
    <url-pattern>/hellow</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>HellowStart</servlet-name>
    <servlet-class>com.zy.crud.servlet.HellwServletStart</servlet-class>
    <!--web容器启动就实例化,值越小,越早创建-->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>HellowStart</servlet-name>
    <url-pattern>/hellowStart</url-pattern>
  </servlet-mapping>

依次输入 http://10.12.80.16:9922/ssm-crud/hellow 即可查看到如下结果:
在这里插入图片描述
从上面可知,当启动的时候,先执行init,当访问的时候,才执行service,当容器结束的时候,会执行destroy方法

2.2 生命周期

在这里插入图片描述
注意: init在构造器调用后,会立即调用这个初始化方法,如果没有指定load级别,那么init方法是在第一次有请求访问的时候,才会被执行调用,因为这时servlet才首次被虚拟机加载到内存中去。

2.3 servletconfig

ServletConfig:代表当前Servlet在web.xml中的配置信息(用的不多)
该接口有如下四个方法:

  • String getServletName() – 获取当前Servlet在web.xml中配置的名字
  • String getInitParameter(String name) – 获取当前Servlet指定名称的初始化参数的值
  • Enumeration getInitParameterNames() – 获取当前Servlet所有初始化参数的名字组成的枚举
  • ServletContext getServletContext() – 获取代表当前web应用的ServletContext对象
    在Servlet的配置文件中,可以使用一个或多个标签为servlet配置一些初始化参数。

当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet。进而,程序员通过ServletConfig对象就可以得到当前servlet的初始化参数信息。

这样做的好处是:如果将数据库信息、编码方式等配置信息放在web.xml中,如果以后数据库的用户名、密码改变了,则直接很方便地修改web.xml就行了,避免了直接修改源代码的麻烦。

public class HellowServlet implements Servlet{
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("*****HellowServlet****【init】********");
        String dbName = servletConfig.getInitParameter("dbName");
        String servletName = servletConfig.getServletName();
        System.out.println("**servletName"+servletName+"***dbName"+dbName);
        Enumeration initParameterNames = servletConfig.getInitParameterNames();
        while (initParameterNames.hasMoreElements()){
            System.out.print("**"+initParameterNames.nextElement());
        }
    }
  <servlet>
    <servlet-name>HellowServlet</servlet-name>
    <servlet-class>com.zy.crud.servlet.HellowServlet</servlet-class>
    <!--添加初始化参数-->
    <init-param>
      <param-name>dbName</param-name>
      <param-value>mysql</param-value>
    </init-param>
    <init-param>
      <param-name>dbPass</param-name>
      <param-value>123</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>HellowServlet</servlet-name>
    <url-pattern>/hellow</url-pattern>
  </servlet-mapping>

在这里插入图片描述

2.4 servletContext

在这里插入图片描述
WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。
由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。
生命周期:当服务器启动web应用加载后创建出ServletContext对象后,域产生。当web应用被移除出容器或服务器关闭,随着web应用的销毁域销毁。

注意:
< context-param>里的参数,可以被所有servlet所识别访问到,是个全局变量
< init-param>里的参数,是一个servlet节点里面设置的,只能这个servlet访问,是个局部变量

一些参数概念,要注意区分:

  • 请求参数 parameter — 浏览器发送过来的请求中的参数信息
  • 初始化参数 initparameter — 在web.xml中为Servlet或ServletContext配置的初始化时带有的基本参数
  • 域属性 attribute — 四大作用域中存取的键值对

1.获取当前WEB初始化参数

  <servlet>
    <servlet-name>HellowServlet</servlet-name>
    <servlet-class>com.zy.crud.servlet.HellowServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>HellowServlet</servlet-name>
    <url-pattern>/hellow</url-pattern>
  </servlet-mapping>
<!--配置参数-->
  <context-param>
    <param-name>driver</param-name>
    <param-value>com.apache.mysql</param-value>
  </context-param>
public class HellowServlet implements Servlet{
    ServletContext servletContext;
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("*****HellowServlet****【init】********");
//        1.这里要注意:在这里是获取不到context配置的参数信息的,初始化的时候,还没有生成参数
        servletContext = servletConfig.getServletContext();
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("*****HellowServlet****【service】********");
//        2.在这里访问,配置的参数才能获取到
        String driver = servletContext.getInitParameter("driver");
        System.out.println("driver = " + driver);
    }

在这里插入图片描述
2.获取WEB路径与流等信息
在这里插入图片描述
加载资源文件

2.5 servletRequest与servletResponse

在这里插入图片描述
1.Request
在这里插入图片描述
在这里插入图片描述

2.Response
在这里插入图片描述
在这里插入图片描述

2.6 GenericServlet

在这里插入图片描述

public class HelloGenericServlet extends GenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
    }
}

2.7 HTTPservlet

在这里插入图片描述

public class HelloHttpServlet extends HttpServlet{

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        
    }
}

2.8 Cookies

在这里插入图片描述

2.8 session

在这里插入图片描述
在这里插入图片描述

2.8 WEB中的绝对路径和相对路径

在这里插入图片描述

2.9 过滤器

  <filter>
    <filter-name>HelloFileter</filter-name>
    <filter-class>com.zy.crud.servlet.HelloFilter</filter-class>
    <init-param>
      <param-name>www</param-name>
      <param-value>222</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>HelloFileter</filter-name>
    <!--注意url写法,这里不能写/不然不起作用-->
    <url-pattern>/*</url-pattern>
  </filter-mapping>
public class HelloFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("****HelloFilter*****【init】********");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("****HelloFilter*****【doFilter】********");
    }

    @Override
    public void destroy() {
        System.out.println("****HelloFilter*****【destroy】********");
    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.请求转发
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.10 监听器

Java Servlet监听器种类及介绍
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述1.监听对象

  <listener>
    <listener-class>com.zy.crud.servlet.HelloListener</listener-class>
  </listener>
public class HelloListener implements ServletContextListener{
    //ServletContext创建之前会调用这个方法
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("****HelloListener*****【contextInitialized】********");
    }
    //ServletContext销毁之前会调用这个方法
    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("****HelloListener*****【contextDestroyed】********");
    }
}

在这里插入图片描述
在这里插入图片描述

2.监听对象中的属性

在这里插入图片描述

  <listener>
    <listener-class>com.zy.crud.servlet.HelloContextAttrLisener</listener-class>
  </listener>
public class HelloContextAttrLisener implements ServletContextAttributeListener{
    @Override
    public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
        System.out.println("****HelloContextAttrLisener*****【attributeAdded】********");
    }

    @Override
    public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
        System.out.println("****HelloContextAttrLisener*****【attributeRemoved】********");
    }

    @Override
    public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
        System.out.println("****HelloContextAttrLisener*****【attributeReplaced】********");
    }
}
1.加载顺序

加载顺序与它们在 web.xml 文件中的先后顺序无关。即不会因为 filter 写在 listener 的前面而会先加载 filter。最终得出的结论是:context-param -> listener -> filter -> servlet -> 拦截器(interceptor)

  <!--servlet-->
  <servlet>
    <servlet-name>HellowStart</servlet-name>
    <servlet-class>com.zy.crud.servlet.HellwServletStart</servlet-class>
    <!--web容器启动就实例化-->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>HellowStart</servlet-name>
    <url-pattern>/hellowStart</url-pattern>
  </servlet-mapping>

  <!--过滤器-->
  <filter>
    <filter-name>HelloFileter</filter-name>
    <filter-class>com.zy.crud.servlet.HelloFilter</filter-class>
    <init-param>
      <param-name>www</param-name>
      <param-value>222</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>HelloFileter</filter-name>
    <!--注意url写法,这里不能写/不然不起作用-->
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <!--监听器-->
  <listener>
    <listener-class>com.zy.crud.servlet.HelloListener</listener-class>
  </listener>
  <!--全局参数-->
  <context-param>
    <param-name>driver22</param-name>
    <param-value>com.apache.mysql</param-value>
  </context-param>
public class HellwServletStart implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("*****HellwServletStart****【init】********");
        ServletContext servletContext = servletConfig.getServletContext();
        String driver22 = servletContext.getInitParameter("driver22");
        System.out.println("driver22 = " + driver22);
    }
public class HelloFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("****HelloFilter*****【init】********");
    }
public class HelloListener implements ServletContextListener{
    //ServletContext创建之前会调用这个方法
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("****HelloListener*****【contextInitialized】********");
    }

在这里插入图片描述
listener、 filter、servlet 加载顺序

2.11 国际化

2.12 文件上传与下载

参考:
Servlet 容器
Java Servlet API中文说明文档
Java Web(一) Servlet详解!!
Servlet 简介
JavaWeb中监听器+过滤器+拦截器区别、配置和实际应用

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值