浅析servlet

今天药忘吃喽~ 2024-04-17 21:00 136阅读 0赞

前言:最近两个礼拜,在和同学搞一个项目,面临上线,测试等一系列问题,又出现了很多bug…所以博客断了那么一段时间,现在有时间了,还是要坚持写博客。

什么是Servlet

Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。

上面这段话来自百度百科
官方的话总有这么一个尿性,用专业的话解释专业的词语。总是能让人感觉一头雾水…。咱们好好说人话行吗…那我就来说一句人话吧——什么是servlet呢?servlet就可以运行在服务器端的一段java代码

针对Servlet技术的开发,Sun公司提供了一些列接口和类,其中有一个比较重要的接口javax.servlet.Servlet;Servlet就是一种实现了Servlet接口的类,它是由Web容器负责创建并且调用,用于接收和相应用户的请求。下面来看一下Servlet这个接口中定义的方法。
在这里插入图片描述
如上图所示:Servlet接口定义了5个方法:
init方法:负责Servlet初始化的工作。Servlet首次被创建时候调用。
getServletConfig:返回容器调用init时创建的ServletConfig对象
getServletInfo返回一个字符串消息,其中包含了关于Servlet信息
service负责相应用户的请求 ,当容器接收到客户访问Servlet对象请求时,就会调用此方法。
destory负责释放Servlet对象所占有的资源。当Servlet对象被销毁时,容器会调用此方法。


Servlet的生命周期如下:

在这里插入图片描述
Servlet的生命周期主要分为3个阶段。1.初始化阶段 2.运行阶段 3.销毁阶段 下面对这三个阶段简单介绍一下:

1.初始化阶段

当客户端发送了HTTP请求之后,Servlet容器首先会解析请求,检查内存只能怪是否有了该Servlet对象。如果有那么直接使用该Servlet对象。如果没有就创建Servlet实例对象。然后就会调用**init()**方法。那么也就是说,在Servlet的整个生命周期内他的init初始化方法只会被调用一次

2.运行阶段

这是Servlet中最重要的阶段,Servlet容器会创建请求的ServletRequest和相应的ServletResponse。然后将他们作为参数传递给Servlet的service方法。所有的请求信息在ServletRequest中,然后通过ServletResponse对象生成相应结果。在Servlet的生命周期内,对于Servlet的每一次访问请求,Servlet都会调用一次service()方法,并且新创建的ServletRequest和ServletResponse对象。service()会在生命周期中执行多次

3.销毁阶段

当服务器关闭或web应用被移出容器时,Servlet随着Web应用的销毁而销毁。在销毁之前会调用**destory()**方法,这样servlet对象就会释放它所占有的资源。在Servlet的生命周期当中destory()也只会被调用一次。服务器关闭或web应用被移出容器

来看一下Servlet的继承关系。

在这里插入图片描述
由于大多数WEB应用都是通过HTTP和客户端进行交互,在Servlet接口中,提供了一个抽象类javax.servlet.http.HttpServlet,他是GenericServlet的子类专门用户创建HTTP的servlet,源码片段如下:

  1. // 根据请求的不同 定义不同的处理方法
  2. protected void service(HttpServletRequest req, HttpServletResponse resp)
  3. throws ServletException, IOException
  4. {
  5. String method = req.getMethod();
  6. if (method.equals(METHOD_GET)) {
  7. long lastModified = getLastModified(req);
  8. if (lastModified == -1) {
  9. // servlet doesn't support if-modified-since, no reason
  10. // to go through further expensive logic
  11. doGet(req, resp);
  12. } else {
  13. long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
  14. if (ifModifiedSince < lastModified) {
  15. // If the servlet mod time is later, call doGet()
  16. // Round down to the nearest second for a proper compare
  17. // A ifModifiedSince of -1 will always be less
  18. maybeSetLastModified(resp, lastModified);
  19. doGet(req, resp);
  20. } else {
  21. resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
  22. }
  23. }
  24. } else if (method.equals(METHOD_HEAD)) {
  25. long lastModified = getLastModified(req);
  26. maybeSetLastModified(resp, lastModified);
  27. doHead(req, resp);
  28. } else if (method.equals(METHOD_POST)) {
  29. doPost(req, resp);
  30. } else if (method.equals(METHOD_PUT)) {
  31. doPut(req, resp);
  32. } else if (method.equals(METHOD_DELETE)) {
  33. doDelete(req, resp);
  34. } else if (method.equals(METHOD_OPTIONS)) {
  35. doOptions(req,resp);
  36. } else if (method.equals(METHOD_TRACE)) {
  37. doTrace(req,resp);
  38. } else {
  39. //
  40. // Note that this means NO servlet supports whatever
  41. // method was requested, anywhere on this server.
  42. //
  43. String errMsg = lStrings.getString("http.method_not_implemented");
  44. Object[] errArgs = new Object[1];
  45. errArgs[0] = method;
  46. errMsg = MessageFormat.format(errMsg, errArgs);
  47. resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
  48. }
  49. }
  50. // 将请求和相应分别转为 HttpServletRequest 与HttpServletResponse
  51. public void service(ServletRequest req, ServletResponse res)
  52. throws ServletException, IOException
  53. {
  54. HttpServletRequest request;
  55. HttpServletResponse response;
  56. if (!(req instanceof HttpServletRequest &&
  57. res instanceof HttpServletResponse)) {
  58. throw new ServletException("non-HTTP request or response");
  59. }
  60. request = (HttpServletRequest) req;
  61. response = (HttpServletResponse) res;
  62. service(request, response);
  63. }

分析上述代码发现,HttpServlet主要有两大功能:
1、根据用户请求方式的不同,定义相应的doXXX()处理方法请求
2、通过service()方法将HTTP请求和相应分别转为HttpServlet和HttpServletResponse类型的对象

由于大多数的请求都是GET和POST提交。当我们定义我们自己的Servlet的时候,就可以通过继续·HttpServlet然后重写doget 和dopost方法。


小结
servlet的生命周期。
1、创建 调用service()方法,第一次被访问时加载
2、初始化 调用init()方法,每次访问时都会被调用
3、销毁destory()方法,当服务器关闭,或web应用被移除时。

发表评论

表情:
评论列表 (有 0 条评论,136人围观)

还没有评论,来说两句吧...

相关阅读