什么是 Servlet

Servlet 是一个接口规范,其规定了 web 服务器在接收到请求时应该怎么做处理,Servlet 不管具体实现,由各类 web 服务器负责实现,目前最流行的服务器软件为 Tomcat

第一个 servlet 程序

创建 servlet 项目

idea 下

image.png

servlet 简单程序

import java.io.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;

//@WebServlet(name = "helloServlet", value = "/hello-servlet")
public class HelloServlet extends HttpServlet {//servlet类需要继承HttpServlet类
    private String message;

    public void init() {
        message = "Hello World!";
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.setContentType("text/html");

        // Hello
        PrintWriter out = response.getWriter();
        out.println("<html><body>");
        out.println("<h1>" + message + "</h1>");
        out.println("</body></html>");
    }

    public void destroy() {
    }
}

init()方法:init()方法仅在服务器装载 Servlet 时才由服务器执行一次
Service 方法:每次客户端请求服务器的时候,就会调用 Service 方法
destroy 方法:仅在服务器移除 Servlet 时才由服务器执行一次

Service 方法和 doGet,doPost 方法

  1. 当类中有 service 方法时,只会执行 service 方法,不会执行 doPost 和 doGet
  2. 当类中没有 service 方法时,servlet 会按照 jsp 传来的请求类型,执行 doGet 还是 doPost

servlet 继承体系

ServletConfig 类

作用

  1. 在 servlet 被加载的 init 方法时,获得初始化参数
  2. 获取 Servlet 程序别名
  3. 获取 servletContext

web.xml

在 Servlet 的配置文件 web.xml 中,可以使用一个或多个标签为 servlet 配置一些初始化参数。

<servlet>
    <servlet-name>ServletConfigDemo1</servlet-name>
    <servlet-class>gacl.servlet.study.ServletConfigDemo1</servlet-class>     <!--配置ServletConfigDemo1的初始化参数 -->
    <init-param>
        <param-name>name</param-name>
        <param-value>gacl</param-value>
    </init-param>
     <init-param>
       <param-name>password</param-name>
        <param-value>123</param-value>
    </init-param>
    <init-param>
        <param-name>charset</param-name>
       <param-value>UTF-8</param-value>
   </init-param>
</servlet>

通过 ServletConfig 获取初始化信息

getInitParameter(参数名);
config.getServletName();获取Servlet程序的别名

每个 Servlet 只能获取自己的 ServletConfig 类

ServletContext

ServletContext 官方叫 servlet 上下文。服务器会为每一个工程创建一个对象,这个对象就是 ServletContext 对象。这个对象全局唯一,而且工程内部的所有 servlet 都共享这个对象。所以叫全局应用程序共享对象。

作用

  1.   是一个域对象
    
  2.   可以读取全局配置参数
    
  3.   可以搜索当前工程目录下面的资源文件
    
  4.   可以获取当前工程名字(了解)
    

servletContext 是一个域对象

image.png
servletContext 存储数据特点,
全局共享,里面的数据所有动态资源都可以写入和获取
服务器启动的时候创建,服务器关闭的时候销毁,因为这是全局应用程序对象,全局共享对象。

读取全局配置参数

xml 配置文件

<!-- 全局配置参数,因为不属于任何一个servlet,但是所有的servlet都可以通过servletContext读取这个数据 -->

<context-param>

       <param-name>param1</param-name>

       <param-value>value1</param-value>

</context-param>

 <context-param>

       <param-name>param2</param-name>

       <param-value>value2</param-value>

</context-param>

方法

image.png

域对象

作用

保存数据,获取数据,共享数据.

Servlet 三大域对象

对象名称 对象的类型
request HttpServletRequest
session HttpSession
application ServletContext

request

生命周期:

  • 创建:客户端向服务器发送一次请求,服务器就会创建 request 对象.
  • 销毁:服务器对这次请求作出响应后就会销毁 request 对象.
  • 有效:仅在当前请求中有效。

作用:

① 获取表单提交参数: request.getParameter()

//从login.jsp中获取用户名和密码
String username = request.getParameter(“username”);
String password = request.getParameter(“password”);
String imageText = request.getParameter(“imageText”);

② 传值到表单: request.setAttribute()

if(user == null) {
//用户名和密码不匹配
request.setAttribute(“msg”, “用户名和密码不匹配!);
return/jsp/login.jsp”;
}

session

生命周期:

  • 创建:服务器端第一次调用 getSession();(保存在服务器内存中)
  • 销毁:
    • 1.非正常关闭服务器(正常关闭 session 会序列化,再次启动服务器 session 会被反序列化);
    • 2.session 过期了默认 30 分钟.
    • 3.手动调用 session.invalidate();
  • 注意:关闭浏览器再次访问会找不到 session 的会话 id 而不是 session 被销毁了。

有效:用户打开浏览器会话开始,直到关闭浏览器会话才会结束。一次会话期间只会创建一个 session 对象。

作用:

① 读取生成的验证码信息:
// 图片的验证码
String imageMsg = (String) request.getSession().getAttribute(“imageMsg”);
② 用户保持登录状态:
//登录成功 保存用户登录状态
request.getSession().setAttribute(“user”, user);
③ 购物车物品保存:
//将 cart 放入 session 中
request.getSession().setAttribute(“cart”, cart);

application

生命周期:

  • 创建:服务器启动的时候,服务器为每个 WEB 应用创建一个属于该 web 项目的对象 ServletContext 类.
  • 销毁:服务器关闭或者项目从服务器中移除的时候.
  • 有效:此信息在整个服务器上被保留。

区别

  • request: 每一次请求都是一个新的 request 对象,如果在 web 组件之间需要共享同一个请求中的数据,只能使用请求转发.
  • session: 每一次会话都是一个新的 session 对象,如果如果需要在一次会话中的多个请求之间需要共享数据,只能使用 session.
  • application: 应用对象,Tomcat 启动到关闭,表示一个应用,在一个应用中有且只有一个 application 对象,作用于整个 Web 应用,可以实现多次会话之间的数据共享.