jetty的基本架构

合集下载

Servlet,Tomcat,Jetty,Netty,Mina对比

Servlet,Tomcat,Jetty,Netty,Mina对比

Servlet,Tomcat,Jetty,Netty,Mina对⽐Servlet, Tomcat, Jetty, Netty,Mina结论先说结论吧: Servlet是⼀种Java EE规范,Tomcat & Jetty是Servlet容器,Tomcat包含了Servlet。

Servlet本⾝并不能处理外部请求,需要Servlet容器的配合,Netty和MINA是⽹络框架,我们可以使⽤Netty造出⾃⼰类似Tomcat的web服务器。

简单的关系的话 Tomcat = Jetty > Netty & MINA > Servlet。

Servletwiki上的定义:Servlet 是⽤ Java 编写的服务器端程序。

其主要功能在于交互式地浏览和修改数据,⽣成动态 Web 内容。

狭义的 Servlet 是指Java 语⾔实现的⼀个接⼝,⼴义的 Servlet 是指任何实现了这个 Servlet 接⼝的类,⼀般情况下,⼈们将 Servlet 理解为后者。

Tomcatwiki的定义:Tomcat 是由 Apache 软件基⾦会下属的 Jakarta 项⽬开发的⼀个 Servlet 容器,按照 Sun Microsystems 提供的技术规范,实现了对 Servlet 和 JavaServer Page(JSP)的⽀持,并提供了作为 Web 服务器的⼀些特有功能,如 Tomcat 管理和控制平台、安全域管理和 Tomcat 阀等。

由于 Tomcat 本⾝也内含了⼀个 HTTP 服务器,它也可以被视作⼀个单独的 Web 服务器。

但是,不能将 Tomcat 和 Apache HTTP 服务器混淆,Apache HTTP 服务器是⼀个⽤C语⾔实现的 HTTPWeb服务器;这两个 HTTP web server 不是捆绑在⼀起的。

Apache Tomcat 包含了⼀个配置管理⼯具,也可以通过编辑XML格式的配置⽂件来进⾏配置。

部署文档

部署文档

2
1. 整体架构
2014 整体架构划分为 4 大部分,web 部分,缓存及内存数据库部分,中间件部分,数据库 部分和文件系统部分.各部分包含的业务如下: Web 部分:包括 Nginx 和 Jetty.Nginx 提供静态资源并缓存到本地,代理用户请求,并将其负 载至后端多台 jetty 服务器. Jetty 服务器提供 web 程序. 缓存及内存数据库部分:包括 Couchbase 集群和 Hazelcast(以下简称 hz)集群.couchbase 缓 存部分 mysql 数据. Hz 集群将 mongodb 所有数据加载到内存中提供快速读取,并将新写入的 数据持久化到 mongodb 中. 中间件部分:包括 zookeeper 和 kafka.zookeeper 主要提供 dubbo 远程调用,服务注册和 kafka 的 topic 注册.kafka 为消息中间件,用来提供消息队列和服务间的通信. 数据库部分:包括多组 mongodb 集群和 mysql 集群,还有 redis 集群. 文件系统部分 :NFS 网络文件系统和 Fastdfs 分布式文件系统 .NFS 提供用户头像的存 储.Fastdfs 存储资源,附件和作业. 整体架构如下图所示:
部署文档
2014.9 v1.0
1
目录
部署文档 .......................................................................................................... 1 目录 ....................................................................................................................................... 2 1. 整体架构 ........................................................................................................................ 3 2. WEB 层 ........................................................................................................................... 3 2.1 Nginx ......................................................................................................................... 4 2.2 Jetty ........................................................................................................................ 33 3. 内存数据库及缓存层 .................................................................................................. 34 3.1 Hazelcast ................................................................................................................. 35 3.2 Couchbase .............................................................................................................. 35 4. 数据库层 ...................................................................................................................... 43 4.1 Mongodb 集群 ....................................................................................................... 43 4.2 Mysql 集群 ............................................................................................................. 52 4.3 Redis 集群 .............................................................................................................. 66

XXL-JOB架构图

XXL-JOB架构图

执行器服务 jetty
调度请求 queue
回调服务 执行线程 回调日志 queue 任务
调度日志 / GLUE日志
调度中心
执行器
XXL-JOB架构图 v1.3
执行器
注册模块
注册模块 调度请求 queue
JobHandler
…… 调度器 quartz
执行器服务 jetty
调度池
回调服务 执行线程 回调日志 queue 任务
调度日志 / GLUE日志
调度中心
执行器
XXL-JOB架构图 v1.5
任务管理 执行器 任务模式 JobHandler
执行器管理 注册方式 AppName 机器地址列表
调度器 (quartz)
执行器服务( jetty)
调度请求 (queue)
……
日志管理 调度日志 Rolling日志 GLUE版本日志
JobHandler
回调服务 (API)
回调线程
调度结果 (queue)
任务线程
……
数据中心 调度中心
注册服务 (API)
注册线程
自研RPC
执行器
XXL-JOB架构图 v1.8
意义:
调度中心
分 片 任 务 分片参数:0, 3 分片参数:1, 3 分片参数:2, 3 执行器集群
执行器0 执行器1 执行器2
……
其他 运行报表 失败告警 任务依赖 ……
Rolling日志 (实时)
日志服务 ( jetty)
执行日志 (Log文件)
JobHandler
回调服务 (API)
回调线程
调度结果 (queue)
任务线程
……
数据中心 调度中心

XXL-JOB架构图

XXL-JOB架构图
XXL-JOB架构图 v1.1
调度中心
任务池
宴会商户头图绑定JOB
婚宴默认搜索排序跑分JOB
……
调度器A【block】
调度器B【block】
调度器C【active】
调度日志
执行器
调度队列
调度请求
调度请求
……
任务执行【业务逻辑】
XXL-JOB架构图 v1.3
调度中心
调度池
执行器地址
调度日志 / GLUE日志
日志管理
调度日志
Rolling日志
GLUE版本日志
……
其他
运行报表
失败告警
任务依赖
……
注册线程
执行器服务
调度结果(queue)
JobHandler
任务线程
调度请求(queue)
自研RPC(xxl-rpc)
执行日志(Log文件)
回调线程
Rolling日志(实时)
日志服务
XXL-JOB架构图 v2.0.0
其他
运行报表
失败告警
任务依赖
……
自动注册
执行器服务(jetty)
调度结果(queue)
JobHandler
任务线程
调度请求(queue)
自研RPC
执行日志(Log文件)
回调线程
Rolling日志(实时)
日志服务(jetty)
XXL-JOB架构图 v1.8
调度中心
数据中心
注册服务(API)
任务管理
执行器
调度请求(queue)
自研RPC
执行日志(Log文件)
回调线程
Rolling日志(实时)
日志服务(jetty)

jetty用法

jetty用法

jetty用法Jetty用法Jetty是一种Java HTTP(Web)服务器和Java Servlet容器,它支持多种应用程序架构和开发框架。

下面介绍一些Jetty的常见用法。

1. Jetty的快速启动•使用Maven添加Jetty依赖项:<dependency><groupId></groupId><artifactId>jetty-server</artifactId><version>版本号</version></dependency>•创建一个简单的Jetty服务器:import ;import ;public class SimpleJettyServer {public static void main(String[] args) throws Except ion {Server server = new Server(8080);(new DefaultHandler());();();}}2. Jetty的Servlet支持•使用Jetty创建一个Servlet类:import ;import ;import ;import ;public class MyServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, Htt pServletResponse response) throws IOException {().println("Hello, Servlet!");}}•将Servlet注册到Jetty服务器:import ;import ;public class JettyServerWithServlet {public static void main(String[] args) throws Except ion {Server server = new Server(8080);ServletContextHandler handler = new ServletConte xtHandler();(, "/");(handler);();();}}3. Jetty的静态资源服务•创建一个简单的Web应用程序目录结构:webapp├──└── resources├── css│ └──└── images└──•将静态资源服务配置到Jetty服务器:import ;import ;public class JettyServerWithStaticResources {public static void main(String[] args) throws Except ion {Server server = new Server(8080);ResourceHandler resourceHandler = new ResourceHa ndler();(false);("webapp");(resourceHandler);();();}}4. Jetty的HTTPS支持•创建一个SSL上下文:import ;public class SSLContextFactoryExample {public static void main(String[] args) {server = new ();("/path/to/keystore");("password");("password");("/path/to/truststore");("password");}}•将SSL上下文配置到Jetty服务器:import ;import ;public class JettyServerWithHTTPS {public static void main(String[] args) throws Except ion {Server server = new Server();SslContextFactory sslContextFactory = new ();("/path/to/keystore");("password");("password");("/path/to/truststore");("password");ServerConnector connector = new ServerConnector (server, sslContextFactory);(443);(connector);();();}}以上是一些常见的Jetty用法,通过这些示例能够帮助你更好地了解和应用Jetty服务器和Servlet容器。

JEE系统架构图及其简介

JEE系统架构图及其简介

各种系统架构图及其简介(Spring+IBatis+Struts1+Struts2+Hibernate+JavaEE+Oracle)1.Spring架构图Spring是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。

框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为J2EE应用程序开发提供集成的框架。

Spring框架的功能可以用在任何J2EE服务器中,大多数功能也适用于不受管理的环境。

Spring的核心要点是:支持不绑定到特定J2EE服务的可重用业务和数据访问对象。

这样的对象可以在不同J2EE环境(Web或EJB)、独立应用程序、测试环境之间重用。

组成Spring框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。

每个模块的功能如下:核心容器:核心容器提供Spring框架的基本功能。

核心容器的主要组件是BeanFactory,它是工厂模式的实现。

BeanFactory使用控制反转(IOC)模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。

Spring上下文:Spring上下文是一个配置文件,向Spring框架提供上下文信息。

Spring上下文包括企业服务,例如JNDI、EJB、电子邮件、国际化、校验和调度功能。

Spring AOP:通过配置管理特性,Spring AOP模块直接将面向方面的编程功能集成到了Spring 框架中。

所以,可以很容易地使Spring框架管理的任何对象支持AOP。

Spring AOP模块为基于Spring的应用程序中的对象提供了事务管理服务。

通过使用Spring AOP,不用依赖EJB组件,就可以将声明性事务管理集成到应用程序中。

Spring DAO:JDBC DAO抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。

异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。

常见的Linux中间件有几个?

常见的Linux中间件有几个?

常见的Linux中间件有几个?中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。

中间件位于客户机/服务器的操作系统之上,管理计算机资源和网络通讯。

是连接两个独立应用程序或独立系统的软件。

相连接的系统,即使它们具有不同的接口,但通过中间件相互之间仍能交换信息。

那么Linux有哪些中间件?本文为大家介绍一下。

第一款:tomcattomcat是一款Java语言servlet标准化的服务器软件。

适用于本地开发、小项目或个人开发,Apache为HTML页面服务,而tomcat 实际操作JSP页面和servlet,但是tomcat处理静态html的能力不如Apache服务器。

特点:支持最新标准、更新快、跨平台、体积小安装部署方便。

第二款:weblogic大型项目或商业项目,Java动态功能和Java Enterprise在大型网络应用的开发、集成、部署和管理中,引入了标准的安全性bea公司生产的基础j2ee架构中间件。

特点:简化了可移植和可扩展应用系统的开发,为其他应用系统和系统提供了丰富的可操作性;商业软件功能齐全强大,主要用于大型企业的大型项目;是一种高扩展的架构体系。

第三款:jettyjetty是使用Java语言编写,jetty运行速度快,轻量级,在Java 中可以从test case控制其运行。

从而使自动化测试不再依赖外部环境,顺利实现自动化测试。

特点:易用、可扩展、易嵌入;快速高效。

第四款:JBoss管理EJB容器和服务器,JBoss遵循商业友好LGPL授权分发,由开源社区开发。

特点:应用服务器也有许多优秀的特点;内存和硬盘空间相对较小;安装方便,解压后,只需配置一些环境变量即可;JBoss支持集群等。

《Jetty6_指南书》

《Jetty6_指南书》

