详解Servlet API

目录
HttpServlet
核心方法
代码示例【处理Get请求】:
代码示例【处理Post请求】:
HttpServerRequest
核心方法
代码示例:【打印请求头信息】
HttpServletResponse
核心方法
代码示例【设置状态码】:
代码示例【重定向】:
代码示例【设置刷新周期】:
HttpServlet
我们写 Servlet 代码的时候, 首先第一步就是先创建类, 继承自 HttpServlet, 并重写其中的某些方法.
核心方法

这些方法的调用时机, 就称为 "Servlet 生命周期". (也就是描述了一个 Servlet 实例从生到死的过
 程).

代码示例【处理Get请求】:
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/getParameter")
public class GetParameterServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username = req.getParameter("username");String password = req.getParameter("password");System.out.println("username=" + username);System.out.println("password=" + password);resp.getWriter().write("ok");}
} 
运行结果:


代码示例【处理Post请求】:
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/postParameter")
public class PostParameterServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username = req.getParameter("username");String password = req.getParameter("password");System.out.println("username=" + username);System.out.println("password=" + password);resp.getWriter().write("ok");}
} 
运行结果:


HttpServerRequest
当 Tomcat 通过 Socket API 读取 HTTP 请求(字符串), 并且按照 HTTP 协议的格式把字符串解析成
 HttpServletRequest 对象.
核心方法
| 方法 | 描述 | 
|    String getProtocol()     |    返回请求协议的名称和版本。     | 
|    String getMethod()     |    返回请求的  HTTP  方法的名称,例如, GET 、 POST  或  PUT 。    | 
|    String getRequestURI()     |    从协议名称直到  HTTP  请求的第一行的查询字符串中,返回该     请求的  URL  的一部分。     | 
|    String getContextPath()    |    返回指示请求上下文的请求  URI  部分。    | 
|    String getQueryString()    |    返回包含在路径后的请求  URL  中的查询字符串。    | 
|    Enumeration     getParameterNames()    |    返回一个  String  对象的枚举,包含在该请求中包含的参数的名     称。    | 
|    String getParameter(String     name)     |    以字符串形式返回请求参数的值,或者如果参数不存在则返回     null 。    | 
|    String[]     getParameterValues(String     name)    |    返回一个字符串对象的数组,包含所有给定的请求参数的值,     如果参数不存在则返回  null 。    | 
|    Enumeration     getHeaderNames()     |    返回一个枚举,包含在该请求中包含的所有的头名。    | 
|    String getHeader(String     name)     |    以字符串形式返回指定的请求头的值。     | 
|    String     getCharacterEncoding()     |    返回请求主体中使用的字符编码的名称。     | 
|    String getContentType()     |    返回请求主体的  MIME  类型,如果不知道类型则返回  null 。    | 
|    int getContentLength()    |    以字节为单位返回请求主体的长度,并提供输入流,或者如果     长度未知则返回  -1 。     | 
|    InputStream     getInputStream()     |    用于读取请求的  body  内容 .  返回一个  InputStream  对象    | 
代码示例:【打印请求头信息】
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;@WebServlet("/show")
public class ShowRequestServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {StringBuilder stringBuilder = new StringBuilder();stringBuilder.append(req.getProtocol());stringBuilder.append("<br>");stringBuilder.append(req.getMethod());stringBuilder.append("<br>");stringBuilder.append(req.getRequestURI());stringBuilder.append("<br>");stringBuilder.append(req.getContextPath());stringBuilder.append("<br>");stringBuilder.append(req.getQueryString());stringBuilder.append("<br>");// 获取所有的 header.Enumeration<String> headerNames = req.getHeaderNames();while (headerNames.hasMoreElements()) {String key = headerNames.nextElement();String value = req.getHeader(key);stringBuilder.append(key + ": " + value + "<br>");}resp.setContentType("text/html; charset=utf8");resp.getWriter().write(stringBuilder.toString());}
} 
运行结果:

HttpServletResponse
Servlet 中的 doXXX 方法的目的就是根据请求计算得到相应, 然后把响应的数据设置到
 HttpServletResponse 对象中. 
 然后 Tomcat 就会把这个 HttpServletResponse 对象按照 HTTP 协议的格式, 转成一个字符串, 并通过Socket 写回给浏览器.
核心方法
| 方法 | 描述 | 
|    void setStatus(int sc)    |    为该响应设置状态码    | 
|    void setHeader(String name,     String value)    |    设置一个带有给定的名称和值的  header.  如果  name  已经存在 ,     则覆盖旧的值    | 
|    void addHeader(String     name, String value)     |    添加一个带有给定的名称和值的  header.  如果  name  已经存在 ,     不覆盖旧的值 ,  并列添加新的键值对     | 
|    void setContentType(String     type)    |    设置被发送到客户端的响应的内容类型。    | 
|    void     setCharacterEncoding(String     charset)     |    设置被发送到客户端的响应的字符编码( MIME  字符集)例如:UTF-8    | 
|    void sendRedirect(String     location)     |    使用指定的重定向位置  URL  发送临时重定向响应到客户端。    | 
|    PrintWriter getWriter()    |    用于往  body  中写入文本格式数据 .     | 
|    OutputStream     getOutputStream()     |    用于往  body  中写入二进制格式数据 .     | 
代码示例【设置状态码】:
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/status")
public class StatusServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.sendError(404, "这个页面是一个错误页面");}
} 
运行结果:

代码示例【重定向】:
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/redirect")
public class RedirectServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.sendRedirect("https://www.sogou.com");}
} 
运行结果:

代码示例【设置刷新周期】:
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/refresh")
public class RefreshServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setHeader("refresh", "1");resp.getWriter().write("" + System.currentTimeMillis());}
} 
通过fiddler抓包:

