Servlet及Servlet处理HTTP请求和响应的方法
发布日期:2021-05-08 06:38:31 浏览次数:19 分类:精选文章

本文共 6807 字,大约阅读时间需要 22 分钟。

Servlet 完全指南

1. HttpServlet 处理 Http 请求

Servlet 的 service() 方法是请求的入口方法,HttpServlet 实现该方法会根据不同的 Http 请求方法(如 GET、POST 请求)调用相应的方法。

(1) HTTP 的头信息

  • Accept:指定浏览器或其他客户端可以处理的 MIME 类型。常见值包括 image/pngimage/jpeg
  • Accept-Charset:指定浏览器可以用来显示信息的字符集,例如 ISO-8859-1
  • Accept-Encoding:告知服务器用户代理支持的内容编码及优先级顺序,常见值包括 gzipcompress
  • Accept-Language:告知服务器客户端能够处理的自然语言集,例如 enen-usru 等。
  • Authorization:用于客户端在访问受密码保护的网页时识别身份。
  • Connection:指示客户端是否可以处理持久 HTTP 连接。值 Keep-Alive 表示使用了持续连接。
  • Content-Length:只适用于 POST 请求,给出 POST 数据的大小(以字节为单位)。
  • Cookie:将之前发送到浏览器的 cookies 返回到服务器。
  • Host:指定原始 URL 中的主机和端口。
  • If-Modified-Since:如果在该字段指定的日期后资源发生了更新,服务器会接受请求;否则,返回 304 Not Modified 响应。
  • If-Unmodified-Since:该头信息是 If-Modified-Since 的对立面,指定的请求资源只有在字段值指定的日期之后未发生更新的情况下才能处理请求;否则,返回 412 Precondition Failed。
  • Referer:告知服务器请求的原始资源的 URI。出于安全考虑,建议不要发送该字段。
  • User-Agent:识别发出请求的浏览器或其他客户端,并可以向不同类型的浏览器返回不同的内容。

(2) HttpServletRequest 对象操作 HTTP Request 头的方法

  • Cookie[] getCookies():返回客户端发送该请求的所有 Cookie 对象。
  • Enumeration getHeaderNames():返回一个枚举,包含该请求中所有的头信息名。
  • Enumeration getParameterNames():返回一个 String 对象的枚举,包含在该请求中包含的参数的名称。
  • HttpSession getSession():返回与该请求关联的当前 session 会话,或者如果请求没有 session 会话,则创建一个。
  • HttpSession getSession(boolean create):返回与该请求关联的当前 HttpSession,或者如果没有当前会话且 create == true,则返回一个新的 session 会话。
  • String getCharacterEncoding():返回请求主体中使用的字符编码的名称。
  • String getContentType():返回请求主体的 MIME 类型,如果不知道类型则返回 null。
  • String getContextPath():返回指示请求上下文的请求 URI 部分。
  • String getHeader(String name):以字符串形式返回指定的请求头的值。
  • String getMethod():返回请求的 HTTP 方法的名称,例如 GET、POST 或 PUT。
  • String getParameter(String name):以字符串形式返回请求参数的值,或者如果参数不存在则返回 null。
  • String getProtocol():返回请求协议的名称和版本。
  • String getQueryString():返回包含在路径后的请求 URL 中的查询字符串。
  • String getRemoteUser():如果用户已通过身份验证,则返回发出请求的登录用户,或者如果用户未通过身份验证,则返回 null。
  • String getRequestURI():从协议名称直到 HTTP 请求的第一行的查询字符串中,返回该请求的 URL 的一部分。
  • String getRequestedSessionId():返回由客户端指定的 session 会话 ID。
  • String[] getParameterValues(String name):返回一个字符串对象的数组,包含所有给定的请求参数的值,如果参数不存在则返回 null。
  • int getContentLength():以字节为单位返回请求主体的长度,并提供输入流,或者如果长度未知则返回 -1。

代码示例

@WebServlet("/log")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
String username = req.getParameter("username");
String password = req.getParameter("password");
Part coverImage = req.getPart("cover_image");
String filename = coverImage.getSubmittedFileName();
String path = req.getServletContext().getRealPath("images") + "\\" + filename;
InputStream is = coverImage.getInputStream();
try (OutputStream os = new FileOutputStream(path)) {
byte[] buffer = new byte[8192];
while ((len = is.read(buffer)) != -1) {
os.write(buffer, 0, len);
}
}
}
}

注意:GET 方法不允许获取请求体。如果需要获取,可以这样做:

ServletInputStream inputStream = req.getInputStream();
InputStream is = inputStream;
is.nextLine();

2. Servlet 服务器 HTTP 响应

(1) 服务器端 Response 常见报头

  • Allow:指定服务器支持的请求方法(如 GET、POST)。
  • Cache-Control:指定响应文档在何种情况下可以安全地缓存。可能的值包括 publicprivateno-cache
  • Connection:指示浏览器是否使用持久 HTTP 连接。值 close 表示浏览器不使用持久 HTTP 连接,值 keep-alive 表示使用持久连接。
  • Content-Disposition:可以让浏览器要求用户以给定名称的文件把响应保存到磁盘。
  • Content-Encoding:在传输过程中,指定页面的编码方式。
  • Content-Language:表示文档编写所使用的语言,例如 enen-usru 等。
  • Content-Length:指示响应中的字节数。只有当浏览器使用持久 (keep-alive) HTTP 连接时才需要这些信息。
  • Content-Type:提供了响应文档的 MIME(Multipurpose Internet Mail Extension)类型。
  • Expires:指定内容过期的时间,在这之后内容不再被缓存。
  • Last-Modified:指示文档的最后修改时间。
  • If-Modified-Since:请求头信息提供一个日期。如果在该日期后资源发生了更新,服务器会接受请求;否则,返回 304 Not Modified 响应。
  • Location:可以将响应接收方引导至与请求 URI 位置不同的资源。通常与 3XX:Redirection 响应配合使用,提供重定向的 URI。
  • Refresh:指定浏览器应该如何尽快请求更新的页面。您可以指定页面刷新的秒数。
  • Retry-After:可以与 503(Service Unavailable 服务不可用)响应配合使用,这会告诉客户端多久可以重复它的请求。
  • Set-Cookie:指定一个与页面关联的 cookie。

