JavaEE-6-Servlet入门

0、Servlet基本概念

Servlet是sun提供的一种动态web资源开发技术。本质上就是一段java小程序,可以将Servlet加入到Servlet容器中运行。

  • Servlet容器:能够运行Servlet的环境就叫做Servlet容器. 比如——tomcat
  • Web容器:能够运行web应用的环境就叫做web容器 比如——tomcat
Servlet的基本运行方式:

Servlet没有main()方法。它们受控于另一个Java应用(例如Tomcat),这个Java应用称为Sevlet容器,Tomcat就是这样一个容器。通常我们把Tomcat也叫做Servlet容器。

JavaEE-6-Servlet入门_第1张图片
图示

Servlet是一个java小程序,需要放在Servlet容器(即 Tomcat中)中才能被正确运行!!!

1、创建一个Servlet

第一步、继承Servlet接口

如下为创建servlet的简单步骤:


JavaEE-6-Servlet入门_第2张图片
简单步骤

注意servlet是一个java接口,所以是写在src资源文件夹下的:


JavaEE-6-Servlet入门_第3张图片
src文件夹下

注意这里在src文件下要先创建一个包
创建完包之后再创建一个java类,在创建页面中选择继承自servlet接口,
JavaEE-6-Servlet入门_第4张图片
点击add

JavaEE-6-Servlet入门_第5张图片
找到servlet接口
JavaEE-6-Servlet入门_第6张图片
四个要实现的方法
  • 其中service(···)是最关键的方法,在里面写服务器要处理的逻辑
第二步、配置web.xml
JavaEE-6-Servlet入门_第7张图片
web.xml文件位置

在项目文件中找到web.xml的路径,在里面进行如下配置:

映射Servlet

JavaEE-6-Servlet入门_第8张图片
先映射Servlet

  • 这一步就是相当于把第一步继承接口的类的信息告诉这个配置文件web.xml

绑定路径:

JavaEE-6-Servlet入门_第9张图片
绑定路径

第三步、测试

JavaEE-6-Servlet入门_第10张图片
访问这个路径

注意这里最后是 "/demo",即我们在绑定路径的时候写的:
/demo

然后每一次我们访问这个地址,都会执行一次我们继承的service(···)方法

运行逻辑分析:
在背后的运行逻辑:进入这个页面之后,先去web.xml的绑定路径配置中找有没有"/demo"这个路径,有,然后找跟绑定路径中的servlet-name标签相同值的映射Servlet步骤中出现的servlet-name,然后再找到我们实现Servlet接口的类,然后再执行service(···)方法。
这整个过程访问的是servlet!!

2、Servlet背后原理分析

JavaEE-6-Servlet入门_第11张图片
运行结果

如上是我们访问Servlet的结果


1、快速创建Servlet

我们可以在项目文件的src下直接创建继承HttpServletServlet

  • Tip:HttpServlet相当于是实现了一些基本操作的Servlet的实现类,我们在它基础上进行开发更加方便
JavaEE-6-Servlet入门_第12张图片
创建页面1

JavaEE-6-Servlet入门_第13张图片
创建页面2
  • 注意这里创建页面2中他是可以直接对url-mappings进行配置的,免去了我们手动配置web.xml的麻烦

JavaEE-6-Servlet入门_第14张图片
创建页面3

这里可以把继承自父类的创建方法前面的勾去掉,这里最重要的两个方法就是 doPost()doGet(),这两个方法实际调用的实际上也是Servlet的 service()方法

  • 前端向后台发送请求,最重要的两个方式就是Post和Get方法

这里创建成功之后,就会自动在WEB-INF下的web.xml中写入配置信息(如果之前自己在web.xml中手动配置过,新的配置信息是不会覆盖原来的配置信息系的)

2、Servlet接口与GenericServlet抽象类、HttpServlet抽象类之间的关系

Servlet接口介绍

JavaEE-6-Servlet入门_第15张图片
接口提供的5个抽象方法

