首页 文章 精选 留言 我的

精选列表

搜索[AI原生解析],共10000篇文章
优秀的个人博客,低调大师

原生js——四种对话框

js一共提供了四种对话弹框,即alert()、confirm()、prompt()、showModalDialog()。具体使用方法如下: 1.alert() alert()向用户显示一条消息并等待用户关闭对话框。 在大多数的浏览器里,alert()方法会产生阻塞,并等待用户关闭对话框。 也就是说,在用户关掉它们所显示的对话框之前,它们不会返回。这就意味着在弹出一个对话框前,代码就会停止运行。如果当前正在载入文档,也会停止载入,直到用户用要求的输入进行响应为止。 alert("我是一个alert对话框"); 2.confirm() confirm()也显示一条消息,要求用户单击“确定”或“取消”按钮,并返回一个布尔值。 在浏览器中,confirm()会产生阻塞。 var test_value = confirm("你确定要继续吗?"); console.log(test_value); // 如果点击【确定】则返回true,点击【取消】,返回false 3.prompt() prompt()同样也显示一条消息,等待用户输入字符串,并返回那个字符串。 在浏览器中,prompt()会产生阻塞。 var message = prompt("请输入你的名字:"); console.log(message); 4.showModalDialog() 首先要说明的是,之前的三种对话框是通用的,showModalDialog()有一定的兼容性,可以简单概括为:IE、火狐、safari浏览器是支持的。但是Chrome和opera浏览器是不支持的,不过我们可以采用window.open()来代替。 showModalDialog()显示一个包含HTML格式的“模态对话框”,可以给它传入参数,以及从对话框里返回值。 showModalDialog()在浏览器当前窗口中显示一个模态窗口,在显示模态窗口的时候,可以传入三个参数: 第一个参数用以指定提供对话框HTML内容的URL 第二个参数是一个任意值(数组和对象均可),这个值在对话框里的脚本中可以通过window.dialogArguments属性的值访问。 第三个参数是一个非标准的列表,包含以分号隔开的name=value对,如果提供了这个参数,可以配置对话框的尺寸或其他属性。具体属性如下: |属性|说明| |:---:|:---| |dialogHeight|对话框高度,不小于100px| |dialogWidth|对话框宽度。| |dialogLeft|离屏幕左的距离。| |dialogTop|离屏幕上的距离。| |center|{ yes | no | 1 | 0 }:是否居中,默认yes,但仍可以指定高度和宽度。| |help|{ yes | no | 1 | 0 }:是否显示帮助按钮,默认yes。| |resizable|{ yes | no | 1 | 0 } [IE5+]: 是否可被改变大小。默认no。| |status|{ yes | no | 1 | 0 } [IE5+]: 是否显示状态栏。默认为yes[ Modeless]或no[Modal]。| |scroll|{ yes | no | 1 | 0 | on | off }:是否显示滚动条。默认为yes。| 在进行模态弹窗的时候,我们首先应该新建一个弹窗的新页面,并在里面写出我们需要的html、css和js代码。例如我们新建一个modal_html.html页面: <form action="#"> <label for="user_name">Name:</label> <input type="text" id="user_name"> <br> <label for="user_gender">Gender:</label> <input type="text" id="user_gender"> <br> <label for="user_age">Age:</label> <input type="text" id="user_age"> </form> <button id="btn_ok">ok</button> <button id="btn_cancle">cancle</button> <script> // 获取页面中的三个input元素,并赋值 var user_name = document.getElementById('user_name'); var user_age = document.getElementById('user_age'); var user_gender = document.getElementById('user_gender'); user_name.value = window.dialogArguments[0]; user_age.value = window.dialogArguments[1]; user_gender.value = window.dialogArguments[2]; var btn_ok = document.getElementById('btn_ok'); var btn_cancle = document.getElementById('btn_cancle'); // 点击【ok】按钮,关闭并返回模态窗口中的值 btn_ok.addEventListener("click",function(){ window.returnValue = [] window.returnValue[0] = user_name.value; window.returnValue[1] = user_age.value; window.returnValue[2] = user_gender.value; window.close(); }); // 点击【cancel】,直接关闭模态窗口,不返回值 btn_cancle.addEventListener("click",function(){ window.close(); }); </script> 新的页面创建好之后,我们便可以在另外一个页面parent.html进行模态弹窗,按照要求传入三个参数,parent.html页面的代码如下: var p = window.showModalDialog("modal_html.html", ["Tom", 23, "meal"], "dialogWidth:400px;dialogHeight:200px;resizable:no"); // 上述代码等价于以下代码 var param_1 = "modal_html.html"; var param_2 = ["Tom", 23, "meal"]; var param_3 = "dialogWidth:400px;dialogHeight:200px;resizable:no"; var p = window.showModalDialog(param_1, param_2, param_3); 如果想从parent.html页面向模态窗口中传递数据,可以在模态窗口modal_html.html页面中,使用window.dialogArguments数组接受,示例代码如下: var user_name = document.getElementById('user_name'); var user_age = document.getElementById('user_age'); var user_gender = document.getElementById('user_gender'); user_name.value = window.dialogArguments[0]; user_age.value = window.dialogArguments[1]; user_gender.value = window.dialogArguments[2]; 如果想从模态窗口中向打开模态窗口的parent.html页面返回数据,首先要在parent.html页面设置window.returnValue,注意这里不需要使用return语句显式返回。使用window.close();语句关闭模态窗口的时候,会自动返回window.returnValue。事例代码如下: // 点击【ok】按钮,关闭并返回模态窗口中的值 btn_ok.addEventListener("click",function(){ window.returnValue = [] window.returnValue[0] = user_name.value; window.returnValue[1] = user_age.value; window.returnValue[2] = user_gender.value; window.close(); }); 在模态窗口页面设置好window.returnValue,我们便可以在parent.html页面进行引用,示例代码如下: var p = window.showModalDialog("modal_html.html", ["Tom", 23, "meal"], "dialogWidth:400px;dialogHeight:200px;resizable:no"); alert(p[0]); // 如果在模态窗口中不修改,则为Tom alert(p[1]); // 如果在模态窗口中不修改,则为 23 alert(p[2]); // 如果在模态窗口中不修改,则为 meal

优秀的个人博客,低调大师

原生jdbc操作mysql数据库详解

首先给大家说一下使用JDBC链接数据库的步骤 1.加载链接数据库驱动 2.建立数据库链接 3.创建数据库操作对象 4.编写sql语句,执行sql语句 5.获取结果集 6.释放资源 我这边采用的是maven构建工具创建的java项目;如果不使用maven创建的话也没有什么不同,因为都是在main方法里面写的嘛! 只是需要导入jdbc需要的jar包即可,然后下面建项目的这些步骤就可以直接跳过了 首先点击新建项目 如果你的这里没有Maven Project 这个选项的话,那就直接点击Other,有的话就直接点击Maven项目即可! 点完以后在这里搜索maven也是一样的,选择Maven Project 然后next 直接使用默认 继续next 找到我选中的那一条 ,其他地方不用填 ,继续next 主要目的不是为了构建项目,所以这上面两个需要填写的地方可以随意些,上面的代表包名 ,第二个代表项目名,然后Finish 然后在pom.xml里面加入如下配置;我是不记得需要那几个jar包了,所以直接全部放进去了,哈哈哈哈哈 现在开始就要写代码了,首先建一个main方法,很简单的写一个例子 package com.TestJDBC; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /** * Hello world! * */ public class Demo01 { public static void main( String[] args ) { Connection connection=null ; Statement statement=null; ResultSet resultSet = null; try { //1.加载驱动 Class.forName("com.mysql.jdbc.Driver"); //2.获取连接对象(参数解释,第一个是代表jdbc的方式访问mysql数据库,localhost代表是访问本地的,3306端口号,db_test01代表数据库名字,后面两个代表账户密码 connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_test01","root","root"); //3.获取执行sql对象 statement = connection.createStatement(); //4.编写sql语句,执行sql String sql="select * from stu"; //5.获取结果集 ,查询操作使用executeQuery,增,删,改使用statement.executeLargeUpdate(sql) //如果是增删改操作,失败了会返回0 resultSet = statement.executeQuery(sql); if(resultSet.next()){ //获取字符串类型的值 String name = resultSet.getString("name"); String sex = resultSet.getString("sex"); //获取int型的值 int age = resultSet.getInt("age"); System.out.println(name+" ,"+sex+","+age); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { //6.释放连接 if(resultSet!=null){ try { resultSet.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(statement!=null){ try { statement.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(connection!=null){ try { connection.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } 下面改了一下,是一个预编译的案例 package com.TestJDBC; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /** * Hello world! * */ public class Demo01 { public static void main(String[] args) { Connection connection = null; PreparedStatement statement = null; ResultSet resultSet = null; try { // 1.加载驱动 Class.forName("com.mysql.jdbc.Driver"); // 2.获取连接对象(参数解释,第一个是代表jdbc的方式访问mysql数据库,localhost代表是访问本地的,3306端口号,db_test01代表数据库名字,后面两个代表账户密码 connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_test01", "root", "root"); // 3.获取执行sql对象 // 4.编写sql语句,执行sql(预编译,用?号代替值) String sql = "select * from stu where id=?"; statement = connection.prepareStatement(sql); //然后再设置进去,可以设置多个值 statement.setString(1, "1"); resultSet = statement.executeQuery(); // 5.获取结果集 // ,查询操作使用executeQuery,增,删,改使用statement.executeLargeUpdate(sql) // 如果是增删改操作,失败了会返回0 if (resultSet.next()) { // 获取字符串类型的值 String name = resultSet.getString("name"); String sex = resultSet.getString("sex"); // 获取int型的值 int age = resultSet.getInt("age"); System.out.println(name + " ," + sex + "," + age); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { // 6.释放连接 if (resultSet != null) { try { resultSet.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (statement != null) { try { statement.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (connection != null) { try { connection.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }

优秀的个人博客,低调大师

Android 原生 Intent 分享支持的那些事

一、前言 对于一个 App 而言,分享是一个比较常见的功能。分享的主要功能,还是为了让 App 在用户之间形成一个自传播的效果,但是对于开发者而言,分享就是在不同的 App 之间,传递文本、文件等数据。 如果只是简单的分享内容,使用ACTION_SEND或者ACTION_SEND_MULTIPLE可能是一种简单的方式。可是从 Support v4 22.0.0 开始,引入了一个新的分享兼容库,ShareCompat,它可以帮开发者更轻松的构造一个分享的 Intent 。 二、ShareCompat 2.1 什么是 ShareCompat ShareCompat 可以帮助我们快速的实现应用间分享的数据的功能。既然是一个完整的功能,它主要包含了两个功能:快速的构建一个分享的 Intent,快速的读取别的 App 内分享来的内容。 所以,ShareCompat 是包含两部分内容的:IntentBuilder、IntentReader。从名称上就可以看出来他们的用途。 2.2 分享文本 从最简单的开始,使用 IntentBuilder 分享一个纯文本,是非常简单的,IntentBuilder 从名称也能看出来,它是Builder模式,所以可以支持多个方法链式调用。 其中最重要的是,设置一个正确的mimeType,它将是用于Intent-filter过滤器重要的过滤条件,表示这里知识分享一个纯文本的类型的内容。 在startActivity()之前,调用resolveActivity()做一层校验,是一个比较常规的保护措施。它避免了当前系统中没有任何 App 可以匹配上这个隐式的 Intent,而触发ActivityNotFoundException的异常。虽然没有可以接收text/plain类型的分享其实是非常不可能的,但是加上它也是一个很好的编码习惯。 2.3 分享 HTML 格式的文本 有一些 App ,例如 电子邮件客户端,是可以支持 HTML 格式的文本的,与纯文本相比,它可以显示更丰富的内容。 可以注意到,区别就在于setType()的时候,填写的是text/html,并且使用的是setHtmlText()方法去配置分享的内容。 既然分享 Html 内容,多用于发送 Email 内容,所以这里也配置了接收的邮件地址。 一般而言,使用 Html 的方式还需要接收分享内容的 App 支持这样的内容,所以还是需要谨慎使用,可能用户分享的 App ,并不能很好的显示我们需要分享的 Html 的内容。 2.4 发送一个Email 前面也提到如何在发送的 Email 中,添加一个 Html 的内容。而 ShareCompat 也提供了非常好的发送 Email 的体验,可以非常方便的构造一个用于发送 Email 的 Intent。 IntentBuilder 中,提供了非常方便的 Api,用于添加一些 Email 收件人、抄送之类的数据,都在addEmailXxx()的方法中,非常好理解,有兴趣的可以直接看看 Api 文档。 2.5 收一个文本内容 虽然大多数情况下,我们是需要开发一个支持分享的功能,但是也不影响我们了解如何接收一个分享的内容。 而分享传递过来的内容,都是可以在 Intent 中获取到的。而 IntentReader 也提供了非常便捷的 Api 让我们快速的拿到它的内容。 这里以接收一个文本内容为例,首先需要在AndroidManifest.xml中配置接收的 Activity 和 Intent-filter。 这就是一个比较常规的 ShareActivity 的配置。 IntentReader 使用起来也非常的简单,它实际上就是一个 Intent 数据的包装器,提供了很多方便的 Api ,从 Intent 中提取出我们需要的数据。 2.6 分享文件和图片 除了分享一段文本内容之外,有时候我们还需要向外分享一个文件(包括视频、图片等)。而发送这些,就需要具有额外的权限。 构造一个图片的分享也非常的简单,只需要使用setStream()方法,传递一个文件的Uri即可,并且配置好对应的mimeType。 但是这种方式,就需要考虑到 Android 6.0 开始对分享的文件,以严格模式进行处理,所以对此我们需要使用FileProvider来支持。 有关 FileProvider 的内容,可以看看之前的文章: 一旦使用上 FileProvider 只需要将 Uri 替换成FileProvider.getUriForFile()返回的 Uri 即可,这都是 FileProvider 的标准内容,就不在这里详细说明了。 不过有一点需要特别注意的,使用 FileProvider 返回的 Uri ,就可以不用显式的设定 mimeType 类型了,因为它是可以通过这个 Uri 推断出正确的 mimeType 的类型的,所以就不需要显式的指定了。 2.7 接收文件内容 Android 6.0 对文件的接收,并没有任何的改变,所以我们只需要使用IntentReader.getStream()这个标准的 Api 就可以拿到分享过来的 Uri。 三、ShareCompat 都兼容了什么 Support v4 包下的库,其实都是为了向 Android 低版本做兼容而努力的,让开发者无需关注他们之间的差异,而通常我们看到一个类的命名中,有 Compat 字样,一般就可以断定,它又是一个兼容库。 那么 ShareCompat 对不同的 Android 版本,有做什么兼容处理呢? ShareCompat 中,有一个静态的 ShareCompatImpl 对象,它就是为了出来兼容问题的,它是一个接口,先来看看它的定义。 可以看到,它实际上就是对configureMenuItem()和 html 的文本转义,做了兼容的处理。 在 ShareCompat 的静态代码块中,对其进行版本的区分,不同版本用不同的实现类。 简单来说,就是一些处理方法,可能在低版本上没有,所以它会使用另外的方法去实现。举个例子,ShareCompatImplJB中,escapeHtml()方法,最终调用的是Html.escapeHtml()方法,但是这个方法它是 Api Level 16 才有的支持,所以在ShareCompatImplBase中,实际上是把它的实现,完全的拷贝了出来,只是为了做一个 Html 中字符的转义。 四、结语 ShareCompat 如果只是简单的去分享一个内容,还是非常的好用的。但是大多数情况下,我们还是会选择使用第三方 App 提供的 SDK,来进行接入支持,因为会有一些定制的需要,例如拿到分享结果。 不过这并不影响我们了解 ShareCompat ,多看看 Google 开发人员写的代码,终归是对你有帮助的。 本文转自承香墨影博客园博客,原文链接:http://www.cnblogs.com/plokmju/p/7324776.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

原生的 exFAT 支持已经来到 Linux 平台

不同文件系统在不同的操作系统上读写一直是件很头大的事,特别是用 NTFS/exFAT格式化后的大容量U盘,在 Windows 和 Linux 之间共享数据时最为头痛。 在Linux平台上支持exFAT,分为三个阶段: 最初是一个exFAT的补丁,可以只读的使用exFAT;之后通过FUSE方式支持了exFAT,但是其性能并不很好;现在由Android代码中移植来的exfat-nofuse则是由微软开发的,并不依赖FUSE,不但能支持读写,而且性能也不错。 exfat-nofuse在 Linux kernel 3.8 、 3.9和3.10中通过测试,可需求的同学可以前往github下载: https://github.com/rxrz/exfat-nofuse 安装方式: make && make install modprobe exfat_fs 原文发布时间为:2013-07-06 本文来自云栖社区合作伙伴“Linux中国”

优秀的个人博客,低调大师

CC Switch 与 AI API 桌面客户端在 Claude Code 和 Codex 接入场景中的差异解析

需要管理多个 API 供应商,或在 Windows、macOS、Linux 之间使用,优先考虑 CC Switch;使用 Apple Silicon Mac,希望把支持的编程客户端接入 账号,可以考虑 Desktop。 你也可以继续CC Switch 使用 ,不必为了换 API 服务而换掉配置工具。 这篇文章面向正在为 Claude Code、Codex 选择接入方式的用户。文中的 ** Desktop 是 的连接管理客户端**,不是 Codex 桌面应用,也不是 Claude Desktop;两款配置工具都不替代编程客户端本身。 *说明:本文由 发布,功能依据截至 2026 年 9 月 27 日的官方资料核对。这是功能与适用场景对比,不是安装耗时实测,也不是模型能力测评。* ## CC Switch 和 Desktop 的主要区别 | 维度 | CC Switch | Desktop | | --- | --- | --- | | 用途 | 管理、切换支持工具的多个 API 供应商 | 把支持的工具接入 账号 | | 系统 | Windows、macOS、Linux,需满足对应版本要求 | 当前官方下载:macOS 12 及以上、Apple Silicon | | 接入 | 供应商预设与自定义配置 | 连接 账号,选择客户端和模型 | | 管理 | MCP、Skills、提示词、用量及本地路由等 | 各工具的 API Key、用量和账号余额 | | 备份 | 保存现有配置,确认使用的路由模式 | 保留连接前创建的配置备份 | | 费用 | 取决于实际处理请求的服务 | API 使用单独计费,不包含在客户端下载中 | 依据:[CC Switch 官方仓库](https://github.com/farion1231/cc-switch)、 Desktop 支持范围与接入说明。表格比较的是公开介绍的使用方式,没有列出的功能不等于产品一定不支持。 ## 什么情况下更适合继续用 CC Switch? 如果你已经维护多个供应商账号,CC Switch 的定位就很匹配。官方资料介绍了供应商预设、自定义配置、本地路由的协议转换与故障切换,以及 MCP、Skills 管理。它也有用量统计,因此,**不能只凭 Desktop 能显示余额或用量,就认为值得迁移。** 操作系统可能比功能表更早决定选择。CC Switch 提供 Windows、macOS 和 Linux 安装方式; Desktop 当前官方下载没有 Windows 和 Intel Mac 安装包。Linux 用户也要核对 [CC Switch 的系统要求](https://github.com/farion1231/cc-switch#download--installation),不能把支持 Linux 理解为支持所有发行版。 如果 CC Switch 已经能稳定连接你的工具,评估其他方案时可以先保留这套配置。使用 作为供应商,并不要求你先迁移到 Desktop。 ## 什么情况下值得试 Desktop? Desktop 侧重一件更具体的事:把已经安装、且在支持范围内的编程客户端接入 ,并在同一账号下查看 用量。公开介绍的流程是连接账号、选择检测到的客户端、选择兼容模型,再应用配置。 当前支持的客户端包括 Claude Code、Codex、Gemini CLI、OpenCode、OpenClaw 和 Hermes。**Cline 与 DeepSeek Harness 仍应使用手动 API 接入文档**;出现在页面的教程列表中,不代表 Desktop 会自动配置它们。 如果你的 Mac 符合要求,而且已经决定使用 ,这套围绕账号连接的流程才是考虑 Desktop 的理由。它不能证明代码写得更好、模型回复更快,或 API 费用一定更低。 ## 先比较一个客户端,再决定是否迁移 选一个已安装的客户端,在空测试目录中检查。新配置验证前,保留原来的可用配置。 - **记下当前状态。** 记录客户端、供应商、模型与配置位置,保留备份。不要把 API Key 放进截图或共享笔记。 - **这次只用一个工具改配置。** 用 CC Switch 时,按对应客户端的官方指引添加供应商;用 Desktop 时,选择支持的客户端并应用 配置。排查同一份配置时,避免在两个管理工具中来回修改。 - **开启新的客户端会话。** CC Switch 的生效方式因客户端和路由模式而异,具体按[官方切换说明](https://github.com/farion1231/cc-switch/blob/main/docs/user-manual/en/2-providers/2.2-switch.md)操作。按钮显示切换成功,不代表已经打开的会话一定换了供应商。 - **发一条小请求,再核对去向。** 使用 时,在账号的请求记录中核对时间、模型、Key 和状态。模型自称是谁,不能证明请求走了哪条路径;能返回文字,也不等于已经验证了编程任务需要的工具调用能力。 - **再检查实际任务与回退方式。** 接入确认后,再做一个小型编程任务。如果失败,先恢复保存的配置,再排查下一个变量。 具体字段以 Claude Code 接入文档和 Codex 模型供应商配置文档为准。选择 Desktop 路径时,可以接着看 Desktop 多工具接入教程。 ## 更换前的三个常见问题 ### Desktop 能完全替代 CC Switch 吗? 不能这样概括。对于“在兼容的 Mac 上,把支持的客户端接入 ”这件事,Desktop 是一个选择。如果你需要跨平台管理多个供应商,CC Switch 仍然更符合这类需求。 ### 不用 Desktop,也能接入 吗? 可以继续用 CC Switch,也可以手动配置。 的 Codex 文档就提供了 CC Switch 接入方式。更换 API 服务和更换配置工具,是两个不同的决定。 ### 换成 Desktop,会降低模型费用吗? 不能仅凭更换工具判断。比较同一任务实际使用的供应商、模型与计费账号,才知道费用如何变化。客户端下载不包含无限模型用量,本文不作省钱承诺。 你的重点如果是**跨平台、多供应商管理**,可以先选 CC Switch;如果是**在 Apple Silicon Mac 上把支持的工具接入 **,可以查看 Desktop 兼容条件与下载入口。确认新路径能完成请求和实际任务后,再决定是否替换原来的配置。 --- **参考来源** - ofox 文档:模型目录 — https://docs.ofox.io/zh/develop/models

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册