浅析 HttpServlet

本文包含内容:

  1. Servlet 的处理流程和任务
  2. javax.servlet.http.HttpServlet 包
  3. @WebServlet(…) 注解

在 javax.servlet 包中定义了所有的 Servlet 都必须实现的或扩展的通用接口和类,javax.servlet.http. 包中定义了采用 HTTP 通信协议的 HttpServlet 类。

Servlet 是运行在带有支持 Java Servlet 规范的解释器的 web 服务器上的 Java 类。

Servlet 的 Tomcat,Jsp,EL spec,WebSocket,Apache Tomcat,Java 版本支持:

支持关系:https://blog.csdn.net/jackpk/article/details/46235815

— Servlet 框架由两个包组成(企业版标准组成):

(1)javax.servlet

(2)javax.servlet.http.

Servlet 的处理流程和任务:
(1)Servlet 的处理流程

(2)Servlet 的任务

读取客户端(浏览器)发送的显式的数据。包括HTML表单,或来自 applet 或自定义 HTTP 客户端程序表单;

读取客户端(浏览器)发送的隐式的 HTTP 请求数据。包括 cookies,媒体类型,及浏览器能理解的压缩格式等;

处理数据并生成结果。可对数据库进行访问,执行 RMI 或 CORBA 调用,调用 Web 服务,或者直接计算得出对应的响应;

发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是文本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel 等;

发送隐式的 HTTP 响应到客户端(浏览器)。返回响应类型(contentType 如 HTML页面,plain文本),设置 cookies 和缓存参数,以及其他类似的任务。

>>当一个 Web 服务器响应一个 HTTP 请求时,响应通常包括一个状态行,一些响应报头,一个空行文档

— Servlet 处理 HTTP 请求过程:

① Web客户端向 Servlet 发出 HTTP 请求;

② Servlet 容器解析 HTTP 请求;

③ Servlet 容器创建一个 HttpRequest 对象,在该对象中封装 HTTP 请求信息,包括客户端发送的数据和请求类型;

④ Servlet 容器创建一个 HttpResponse 对象.

— javax.servlet.http.HttpServlet 包(Servlet 服务器 HTTP 响应)
关于HTTP响应参考菜鸟教程: https://www.runoob.com/servlet/servlet-server-response.html


HttpServlet (abstract class)

Http 请求方式包括六种:DELETE,GET,POST,OPTIONS,PUT,TRACE

HttpServlet 为公共抽象类(什么都不做):提供要进行子类化的抽象类,以创建适用于Web站点的HTTP Servlet。

HttpServlet 必须重写至少一个方法的子类。通常是以下方法之一处理标准 HTTP 请求:

void service(ServletRequest req, ServletResponse res) –继承自 javax.servlet,将客户端请求分派给受保护的 service方法。客户端发送的 HTTP 请求和服务器的 HTTP 响应均在service() 下完成。
protected void doGet(HttpServletRequest req, HttpServletResponse resp) –用于HTTP GET 请求
protected void doPost(HttpServletRequest req, HttpServletResponse resp) –用于 HTTP POST 请求
protected void doPut(HttpServletRequest req, HttpServletResponse resp) –用于 HTTP PUT 请求
protected void doDelete(HttpServletRequest req, HttpServletResponse resp) –用于 HTTP DELETE 请求(init 并且 destroy –管理为 Servlet 的生命周期而持有的资源 getServletInfo –Servlet 用来提供有关自身的信息)
protected long getLastModified(HttpServletRequest req), --从public service方法接收标准HTTP请求, 并将它们分派给此类中定义的doXXX方法。

HttpServlet 包括更多方法如 doHead(…), doOptions(…), doTrace(…),

关于 HttpServlet 下的方法,这里不详细记录,更多详细内容:

API 详述:https://docs.oracle.com/javaee/7/api/javax/servlet/http/HttpServlet.html

注意:
① HttpServlet 是 javax.servlet 的子类,Servlet 对浏览器发送的 HTTP 请求(request) 和 HTTP响应(response) 都是在 service() 方法中进行的
② 如果 Servlet 通过 javax.servlet.http.HttpServlet 实现,对 doGet(…) 或 doPost(…) 重写,那么该 Servlet 只能对 GET 或 POST 作出响应
③ 如果开发人员想处理所有类型的请求(request),只要简单地实现service方法即可(但假如选择实现service方法,则不必实现doPost或doGet方法,除非在service方法的开始调用super.service())

— 创建 HttpServlet 步骤

…扩展 HttpServlet 抽象类;

…重写 HttpServlet 部分方法。如 doGet(…), doPost(…);

…获取 Http 请求信息。通过 HttpServletRequest 对象获取用户提交的数据或URL上的查询字符串;

…生成 HTTP 响应结果。通过 HttpResponse 对象.getWirter() 方法生成响应结果,该方法返回 PrintWriter 对象。

— Http 服务器端响应实例
package servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.annotation.WebServlet;

//关于 @WebServlet(…) 注解
// – 如引入注解有误,则需要导入 .jar 包:jackson-annotation-2.2.3.jar
//@WebServlet(...) 注解相关内容
@WebServlet(“/BaseServlet”) 
public class BaseServlet extends HttpServlet {//1. 扩展 HttpServlet 抽象类
	//2. 重写 doPost(…) 和 doGet(…)方法
	@Override
	//ServletException 处理异常:无法处理 POST 请求
	//IOException 处理异常:处理 POST 请求时检测到输入或输出错误
	Protected void doPost(HttpServletRequset req, HttpServletResponse resp) throws ServletException, IOException {
try {
	//3. 获取客户端请求信息
	String myName = req.getParameter(“myName”);
	if(null != myName) {
		myName = resp.setCharacterEncoding(“UTF-8”);
} else {
	myName = “你的名字”;
}

//4. 生成 HTTP 响应结果并向客户端回显信息
resp.setContentType(“text/plain”);  //返回结果为 plain -- .txt 文本
PrintWriter pw = resp.getWriter();
pw.write(myName);
pw.flush();  //刷新 PrintWriter缓存区
pw.close();

} catch(Exception e) {
	e.printStackTrace();
}
}//end doPost

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	this.doPost(req, resp);
}//end doGet
}//end class BaseServlet extends HttpServlet

最后在 web.xml 中添加(如使用了 @WebServlet(“”) 注解, 则无需这一步操作)

<servlet>
	<!-- 类名称 -->
	<servlet-name>BaseServlet</servlet-name>
	<!—包名.类名 -->
	<servlet-class>servlet.BaseServlet</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>BaseServlet</servlet-name>
	<!—项目路径-->
	<url-pattern>/servletLearn</url-pattern>
</servlet-mapping>

参考资料:

菜鸟教程 – Servlet 服务器 HTTP 响应:
https://www.runoob.com/servlet/servlet-server-response.html

博客园 @Author 小顾问 – HttpServlet详解:
https://www.cnblogs.com/panjun-Donet/archive/2010/02/22/1671290.html

Oracle Java EE API – 类HttpServlet:https://docs.oracle.com/javaee/7/api/javax/servlet/http/HttpServlet.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值