前言和目录写在前面:使用jetty已经很久了,它是一个很出色的web容器和工具,特在此和大家分享jetty6的知识。

网络上有一些关于jetty的资料,但过去陈旧且不具有系统性,导致很多人误解jetty的功能,国外目前也没有关于jetty的书籍,所以那些搞翻译的人也没有翻译来源,故决定写一本关于jetty6 的书,以推广jetty在国内的使用。

记住jetty不仅仅是一个web容器!版权声明:这一系列章节只在javaeye的博客发表,谢绝任何组织和个人的转载或抄袭!本人保留所有权利!如侵犯本版权则需赔偿人民币5000000圆整,因为劳动是无价的,这算便宜的了!作者:陈汝烨由于这一些系列文章正在编写过程中,写好一章就发一章,难免有很多错误的地方,欢迎哥们指正!关键字: jetty是什么 jetty配置 jetty使用 jetty嵌入 jetty启动 jetty部署 jetty教程 jetty嵌入式 jetty第1章Jetty介绍1.1 Jetty功能介绍1.2 Jetty的特点1.3 jetty项目历史和现状1.4 jetty vs tomcat1.5 本章小结2.1 下载2.2 安装2.3 使用java命令启动2.3.1 快速启动2.3.2 停止服务2.3.3 start.jar深入探讨2.4我们可以学到什么2.5 Windows系统下启动和关闭控制2.6 Linux系统下启动和关闭控制2.6.1 系统变量的设置2.6.2 命令参数2.6.3 相关配置文件2.7本章小结3.1 构架概述3.2 Connector3.3 Handler3.4 Server 和ThreadPool3.5 目录结构第4章Jetty服务配置文件4.1 jetty.xml 示例剖析4.2 Jetty xml Configuration语法4.3 org.mortbay.xml.XmlConfiguration 第5章在Jetty中部署Web应用程序相关的配置文件静态部署动态热部署Servlet2.5 新特性第6章Handler详细本章相信介绍各种Handler的功能和用法第7章类加载器第8章Jetty ConnectorSSL的配置,和apache mod_proxy,ajp部署9虚拟主机讲解Jetty下虚拟主机的配置方法10管理服务器服务器日志管理,请求日志,实时状态,关闭服务器,JMX管理 linux 非root用户在80端口启动11配置JNDI介绍jndi如何使用、12会话与集群13性能优化线程池,内存大小配置,共享libGZIPOptimizing with Last-Modified and Cache-Control Optimizing Browser CachingOptimizing on High Load Serverslinux最大连接数配置linux下epull启用配置14异步Servlet,AJax,Comet15Embedding Jetty16 JEE服务器整合17 在开发环境中使用Jetty18 安全19 FAQJetty6 指南书 - 第一章 Jetty介绍文章分类:Java编程写在前面:使用jetty已经很久了,它是一个很出色的web容器和工具,特在此和大家分享jetty6的知识。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

jetty的基本架构Jetty 的基本架构Jetty 目前的是一个比较被看好的 Servlet引擎,它的架构比较简单,也是一个可扩展性和非常灵活的应用服务器,它有一个基本数据模型,这个数据模型就是Handler,所有可以被扩展的组件都可以作为一个 Handler,添加到Server 中,Jetty 就是帮你管理这些 Handler。

Jetty 的基本架构下图是 Jetty 的基本架构图,整个 Jetty 的核心组件由 Server 和Connector 两个组件构成,整个Server 组件是基于 Handler 容器工作的,它类似与 Tomcat 的 Container 容器,Jetty 与 Tomcat的比较在后面详细介绍。

Jetty 中另外一个比不可少的组件是Connector,它负责接受客户端的连接请求,并将请求分配给一个处理队列去执行。

图 1. Jetty 的基本架构Jetty 中还有一些可有可无的组件,我们可以在它上做扩展。

如 JMX,我们可以定义一些 Mbean 把它加到 Server 中,当Server 启动的时候,这些 Bean 就会一起工作。

图 2. Jetty 的主要组件的类图从上图可以看出整个 Jetty 的核心是围绕着Server 类来构建,Server 类继承了 Handler,关联了Connector 和 Container。