生命周期:

  • init(···):在Servlet第一次执行时(服务器被开启不会执行Servlet!只有访问准确路径才会)会被服务器调用
  • service(···):在Servlet每一次执行时都会被服务器调用
  • destroy(···):在服务器被正常关闭时或者项目被移除的时候被服务器调用
  • 总结:Servlet是单实例对象,多线程(每一次访问都会新出一个线程(不是实例)然后执行service()
    描述

如下是GenericServlet抽象类、HttpServlet抽象类与Servlet接口的简单描述:


JavaEE-6-Servlet入门_第16张图片
关系
  • GenericServlet抽象类实现了Servlet接口,HttpServlet抽象类继承自GenericServlet抽象类
    JavaEE-6-Servlet入门_第17张图片
    关系

Tip:

JavaEE-6-Servlet入门_第18张图片
关于url-pattern的配置

这里在 url-pattern中的值使用通配符是为了支持更多的路径,也就是说用户在浏览器地址栏中输入多种不同的路径, 只要满足这个通配符格式,那么执行的就是同一个Servlet程序

3、load-on-startup的配置

这个也是在web.xml中进行配置,主要作用是在服务器启动的时候就可以让servlet启动(正常情况是访问对应对应路径的时候才会启动servlet)


示例
JavaEE-6-Servlet入门_第19张图片
写在映射Servlet中
  • 这里给值为正整数时(数字越小,优先级越高),当服务器启动的时候就会被自动启动

  • 关于路径:在web项目中引用其他文件的时候(比如css文件),这个时候最好使用绝对路径(这个绝对路径不是说从C盘根目录开始写,而是从
    路径

    这个项目名day09的根目录开始写),这样我们在移动这个写代码的文件的时候,不会因为改了路径而找不到引用的文件。

4、ServletConfig

  • 作用:
    JavaEE-6-Servlet入门_第20张图片
    作用

    转自:https://www.cnblogs.com/smyhvae/p/4140877.html

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就行了,避免了直接修改源代码的麻烦(不用修改源码的话,不需要重新编译)。

  • 代码举例:
    新建一个名为ServletConfigTest的Servlet,然后在web.xml中的标签下,通过标签为这个servlet配置两个初始化参数(注意,一个标签代表一个参数)

        ServletConfigTest
        com.vae.servlet.ServletConfigTest
        
            name1
            value1
        
        
            encode
            utf-8
        
    

然后在代码中获取上面的两个参数。代码实现如下:

public class ServletConfigTest extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        ServletConfig config = this.getServletConfig();  //拿到init方法中的ServletConfig对象

        // --获取当前Servlet 在web.xml中配置的名称(用的不多)
         String sName = config.getServletName();
         System.out.println("当前Servlet 在web.xml中配置的名称:"+sName);
         
        // --获取当前Servlet中配置的初始化参数(只能获取一个)经常用到
        // String value = config.getInitParameter("name2");
        // System.out.println(value);

        // --获取当前Servlet中配置的初始化参数(全部获取)经常用到
         Enumeration enumration = config.getInitParameterNames();
         while(enumration.hasMoreElements()){
         String name = (String) enumration.nextElement();
         String value = config.getInitParameter(name);
         System.out.println(name+":"+value);
         }
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}

核心代码是第17行,通过this.getServletConfig()方法拿到init方法中的ServletConfig对象,然后获取配置信息。

运行程序,后台打印日志如下:


JavaEE-6-Servlet入门_第21张图片
输出

5、ServletContext

讲完ServletConfig,我们接着看ServletContext,ServletContext代表当前web应用
WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用
通过this.getServletContext();可以直接获得ServletContext对象

  • 一个WEB应用中的所有Servlet共享同一个ServletContext对象
  • ServletContext对象的作用:Servlet对象之间可以通过ServletContext对象来实现相互之间的通讯。
  • ServletContext对象通常也被称之为context域对象

下面开始正式讲ServletContext的应用:

应用一:在整个web应用中共享数据

  • 作用范围:整个web应用范围内共享数据
  • 生命周期:当服务器启动web应用加载后创建出ServletContext对象后,域产生。当web应用被移除出容器或服务器关闭,随着web应用的销毁域销毁。
    代码举例 ServletTest01.java:
public class ServletTest01 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        context.setAttribute("name", "smyhvae");
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}

ServletTest02.java:

public class ServletTest02 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String myName = (String) context.getAttribute("name");
        System.out.println(myName);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}

ServlryContext中常用的方法有:

  • void setAttribute(String,Object);
  • Object getAttribute(String);
  • void removeAttribute(String);

应用二:获取WEB应用的初始化参数

我们使用标签来给一个servlet设置初始化配置信息的时候,注意这个配置信息是只对这个servlet生效的(这个标签也是被包在某一个标签中的),这里的参数的获取和ServletConfig的使用几乎相同,代码如下:


        ServletConfigTest
        com.vae.servlet.ServletConfigTest
        
            name1
            value1
        
        
            encode
            utf-8
        
    

这时如果我们使用标签(与Servlet标签并列)为整个Web应用配置属性的话,那所有的Servlet就都能访问里面的参数了。
示例:在web.xml中加入初始化配置信息:

JavaEE-6-Servlet入门_第22张图片
使用标签

在代码中获取:

public class ServletTest03 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        ServletContext context = this.getServletContext(); // 得到上下文对象

        // 获取单个的Context里面的初始化参数
        String value1 = context.getInitParameter("username");
        String value2 = context.getInitParameter("password");
        System.out.println(value1 + ";" + value2);
        System.out.println();

        // 一次性获取Context里所有的初始化参数
        Enumeration enumeration = context.getInitParameterNames();
        while (enumeration.hasMoreElements()) {
            String name = (String) enumeration.nextElement();
            String value = context.getInitParameter(name);
            System.out.println(name + ";" + value);

        }

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}

通过context.getInitParameter()方法获得初始化参数。

JavaEE-6-Servlet入门_第23张图片
输出结果

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

你可能感兴趣的:(JavaEE-6-Servlet入门)