HttpServlet

330 次浏览次阅读
没有评论

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)两个文件夹
    HttpServlet
  2. 打开 HttpServletDemo/pom.xml 配置加载 javax.servlet、javax.servlet.jsp 资源包
    HttpServlet
  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
HttpServlet

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>

HttpServlet

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>

HttpServlet

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>

HttpServlet

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

正文完
 0
评论(没有评论)