请选择 进入手机版 | 继续访问电脑版

湖南新梦想

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 30|回复: 0

Java网络编程基本功之Servlet与Servlet容器(一)

[复制链接]

2542

主题

2941

帖子

1万

积分

论坛元老

Rank: 8Rank: 8

积分
10451
发表于 2022-5-13 11:37:22 | 显示全部楼层 |阅读模式
    Servlet与Servlet容器关系
  Servlet
  比较这两个的区别, 就得先搞清楚Servlet 的含义, Servlet (/?s?rvlit/ ) 翻译成中文就是小型应用程序或者小服务程序, 与之相类似的是Server (/?s??rv?r/), 翻译过来是服务器的意思, 可见这二者承担类似的功能,但是Servlet更轻量。
  web开发的本质就一句话:客户端和服务器交换数据。于是使用Java的 Socket 套接字进行编程,去处理客户端来的 tcp 请求,经过编解码处理读取请求体,获取请求行,然后找到请求行对应的处理逻辑步入服务器的处理中,处理完毕把对应的结果返回给当前的 Socket 链接,响应完毕,关闭 Socket。
  上述过程中, 建立连接、传输数据、关闭连接等过程是tomcat容器帮你做了这些事情, 而拿到请求行之后去找对应的 url 路由,这一部分是谁做的呢?是Servlet ! 简单来说Servlet就是一段处理 web 请求的逻辑。
  具体来说Servlet具有以下几个特点:
  1. Servlet是用Java编写的Server端程序,它与协议和平台无关。
  2. Servlet运行于Java-enabled Web Server中。
  3. Java Servlet可以动态地扩展Server的能力,并采用请求-响应模式提供Web服务。
  4. 最早支持Servlet技术的是JavaSoft的Java Web Server。
  5. 此后,一些其它的基于Java的Web Server开始支持标准的Servlet API。
  6.Servlet的主要功能在于交互式地浏览和修改数据,生成动态Web内容。
  上面六点中,最需要被记住的是Servlet可以动态地扩展Server的能力,并采用请求-响应模式提供Web服务。
  JDK中的Servlet是一个接口:
  1.   public interface Servlet {
  2.       public void init(ServletConfig config) throws ServletException;
  3.       public ServletConfig getServletConfig();
  4.       public void service(ServletRequest req, ServletResponse res)
  5.               throws ServletException, IOException;
  6.       public String getServletInfo();
  7.       public void destroy();
  8.   }
复制代码
  可以看到Servlet 是一个接口, 规定了请求从容器到达 web 服务端的规范,详细内容在后面的Servlet生命周期中详细梳理,这儿简单概括三个重要步骤是:
  init():初始化请求的时候要做什么。
  service():拿到请求的时候要做什么。
  destory():处理完请求销毁的时候要做什么。
  所有实现 Servlet 的实现方都是在这个规范的基础上进行开发。那么 Servlet 中的数据是从哪里来的呢?答案就是 Servlet 容器。容器才是真正与客户端打交道的那一方。一个容器中 Servlet 可以有多个, 常见的Servlet容器Tomcat,它监听了客户端的请求端口,根据请求行信息确定将请求交给哪个Servlet 处理,找到处理的Servlet之后,调用该Servlet的 service() 方法,处理完毕将对应的处理结果包装成ServletResponse 对象返回给客户端。
  Servlet容器
  现在讲讲Servlet容器, 前面说过看Servlet只是一个接口或者说是规范, 那么就势必有具体实现, 而Servlet具体实现或者说包装器是Wrapper, 直接管理Wrapper的容器就是Context, 一个 Context 对应一个 Web 工程, 也就是说Context 容器如何运行将直接影响 Servlet 的工作。
 由图可以知道, Tomcat底层是Context, Context负责管理Servlet包装类Wrapper。
  下面创建一个实例对象并调用 start 方法就可以很容易启动 Tomcat,我们还可以通过这个对象来增加和修改 Tomcat 的配置参数,如可以动态增加 Context、Servlet 等。我们就选择 Tomcat7 自带的 examples Web 工程,并看看它是如何加到这个 Context 容器中的。
  1.   //给 Tomcat 增加一个 Web 工程:
  2.   Tomcat tomcat = getTomcatInstance();
  3.   File appDir = new File(getBuildDirectory(), "webapps/examples");
  4.   tomcat.addWebapp(null, "/examples", appDir.getAbsolutePath());
  5.   tomcat.start();
  6.   ByteChunk res = getUrl("http://localhost:" + getPort() +
  7.                 "/examples/servlets/servlet/HelloWorldExample");
  8.   assertTrue(res.toString().indexOf("<h1>Hello World!</h1>") > 0);
复制代码
  上述代码是创建一个 Tomcat 实例并新增一个 Web 应用,然后启动 Tomcat 并调用其中的一个 HelloWorldExample Servlet,看有没有正确返回预期的数据。
  1.   //Tomcat 的 addWebapp 方法的代码如下:
  2.   public Context addWebapp(Host host, String url, String path) {
  3.          silence(url);
  4.          Context ctx = new StandardContext();
  5.          ctx.setPath( url );
  6.          ctx.setDocBase(path);
  7.          if (defaultRealm == null) {
  8.              initSimpleAuth();
  9.          }
  10.          ctx.setRealm(defaultRealm);
  11.          ctx.addLifecycleListener(new DefaultWebXmlListener());
  12.          ContextConfig ctxCfg = new ContextConfig();
  13.          ctx.addLifecycleListener(ctxCfg);
  14.          ctxCfg.setDefaultWebXml("org/apache/catalin/startup/NO_DEFAULT_XML");
  15.          if (host == null) {
  16.              getHost().addChild(ctx);
  17.          } else {
  18.              host.addChild(ctx);
  19.          }
  20.          return ctx;
  21.   }
复制代码
  添加一个 Web 应用时将会创建一个 StandardContext 容器,并且给这个 Context 容器设置必要的参数(url 代表这个应用在 Tomcat 中的访问路径; path 代表这个应用实际的物理路径) 其中最重要的一个配置是 ContextConfig,【ContextConfig监听器】继承了 【LifecycleListener 监听器接口】,它是在调用清单 2 时被加入到 StandardContext 容器中。 当 Context 容器初始化状态设为 init 时,添加在 Context 容器的 Listener 将会被调用。【ContextConfig监听器】将会负责整个 Web 应用配置文件的解析工作。最后将这个 Context 容器加到父容器 Host 中。

(未完待续)

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|湖南新梦想 ( 湘ICP备18019834号-2 )

GMT+8, 2022-5-24 22:37 , Processed in 0.042809 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表