首页 文章 精选 留言 我的

精选列表

搜索[通用人工智能],共10006篇文章
优秀的个人博客,低调大师

Java数据库通用操作类的代码

Java操作数据库主要有以下三个步骤:1)查找数据库驱动;2)生成Connection对象;3)生成Statement对象,然后使用Statement对象进行数据库的增删改查操作。为了更加方便使用,对上述操作进行封装,增删改三个操作封装为update方法,参数为标准的SQL语句,返回值为boolean类型;查询封装为query方法,方法的参数也为标准的查询SQL语句,返回为记录集ResultSet;单独编写initialize方法实现配置文件读取,Connection对象生成,Statement生成等操作,并将initialize()方法与类的构造函数合并,即一生成类对象即完成初始化操作;close()方法实现了对数据资源回收工作,值得注意的是在初始化操作时,是先生成Connection对象,再生成Statement对象,而关闭时是先关闭Statement对象再关闭Connection对象,这一点一定要注意。 数据库类中可能发生变化的内容:数据库驱动,url,用户名和密码,单独在配置文件中,防止发生变化时需要修改和重新编译代码。 配置文件内容如下: driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8 username=root password=test 具体DBProcess.java的代码如下: packageedu.sgit.db; importjava.io.IOException; importjava.io.InputStream; importjava.sql.Connection; importjava.sql.DriverManager; importjava.sql.ResultSet; importjava.sql.Statement; importjava.util.Properties; /* *表名:test *idint自增 *usernamevarchar(50) *passwordvarchar(50) * */ //insertintotest(username,password) // values('admin','111'); //updatetestsetpassword='222'whereid=1 //updatetestsetpassword='222'whereusername='admin' //deletefromtestwhereid=1; //deletefromtestwhereusername='admin' //select*fromtestwhereusername='admin' publicclassDBProcess{ privateConnectionconn=null; privateStatementstmt=null; publicDBProcess(){ initialize(); } publicvoidinitialize(){ try{ Stringdriver="";//数据库驱动类 Stringurl=""; Stringusername=""; Stringpassword=""; //读配置文件,获取,driver,url,username,password InputStreamin=this.getClass().getResourceAsStream("prop.properties");//字节流 Propertiesprop=newProperties(); try{ prop.load(in); }catch(IOExceptione){ e.printStackTrace(); } driver=prop.getProperty("driver"); url=prop.getProperty("url"); username=prop.getProperty("username"); password=prop.getProperty("password"); //1.查找数据库驱动 Class.forName(driver);//查找数据库驱动 //2.建立数据库连接,并生成相应的连接对象 conn=DriverManager.getConnection(url,username,password);//建立数据库连接 //3.生成数据库操作对象stmt stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); }catch(Exceptionex){ ex.printStackTrace(); } } //在数据表中添加,修改,删除一条记录 publicbooleanupdate(Stringsql){ try{ //添加 //insertintotest(username,password) //values('admin','111'); //修改数据库记录 //updatetestsetpassword='222222'whereid=1, //删除记录 //sql="deletefromtestwhereid=8" stmt.executeUpdate(sql); returntrue; }catch(Exceptionex){ ex.printStackTrace(); returnfalse; } } //查询结果 //sql="select*fromtest" publicResultSetquery(Stringsql){ try{ returnstmt.executeQuery(sql); }catch(Exceptionex){ ex.printStackTrace(); returnnull; } } publicvoidclose(){ try{ if(stmt!=null) stmt.close(); if(conn!=null) conn.close(); }catch(Exceptionex){ ex.printStackTrace(); } } } 测试代码: packageedu.sgit.test; importjava.sql.ResultSet; importedu.sgit.db.DBProcess; publicclassDBTest{ publicstaticvoidmain(String[]args){ /* +--------+--------------+------+-----+---------+----------------+ |Field|Type|Null|Key|Default|Extra| +--------+--------------+------+-----+---------+----------------+ |Id|int(11)|NO|PRI|NULL|auto_increment| |title|varchar(100)|YES||NULL|| |msg|text|YES||NULL|| |inDate|datetime|YES||NULL|| |count|int(11)|YES||0|| +--------+--------------+------+-----+---------+----------------+ **/ DBProcessdb=newDBProcess(); //add Stringtitle="abc"; Stringmsg="msg_0001"; Stringdate="2020-09-2010:45:23"; intcount=100; intid=8; //如果字段是字符,变量前后加'',如果字段是数值类型,不加单引号 //title:'aaa0000' //count:100 Stringsql0="insertintomsg(title,msg,inDate,count)values('abc','msg_0001','2020-09-2010:45:23',100)"; Stringsql1="insertintomsg(title,msg,inDate,count)values('"; sql1=sql1+title+"','"; sql1=sql1+msg+"','"; sql1=sql1+date+"',"; sql1=sql1+count+")"; System.out.println(sql1); booleanflag=db.update(sql1); if(flag){ System.out.println("addok!"); }else{ System.out.println("adderror!"); } //update sql1="updatemsgsettitle='"; sql1=sql1+title+"'whereid="+id; flag=db.update(sql1); if(flag){ System.out.println("udpateok!"); }else{ System.out.println("udpateerror!"); } //delete sql1="deletefrommsgwhereid="+id; flag=db.update(sql1); if(flag){ System.out.println("deleteok!"); }else{ System.out.println("deleteerror!"); } //query sql1="select*frommsg"; ResultSetrs=db.query(sql1); try{ while(rs.next()){ System.out.print(rs.getInt("id")); System.out.print("\t"); System.out.print(rs.getString("title")); System.out.print("\t"); System.out.print(rs.getString("msg")); System.out.print("\t"); System.out.print(rs.getString("inDate")); System.out.print("\t"); //System.out.print(rs.getInt("count")); //System.out.print("\n"); } }catch(Exceptionex){ ex.printStackTrace(); } } }

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

