69期-Java SE-043_Servlet-1

### Servlet 生命周期

1、当客户端请求 Servlet 时,Tomcat 会查询当前目标 Servlet 的实例化对象是否存在,如果不存在,则执行第 2 步,如果存在,则执行第 4 步。

2、通过反射机制创建 Servlet 的实例化对象(Tomcat 完成)。

3、调用 init 方法完成初始化的操作。

4、调用 service 方法完成具体的业务逻辑。

5、当关闭 Tomcat 应用的时候,Tomcat 会调用 destory 方法,释放当前 Servlet 对象占用的资源。

### Servlet 生命周期方法

- 构造函数,只调用一次,创建对象。
- init 方法,只调用一次,初始化对象。
- service 方法,调用多次,执行多少请求,就调用多少次。
- destory 方法,只调用一次,卸载对象。

init 方法获取的 ServletConfig,可以用来获取 Servlet 相关配置。

1、getServletName() 获取当前 Servlet 的name,由 web.xml 中配置的 servlet-name 来决定。

2、getInitParamter() 获取当前 Servlet 的初始化参数,配置在 web.xml 中。

3、getServletContext() 获取当前 Servlet 的上下文对象。

4、getInitParameterNames() 获取当前 Servlet 的所有初始化参数名。

```java
@Override
public void init(ServletConfig servletConfig) throws ServletException {
  System.out.println(servletConfig.getServletName());
  System.out.println(servletConfig.getServletContext());
  System.out.println(servletConfig.getInitParameter("username"));
  Enumeration<String> names = servletConfig.getInitParameterNames();
  while(names.hasMoreElements()){
    System.out.println(names.nextElement());
  }
}
```

### ServletConfig 和 ServletContext 的区别

我们可以通过 ServletConfig 对象获取当前 Servlet 的配置信息。

ServletContext 是当前 Servlet 的上下文,Servlet 的管理者,可以获取当前 Servlet 对象相关的各种资源。

ServletConfig 作用于某个特定的 Servlet 对象,每个 Servlet 对象都有一个 ServletConfig。

ServletContext 作用于整个 Web 应用,多个 Servlet 共用同一个 ServletContext,一个 Web 应用只能有一个 ServletContext,但是可以有多个 ServletConfig。

ServletContext 是全局变量,ServletConfig 是局部变量。

### ServletContext 的常用方法

- getInitParameter(String key) 获取全局参数。
- getServerInfo() 获取当前 Tomcat 容器信息。
- getContextPath() 获取当前 Web 应用的工程名。
- getRealPath() 获取当前 Web 应用的绝对路径。

HelloServlet.java

package com.southwind.servlet;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HelloServlet extends HttpServlet {
    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("ServletConfg:"+config.getInitParameter("username"));
        System.out.println("ServletContext:"+config.getServletContext().getInitParameter("username"));
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doget");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("dopost");
    }
}

MyGenericServlet.java

package com.southwind.servlet;

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

public class MyGenericServlet implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

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

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        String idStr = servletRequest.getParameter("id");
        System.out.println(idStr);
    }

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

    @Override
    public void destroy() {
        System.out.println("destory...");
    }
}

MyHttpServlet.java

package com.southwind.servlet;

import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class MyHttpServlet extends MyGenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        String method = request.getMethod();
        switch (method){
            case "GET":
                doGet(request,response);
                break;
            case "POST":
                doPost(request,response);
                break;
        }
    }

    public void doGet(HttpServletRequest request,HttpServletResponse response){
        System.out.println("doGet");
    }

    public void doPost(HttpServletRequest request,HttpServletResponse response){
        System.out.println("doPost");
    }
}

MyServlet.java

package com.southwind.servlet;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Enumeration;

public class MyServlet extends MyHttpServlet {

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("ServletConfg:"+servletConfig.getInitParameter("username"));
        System.out.println("ServletContext:"+servletConfig.getServletContext().getInitParameter("username"));
        System.out.println(servletConfig.getServletContext().getServerInfo());
        System.out.println(servletConfig.getServletContext().getContextPath());
        System.out.println(servletConfig.getServletContext().getRealPath(""));
    }

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) {

    }

    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) {

    }

    @Override
    public void destroy() {
        System.out.println("destory...");
    }
}

index.jsp

<%--
  Created by IntelliJ IDEA.
  User: southwind
  Date: 2019-07-02
  Time: 20:15
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  $END$
  </body>
</html>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <context-param>
        <param-name>username</param-name>
        <param-value>admin</param-value>
    </context-param>

    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.southwind.servlet.HelloServlet</servlet-class>
        <init-param>
            <param-name>username</param-name>
            <param-value>hello</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello.do</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>test</servlet-name>
        <servlet-class>com.southwind.servlet.MyServlet</servlet-class>
        <init-param>
            <param-name>username</param-name>
            <param-value>root</param-value>
        </init-param>
        <init-param>
            <param-name>password</param-name>
            <param-value>123123</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>test</servlet-name>
        <url-pattern>/test.do</url-pattern>
    </servlet-mapping>

