HttpServlet

作者: 太阳上的雨天 分类: Java 发布时间: 2022-01-31 00:55

HttpServlet

什么是HttpServlet

HttpServlet是Servlet接口的一个实现类

Servlet框架是由两个Java包组成:javax.servlet和javax.servlet.http。 在javax.servlet包中定义了所有的Servlet类都必须实现或扩展的的通用接口和类,在javax.servlet.http包中定义了采用HTTP通信协议的HttpServlet类

HttpServlet的请求响应流程

  • Web客户向Servlet容器发出Http请求
  • Servlet容器解析Web客户的Http请求
  • Servlet容器创建一个HttpRequest对象,在这个对象中封装Http请求信息
  • Servlet容器创建一个HttpResponse对象
  • Servlet容器调用HttpServlet的service方法,把HttpRequest和HttpResponse对象作为service方法的参数传给HttpServlet对象
  • HttpServlet调用HttpRequest的有关方法,获取HTTP请求信息
  • HttpServlet调用HttpResponse的有关方法,生成响应数据
  • Servlet容器把HttpServlet的响应结果传给Web客户

如何创建HttpServlet,实现步骤

  • 继承HttpServlet抽象类
  • Override HttpServlet的部分方法,常见的doGet(), doPost()方法
  • 获取HTTP请求信息。通过HttpServletRequest对象来检索HTML表单所提交的数据或URL上的查询字符串
  • 生成HTTP响应结果。通过HttpServletResponse对象生成响应结果

创建测试项目HttpServletDemo,实现HttpServlet

  1. 在src/main目录下,新建一个package名字随便取,然后在package下新建一个java(Source Root)和resources(Resources Root)两个文件夹
  2. 打开HttpServletDemo/pom.xml配置加载javax.servlet、javax.servlet.jsp资源包
  3. 打开webapp/WEB-INF/web.xml,复制以下内容替换web.xml中的代码
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
                      https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
         version="5.0">
    </web-app>

    ServletContext

什么是ServletContext ?

ServletContext是一个web应用的上下文对象

ServletContext对象的生命周期 ?

ServletContext中属性的生命周期从创建开始,到服务器关闭结束

如何获得ServletContext ?

# 继承HttpServlet
ServletContext servletContext = this.getServletContext();

1.1 域对象的通用的方法:

setAtrribute(String name,Object obj) # 键值对

getAttribute(String name) # 根据健取值,取到的值为Object类型,需要向下转型

removeAttribute(String name)
创建com.test.servlet/TestHttpServletDemo.java

package com.test.servlet;

import javax.servlet.ServletContext;
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 TestHttpServletDemo extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = this.getServletContext();

        String name = "HttpServlet -> getServletContext -> setAttribute && getAttribute";
        servletContext.setAttribute("name", name);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

创建com.test.servlet/TestHttpServletDemo2.java

package com.test.servlet;

import javax.servlet.ServletContext;
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 TestHttpServletDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = this.getServletContext();
        String name = (String) servletContext.getAttribute("name");

        resp.setContentType("text/html; charset=UTF-8");
        resp.getWriter().write(name);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

webapp/WEB-INF/web.xml

<servlet>
    <servlet-name>demo</servlet-name>
    <servlet-class>com.test.servlet.TestHttpServletDemo</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>demo</servlet-name>
    <url-pattern>/demo</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>demo2</servlet-name>
    <servlet-class>com.test.servlet.TestHttpServletDemo2</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>demo2</servlet-name>
    <url-pattern>/demo2</url-pattern>
  </servlet-mapping>

先访问http://localhost:8080/demo/demo
在访问http://localhost:8080/demo/demo2

1.2 获取web初始化参数
创建com.test.servlet/TestHttpServletDemo3.java

package com.test.servlet;

import javax.servlet.ServletContext;
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 TestHttpServletDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = this.getServletContext();

        // 获取web初始化参数
        String db = servletContext.getInitParameter("db-mysql");
        resp.getWriter().println(db);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

webapp/WEB-INF/web.xml

  <!--  配置web应用的初始化参数  -->
  <context-param>
    <param-name>db-mysql</param-name>
    <param-value>jdbc:mysql://localhost:3306/DatabaseName</param-value>
  </context-param>

  ......

    <servlet>
    <servlet-name>demo3</servlet-name>
    <servlet-class>com.test.servlet.TestHttpServletDemo3</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>demo3</servlet-name>
    <url-pattern>/demo3</url-pattern>
  </servlet-mapping>

1.3 请求转发 (与重定向 1.5 )
请求转发:客户端发起一次请求,一次响应。客户端向服务端A发起请求,A接到请求后,调用getRequestDispacther 把请求转发给指定的服务端B。整个过程都在服务端完成,而且是在同一个请求里面。因此A和B共享一个Request.

重定向: 客户端发起两次请求,两次响应。客户发送一个请求到服务端A,A接到请求后,向客户端返回个响应,告诉客户端,你必须再发送一个请求到服务端B。紧接着客服端再次发送一个请求到服务端B。两次请求,相互独立,不共享Request

getRequestDispatcher(String s) # s 转发路径
创建com.test.servlet/TestHttpServletDemo4.java

package com.test.servlet;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
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 TestHttpServletDemo4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = this.getServletContext();

        RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher("/demo3"); //转发的请求路径
        requestDispatcher.forward(req, resp); // 调用forward实现请求转发
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

webapp/WEB-INF/web.xml


  <servlet>
    <servlet-name>demo4</servlet-name>
    <servlet-class>com.test.servlet.TestHttpServletDemo4</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>demo4</servlet-name>
    <url-pattern>/demo4</url-pattern>
  </servlet-mapping>

1.4 Properties
load() 从字节输入流中读取键值对
在main目录下创建resources文件夹,并设置为resources root。然后在resources文件夹下创建test.properties

name=test

创建com.test.servlet/TestHttpServletDemo5.java

package com.test.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class TestHttpServletDemo5 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        InputStream resourceAsStream = this.getServletContext().getResourceAsStream("/WEB-INF/classes/test.properties");

        Properties prop = new Properties();
        prop.load(resourceAsStream);
        String name = prop.getProperty("name");

        resp.getWriter().println(name);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

webapp/WEB-INF/web.xml

  <servlet>
    <servlet-name>demo5</servlet-name>
    <servlet-class>com.test.servlet.TestHttpServletDemo5</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>demo5</servlet-name>
    <url-pattern>/demo5</url-pattern>
  </servlet-mapping>

1.5 重定向
sendRedirect(String s)
创建com.test.servlet/TestHttpServletDemo6.java

package com.test.servlet;

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 TestHttpServletDemo6 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.sendRedirect("/demo/demo5");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

webapp/WEB-INF/web.xml

<servlet>
    <servlet-name>demo6</servlet-name>
    <servlet-class>com.test.servlet.TestHttpServletDemo6</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>demo6</servlet-name>
    <url-pattern>/demo6</url-pattern>
  </servlet-mapping>

访问:http://localhost:8080/demo/demo6, 会重定向到 http://localhost:8080/demo/demo5

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注