探索 Servlet 的秘密

Servlet

什么是servlet

概念:
Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。

作用:
其主要功能在于交互式地浏览和修改数据,生成动态Web内容。

理解:
狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一 般情况下,我们将Servlet理解为后者。

Servlet 架构:
在这里插入图片描述

Servlet标准 API核心包:

  • javax.servlet:其中包含定义Servlet和Servlet容器之间的类和接口
  • javax.servlet.http:其中包含定义HTTP Servlet和Servlet容器之间的类和接口
  • javax.servlet.annotation:其中包含标注Servlet,Filter,Listener的注解

CDSN:cmd下 && IDEA下 的 Servlet

Servlet 任务:

  • 读取客户端(浏览器)发送的显式的数据。这包括网页上的 HTML 表单,或者也可以是来自 applet 或自定义的 HTTP 客户端程序的表单。
  • 读取客户端(浏览器)发送的隐式的 HTTP 请求数据。这包括 cookies、媒体类型和浏览器能理解的压缩格式等等。
  • 处理数据并生成结果。这个过程可能需要访问数据库,执行 RMI 或 CORBA 调用,调用 Web 服务,或者直接计算得出对应的响应。
  • 发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel 等。
  • 发送隐式的 HTTP 响应到客户端(浏览器)。这包括告诉浏览器或其他客户端被返回的文档类型(例如 HTML),设置 cookies 和缓存参数,以及其他类似的任务。

Servlet常见方法与生命周期

Servlet 生命周期可被定义为从创建直到毁灭的整个过程。

以下是 Servlet 遵循的过程:

Servlet 通过调用 init() 方法进行初始化。
Servlet 调用 service() 方法来处理客户端的请求。 
Servlet 通过调用 destroy() 方法终止(结束)。 
最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。

在这里插入图片描述

HttpServlet处理Http请求

Servlet的service()方法是请求的入口方法,
HttpServlet实现service()方法在这个入口方法中根据不同的 Http 请求方法(如GET、POST请求)
调用不同的方法。 

大多数应用程序都是要于HTTP结合起来使用。这意味着可以利用HTTP提供的特性。
javax.servlet.http包 是Servlet API中的第二个包,
其中包含了用于编写Servlet应用程序的类和接口,并且许多类型都覆写了javax.servlet中的类型。

HttpServlet类覆盖了 javax.servlet.GenericServlet类。
使用HttpServlet时,
需要使用代表Servlet请求和Servlet响应的 HttpServletRequest 和 HttpServletResponse 对象。

HttpServlet中的Service方法会检验用来发送请求的HTTP方法(通过调用request.getMethod() )

doGet、doPost、doHead、doPut、doTrace	
doOptions、doDelete	

其他

init 方法被设计成只调用一次

Servlet 对象工作在多线程环境下
因为 tomcat 内部是使用线程处理每个请求的,而且每个 servlet 对象只会存在一个,
所以我们覆写的 doGet 类似的方法,是在多线程环境下运行的,
是需要考虑线程安全问题的。

它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。(是用于一次性初始化)

Servlet 创建于用户第一次调用对应于该 Servlet 的 URL 时,但也可以指定 Servlet 在服务器第一次启动时被加载。

当用户调用一个 Servlet 时,就会创建一个 Servlet 实例,每一个用户请求都会产生一个新的线程适当的时候移交给 doGet 或 doPost 方法。
init() 方法简单地创建或加载一些数据,这些数据将被用于 Servlet 的整个生命周期。


init 方法的定义如下:
public void init() throws ServletException {
	// 初始化代码...
}

service() 方法是执行实际任务的主要方法

Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。

每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。
service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用  doGet、doPost、doPut、doDelete 等方法。


下面是该方法的特征:
public void service(ServletRequest request,
					ServletResponse response) throws ServletException, IOException{
}

service() 方法由容器调用,service 方法在适当的时候调用 doGet、doPost、doPut、doDelete 等方法。
所以,不用对 service() 方法做任何动作,只需要根据来自客户端的请求类型来重写 doGet()doPost() 即可。

destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用

destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。

在调用 destroy() 方法之后,servlet 对象被标记为垃圾回收。


destroy 方法定义如下所示:
public void destroy() {
	// 终止化代码...
}

Servlet请求处理过程图
在这里插入图片描述

Servlet文件上传理解

HttpServletRequest 对文件上传的支持:

HttpServletRequest 提供了两个方法 用于从请求中解析出上传的文件:

Part getPart(String name)   	//获取请求中给定 name 的文件
Collection<Part> getParts()    //获取所有的文件

其中,每一个文件用一个对象来表示。
该接口提供了处理文件的简易方法,比如 write()、delete() 等。

Part img = request.getPart("img");
img.write("E:\\apache-tomcat-8.5.47\\webapps\\file_dir\\img.jpg");

注意:如果请求的 MIME 类型不是 multipart/form-data,则不能使用上面的两个方法,否则将抛异常。

UploadServlet:

public class UploadServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 文件上传,不能用 GET 方法
        System.out.println("上传文件只能用 POST 方法!");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 具体上传上来的文件放在什么地方,由自己决定
        File path=new File("E:\\Code\\Java\\hellobitidea\\");
        // 获取文件,文件在 html 中的 name 是“file”
        Part img = req.getPart("file");
        //制作文件全路径
        String filePath = path.getPath()+File.separator + img.getSubmittedFileName();
        //获取成功之后,写入指定路径
        img.write(filePath);
        //显示到标准输出
        System.out.println("file Upload: " + filePath);
        //同样的信息,显示给用户浏览器
        resp.setContentType("text/html");
        PrintWriter out = resp.getWriter();
        out.println("file Upload: " + filePath);
    }
}

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值