Container 是管理 Mbean 的容器。

Jetty 的 Server 的扩展主要是实现一个个Handler 并将 Handler 加到 Server 中,Server 中提供了调用这些 Handler 的访问规则。

整个 Jetty 的所有组件的生命周期管理是基于观察者模板设计,它和Tomcat 的管理是类似的。

下面是 LifeCycle 的类关系图每个组件都会持有一个观察者(在这里是 Listener 类,这个类通常对应到观察者模式中常用的 Observer 角色,关于观察者模式可以参考《Tomcat系统架构与设计模式,第2部分:设计模式分析》一文中关于观察者模式的讲解)集合,当 start、fail 或 stop 等事件触发时,这些 Listener 将会被调用,这是最简单的一种设计方式,相比 Tomcat 的 LifeCycle 要简单的多。

Handler 的体系结构前面所述 Jetty 主要是基于 Handler 来设计的,Handler 的体系结构影响着整个 Jetty 的方方面面。

下面总结了一下 Handler 的种类及作用:图 3. Handler 的体系结构(查看大图)Jetty 主要提供了两种 Handler 类型,一种是 HandlerWrapper,它可以将一个 Handler委托给另外一个类去执行,如我们要将一个 Handler 加到 Jetty 中,那么就必须将这个 Handler 委托给 Server去调用。

配合 ScopeHandler 类我们可以拦截 Handler 的执行,在调用Handler 之前或之后,可以做一些另外的事情,类似于Tomcat 中的 Valve;另外一个 Handler 类型是 HandlerCollection,这个Handler 类可以将多个Handler 组装在一起,构成一个 Handler 链,方便我们做扩展。

回页首Jetty 的启动过程Jetty 的入口是 Server 类,Server 类启动完成了,就代表 Jetty能为你提供服务了。

它到底能提供哪些服务,就要看 Server 类启动时都调用了其它组件的 start 方法。

从 Jetty的配置文件我们可以发现,配置 Jetty 的过程就是将那些类配置到Server 的过程。

下面是 Jetty 的启动时序图:图 4. Jetty 的启动流程因为 Jetty 中所有的组件都会继承 LifeCycle,所以Server 的 start 方法调用就会调用所有已经注册到Server 的组件,Server 启动其它组件的顺序是:首先启动设置到 Server 的 Handler,通常这个 Handler 会有很多子Handler,这些 Handler 将组成一个 Handler 链。

Server 会依次启动这个链上的所有 Handler。

接着会启动注册在Server 上 JMX 的 Mbean,让 Mbean 也一起工作起来,最后会启动Connector,打开端口,接受客户端请求,启动逻辑非常简单。

回页首接受请求Jetty 作为一个独立的 Servlet 引擎可以独立提供 Web 服务,但是它也可以与其他 Web应用服务器集成,所以它可以提供基于两种协议工作,一个是 HTTP,一个是 AJP 协议。

如果将 Jetty 集成到 Jboss 或者Apache,那么就可以让 Jetty 基于 AJP 模式工作。

下面分别介绍 Jetty如何基于这两种协议工作,并且它们如何建立连接和接受请求的。

基于 HTTP 协议工作如果前端没有其它 web 服务器,那么 Jetty 应该是基于 HTTP 协议工作。

也就是当 Jetty 接收到一个请求时,必须要按照 HTTP 协议解析请求和封装返回的数据。

那么 Jetty 是如何接受一个连接又如何处理这个连接呢?我们设置 Jetty 的 Connector 实现类为org.eclipse.jetty.server.bi.SocketConnector 让 Jetty 以 BIO 的方式工作,Jetty在启动时将会创建 BIO 的工作环境,它会创建 HttpConnection 类用来解析和封装 HTTP1.1的协议,ConnectorEndPoint 类是以 BIO 的处理方式处理连接请求,ServerSocket 是建立 socket连接接受和传送数据,Executor 是处理连接的线程池,它负责处理每一个请求队列中任务。

acceptorThread 是监听连接请求,一有socket 连接,它将进入下面的处理流程。

