• Java Web之Servlet技术


    1、Servlet基础

    针对Servlet技术开发,Sun公司提供了一些列接口和类,其中最重要的是javax.servlet.Servlet接口,两个重要的包是javax.servlet和javax.servlet.http,Servlet就是一种实现了Servlet接口的类,它由Web容器(Tomcat/Jetty等)负责调用并创建,用于接收和响应用户请求。Servlet接口中定义了5个抽象方法:

    Servlet顶层类结构如下所示:

    2、第一个Servlet程序

    新建一个Java Web工程,然后新建Hello类,Hello.java源码如下:

    package zzz; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Hello extends HttpServlet {
        @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { // 设置响应消息编码
            response.setContentType("text/html;charset=utf-8");
            PrintWriter out = response.getWriter();
            out.println("Hello World");
        }
    
        @Override public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { this.doGet(request, response);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    配置文件web.xml如下:

    
    
        zzz
    
       
          Hello 
          zzz.Hello 
      
       
          Hello 
          /hello 
      
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    启动运行浏览器显示如下:

    3、Servlet生命周期

    Servlet生命周期大致分为3个阶段,初始化阶段、运行阶段和销毁阶段。以下是各个阶段详细说明:

    • 初始化阶段:客户端向Servlet容器发出请求访问Servlet时,容器首先解析请求,查看内存中是否有该Servlet对象,如果有直接使用;否则创建该Servlet对象,然后调用init()方法,注意,Servlet整个声明周期中,init()只会调用一次
    • 运行阶段:这个是Servlet最重要的阶段,此阶段容器会构造一个ServletRequest和ServletResponse对象作为参数传递到Servlet的service()方法中。对于Servlet的每一次访问,Servlet容器都会调用一次service()方法,service()方法在Servlet整个生命周期中会被调用多次
    • 销毁阶段:当服务器关闭或者Web应用被移除出容器时,会进入到此阶段,此时会调用destroy()方法,整个生命周期中destroy()方法只会被调用一次

    在客户端首次访问Servlet时,容器会创建该Servlet对象,但是有时希望Servlet对象在Tomcat启动时跟随启动,这怎么处理呢?此时,只需要在web.xml中使用元素即可,示例配置如下:

    
          Hello
          zzz.Hello
        
        1 
      
      
          Hello
          /hello
      
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    4、ServletConfig和ServletContext

    ServletConfig接口

    Servlet运行期间,如果需要一些辅助信息,例如文件编码、使用Servlet的公司等,这些信息可以在web.xml中使用元素进行配置,当Tomcat初始化一个Servlet时,会将该Servlet配置信息封装成一个ServletConfig对象通过init(ServletConfig config)传递到Servlet。ServletConfig定义了一系列获取配置信息的方法:

    接下来以getInitParameter()为例,讲解该方法使用示例:

    web.xml配置文件如下:

    
    
        zzz
    
      
          Hello
          zzz.Hello
          
              company
              dahua
          
      
      
          Hello
          /hello
      
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    Hello.java文件如下:

    package zzz; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletConfig; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Hello extends HttpServlet {
        @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { // 设置响应消息编码
            response.setContentType("text/html;charset=utf-8");
            PrintWriter out = response.getWriter();
    
            ServletConfig config = this.getServletConfig();
            String param = config.getInitParameter("company");
            out.println("company: " + param);
        }
    
        @Override public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { this.doGet(request, response);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    ServletContext接口

    当Servlet容器启动时,会为每一个Web应用创建一个唯一的ServletContext对象代表当前Web应用,该对象不仅封装了该Web应用的所有信息,而且实现了多个Servlet对象间的数据共享。在web.xml中不仅可以配置Servlet的初始化信息,还可以配置整个Web应用的初始化信息,配置方式如下所示:

    
        name
        luoxn28
    
    
        company
        dahua
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    注意:一个元素里只能有一个和,上面的配置在web.xml中下配置。Hello.java文件如下:

    package zzz; import java.io.IOException; import java.io.PrintWriter; import java.util.Enumeration; import javax.servlet.ServletContext; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Hello extends HttpServlet {
        @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { // 设置响应消息编码
            response.setContentType("text/html;charset=utf-8");
            PrintWriter out = response.getWriter();
    
            ServletContext context = this.getServletContext();
            Enumeration paramNames = context.getInitParameterNames(); while (paramNames.hasMoreElements()) {
                String name = paramNames.nextElement();
                String value = context.getInitParameter(name);
                out.println(name + ": " + value + "
    "); } } @Override public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { this.doGet(request, response); } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    由于一个Web应用中所有Servlet共享一个ServletContext对象,所以ServletContext对象的域属性可以被Web应用中所有的Servlet访问。在ServletContext接口中定义了分别增加、删除、设置ServletContext域属性的4个方法:

    通过以上方法就可以实现多个Servlet间共享数据,这个具体实例就不贴代码了。

  • 相关阅读:
    STM32F103VET6基于Arduino开发框架下串口和软串口输出乱码解决方案
    .Net学习——Nlog日志框架的使用
    变量与常量
    C#WPF数字大屏项目实战06--报警信息
    quark h5 学习
    抽象类和接口
    linux入门2—文件系统
    用OCC+VS+Qt创建并显示一个几何
    Java中ArrayList集合中如何删除重复元素呢?
    【日常计算机问题】win11、win10解决公共WiFi认证不弹出的问题。电脑没有弹出认证界面。以广州图书馆i-guangdong;i广东为例
  • 原文地址:https://blog.csdn.net/m0_73533108/article/details/126903409