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的注解
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);
}
}