当 socket 被真正执行时,HttpConnection 将被调用,这里定义了如何将请求传递到 servlet 容器里,有如何将请求最终路由到目的 servlet,关于这个细节可以参考《 servlet 工作原理解析》一文。

下图是 Jetty 启动创建建立连接的时序图:图 5. 建立连接的时序图Jetty 创建接受连接环境需要三个步骤:创建一个队列线程池,用于处理每个建立连接产生的任务,这个线程池可以由用户来指定,这个和 Tomcat 是类似的。

创建 ServerSocket,用于准备接受客户端的 socket 请求,以及客户端用来包装这个 socket 的一些辅助类。

创建一个或多个监听线程,用来监听访问端口是否有连接进来。

相比 Tomcat 创建建立连接的环境,Jetty 的逻辑更加简单,牵涉到的类更少,执行的代码量也更少了。

当建立连接的环境已经准备好了,就可以接受 HTTP 请求了,当Acceptor 接受到 socket 连接后将转入下图所示流程执行:图 6. 处理连接时序图Accetptor 线程将会为这个请求创建ConnectorEndPoint。

HttpConnection用来表示这个连接是一个 HTTP 协议的连接,它会创建 HttpParse 类解析 HTTP 协议,并且会创建符合 HTTP 协议的Request 和 Response 对象。

接下去就是将这个线程交给队列线程池去执行了。

基于 AJP 工作通常一个 web 服务站点的后端服务器不是将 Java 的应用服务器直接暴露给服务访问者,而是在应用服务器,如 Jboss的前面在加一个 web 服务器,如 Apache 或者nginx,我想这个原因大家应该很容易理解,如做日志分析、负载均衡、权限控制、防止恶意请求以及静态资源预加载等等。

下图是通常的 web 服务端的架构图:图 7. Web 服务端架构(查看大图)这种架构下 servlet 引擎就不需要解析和封装返回的 HTTP 协议,因为 HTTP 协议的解析工作已经在Apache 或 Nginx 服务器上完成了,Jboss 只要基于更加简单的 AJP 协议工作就行了,这样能加快请求的响应速度。

对比 HTTP 协议的时序图可以发现,它们的逻辑几乎是相同的,不同的是替换了一个类 Ajp13Parserer 而不是 HttpParser,它定义了如何处理AJP 协议以及需要哪些类来配合。

实际上在 AJP 处理请求相比较 HTTP 时唯一的不同就是在读取到 socket 数据包时,如何来转换这个数据包,是按照HTTP 协议的包格式来解析就是 HttpParser,按照 AJP 协议来解析就是Ajp13Parserer。

封装返回的数据也是如此。

让 Jetty 工作在 AJP 协议下,需要配置 connector 的实现类为Ajp13SocketConnector,这个类继承了 SocketConnector 类,覆盖了父类的 newConnection方法,为的是创建 Ajp13Connection 对象而不是 HttpConnection。

如下图表示的是 Jetty 创建连接环境时序图:与 HTTP 方式唯一不同的地方的就是将 SocketConnector 类替换成了Ajp13SocketConnector。

改成 Ajp13SocketConnector 的目的就是可以创建 Ajp13Connection类,表示当前这个连接使用的是 AJP 协议,所以需要用 Ajp13Parser 类解析 AJP 协议,处理连接的逻辑都是一样的。

如下时序图所示:基于NIO 方式工作前面所描述的 Jetty 建立客户端连接到处理客户端的连接都是基于 BIO 的方式,它也支持另外一种 NIO 的处理方式,其中 Jetty 的默认connector 就是 NIO 方式。

关于 NIO 的工作原理可以参考 developerworks 上关于 NIO 的文章,通常 NIO 的工作原型如下:Selector selector = Selector.open();ServerSocketChannel ssc = ServerSocketChannel.open();ssc.configureBlocking( false );SelectionKey key = ssc.register( selector, SelectionKey.OP_ACCEPT );ServerSocketChannel ss = (ServerSocketChannel)key.channel(); SocketChannel sc = ss.accept();sc.configureBlocking( false );SelectionKey newKey = sc.register( selector, SelectionKey.OP_READ ); Set selectedKeys = selector.selectedKeys();。

相关文档
最新文档