文章目录

  • 一、Servlet 的概述
  • 二、Servlet 的入门
  • 1. 创建包和类
  • 2. 让该类实现 Servlet 接口
  • 3. 在 web.xml 中 配置这个类
  • 4. 访问 Servlet
  • 三、Servlet 的执行流程
  • 四、Servlet 的实现关系
  • 1. 基本实现关系
  • 2. 关系实现的概述
  • 3. 在 IDEA 中创建 Servlet
  • 五、Servlet 的生命周期
  • 1. Servlet 生命周期的概述
  • 六、Servlet 的启动时加载
  • 1. 用启动时加载 的原因
  • 2. 配置完成启动时加载
  • 七、Servlet 的访问路径的配置
  • 1. Servlet 中的 `` 的配置方式
  • 2. 访问的优先级
  • 八、ServletConfig 对象
  • 1. 概述
  • 2. 获得 ServletConfig 对象
  • 3. ServletConfig 对象的 API
  • 九、ServletContext 对象
  • 1. ServletContext 对象概述
  • 2. ServletContext 对象的作用一:获取 web 项目信息
  • 3. ServletContext 对象的作用二:读取 web 项目下文件
  • 4. ServletContext 对象的作用三:作为域对象存取数据
  • 十、Response 对象
  • 1. Response 对象的概述
  • 2. Response 对象的 API
  • 3. 代码演示例子
  • 4. Response 对象响应的中文乱码处理
  • 十一、Request 对象
  • 1. Request 对象的概述及API
  • 2. 代码演示例子
  • 3. Request 对象接收表单请求参数
  • 3. Request 对象接收表单请求参数中文乱码处理



一、Servlet 的概述

  • Servlet 是一个运行在 web 服务器上的小的 java 程序,用于处理从 web 客户端发送的请求,并且对请求作出响应;
  • 使用 Servlet
    编写一个 java 类实现 Servlet 的接口;
    配置 Servlet;

二、Servlet 的入门

1. 创建包和类

Java 当response为null不返回_javaweb

2. 让该类实现 Servlet 接口

这里主要重写了 service 方法;

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

/**
 * Servlet 的入门程序
 */
public class HelloServlet implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

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

    /*
        这里主要用这个方法
        用来处理客户请求,并对请求作出响应;
     */
    @Override
    public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException {
        //向页面输出内容
        resp.getWriter().println("hello Servlet!!!");
    }

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

    @Override
    public void destroy() {

    }
}

3. 在 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">

    <!-- 配置Servlet -->
    <servlet>
        <!-- 配置 Servlet 的名称 -->
        <servlet-name>HelloServlet</servlet-name>
        <!-- 配置 Servlet 的全路径 -->
        <servlet-class>ServletDemo1.HelloServlet</servlet-class>
    </servlet>

    <!-- 配置Servlet 的一个映射-->
    <servlet-mapping>
        <!-- 配置 Servlet 的名称 -->
        <servlet-name>HelloServlet</servlet-name>
        <!-- 配置访问路径 -->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>

4. 访问 Servlet

Java 当response为null不返回_java_02

三、Servlet 的执行流程

Java 当response为null不返回_Servlet_03

四、Servlet 的实现关系

1. 基本实现关系

Servlet 接口
|
GenericServlet 类:通用的 Servlet,是一个与协议无关的 Servlet;
|
HttpServlet 类:HTTP 专用的 Servlet;

2. 关系实现的概述

  • 通常编写一个 Servlet 都会让这个 Servlet 继承 HttpServlet,重写 service 方法;
  • 在 service 方法内部,会根据请求方式不同,执行不同的 doXXX 方法;
    (get 请求执行 doGet 方法,post 请求执行 doPost 方法)
  • 所以 往往继承了 HttpServlet 之后,不需要重写 service 方法只需要重写 doGet 和 doPost 即可;
  • 通常请求要处理的代码都是一致的,所以需要让 doGet 和 doPost 相互调用,可以简化编程;
package ServletDemo2;

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 HelloServlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //如果是GET请求,就会执行doGet中的代码
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //如果是POST请求,就会执行doPost中的代码
        resp.getWriter().println("HelloServlet22222222");
    }
}

Java 当response为null不返回_xml_04

3. 在 IDEA 中创建 Servlet

(可以直接创建 Servlet,不用自己在 web.xml 中配置信息)

Java 当response为null不返回_javaweb_05

五、Servlet 的生命周期

1. Servlet 生命周期的概述

  • 生命周期:一个对象从创建到销毁的过程;
  • 和生命周期相关的三个方法:
  • Servlet 第一次被访问时会被实例化,只要 Servlet 被实例化,init 方法就会执行(init 方法只会执行一次);
  • 任何一次从客户端发来的请求,service 方法就会执行(在 service 内部根据不同的请求方式调用不同的 doXxx 方法);
  • 当 Servlet 从服务器移除,或者服务器关闭的时候,Servlet 对象会被销毁,里面的 destory 方法就会执行,然后垃圾回收就会将其回收掉;

六、Servlet 的启动时加载

1. 用启动时加载 的原因

  • 假设在 init 方法中做了一些耗时的操作,则第一个用户第一次访问这个对象时,等待时间长;
  • 所以需要将 Servlet 改为启动时加载
  • 让服务器启动时 就创建 Servlet 的对象,这样 之前耗时的操作就会在 服务器启动时花费,用户不需要额外花费时间;

2. 配置完成启动时加载

在 web.xml 中进行配置

Java 当response为null不返回_Servlet_06

七、Servlet 的访问路径的配置

