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
- 在 src/main 目录下,新建一个 package 名字随便取, 然后在 package 下新建一个 java(Source Root) 和 resources(Resources Root)两个文件夹
- 打开 HttpServletDemo/pom.xml 配置加载 javax.servlet、javax.servlet.jsp 资源包
- 打开 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