(2) HttpServletResponse 对象操作 HTTP Response 头的方法

  • String encodeRedirectURL(String url):为 sendRedirect 方法中使用的指定 URL 进行编码,或者如果编码不是必需的,则返回 URL 未改变。
  • String encodeURL(String url):对包含 session 会话 ID 的指定 URL 进行编码,或者如果编码不是必需的,则返回 URL 未改变。
  • boolean isCommitted():返回一个布尔值,指示响应是否已经提交。
  • void addCookie(Cookie cookie):将指定的 cookie 添加到响应。
  • void addDateHeader(String name, long date):添加一个带有给定的名称和日期值的响应报头。
  • void addHeader(String name, String value):添加一个带有给定的名称和值的响应报头。
  • void addIntHeader(String name, int value):添加一个带有给定的名称和整数值的响应报头。
  • void sendRedirect(String location):使用指定的重定向位置 URL 发送临时重定向响应到客户端。
  • void setCharacterEncoding(String charset):设置发送到客户端的响应字符编码(MIME 字符集),例如 UTF-8。
  • void setContentLength(int len):设置 HTTP Servlet 响应中的内容主体的长度,该方法设置 HTTPContent-Length 头。
  • void setContentType(String type):设置发送到客户端响应的内容类型。
  • void setDateHeader(String name, long date):设置一个带有给定的名称和日期值的响应报头。
  • void setHeader(String name, String value):设置一个带有给定的名称和值的响应报头。
  • void setIntHeader(String name, int value):设置一个带有给定的名称和整数值的响应报头。
  • void setStatus(int sc):为该响应设置状态码。

代码示例

@WebServlet("/log")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html; charset=utf-8");
PrintWriter writer = resp.getWriter();
writer.println("

登陆成功

");
resp.sendRedirect("/u"); // 路径跳转
}
}
> **注意**:当需要返回 JSON 数据类型时,可以使用:
>
> ```java
> resp.setContentType("application/json; charset=utf-8");
> ```
## 3. Http 状态码
以下是常见的 HTTP 状态码及其含义:
- **100 Continue**:只有请求的一部分已经被服务器接收,但只要它没有被拒绝,客户端应继续该请求。
- **101 Switching Protocols**:服务器切换协议。
- **200 OK**:请求成功。
- **201 Created**:该请求是完整的,并创建一个新的资源。
- **202 Accepted**:该请求被接受处理,但该处理是不完整的。
- **204 No Content**:无内容。
- **206 Partial Content**:局部请求。
- **301 Moved Permanently**:所请求的页面已经转移到一个新的 URL,永久重定向。
- **302 Found**:所请求的页面已经临时转移到一个新的 URL。
- **303 See Other**:所请求的页面可以在另一个不同的 URL 下被找到。
- **307 Temporary Redirect**:所请求的页面已经临时转移到一个新的 URL,临时重定向。
- **400 Bad Request**:服务器不理解请求。
- **401 Unauthorized**:所请求的页面需要用户名和密码。
- **402 Payment Required**:您还不能使用该代码。
- **403 Forbidden**:禁止访问所请求的页面。
- **404 Not Found**:服务器无法找到所请求的页面。
- **405 Method Not Allowed**:在请求中指定的方法是不允许的。
- **408 Request Timeout**:请求需要的时间比服务器能够等待的时间长,超时。
- **413 Request Entity Too Large**:服务器不接受该请求,因为请求实体过大。
- **414 Request-URL TooLong**:服务器不接受该请求,因为 URL 太长。当您将 "post" 请求转换为带有长查询信息的 "get" 请求时会发生这种情况。
- **500 Internal Server Error**:未完成的请求。服务器遇到了一个意外的情况。
- **502 Bad Gateway**:未完成的请求。服务器从上游服务器收到无效响应。
- **503 Service Unavailable**:未完成的请求。服务器暂时超载或死机。
- **504 Gateway Timeout**:网关超时。
- **505 HTTP Version Not Supported**:服务器不支持 "HTTP 协议" 版本。
## 4. HttpServletResponse 对象设置 HTTP 状态代码的方法
- `public void setStatus(int statusCode)`:该方法设置一个任意的状态码。请确保在使用 `PrintWriter` 实际返回任何内容之前调用 `setStatus`。
- `public void sendRedirect(String url)`:该方法生成一个 302 响应,连同一个带有新文档 URL 的 Location 头。
- `public void sendError(int code, String message)`:该方法发送一个状态码(通常为 404),连同一个在 HTML 文档内部自动格式化并发送到客户端的短消息。
上一篇:Java设计模式
下一篇:JavaWeb15:Servlet项目配置

发表评论

最新留言

关注你微信了!
[***.104.42.241]2025年05月03日 00时58分18秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章