1. Servlet 中的 <url-pattern> 的配置方式

  • 完全路径匹配
    / 开始;
  • 目录匹配
    / 开始,以 /* 结束;
  • 扩展名匹配
    不能以 / 开始,是以 * 开始

Java 当response为null不返回_Servlet_07

2. 访问的优先级

完全路径匹配 > 目录匹配 > 扩展名匹配

八、ServletConfig 对象

1. 概述

  • ServletConfig 用来获得 Servlet 的相关配置的对象;

2. 获得 ServletConfig 对象

getServletConfig()

3. ServletConfig 对象的 API

Java 当response为null不返回_java_08

  • 获得 Servlet 的初始化参数
  • 获得 ServletContext 对象
  • 获得 Servlet 名称

九、ServletContext 对象

1. ServletContext 对象概述

  • ServletContext :Servlet 的上下文对象;ServletContext 对象对 Servlet 之前和之后的内容都知道;
  • ServletContext 对象 一个 web 项目只有一个;
  • 在服务器启动时为每个 web 项目创建一个单独的 ServletContext 对象;

2. ServletContext 对象的作用一:获取 web 项目信息

获取 web 项目信息

  • 获取文件的 MIME 类型;getMimeType()
  • 获取 web 请求的工程名;getContextPath()
  • 获取 web 项目的初始化参数;getInitParameter()getInitParameterNames()
  • Java 当response为null不返回_xml_09


3. ServletContext 对象的作用二:读取 web 项目下文件

读取 web 项目下文件

  • 之前用 IO 流可以读取文件,现在 获取 web 项目下的文件,使用传统的 IO 流会出现错误;
  • 用传统方式写,会出现异常,问题出现在 相对路径;
  • Java 当response为null不返回_java_10


  • Java 当response为null不返回_Servlet_11

  • 用 ServletContext 读取
  • Java 当response为null不返回_java_12

  • 用 传统方式 和 ServletContext 读取
  • Java 当response为null不返回_服务器_13

4. ServletContext 对象的作用三:作为域对象存取数据

作为域对象存取数据

  • 存入数据的方法;setAttribute()
  • 获取数据的方法;getAttribute()
  • 移除数据的方法;removeAttribute()
1. 域对象:指的是将数据存入到域对象中,这个数据就会有一定的作用范围;
2. 域:指的是一定的作用范围;
3. ServletContext 作为域对象的作用范围:整个 web 服务器;

十、Response 对象

1. Response 对象的概述

  • B/S 结构的软件,可以通过浏览器访问服务器;

Java 当response为null不返回_Servlet_14

2. Response 对象的 API

(1)关于响应行的方法

  • setStatus(int sc) 设置响应的状态码;

(2)关于响应头的方法

  • set 开头的方法:一个 key 对应一个 value情况;
    setHeader(String name, String value)
  • Java 当response为null不返回_服务器_15


  • Add 开头的方法:一个 key 对应多个 value 的情况;
    addHeader(String name, String value)
  • Java 当response为null不返回_javaweb_16


(3)关于响应体的方法

  • getOutputStream()
  • getWriter()

(4)其他 API

  • 重定向方法;setRedirect()
  • 设置浏览器打开页面时采用的字符集;setContentType()
  • 设置响应字符流的缓冲区字符集;setCharacterEncoding()
  • 服务器想浏览器回写Cookie的方法;addCookie()

3. 代码演示例子

(1)重定向

  • 302 状态码和 Location 响应头结合使用的效果
  • 实际开发中可以使用 response.sendRedirect("/web01/ResponseDemo2"); 替换重定向两句的写法;

(2)定时刷新

Java 当response为null不返回_javaweb_17

4. Response 对象响应的中文乱码处理

(1)使用字节流处理中文

解决:将中文转成字节数组的时候 和 浏览器默认打开的时候 采用的字符集一致即可。

Java 当response为null不返回_Servlet_18


(2)使用字符流处理中文

解决:设置 response 获得字符流缓冲区的编码 和 设置浏览器默认打开时候 采用的字符集一致即可。

Java 当response为null不返回_java_19

十一、Request 对象

1. Request 对象的概述及API

(1)获得客户机信息

  • 获得请求的方式;getMethod()
  • 获得请求路径后提交参数的字符串;getQueryString()
  • 获得请求路径的 URI、URL;getRequestURI(), getRequestURL()
  • 获得客户机的 IP 地址;getRemoteAddr()

(2)获得请求头的方法

  • 获得一个 key 对应一个 value 的请求头;getHeader(String name)
  • 获得一个 key 对应多个 value 的请求头;getHeaders(String name)

(3)获得请求参数的方法

  • 用来获得提交的参数(一个 name 对应一个 value);getParameter(String name)
  • 用来获得提交的参数(一个 name 对应多个 value);getParameterValues(String name)
  • 用来获得提交的参数(将提交的参数名称和对应的值封装到一个 map 中);getParameterMap(String name)

(4)Request 作为域对象存取数据的方法

  • 向 request 域中存数据;setAttribute(String name, Object o)
  • 从 request 域中获取数据;getAttribute(String name)
  • 从 request 域中移除数据;removeAttribute(String name)

2. 代码演示例子

Java 当response为null不返回_javaweb_20


Java 当response为null不返回_java_21

3. Request 对象接收表单请求参数

  • demo1.html
  • RequestDemo2.java

    接着上面的代码,用另外一种接收数据的方式:

3. Request 对象接收表单请求参数中文乱码处理

  • 页面:

(1)get 方式处理中文乱码

解决:将存入到 request 缓冲区的值以 ISO-8859-1 的方式获取到,以 UTF-8 的方式进行编码。

Java 当response为null不返回_javaweb_22

(2)post 方式处理中文乱码

解决:将 request 缓冲区的编码修改了即可。

Java 当response为null不返回_java_23