美文网首页程序员面经集
Java使用Jetty实现嵌入式Web服务器及Servlet容器

Java使用Jetty实现嵌入式Web服务器及Servlet容器

作者: JAVA架构师的圈子 | 来源:发表于2021-02-19 22:07 被阅读0次

    首先来介绍下 Jetty,根据 wiki 的介绍:

    Jetty 是一个纯粹的基于 Java 的网页服务器和 Java Servlet 容器。尽管网页服务器通常用来为人们呈现文档,但是 Jetty 通常在较大的软件框架中用于计算机与计算机之间的通信。


    Jetty 作为 Eclipse 基金会的一部分,是一个自由和开源项目。该网页服务器被用在 Apache ActiveMQ、Alfresco、Apache Geronimo、Apache Maven、Google App Engine、Eclipse、FUSE等产品上。

    Jetty 也是 Lift、Eucalyptus、Red5、Hadoop、I2P等开源项目的服务器。Jetty 支持最新的Java Servlet API(带 JSP 的支持),支持 SPDY 和 WebSocket 协议。

    2016年,Jetty的代码主仓库已经迁移到了 Github ,但是其仍然处于 Eclipse IP Process 政策下开发。

    Jetty 在嵌入式的 Java应用程序中提供 Web 服务,其已经是 Eclipse IDE 中的一个组成部分。它支持AJP、JASPI、JMX、JNDI、OSGi、WebSocket 和其他的 Java 技术。


    Apache Hadoop 是 Jetty 应用在框架中的典型范例。 Hadoop 在几个模块中使用Jetty作为 Web 服务器

    总结一下:

    Jetty 是一个 Java 实现的开源的 servlet 容器,它既可以像 Tomcat 一样作为一个完整的 Web 服务器和 Servlet 容器,同时也可以嵌入在 Java 应用程序中,在 Java 程序中调用 Jetty

    因为它的“轻量级”,在不是很复杂的小项目中是个不错的选择,启动(加载)也非常的快速

    下面主要看下 Jetty 在嵌入式的 Java 应用程序中的应用

    加载静态页面
    导入依赖就不说了,Jetty 本身就是通过 jar 包的方式分发,或者可以使用 Maven 来构建:

    <dependency>
      <groupId>org.eclipse.jetty</groupId>
      <artifactId>jetty-servlet</artifactId>
      <version>9.2.1.v20140609</version>
    </dependency>
    

    当然 Servlet 相关的那些依赖不要忘了加入,然后是 Java 代码入口:

    public static void main(String[] args) throws Exception {
      Server server = new Server(8080);
    
      ResourceHandler resourceHandler = new ResourceHandler();
      resourceHandler.setResourceBase("D:/test");
      // 可显示目录结构,类似 FTP
      resourceHandler.setDirectoriesListed(true); 
    //加入Java开发交流君样:756584822一起吹水聊天
      server.setHandler(resourceHandler);
      server.start();
    } 
    运行 Java 程序,Jetty 服务器就会启动了,在浏览器中就可以访问了,但是这种方式只能访问静态页面,不支持 Servlet/JSP
    
    实现Servlet容器(外部)
    Java 代码主入口:
    
    public static void main(String[] args) throws Exception {  
      Server server = new Server(8080);
      
      WebAppContext webapp = new WebAppContext();
      webapp.setResourceBase("E:/apache-tomcat-7.0.47/webapps/test");
      // 也可以通过设置 war 包的方式
      // webapp.setWar("C:/TVPlay.war");
      
      server.setHandler(webapp);
      server.start();
    }
    

    就是设置一个 Java Web 应用程序的目录就可以了,这种是使用外部文件(地址)的方式

    运行内部编写的Servlet

    很多时候是我们需要写几个 Servlet,犯不着建个 web 工程,这时候用 Jetty 来嵌入一个服务器最合适不过了,主入口:

    public static void main(String[] args) throws Exception {
      Server server = new Server(8080);
    
      ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
      // Or ServletContextHandler.NO_SESSIONS
      context.setContextPath("/");
      server.setHandler(context);
    //加入Java开发交流君样:756584822一起吹水聊天
      // http://localhost:8080/hello
      context.addServlet(new ServletHolder(new HelloServlet()), "/hello");
      // http://localhost:8080/hello/Kerronex
      context.addServlet(new ServletHolder(new HelloServlet("Hello Kerronex!")), "/hello/Kerronex");
    
      server.start();
      server.join();
    }
    

    具体对应的 Servlet 我就不贴了,很简单的 doGet 测试下就可以了~~

    打包后直接用命令 java -jar xxx.jar 允许就可以啦

    关于join

    如果 server 没有起来,这里面 join() 函数起到的作用就是使线程阻塞, 这里 join() 函数实质上调用的 jetty 的线程池( 这里和 Thread 中的 join 函数相似 )

    如果没有 join 函数,jetty 服务器也能正常启动或运行正常,是因为 jetty 比较小,启动速度非常快

    然而如果你的 application 比较重的话, 调用 join 函数,能够保证你的 server 真正的起来(也就是说在 jetty start 之前 join 方法都是阻塞状态,避免 JVM 退出)

    其他
    TODO:使用 Jetty 构建 web 项目

    需要使用插件及相关依赖:

    <dependency>
      <groupId>org.eclipse.jetty</groupId>
      <artifactId>jetty-websocket</artifactId>
      <version>8.1.11.v20130520</version>
    </dependency>
    <dependency>
      <groupId>org.eclipse.jetty</groupId>
      <artifactId>jetty-webapp</artifactId>
      <version>8.1.11.v20130520</version>
    </dependency>
    <!-- jetty -->
    <dependency>
      <groupId>org.eclipse.jetty</groupId>
      <artifactId>jetty-server</artifactId>
      <version>8.1.11.v20130520</version>
    </dependency>
    
    
    <build>
      <plugins>
        <plugin>
          <groupId>org.eclipse.jetty</groupId>
          <artifactId>jetty-maven-plugin</artifactId>
          <version>9.3.7.v20160115</version>
          <configuration>
            <webApp>/*加入Java开发交流君样:756584822一起吹水聊天*/
              <contextPath>/</contextPath>
            </webApp>
            <scanIntervalSeconds>3</scanIntervalSeconds>
            <scanTargetPatterns>
              <scanTargetPattern>
                <directory>src/main/webapp</directory> 
                <includes>
                  <include>**/*.xml</include>
                  <include>**/*.properties</include>
                </includes>
              </scanTargetPattern>
            </scanTargetPatterns>
            <webAppConfig>
              <defaultsDescriptor>src/main/resource/webdefault222.xml</defaultsDescriptor>
            </webAppConfig>
            <connectors>
              <connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector">
                <port>8010</port>
                <maxIdleTime>400000</maxIdleTime>
              </connector>
            </connectors>
          </configuration>
        </plugin>
        </plugins>
    </build>
    

    相关命令:

    mvn jetty:run

    mvn -Djetty.http.port=9999 jetty:run

    单独下载的 Jetty 的 jar 包就可以单独运行,也是使用 Java -jar 命令

    image

    最新2020整理收集的一些高频面试题(都整理成文档),有很多干货,包含mysql,netty,spring,线程,spring cloud、jvm、源码、算法等详细讲解,也有详细的学习规划图,面试题整理等,需要获取这些内容的朋友请加Q君样:756584822

    相关文章

      网友评论

        本文标题:Java使用Jetty实现嵌入式Web服务器及Servlet容器

        本文链接:https://www.haomeiwen.com/subject/hqezxltx.html