WildFly8(JBoss)默认web服务器-------Undertow

Java微服务框架之Undertow

一、Undertow简介:

Undertow 是红帽公司(RedHat)的开源产品,是 WildFly8(JBoos) 默认的 Web 服务器。

      官网API给出一句话概述Undertow:

      Undertow is a flexible performant web server written in java, providing both blocking and non-blocking API’s based on NIO.

      译文: Undertow是一个用java编写的灵活的高性能Web服务器,提供基于NIO的阻塞和非阻塞API。

      官网API总结特点:

       Lightweight(轻量级)

          Undertow非常轻量级,Undertow核心jar包在1Mb以下。 它在运行时也是轻量级的,有一个简单的嵌入式服务器使用少于4Mb的堆空间

       HTTP Upgrade Support(支持http升级)

          支持HTTP升级,允许多个协议通过HTTP端口进行多路复用

       Web Socket Support(支持WebScoket)

          Undertow提供对Web Socket的全面支持,包括JSR-356支持

       Servlet 3.1  

           Undertow提供对Servlet 3.1的支持,包括对嵌入式servlet的支持。 还可以在同一部署中混合Servlet和本机Undertow非阻塞处理程序

       Embeddable(可嵌入的)

           Undertow可以嵌入在应用程序中或独立运行,只需几行代码

       6. Flexible(灵活性)

         Undertow框架jar包: undertow-core.jar undertow-servlet.jar

二、Undertow示例: 

1.官网给出一个Undertow Web 服务器使用异步IO的方式向界面输出字符串 

  import io.undertow.Undertow;
  import io.undertow.server.HttpHandler;
  import io.undertow.server.HttpServerExchange;
  import io.undertow.util.Headers;
  
  public class HelloWorldServer {
     public static void main(String[] args) {
         Undertow server=Undertow.builder()
         .addHttpListener(8080, "localhost").setHandler(new HttpHandler(){//设置HttpHandler的回调方法
             @Override
             public void handleRequest(HttpServerExchange exchange)
                     throws Exception {        
                 exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain");
                 exchange.getResponseSender().send("This is my first insert server!");
             }
         }).build();
        server.start();
    }
 }
 运行后打开浏览器输入 http://localhost:8080 ,则页面输出“Hello World”字符串

 2.Undertow来部署Servlet

 

import io.undertow.Handlers;
  import io.undertow.Undertow;
  import io.undertow.server.HttpHandler;
  import io.undertow.server.handlers.PathHandler;
  import io.undertow.servlet.Servlets;
  import io.undertow.servlet.api.DeploymentInfo;
  import io.undertow.servlet.api.DeploymentManager;
  import io.undertow.servlet.api.ServletContainer;
  import io.undertow.servlet.api.ServletInfo;
 
 import javax.servlet.ServletException;
 
 import org.wildfly.undertow.quickstart.servlet.MyServlet;
 
 public class ServletServer {
     
        public static void main(String[] args) {
     
         /*
          * 创建ServletInfo,Servelt的最小单位。是对javax.servlet.Servlet具体实现的再次封装。
          * 注意:ServletInfo的name必须是唯一的
          */
         ServletInfo servletInfo1 = Servlets.servlet("MyServlet",
                 MyServlet.class);
         // 创建servletInfo的初始化参数
         servletInfo1.addInitParam("message", "This is my first MyServlet!");
         // 绑定映射为/myServlet
         servletInfo1.addMapping("/myServlet");
         /**
          * 创建包部署对象,包含多个servletInfo。可以认为是servletInfo的集合
          */
         DeploymentInfo deploymentInfo1 = Servlets.deployment();
         // 指定ClassLoader
         deploymentInfo1.setClassLoader(ServletServer.class.getClassLoader());
         // 应用上下文(必须与映射路径一致,否则sessionId会出现问题,每次都会新建)
         deploymentInfo1.setContextPath("/myapp");
         // 设置部署包名
         deploymentInfo1.setDeploymentName("myServlet.war");
         // 添加servletInfo到部署对象中
         deploymentInfo1.addServlets(servletInfo1);
         /**
          * 使用默认的servlet容器,并将部署添加至容器
          * 容器,用来管理DeploymentInfo,一个容器可以添加多个DeploymentInfo
          */
         ServletContainer container = Servlets.defaultContainer();
         /**
          * 将部署添加至容器并生成对应的容器管理对象
          * 包部署管理。是对添加到ServletContaint中DeploymentInfo的一个引用,用于运行发布和启动容器
          */
         DeploymentManager manager = container.addDeployment(deploymentInfo1);
         // 实施部署
         manager.deploy();
         /**
          * 分发器:将用户请求分发给对应的HttpHandler
          */
         PathHandler pathHandler = Handlers.path();
         /**
          * servlet path处理器,DeploymentManager启动后返回的Servlet处理器。
          */
         HttpHandler myApp=null;
         try {
             //启动容器,生成请求处理器
             myApp=manager.start();
         } catch (ServletException e) {
             throw new RuntimeException("容器启动失败!");
         }
         //绑定映射关系
         pathHandler.addPrefixPath("/myapp", myApp);
         
         Undertow server=Undertow.builder().
                 //绑定端口号和主机
                 addHttpListener(8081, "localhost")
                 //设置分发处理器
                 .setHandler(pathHandler).build();
         //启动server
         server.start();
     }
 }
自定义MyServlet

 

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyServlet extends HttpServlet {

    private static final long serialVersionUID = 2378494112650465478L;

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter writer = resp.getWriter();
        writer.write("<p style='color:red;text-align:center;'>"+this.getInitParameter("message")+"</p>");
        writer.close();
    }
    
}

 如下图,是本人抽象出Undertow生成应用的架构:

 

 

示例运行:

在浏览器地址栏里输入:http://localhost:8081/myapp/myServlet,界面上会显示ServletInfo的初始化参数message数据

Undertow 官网API地址:http://undertow.io/index.html 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值