Android 仿IOS的PopupWindow和通用BasePopupWindow搭建

截图 pw.png 实现 1、BasePopupWindow.java 1.1、实现动态加载不同layout 1.2、动态配置是否弹出后背景半透明,关闭时候恢复(监听ondismiss,靠window类来变色) 1.3、一些基础性的方法抽象方法 1.4、为了更加复杂的样式和动效,可以继续扩展此类 /** * Created by wujn on 2018/10/29. * Version : v1.0 * Function: base popuwindow */ public abstract class BasePopupWindow extends PopupWindow implements View.OnClickListener{ /** * 上下文 */ private Context context; /** * 最上边的背景视图 */ private View vBgBasePicker; /** * 内容viewgroup */ private LinearLayout llBaseContentPicker; public BasePopupWindow(Context context) { super(context); this.context = context; View parentView = View.inflate(context, R.layout.base_popup_window_picker, null); vBgBasePicker = parentView.findViewById(R.id.v_bg_base_picker); llBaseContentPicker = (LinearLayout) parentView.findViewById(R.id.ll_base_content_picker); /*** * 添加布局到界面中 */ llBaseContentPicker.addView(View.inflate(context, bindLayout(), null)); setContentView(parentView); //设置PopupWindow弹出窗体的宽 this.setWidth(ViewGroup.LayoutParams.MATCH_PARENT); //设置PopupWindow弹出窗体的高 this.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT); //在PopupWindow里面就加上下面代码,让键盘弹出时,不会挡住pop窗口。 this.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED); this.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); setFocusable(true);//设置获取焦点 setTouchable(true);//设置可以触摸 setOutsideTouchable(true);//设置外边可以点击 ColorDrawable dw = new ColorDrawable(0xffffff); setBackgroundDrawable(dw); //设置SelectPicPopupWindow弹出窗体动画效果 this.setAnimationStyle(R.style.BottomDialogWindowAnim); initView(parentView); initListener(); initData(); vBgBasePicker.setOnClickListener(this); //是否需要屏幕半透明 setBackgroundHalfTransition(isNeedBackgroundHalfTransition()); } /** * 初始化布局 * * @return */ protected abstract int bindLayout(); /** * 初始化view * * @param parentView */ protected abstract void initView(View parentView); /** * 初始化数据 */ protected abstract void initData(); /** * 初始化监听 */ protected abstract void initListener(); /** * 为了适配7.0系统以上显示问题(显示在控件的底部) * * @param anchor */ @Override public void showAsDropDown(View anchor) { if (Build.VERSION.SDK_INT >= 24) { Rect rect = new Rect(); anchor.getGlobalVisibleRect(rect); int h = anchor.getResources().getDisplayMetrics().heightPixels - rect.bottom; setHeight(h); } super.showAsDropDown(anchor); if(isNeedBgHalfTrans){ backgroundAlpha(0.5f); } } /** * 展示在屏幕的底部 * * @param layoutid rootview */ public void showAtLocation(@LayoutRes int layoutid) { showAtLocation(LayoutInflater.from(context).inflate(layoutid, null), Gravity.TOP | Gravity.CENTER_HORIZONTAL, 0, 0); if(isNeedBgHalfTrans){ backgroundAlpha(0.5f); } } /** * 最上边视图的点击事件的监听 * * @param v */ @Override public void onClick(View v) { switch (v.getId()) { case R.id.v_bg_base_picker: dismiss(); break; } } /** * 是否设置背景半透明 * */ public boolean isNeedBackgroundHalfTransition(){ return false; } private boolean isNeedBgHalfTrans = false; private void setBackgroundHalfTransition(boolean isNeed){ isNeedBgHalfTrans = isNeed; if(isNeedBgHalfTrans){ this.setOnDismissListener(new OnDismissListener() { @Override public void onDismiss() { backgroundAlpha(1f); } }); } } /** * 设置添加屏幕的背景透明度 * @param bgAlpha */ private void backgroundAlpha(float bgAlpha) { WindowManager.LayoutParams lp = ((Activity)context).getWindow().getAttributes(); lp.alpha = bgAlpha; //0.0-1.0 ((Activity)context).getWindow().setAttributes(lp); } } 2、base_popup_window_picker.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <View android:id="@+id/v_bg_base_picker" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" /> <LinearLayout android:id="@+id/ll_base_content_picker" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:orientation="vertical" /> </LinearLayout> 3、进入和退出时候的动画style <!--animanation--> <!-- 底部的dialog弹出的动画样式--> <style name="BottomDialogWindowAnim" parent="android:Animation"> <item name="android:windowEnterAnimation">@anim/popup_bottom_enter_anim</item> <item name="android:windowExitAnimation">@anim/popup_bottom_exit_anim</item> </style> 进入动画:popup_bottom_enter_anim.xml <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:duration="200" android:fromYDelta="100%p" android:toYDelta="0" /> <alpha android:duration="200" android:fromAlpha="0.0" android:toAlpha="1.0" /> </set> 退出动画:popup_bottom_exit_anim.xml <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:duration="200" android:fromYDelta="0" android:toYDelta="50%p" /> <alpha android:duration="200" android:fromAlpha="1.0" android:toAlpha="0.0" /> </set> 4、仿IOS的layout:popup_window_album_or_camera.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="10dp"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/bg_shape_corner_white" android:orientation="vertical"> <Button android:id="@+id/btnCamera" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@null" android:text="拍照" android:textColor="@color/dodgerblue" android:textSize="@dimen/normal_text_size" /> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="@color/gray_1" /> <Button android:id="@+id/btnAlbum" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@null" android:text="从相册中选择" android:textColor="@color/dodgerblue" android:textSize="@dimen/normal_text_size" /> </LinearLayout> <LinearLayout android:layout_marginTop="10dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/bg_shape_corner_white" android:orientation="vertical"> <Button android:id="@+id/btnCancel" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@null" android:text="@string/cancel" android:textColor="@color/dodgerblue" android:textSize="@dimen/normal_text_size" /> </LinearLayout> </LinearLayout> item的背景style <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="@color/white" /> <corners android:radius="6dp"/> <stroke android:width="1dp" android:color="@color/gray_1" /> </shape> 5、仿IOS的popuwindow类:AlbumOrCameraPopupWindow public class AlbumOrCameraPopupWindow extends BasePopupWindow { private Button btnCamera; private Button btnAlbum; private Button btnCancel; private OnCameraOrAlbumSelectListener onCameraOrAlbumSelectListener; public AlbumOrCameraPopupWindow(Context context,OnCameraOrAlbumSelectListener onCameraOrAlbumSelectListener) { super(context); this.onCameraOrAlbumSelectListener = onCameraOrAlbumSelectListener; } @Override public boolean isNeedBackgroundHalfTransition(){ return true; } @Override protected int bindLayout() { return R.layout.popup_window_album_or_camera; } @Override protected void initView(View parentView) { btnCamera = (Button) parentView.findViewById(R.id.btnCamera); btnAlbum = (Button) parentView.findViewById(R.id.btnAlbum); btnCancel = (Button) parentView.findViewById(R.id.btnCancel); } @Override protected void initData() { } @Override protected void initListener() { btnCamera.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dismiss(); if(onCameraOrAlbumSelectListener != null){ onCameraOrAlbumSelectListener.OnSelectCamera(); } } }); btnAlbum.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dismiss(); if(onCameraOrAlbumSelectListener != null){ onCameraOrAlbumSelectListener.OnSelectAlbum(); } } }); btnCancel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dismiss(); } }); } } 选择相机或者相册的监听接口 public interface OnCameraOrAlbumSelectListener { public void OnSelectCamera(); public void OnSelectAlbum(); } 6、具体使用 private AlbumOrCameraPopupWindow ACWindow; private void initListener(){ ACWindow = new AlbumOrCameraPopupWindow(this, onCameraOrAlbumSelectListener); btnIosPopupWindow.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(ACWindow != null && !ACWindow.isShowing()){ ACWindow.showAtLocation(R.layout.activity_view_popup_window); } } }); } /**选择相机或者相册*/ private OnCameraOrAlbumSelectListener onCameraOrAlbumSelectListener = new OnCameraOrAlbumSelectListener() { @Override public void OnSelectCamera() { LogUtil.i("OnSelectCamera..."); ToastUtil.showShort(instance, "相机"); } @Override public void OnSelectAlbum() { LogUtil.i("OnSelectAlbum..."); ToastUtil.showShort(instance, "从相册中选择"); } }; 朝CV工程师又进一步~~~

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

Android 快应用环境搭建(Windows和Mac通用)

快应用官网 快应用官方文档 1. 安装Node.js 图1.png 尽量按照官网推荐的来安装对应包。 查看Node.js版本 node -v 图2.png 2. 安装hap-toolkit # npm设置国内镜像 npm config set registry https://registry.npm.taobao.org # npm查看镜像 npm config get registry # 通过npm仓库安装 npm install -g hap-toolkit # 验证是否安装成功 hap -V 图3.png 3. 资源下载 下载调试器和预览版工具 图4.png 4. 创建项目 创建项目hap init <ProjectName> hap init HelloWorld 图5.png 项目根目录主要结构如下: ├── sign rpk包签名模块 │ └── debug 调试环境 │ ├── certificate.pem 证书文件 │ └── private.pem 私钥文件 ├── src │ ├── Common 公用的资源和组件文件 │ │ └── logo.png 应用图标 │ ├── Demo 页面目录 │ | └── index.ux 页面文件,可自定义页面名称 │ ├── app.ux APP文件,可引入公共脚本,暴露公共数据和方法等 │ └── manifest.json 项目配置文件,配置应用图标、页面路由等 └── package.json 定义项目需要的各种模块及配置信息 安装npm依赖-进入项目的根目录再执行命令 npm install 手动编译项目 npm run build 自动编译项目 npm run watch 5. 安装应用 扫码安装 # 开启Http服务器 npm run server # 自定义端口的Http服务器 npm run server -- --port 8080

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

Weex布局尺寸通用适配方案的研究

问题 weex为前端赋予了强大的跨端开发能力和较一致的良好的用户体验。weex一般是与native进行协作开发: 同app内不同页面用两者分别开发,统一串联 同页面两者协作开发,比如native提供组件,weex使用 由于native布局一般采用定高不定宽的方式,以求不同尺寸的屏幕可以得到基本一致的布局体验,然而weex布局采用基于750的等比例缩放,这种不一致导致的问题: 同一元素在不同屏幕的尺寸展现不一致,大屏手机尺寸偏大,小屏手机尺寸偏小 与native尺寸偏差较多 字号的差异也比较明显。 默认依据ip6尺寸布局,惨不忍睹的现场直击... 红框部分的滑动组件是native的,而背景容器是weex布局的,由于weex等比例缩放,而native使用pt,导致iphone 5s native组件溢出,而iphone 6p组件相比于容器过小。 下面是i

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

Openstack_通用技术_RPC 远程异步调用

目录 目录 RPC 一个通过 HTTP Request 调用操作函数的 RPC 实现样例 环境 接收 HTTP Request RPC 调用具体的操作函数 测试 RPC RPC: 同一个项目内的不同服务进程之间的交互方式。为不同的进程服务提供了 call()(同步) 和 cast()(异步) 两种调用方式。 问题 1: 在一个 Openstack 项目中拥有多个不同的进程服务,EG. API Service/Manage Service。 当我们通过 Client 发送 API Request 去调用 Manage Service 执行一个操作任务时,我们会希望这个调用的结果是能够快速响应到 Client 的(保证用户体验)。 问题 2: 而且进程服务之间的调用我们还需要考虑如何有效的避免进程服务之间调用的阻塞问题。EG. API Service 调用 Manage Service 时,如果不能及时的将 API Service 释放掉,那么 API Request 就会因为被占用,而无法处理新的请求。 对于上面两个问题,我们可以通过将具体的执行过程和响应过程分离来达到理想的效果。这也是 RPC 和 API 存在的原因之一。 一个通过 HTTP Request 调用操作函数的 RPC 实现样例 包含了下列两个过程实现: 接收 HTTP Request RPC 调用操作函数 环境 Devstack 用的 L 版,样例在自定义的 Openstack 项目中实现,详见自动化生成 Openstack 新项目开发框架。 接收 HTTP Request 定义 HTTP Request URL 路由转发的 Resource 详见Openstack Restful API 开发框架 Paste + PasteDeploy + Routes + WebOb 和 Openstack Paste.ini 文件详解 # project/api/v1/router.py from project.api.v1 import new_resource class APIRouter(octopunch.api.openstack.APIRouter): """Routes requests on the API to the appropriate controller and method.""" ExtensionManager = extensions.ExtensionManager def _setup_routes(self, mapper, ext_mgr): self.resources['versions'] = versions.create_resource() mapper.connect("versions", "/", controller=self.resources['versions'], action='show') mapper.redirect("", "/") self.resources['new_resource'] = new_resource.create_resource(ext_mgr) mapper.resource('new_resource', 'new_resource', controller=self.resources['new_resource']) 将 Resource 和 HTTP 方法绑定到 Controller 的 Action 函数中 # project/api/v1/new_resource.py class NewResourceController(wsgi.Controller): def __init__(self, ext_mgr): self.ext_mgr = ext_mgr super(NewResourceController, self).__init__() # Create() 对应了 HTTP 的 POST 方法 @wsgi.serializers() def create(self, req, body): """Create a NewResource.""" context = req.environ['project.context'] # Sync the project database. self.new_resource_api.db_sync(context) def create_resource(ext_mgr): """project resource factory method.""" return wsgi.Resource(NewResourceController(ext_mgr)) 上述两个文件实现了通过 HTTP Request 的 POST 方法来执行指定的 Create() 函数。 RPC 调用具体的操作函数 通过 API 调用 RPC-API # project/new_resource/api.py # import rpcapi module from project.new_resource import rpcapi as new_resource_rpcapi class API(base.Base): """API for interacting with the new_resource manager.""" def __init__(self, db_driver=None, image_service=None): self.new_resource_rpcapi = new_resource_rpcapi.NewResourceAPI() super(API, self).__init__(db_driver) # 定义调用 rpcapi 的接口函数 def db_sync(self, context): """Call rpc api to start db sync for new_resource database.""" self.new_resource_rpcapi.db_sync(context) API 的存在是为了能够快速的响应请求,至于之后的执行过程交由 RPC-API 和 Manager 来处理 rpc-api.py 调用 manager.py 在 rpcapi.py 定义的 RPC 接口函数会自动的映射到 manager.py 中指定的处理函数。 # project/new_resource/rpcapi.py class NewResourceAPI(object): def __init__(self): super(NewResourceAPI, self).__init__() target = messaging.Target(topic=CONF.manage_topic, version=self.RPC_API_VERSION) serializer = objects_base.ProjectObjectSerializer() self.client = rpc.get_client(target, version_cap='1.8', serializer=serializer) # 定义 rpcapi 函数,使用 cast 异步调用方式 def db_sync(self, context): cctxt = self.client.prepare() # 指定 rpcapi 的调用方式,和指定映射到 manager.py 的处理函数 cctxt.cast(context, 'db_sync') RPC-API 的存在是为了快速的响应进程服务之间的调用请求。 # project/new_resource/manager.py class NewResourceManager(manager.Manager): RPC_API_VERSION = '1.8' target = messaging.Target(version=RPC_API_VERSION) def __init__(self, service_name=None, *args, **kwargs): super(NewResourceManager, self).__init__(*args, **kwargs) self._startup_delay = True def init_host_with_rpc(self): eventlet.sleep(CONF.periodic_interval) self._startup_delay = False def db_sync(self, context): print "这里是具体的 RPC 操作函数" 小结: Openstack 的 PRC 调用的过程为: api.py ⇒ rpcapi.py ⇒ manager.py 详见:Openstack Nova 源码分析 — RPC 远程调用过程 测试 启动 API 服务 project-api --config-file /etc/project/proname.conf 启动 Manager 服务 project-manager --config-file /etc/project/project.conf 发送 HTTP 请求 curl -i 'http://<Service_host_ip>:<service_port>/v1/<project_id>/<ResourceUrl>' -X POST -H "Content-Type: application/json" -H "X-Auth-Project-Id: admin" -H "X-Auth-Token: <token_id>" -d '<body_content_dict>' 注意: 样例需要根据自身开发环境进行调整,

资源下载

更多资源
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应用均可从中受益。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册