</web-app>

原文地址:https://www.cnblogs.com/HiJackykun/p/11182663.html

时间: 2024-08-30 08:31:46

69期-Java SE-043_Servlet-1的相关文章

69期-Java SE-035_MySQL-6 存储过程、SQL练习 -doing

### 存储过程 存储过程是一组为了完成特定功能的 SQL 语句集合,经过编译后存储在数据库中,用户通过指定存储过程的名称以及参数来执行相应的存储过程. 一次编写,多次调用,避免开发人员重复编写相同的 SQL 语句,存储过程是在数据库中存储和执行的,可以减少客户端和服务端之间的数据传输,从而提高效率. ### 优点 - 模块化的程序设计,只需要创建一次存储过程,以后就可以在程序中调用该存储过程任意次. - 执行速度更快,如果某个操作需要执行大量的 SQL 语句或者需要重复执行 SQL 语句,存储

69期-Java SE-031_MySQL-001-002 创建表、MySQL数据类型、数据的管理(数据库结构、数据表、数据)、SQL 函数

### 创建表 1.创建数据库 ```sql create database mstest default character set utf8 collate utf8_general_ci ``` 2.创建数据表 ```sql create table user( id int, name varchar(11) ) ``` Java 数据类型:基本数据类型 byte short int long double float boolean char ? 引用类型 MySQL 数据类型 - 整

69期-Java SE-002_变量、运算符-001-002

- 声明变量的数据类型和变量名. - 给内存空间赋值,该值就是变量值. - 通过变量名使用变量. ```java public class Hello { public static void main(String[] args) { //1.开辟内存空间,定义变量名 int num1; //2.赋值 num1 = 10; //3.使用变量 System.out.println(num1); } } ``` ```java public class Hello { public static

69期-Java SE-003_流程控制、循环-001-002

### 位运算符 十进制和二进制的转换. - 十进制转二进制:目标数除以二,如果能除尽,则该位计作零,如果除不尽,则该位计作一,再对商继续除以二,以此类推,直到商为零,然后将每一位的结果进行反序组合就是对应的二进制结果,10 转为二进制 1010,17 转为二进制 10001 - 二进制转十进制:从目标数最右侧算起,本位的数值乘以本位的权重,权重就是2的第几位的位数减一次方,如果第1位就是2的(1-1)次方,第2位就是2的(2-1)次方,第3位就是2的(3-1)次方…,将每一位的数值和本位权重相

69期-Java SE-004_循环、数组-001-002

Hello.java import java.util.Scanner; public class Hello { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String str = "yes"; int num; while(str.equals("yes")) { System.out.print("请输入学生编号:")

69期-Java SE-036_MySQL-7 SQL练习 -doing

第一道: 现有图书管理数据库的三个关系模式,他们的字段分别如下: 图书表:总编号, 分类号, 书名, 作者, 出版单位, 单价 读者表:借书证号, 单位, 姓名, 性别, 职称, 地址 借阅表:借书证号, 总编号, 借书日期 以上表对应的字段明细如下: book : b_no ,b_type ,b_name , b_author ,b_publish ,b_price reader : r_no , r_unit , r_name ,r_sex ,r_pro ,r_address borrow

69期-Java SE-005_二维数组、综合练习-001-002

Test.java public class Test { public static void main(String[] args) { int[] array = {73,80,62,93,96,87}; //求最大值 int max = array[0]; for(int i=1;i<array.length;i++) { if(array[i]>max) { max = array[i]; } } System.out.println("数组中的最大值是"+max

69期-Java SE-007_面向对象-1-001-002

Student.java public class Student { //定义属性 int id; String name; int age; int userFirstName; double myScore; //定义方法 public static int add(int num1,int num2) { return num1+num2; } public static void add2(int num1,int num2) { System.out.println(num1+num

69期-Java SE-009_面向对象-3-001-002

### 多态 一个事物有多种表现形态. - 定义方法时形参为父类,调用方法时传入的参数为子类对象. - 定义方法时返回值数据类型为父类,调用方法时返回子类对象. 具有继承关系的两个对象可以相互转换,子类转父类即父类引用指向子类对象,可以自动完成,无需强制转换,也叫做向上转型. 父类转子类即子类引用指向父类对象,不能自动完成转换,需要强制转换,也叫做向下转型. ### 抽象方法和抽象类型 如果一个方法只有方法声明而没有具体的方法实现,那么该方法就是抽象方法,在方法定义处使用 abstract 关键

69期-Java SE-008_面向对象-2-001-002

User.java public class User { public static String name; public static int num; static { num++; System.out.println("执行了静态代码块"); } static { System.out.println("static2"); } } Cashier.java package entity; public class Cashier { private M