简介: Gridx 的是为了弥补 Dojo 现有的 Grid 控件(主要是 DataGrid 及其子类 EnhancedGrid)的各种不足而诞生的。Gridx 脱离了 DataGrid 的框架,具有高度模块化的设计,使其能适应各种使用场景的需要。大量针对 DataGrid/EnhancedGrid 的问题而做出的设计上的改进使 Gridx 具有更高的稳定性和更好的性能。同时,API 的设计更直观,且难以被误用。本文从如何创建和使用 Gridx 入手介绍了 Gridx 的基本特点和基本用法,目的是让您对 Gridx 有一个基本的了解。
准备工作
Gridx 是基于 Dojo 的开源项目,在 GitHub 或者其官网都可以下载到源码包。下载解压后将 gridx 文件夹置于与 dojo、dijit 和 dojox 等文件夹同级的目录即可。目前 Gridx 支持 Dojo1.7+。
gridx/tests 文件夹中有大量的示例页面,可以从修改这些示例页面开始学习使用 Gridx。
回页首
创建 Gridx
Gridx 继承了 dijit._WidgetBase,因此其创建方式和其他 widget 类似,只是有一些必须指定的参数需要特别说明。
选用合适的 store 和 cache
Gridx 与 DataGrid 一样,都以 Dojo 的 store 作为数据源。不过,Gridx 需要用户指出所用的 store 是异步的还是同步的。异步 store 通常由服务器端提供数据,向它请求数据时往往需要异步地接收返回数据;而同步 store 的所有数据一般都在客户端,因此所有的请求都能同步完成。异步 store 往往会带来更为复杂的逻辑,因此 Gridx 针对这两种 store 分别进行了优化。但由于无法从 store 本身得知它是否异步,同时为了减小代码量,用户需要将这个信息告知 Gridx。告知的方法是设置 cacheClass 参数:
清单 1. 创建 Gridx 并配置 cacheClass 参数
require([
"gridx/Grid",
"gridx/core/model/cache/Sync",
......
"dojo/domReady!"
], function(Gridx, Cache, ......){
......
var grid = new Gridx({
cacheClass: Cache
store: store,
......
});
grid.placeAt('gridContainerNode');
grid.startup();
});
目前 Gridx 有两种 cache 实现:gridx/core/model/cache/Sync 和 gridx/core/model/cache/Async,前者用于同步 store,后者用于异步 store。Async 的实现逻辑比 Sync 要复杂得多,这是因为它需要考虑数据的延迟加载。这样,如果用户的应用只需要客户端数据,就完全不必用到关于延迟加载的代码,从而减小了最终下载到浏览器的代码量。
cacheClass 既可以直接接受 cache 实现的构造函数(如上例),也可以接受 MID,例如:
清单 2. 用 MID 设置 cacheClass 参数
var grid = new Gridx({
cacheClass: "gridx/core/model/cache/Async"
......
});
这种写法更适合以 HTML 声明的方式创建 Gridx 的场合,因为它不需要引入额外的变量。
目前 Gridx 能够直接支持 dojo(x)/data/* 的老 store 以及 dojo/store/* 的新 store,而不需要任何适配转换。常用的同步 store 有 dojo/data/ItemFileWriteStore 以及 dojo/store/Memory。常用的异步 store 有 dojox/data/JsonRestStore、dojox/data/QueryReadStore 以及 dojo/store/JsonRest。
需要特别注意的是,Gridx 要求 store 中的数据行必须具有唯一标识符(ID)。对于老 store 而言,也就是必须要实现 dojo/data/api/Identity。所幸刚才列举的常用 store 都满足这个要求。
声明列
配好 store 并选择好 cache 之后,就需要声明 Gridx 的列结构。列声明使用 structure 参数,这和 DataGrid 类似。所不同的是,Gridx 的列声明结构非常简单,只支持一维数组,没有 DataGrid 中视图(View)和子行(rows/cells)等复杂的声明结构:
清单 3. 一维数组结构的列声明
var grid = new Gridx({
cacheClass: Cache
store: store,
structure: [
{id: 'column1', ......},
{id: 'column2', ......},
{id: 'column3', ......},
......
]
});
下面各小节详细介绍列声明中各个属性的含义。
id、name、field
对于 Gridx 来说,每一列都有一个唯一标识符(ID)。用户最好能指定一些有意义的 ID,从而方便以后的使用。如果用户没有指定,那么 Gridx 会分别赋予"1", "2", "3", ....... 等字符串类型的自然数作为列的默认 ID。
与 DataGrid 类似,name 属性是指表头上显示出来的列名。name 属性可以是任意字符串,甚至可以包含 HTML 标签,从而做出各种定制效果。例如:{id: 'column1', name: 'Company Name '}。
field 属性也是从 DataGrid 沿袭下来的,指该列在 store 中的对应域。该列中的单元格会从这个 field 域中取得数据。
图 1. name 属性作为普通字符串、未指定、以及带 HTML/CSS 的各种情况
formatter 函数
Gridx 的 formatter 函数与 DataGrid 中的同名函数不同,其目的在于为 Gridx 提供数据,而不是对数据做显示上的修饰。如果某一列没有 field 参数,就可以通过 formatter 函数来提供数据,例如:
清单 4. 使用 formatter 函数组合多个域的数据
{id: 'column1', formatter: function(rawData){
return rawData.field1 + rawData.field2;
});
这样,这一列就能显示两个数据域的和。
图 2. formatter 函数综合多个数据域的内容产生了 Summary 列中的数据
formatter 函数所传入的 rawData 参数是以 store 的 field 名称作为 key 的关联数组(对象),包含当前行中的所有数据,形如:
清单 5. rawData 格式
rawData: {
field1: data1,
field2: data2,
......
}
这种形式要比某些 store(主要是老 store)的数据项(item)更容易使用,也使接口与新 store 保持一致。
decorator 函数
Gridx 对数据的产生和数据的修饰做了严格的区分。formatter 是用于产生数据,decorator 函数则用于修饰数据。例如:
清单 6. 用 decorator 函数为单元格添加 HTML/CSS
{id: 'column1', field: 'field1',
decorator: function(cellData, rowId, rowIndex){
return "" +
cellData + " ";
}
}
这样就能在单元格中显示出链接。
图 3. 使用 decorator 对数据做修饰
decorator 函数只能返回字符串,不像 DataGrid 的 formatter 函数还可以返回 widget 实例。关于如何在单元格中显示 widget 的问题将在其他文章中详细介绍。
style 和 class
通过在 decorator 函数中加入 HTML 标签和 style 属性可以对单元格中的内容做各种修饰,但无法改变单元格本身的样式。要做到这一点,需要 style 或 class:
清单 7. 字符串形式的 style 和 class 参数
{id: 'column1', field: 'field1',
style: 'text-align: center;',
'class': 'mySpecialColumn'
}
style 和 class 都会直接加入到
标签的 style 属性和 class 属性。
style 和 class 还可以写成一个返回字符串的函数,这样单元格的样式就能随数据而变化:
清单 8. 函数形式的 style 和 class 参数
{id: 'column1', field: 'field1',
style: function(cell){
return cell.data() % 2 ? 'color: red;' : 'color: blue;';
},
'class': function(cell){
return cell.data() %2 ? 'oddClass' : 'evenClass';
}
}
这里 style 和 class 函数所传入的 cell 参数代表了当前所处理的单元格,可以通过各种方便的方法获取有关该单元格的一切信息。
图 4. 使用 style 函数为每一个单元格设置独特背景色的例子
配置功能模块
有了 store、cacheClass 和 structure 后,Gridx 就能运行了。不过这样的 Gridx 除了显示数据之外,几乎没有任何界面功能。Gridx 几乎所有的功能都是由可选模块(module)实现的,需要在创建时声明使用了那些模块。这提供了巨大的灵活性来满足各种不同的需求。
声明模块的是 modules 属性:
清单 9. 通过 modules 参数配置功能模块
require([
"gridx/Grid",
"gridx/core/model/cache/Sync",
"gridx/modules/VirtualVScroller",
"gridx/modules/ColumnResizer",
"gridx/modules/Focus",
"gridx/modules/SingleSort",
......
dojo/domReady!"
], function(Gridx, Cache, VirtualVScroller, ColumnResizer, Focus, SingleSort, ......){
......
var grid = new Gridx({
cacheClass: Cache
store: store,
structure: structure,
vScrollerLazy: true,// 模块参数可作为 Gridx 参数传递
modules: [
VirtualVScroller, // 用法 1:直接列举模块构造函数
"gridx/modules/ColumnResizer", // 用法 2:模块 MID
{ // 用法 3:带有 moduleClass 的对象
moduleClass: SingleSort,
initialOrder: { colId: 'column1', descending: true }
},
{ // 用法 4: moduleClass 也接受 MID
moduleClass: "gridx/modules/Focus"
}
]
});
......
});
从上面的例子可见,要使用一个模块先要引入该模块的文件,然后直接列举在 modules 数组中即可。modules 数组中的模块既可以是模块构造函数本身,也可以是模块的 MID,还可以是一个含有 moduleClass 属性的对象。模块本身也可能有参数,这些参数既可以与 moduleClass 一起放在一个对象里(如 initialOrder),也可以直接作为 Gridx 的参数,只不过需要加上所属模块的名称作为前缀(如 vScrollerLazy,这里 vScroller 是模块名称,lazy 是属性名,加上前缀后首字母大写)。模块参数直接作为 Gridx 参数可以使代码更为简洁,因此是推荐的配置方法。
上面的例子中加入了 4 个模块:VirtualVScroller 实现了延迟渲染的功能,每次只渲染出需要显示的行,从而可以很快地完成拥有大量数据的 Grid 的创建;ColumnResizer 实现了鼠标拖动改变列宽的功能;SingleSort 是一个单列排序的简单实现;Focus 模块则是对键盘的支持,这是一个被许多其他模块引用的模块,对于 A11y 非常重要。
熟悉 DataGrid 的用户会发现这些功能在 DataGrid 中都是默认自带的。虽然这些功能很常用,但用户在不需要它们的时候却难以屏蔽;即使能够屏蔽它们的功能,大量的有关这些功能的代码也依旧存在,而这不失为一种浪费。
图 5. 启用了排序、分页、改变列宽、行选择、行首勾选框等多个模块的 Gridx
Gridx 的模块化是其最大的特点之一。其实 Gridx 的所有用户界面(包括表头、数据行、纵向滚动条、横向滚动条等)都是模块,只不过这些模块是默认加载的核心模块而已。所谓创建 Gridx 其实就是在一个很小的逻辑内核(称为 Core)的基础上依次创建这些模块。模块之间秉承低耦合的原则,只以 API 和功能相联系而不涉及具体实现,因此几乎所有的模块都是可替换的。同时模块本身是高内聚的,使得维护和调试也更为方便。
其他配置参数
Gridx 本身还有少数几个参数:如 autoHeight 和 autoWidth,可以由行高和列宽来决定 Gridx 的高度和大小;使用 cache/Async 时的 cacheSize 参数可以配置保存在客户端的最大行数,而 pageSize 可是每次向 store 请求数据时的推荐请求行数。这些参数只有在特殊需求下才有必要使用,具体用法可关注 Gridx 文档。
创建 Gridx 时还有一个基本要求就是要指定 Gridx 的大小。Gridx 与 DataGrid 不同,没有默认高度(DataGrid 有 6em 的默认高度),因此必须通过 CSS 为 Gridx 指定高度(除非使用 autoHeight)。同样,也没有默认宽度。
目前 Gridx 只支持 Claro 主题,通过 gridx/resources/claro/Gridx.css 可以引入所有与 Gridx 相关的样式。若要支持 RTL,还需要引入 gridx/resources/claro/Gridx_rtl.css。
图 6. RTL 状态下采用了 autoWidth 的 Gridx
回页首
使用 Gridx API
Gridx 本身的 API 很少,主要的 API 来源是其数据模型(grid.model)和各个模块。
数据模型 API
Gridx 的数据模型(grid.model)是其 MVC 模式的 M 部分,是整个 Grid 的数据层和逻辑层,没有任何用户界面(甚至可以单独使用)。grid.model 的 API 就是为了与 Gridx 的数据进行便捷的交互。主要 API 有:
清单 10. grid.model 的常用 API
grid.model.byIndex(rowIndex);
grid.model.byId(rowId);
grid.model.indexToId(rowIndex);
grid.model.idToIndex(rowId);
grid.model.size();
grid.model.when(request, callback);
可见除了最后一个 when 函数,都是取数据的 API。这个 when 函数是数据模型中唯一的异步函数,它可以接受一个回调函数作为参数,也会返回一个 Deferred 对象。其语义是:当所请求 request 的数据行都已加载到客户端,且所有改变数据的操作都完成时,调用回调函数 callback。因此典型的用法是:
清单 11. grid.model.when 的用法
grid.model.when([1, 3, 5, 7, 9], function(){
// 获取第 5 行的 ID
var rowId = grid.model.indexToId(5);
// 获取第 1 行的数据
var rowData = grid.model.byIndex(1).data;
// 获取第 9 行的 item
var storeItem = grid.model.byIndex(9).item;
});
这里的 [1, 3, 5, 7, 9] 是用 index 的方式来请求行。Gridx 也支持通过范围的方式来请求行:
grid.model.when({start: 0, count: 20}, ....);
或是用 ID 来请求行:
grid.model.when({id: ['row1', 'row2']}, ....);
更多用法请参见文档。
grid.model 还有一些 API 可以对数据行的顺序进行改变或者过滤,例如:
清单 12. 改变数据模型的 API
grid.model.sort();
grid.model.query();
grid.model.filter();
grid.model.move();
这些功能其实是由 model 的扩展(modelExtension)实现的。如果今后出现了其他类型的数据操作需求,就可以以这种扩展的形式进行补充。
注意到 Gridx 的数据模型没有提供插入、删除、修改数据的方法,这是因为这些操作都可以直接通过 store 的 API 来完成,Gridx 并不需要提供重复的接口。
模块 API
模块 API 是 Gridx 的另一大 API 来源。Gridx 的几乎所有模块都可以通过 Gridx 实例直接访问到。例如:
清单 13. 访问模块 API
grid.sort.clear(); // 调用 sort 模块的 clear 方法。
grid.columnResizer.setWidth(); // 调用 columnResizer 模块的 setWidth 方法。
grid.select.row.getSelectedIds(); // 行选择模块的 getSelectedIds 方法
grid.select.column.selectById(); // 列选择模块的 selectById 方法
// 甚至核心模块也不例外:
grid.header.hidden = true;
grid.body.refresh();
grid.vScroller.scrollToRow();
由于每一个模块都有自己的名字空间,因此不容易引发命名冲突。有的模块(如行列选择等)甚至可以创造出更深层次的命名空间,从而使 API 的命名更精简。
Gridx 几乎所有主要的功能 API 都由模块提供,这其实简化了各个 API 的命名。例如 selectRow 模块和 selectColumn 模块都可以有 selectById 函数,命名精简的同时在使用的时候仍然具有清晰的语义。每个模块具体的 API 请参考 Gridx 文档。
行、列、单元格
行、列和单元格是 Grid 中非常直观的界面元素,因此在 Gridx 中它们都有各自的对象表示,使用起来非常方便:
清单 14. 行、列、单元格对象使用举例
var row = grid.row(1); // 获取第 2 行(行号从 0 开始)
var row = grid.row('rowId'); // 获取标识符为 rowId 的行
var column = grid.column(3); // 获取第 4 列
var column = grid.column('columnId'); // 获取标识符为 columnId 的列
var cell = grid.cell(2, 3); // 获取位于第 3 行第 4 列的单元格
这些对象只是 API 的集合,而没有任何状态,因此不用担心一个 row 对象会因为 Grid 经过某种改变(例如排序)之后而失效。例如:
清单 15. 数据模型改变前后同一个行、列或单元格对象仍然有效
var row = grid.row('rowId'); // 获取一个行对象
var indexBeforeSort = row.index(); // 获取排序前的行号
grid.column('column1').sort(); // 排序
grid.model.when({id: 'rowId'}, function(){ // 等待数据更新
var indexAfterSort = row.index(); // 从同一个 row 对象中获取排序后的行号
});
行和列对象中的只有只读的 id 属性不是函数,由此来唯一地指代一行或一列。
单元格对象的 row 和 column 也是只读属性而不是函数,分别表示该单元格所在的行和列:
grid.cell(1, 2).row.id; // 获取第 2 行第 3 列的单元格的行 ID。
Gridx 的模块可以向这些对象中增加方法来增强它们的能力。例如一旦启用了 gridx/modules/move/Row 模块,就能写出如下代码:
grid.row(2).moveTo(10); // 将第 3 行移动到第 11 行的位置
回页首
使用 Gridx 事件
Gridx 的各个部分都可以和用户交互,因此需要支持各种鼠标和键盘事件。不仅如此,在 Gridx 生命周期以及使用过程中还会出现许多与特定功能相关的“事件”,例如渲染、选择等等。
鼠标键盘事件
Gridx 上继承了 DataGrid 的事件命名方式(on + 界面对象 + 事件类型),但提供的事件更全面,信息更完善。Gridx 提供下表中的所有组合:
表 1.Gridx 支持的所有鼠标键盘事件
Cell
HeaderCell
Row
Header
Click
onCellClick
onHeaderCellClick
onRowClick
onHeaderClick
DblClick
onCellDblClick
onHeaderCellDblClick
onRowDblClick
onHeaderDblClick
MouseDown
onCellMouseDown
onHeaderCellMouseDown
onRowMouseDown
onHeaderMouseDown
MouseUp
onCellMouseUp
onHeaderCellMouseUp
onRowMouseUp
onHeaderMouseUp
MouseOver
onCellMouseOver
onHeaderCellMouseOver
onRowMouseOver
onHeaderMouseOver
MouseOut
onCellMouseOut
onHeaderCellMouseOut
onRowMouseOut
onHeaderMouseOut
MouseMove
onCellMouseMove
onHeaderCellMouseMove
onRowMouseMove
onHeaderMouseMove
ContextMenu
onCellContextMenu
onHeaderCellContextMenu
onRowContextMenu
onHeaderContextMenu
KeyDown
onCellKeyDown
onHeaderCellKeyDown
onRowKeyDown
onHeaderKeyDown
KeyPress
onCellKeyPress
onHeaderCellKeyPress
onRowKeyPress
onHeaderKeyPress
KeyUp
onCellKeyUp
onCellKeyUp
onRowKeyUp
onHeaderKeyUp
对所有的 Row 事件,都会在事件对象中提供以下信息:
清单 16. 事件对象上提供的附加信息
evt.rowId // 行 ID
evt.parentId // 如果该行是子行,则提供父行 ID
evt.rowIndex // 行号(与分页、展开状态无关)
evt.visualIndex // 在当前页中实际显示是第几行(与分页、树节点展开状态有关)
由于 Grid 可能分页显示或者有可展开的树节点,因此有逻辑行号(rowIndex)和实际显示位置(visualIndex)的区别。逻辑行号表示该行在其父行之下是第几个子行(所有根节点行都假设有一个虚构的父行);显示位置则表示该行在当前视图中处于第几行。
对于 Cell 事件,除了所有的行信息之外还提供列 ID 和列序号:
evt.columnId // 列 ID
evt.columnIndex // 列号
HeaderCell 事件只有列信息,Header 事件则没有附加信息。
另外,所有这些事件都是空函数,因此可以在创建 Grid 时直接以参数形式给出:
清单 17. 以初始化参数形式提供的事件处理函数
var grid = new Gridx({
cacheClass: Cache,
store: store,
structure: structure,
onCellClick: function(evt){...} // 可以安全覆盖原来的空函数
});
当然,用 connect 连接也是推荐的方式:
清单 18. 以 connect 方式连接的事件处理函数
grid.connect(grid, 'onCellClick', function(evt){
var cell = grid.cell(evt.rowId, evt.columnId);
......
});
Grid 事件和模块事件
除了鼠标键盘事件之外,Gridx 本身和各个模块也会提供一些“钩子”函数作为事件挂载点,让用户对 Gridx 的运行过程有更好的控制。例如:
清单 19. 模块加载完毕事件
grid.connect(grid, 'onModulesLoaded', function(){
// 所有模块加载完毕
});
onModulesLoaded 事件会在所有模块都加载完毕后触发,可以认为是 Gridx 初始化完成的标志。
清单 20. 数据区域渲染事件
grid.connect(grid.body, 'onRender', function(){
// 数据区域进行了渲染
});
当 Gridx 的数据区域进行渲染的时候(例如滚动或刷新显示以后),grid.body 模块会触发 onRender 事件。
清单 21. 行选择事件
grid.connect(grid.select.row, 'onSelected', function(row){
//row 被选中时触发
});
当一行被选中时,grid.select.row 模块会触发'onSelected'事件。
类似的模块事件还有很多,请参考 Gridx 文档。
回页首
结束语
本文从创建和 API 使用的角度介绍了 Gridx 的基本用法,强调了 Gridx 的模块化和直观的 API 设计。限于篇幅,更多关于 Gridx 的新特性无法在本文中涵盖,例如新的延迟渲染机制、新的拖放机制、以及新的树结构支持等等。这些内容将在其他文章中做进一步介绍。对 Gridx 各个功能模块及其 API 的详细描述还请参考 Gridx 文档和 Github 网站。
参考资料
学习
Gridx 官方网站:包含 Gridx 的最新动态。
Gridx 功能展示:了解 Gridx 的新功能
Gridx 的 GitHub 首页:参与 Gridx 开发及讨论
深入了解 Gridx 的数据模型:介绍了 gridx.model 的设计
Gridx 1.0 API 文档。
developerWorks Web development 专区:通过专门关于 Web 技术的文章和教程,扩展您在网站开发方面的技能。
developerWorks Ajax 资源中心:这是有关 Ajax 编程模型信息的一站式中心,包括很多文档、教程、论坛、blog、wiki 和新闻。任何 Ajax 的新信息都能在这里找到。
developerWorks Web 2.0 资源中心,这是有关 Web 2.0 相关信息的一站式中心,包括大量 Web 2.0 技术文章、教程、下载和相关技术资源。您还可以通过 Web 2.0 新手入门 栏目,迅速了解 Web 2.0 的相关概念。
查看 HTML5 专题,了解更多和 HTML5 相关的知识和动向。
注:本文首发于IBM Developer Works:http://www.ibm.com/developerworks/cn/web/1302_zhuxw_gridx/
你可能感兴趣的:(Dojo扩展,(dojox))
腾讯云技术深度探索:构建高效云原生微服务架构
我的运维人生
云原生 架构 腾讯云 运维开发 技术共享
腾讯云技术深度探索:构建高效云原生微服务架构在当今快速发展的技术环境中,云原生技术已成为企业数字化转型的关键驱动力。腾讯云作为行业领先的云服务提供商,不断推出创新的产品和技术,助力企业构建高效、可扩展的云原生微服务架构。本文将深入探讨腾讯云在微服务领域的最新进展,并通过一个实际案例展示如何在腾讯云平台上构建云原生应用。腾讯云微服务架构概览腾讯云微服务架构基于云原生理念,旨在帮助企业快速实现应用的容
nosql数据库技术与应用知识点
皆过客,揽星河
NoSQL nosql 数据库 大数据 数据分析 数据结构 非关系型数据库
Nosql知识回顾大数据处理流程数据采集(flume、爬虫、传感器)数据存储(本门课程NoSQL所处的阶段)Hdfs、MongoDB、HBase等数据清洗(入仓)Hive等数据处理、分析(Spark、Flink等)数据可视化数据挖掘、机器学习应用(Python、SparkMLlib等)大数据时代存储的挑战(三高)高并发(同一时间很多人访问)高扩展(要求随时根据需求扩展存储)高效率(要求读写速度快)
Java面试题精选:消息队列(二)
芒果不是芒
Java面试题精选 java kafka
一、Kafka的特性1.消息持久化:消息存储在磁盘,所以消息不会丢失2.高吞吐量:可以轻松实现单机百万级别的并发3.扩展性:扩展性强,还是动态扩展4.多客户端支持:支持多种语言(Java、C、C++、GO、)5.KafkaStreams(一个天生的流处理):在双十一或者销售大屏就会用到这种流处理。使用KafkaStreams可以快速的把销售额统计出来6.安全机制:Kafka进行生产或者消费的时候会
Kafka是如何保证数据的安全性、可靠性和分区的
喜欢猪猪
kafka 分布式
Kafka作为一个高性能、可扩展的分布式流处理平台,通过多种机制来确保数据的安全性、可靠性和分区的有效管理。以下是关于Kafka如何保证数据安全性、可靠性和分区的详细解析:一、数据安全性SSL/TLS加密:Kafka支持SSL/TLS协议,通过配置SSL证书和密钥来加密数据传输,确保数据在传输过程中不会被窃取或篡改。这一机制有效防止了中间人攻击,保护了数据的安全性。SASL认证:Kafka支持多种
Armv8.3 体系结构扩展--原文版
代码改变世界ctw
ARM-TEE-Android armv8 嵌入式 arm架构 安全架构 芯片 Trustzone Secureboot
快速链接:.ARMv8/ARMv9架构入门到精通-[目录]付费专栏-付费课程【购买须知】:个人博客笔记导读目录(全部)TheArmv8.3architectureextensionTheArmv8.3architectureextensionisanextensiontoArmv8.2.Itaddsmandatoryandoptionalarchitecturalfeatures.Somefeat
《 C++ 修炼全景指南:九 》打破编程瓶颈!掌握二叉搜索树的高效实现与技巧
Lenyiin
C++ 修炼全景指南 技术指南 c++ 算法 stl
摘要本文详细探讨了二叉搜索树(BinarySearchTree,BST)的核心概念和技术细节,包括插入、查找、删除、遍历等基本操作,并结合实际代码演示了如何实现这些功能。文章深入分析了二叉搜索树的性能优势及其时间复杂度,同时介绍了前驱、后继的查找方法等高级功能。通过自定义实现的二叉搜索树类,读者能够掌握其实际应用,此外,文章还建议进一步扩展为平衡树(如AVL树、红黑树)以优化极端情况下的性能退化。
一台适合普通办公使用的电脑推荐thinkpadE475
sam_1c14
图片发自App图片发自App缺点是内存只有4G。胜在便宜。14寸,很轻薄。给老婆买的。应该不能用来编程,会很慢的,真要用可以自己加根内存条,最大扩展到32G。图片发自App
《 C++ 修炼全景指南:四 》揭秘 C++ List 容器背后的实现原理,带你构建自己的双向链表
Lenyiin
技术指南 C++ 修炼全景指南 c++ list 链表 stl
本篇博客,我们将详细讲解如何从头实现一个功能齐全且强大的C++List容器,并深入到各个细节。这篇博客将包括每一步的代码实现、解释以及扩展功能的探讨,目标是让初学者也能轻松理解。一、简介1.1、背景介绍在C++中,std::list是一个基于双向链表的容器,允许高效的插入和删除操作,适用于频繁插入和删除操作的场景。与动态数组不同,list允许常数时间内的插入和删除操作,支持双向遍历。这篇文章将详细
设计模式之建造者模式(通俗易懂--代码辅助理解【Java版】)
ok!ko
设计模式 设计模式 建造者模式 java
文章目录设计模式概述1、建造者模式2、建造者模式使用场景3、优点4、缺点5、主要角色6、代码示例:1)实现要求2)UML图3)实现步骤:1)创建一个表示食物条目和食物包装的接口2)创建实现Packing接口的实体类3)创建实现Item接口的抽象类,该类提供了默认的功能4)创建扩展了Burger和ColdDrink的实体类5)创建一个Meal类,带有上面定义的Item对象6)创建一个MealBuil
程序员架构师主要是做什么_程序员架构师:职责、技能与挑战
绿色小猪
免费备考资料(2024年11月软考):历年试题+视频课合集+电子讲义点击领取>>>免费刷题:2024年11月软考备考刷题点此进入>>>程序员架构师的角色定位在软件开发领域,程序员架构师是一个至关重要的角色。他们不仅需要深入理解业务需求,还要将其转化为技术上的解决方案。程序员架构师是项目中的技术领航者,负责制定和维护软件系统的整体架构,确保系统的可扩展性、可维护性和性能。他们的工作涉及从概念化到实现
python中文版软件下载-Python中文版
编程大乐趣
python中文版是一种面向对象的解释型计算机程序设计语言。python中文版官网面向对象编程,拥有高效的高级数据结构和简单而有效的方法,其优雅的语法、动态类型、以及天然的解释能力,让它成为理想的语言。软件功能强大,简单易学,可以帮助用户快速编写代码,而且代码运行速度非常快,几乎可以支持所有的操作系统,实用性真的超高的。python中文版软件介绍:python中文版的解释器及其扩展标准库的源码和编
《Mesh 组网和 AC+AP 组网的优缺点》
jiyiwangluokeji
网络工程 网络
Mesh组网和AC+AP组网的优缺点。Mesh组网的优点:1.部署灵活:节点之间可以通过无线方式连接,新增节点比较方便,无需事先规划布线。2.自我修复和优化:如果某个节点出现故障,网络可以自动重新路由数据,保证网络的稳定性。3.覆盖范围广:可以通过添加节点轻松扩展覆盖区域。4.设备选型多样:市面上有多种不同品牌和型号的Mesh路由器可供选择。Mesh组网的缺点:1.无线回程可能存在性能瓶颈:如果节
探索Zebra4J:构建高效企业级Web应用的微服务框架
叶准鑫Natalie
探索Zebra4J:构建高效企业级Web应用的微服务框架ZebraZebra4J/Zebra4Js基于SpringBoot的JavaWeb/Nodejs框架项目地址:https://gitcode.com/gh_mirrors/zebra/Zebra项目介绍在当今快速发展的技术环境中,构建高效、可扩展的企业级Web应用是每个开发团队的追求。Zebra4J作为一款基于SpringBoot的全新微服务
Hadoop
傲雪凌霜,松柏长青
后端 大数据 hadoop 大数据 分布式
ApacheHadoop是一个开源的分布式计算框架,主要用于处理海量数据集。它具有高度的可扩展性、容错性和高效的分布式存储与计算能力。Hadoop核心由四个主要模块组成,分别是HDFS(分布式文件系统)、MapReduce(分布式计算框架)、YARN(资源管理)和HadoopCommon(公共工具和库)。1.HDFS(HadoopDistributedFileSystem)HDFS是Hadoop生
Nginx的使用场景:构建高效、可扩展的Web架构
张某布响丸辣
nginx 前端 架构
Nginx,作为当今最流行的Web服务器和反向代理软件之一,凭借其高性能、稳定性和灵活性,在众多Web项目中扮演着核心角色。无论是个人博客、中小型网站,还是大型企业级应用,Nginx都能提供强大的支持。本文将探讨Nginx的几个主要使用场景,帮助读者理解如何在实际项目中充分利用Nginx的优势。1.静态文件服务对于包含大量静态文件(如HTML、CSS、JavaScript、图片等)的网站,Ngin
svg图片兼容性和用法优缺点
独行侠_ef93
svg图片的使用方法第一次来认认真真的研究了下svg图片,之前只是在网上见过,但都是一晃而过也没当回事,最近网站改版看到同事有用到svg格式的图片,想想自己干了几年的重构也没用过,这些细节的知识是应该好好研究研究了。暂时还没研究得完全透切,先记下目前为止所看到的吧不然又给忘了。svg可缩放矢量图形(ScalableVectorGraphics),顾名思义就是任意改变其大小也不会变形,是基于可扩展标
如何区分Python中数据类型可变还是不可变
秸秆混凝烧结工程师
关键字改变元素值,内存地址发生改变,被称为数据内型不可变如string,元组,存储数据类型单一,不能同时存在两个数据类型,新增元素后,表容量,元素个数,元素存储区ID改变,典型的内置元素一体存储法;改变元素值,但是内存地址不改变就是可变数据内型,如list,存储元素可以不同,删除,新增,插入,表序列不改变,扩展表容量时,对象地址ID不变,属于顺序表的,分离式存储结构,外置元素法,python中不可
Java集合类框架源码分析 之 RoleList源码解析 【6】
yunzhonghefei
Java集合类源码分析 RoleList源码解析
该类继承于ArrayList,针对Role进行了一些扩展。其他方法和ArrayList中基本相同,源码不做针对性分析:看一下类简介:/***代表了一个roles的列表,作为方法setRoles()的参数,去创建一个关联关系,并且尝试在同一个关系中设置多个角色。*ARoleListrepresentsalistofroles(Roleobjects).Itisusedas*parameterwhen
rabbitmq
楚楚ccc
Java系列 rabbitmq 分布式
1.消息服务概述、rabbitmq核心概念消息服务概述:大多数应用中,可通过消息服务中间件来提升系统异步通信,扩展解耦能力两个重要概念:消息代理(messagebroker)和目的地(destination)。当消息发送者者发出消息后,将由消息代理接管,消息代理保证将消息传递至目的地两种形式的目的地:队列(queue):点对点的消息通信(point-to-point)主题(topic):发布(pu
(k8s)Kubernetes 从0到1容器编排之旅
道不贱卖,法不轻传
kubernets kubernetes 容器 云原生
一、引言在当今数字化的浪潮中,Kubernetes如同一艘强大的航船,引领着容器化应用的部署与管理。它以其卓越的灵活性、可扩展性和可靠性,成为众多企业和开发者的首选。然而,要真正发挥Kubernetes的强大威力,仅仅掌握基本操作是远远不够的。本文将带你深入探索Kubernetes使用过程中的奇技妙法,为你开启一段优雅的容器编排之旅。二、高级资源管理之精妙艺术1.资源配额与限制:雕琢资源之美•Ku
python数据分析知识点大全
编程零零七
python数据分析 python 开发语言 python数据分析 数据分析知识点大全 python数据分析知识点 python教程 python基础
Python数据分析知识点大全可以归纳为以下几个主要方面:一、基础概念与目的数据分析定义:数据分析是指用适当的统计分析方法对收集来的大量数据进行分析,提取有用信息和形成结论,对数据加以详细研究和概括总结的过程。其目的在于从数据中挖掘规律、验证猜想、进行预测。Python在数据分析中的优势:Python因其易学性、快速开发、丰富的扩展库(如NumPy、Pandas等)和成熟的框架,成为数据分析领域的
10- 【JavaWeb】Tomcat、Servlet基础
weixin_44329069
JavaWeb tomcat servlet java
1.MacOS配置Tomcat服务器教程MacOS配置Tomcat服务器教程2.Servlet基础1.创建ServletServlet是一个扩展服务器功能的Java类,主要用于处理HTTP请求。以下是一个简单的Servlet示例:importjava.io.IOException;importjavax.servlet.ServletException;importjavax.servlet.an
面试常见题之Spring Cloud
拾光编程
java面试 面试 spring cloud 职场和发展
在Java软件工程师的面试中,关于SpringCloud的题目旨在考察候选人对微服务架构的理解、SpringCloud各组件的掌握程度、以及如何在实际项目中应用这些技术来构建可扩展、可靠和高效的服务。本文将概括性地列出20个关于SpringCloud的面试题目,并为每个题目提供一个简要的回答框架或关键点,以便你根据需要进行扩展。1.SpringCloud是什么?它解决了什么问题?回答框架:Spri
Flume:大规模日志收集与数据传输的利器
傲雪凌霜,松柏长青
后端 大数据 flume 大数据
Flume:大规模日志收集与数据传输的利器在大数据时代,随着各类应用的不断增长,产生了海量的日志和数据。这些数据不仅对业务的健康监控至关重要,还可以通过深入分析,帮助企业做出更好的决策。那么,如何高效地收集、传输和存储这些海量数据,成为了一项重要的挑战。今天我们将深入探讨ApacheFlume,它是如何帮助我们应对这些挑战的。一、Flume概述ApacheFlume是一个分布式、可靠、可扩展的日志
linux 操作系统下的compress命令介绍和使用案例
lisanmengmeng
linux 命令工具 linux 运维 服务器
linux操作系统下的compress命令介绍和使用案例compress命令是Linux系统中用于文件压缩的一个工具,主要使用Lempel-Ziv-Welch(LZW)算法进行数据压缩。压缩后,文件的扩展名将变为“.Z”。虽然compress命令在历史上有其重要性,但在现代Linux系统中,它已经被更高效的压缩工具如gzip和bzip2所取代使用方法基本语法bashcompress[选项][文件名
6.Java面向对象第六章 抽象类和接口
懒洋洋大魔王
Java面像对象 java 开发语言
5.Java面向对象抽象类和接口文章目录5.Java面向对象抽象类和接口一、1.抽象类VS普通类2.抽象方法VS普通方法3.抽象类与抽象方法的使用二、接口1.必须知道的接口特性2.定义接口3.接口使用三、抽象类vs接口相同点不同点多用组合,少用继承针对接口编程针对扩展开放,针对改变关闭多用组合,少用继承针对接口编程针对扩展开放,针对改变关闭一、1.抽象类VS普通类抽象类不能被实例化但可以创建一个引
一文搞懂应用架构的3个核心概念
公众号-架构师汤师爷
后端 架构设计 Java SaaS
如果你是一名业务开发,你可能要说,我整天就是做CRUD(增删改查),哪里需要了解什么应用架构设计?经常有人说,程序员35岁之后很容易陷入瓶颈,被行业淘汰,我觉得原因其实就在此。有些朋友在写代码的时候,可能没有太多考虑非功能性的需求、扩展性,只是完成功能,觉得能用就好。做事情的时候,也没有长远的规划,只是把眼前的事情做好就满足了。我面试过很多大龄候选人,他们的简历长达十几页,项目经历有几十个。然而,
架构评审的自动化与人工智能: 如何提高效率
光剑书架上的书
架构 自动化 人工智能 运维
1.背景介绍架构评审是软件开发过程中的一个关键环节,它旨在确保软件架构的质量、可维护性和可扩展性。传统的架构评审通常是由人工进行,需要大量的时间和精力。随着大数据技术和人工智能的发展,自动化和人工智能技术已经开始应用于架构评审,从而提高评审的效率和准确性。在本文中,我们将讨论如何通过自动化和人工智能技术来提高架构评审的效率。我们将从以下几个方面进行讨论:背景介绍核心概念与联系核心算法原理和具体操作
深入了解树莓派5:性能与功能的全面升级
像风一样自由2020
树莓派 ubuntu
深入了解树莓派5:性能与功能的全面升级引言2023年,树莓派基金会正式发布了备受期待的树莓派5(RaspberryPi5)。作为树莓派系列的最新一代产品,树莓派5在处理性能、连接性和功能扩展方面都有了显著的提升,为开发者、教育者和科技爱好者带来了更强大的工具。本文将详细介绍树莓派5的特性、规格和应用场景。一、产品概述树莓派5是基于ARM架构的单板计算机,延续了树莓派系列低成本、高性能的设计理念。它
oracle数据库安装和配置详细讲解
程序员小羊!
运维 数据库 oracle
大家好,我是程序员小羊!前言:Oracle数据库是全球广泛使用的关系型数据库管理系统(RDBMS),提供高性能、可靠性、安全性和可扩展性,广泛应用于企业关键任务系统。下面详细介绍如何在CentOS系统上安装和配置Oracle数据库。1.前提条件1.1硬件要求内存:最小1GB,推荐2GB以上。硬盘:至少10GB的可用空间,视具体应用需求而定。1.2软件要求操作系统:CentOS7或CentOS8(确
tomcat基础与部署发布
暗黑小菠萝
Tomcat java web
从51cto搬家了,以后会更新在这里方便自己查看。
做项目一直用tomcat,都是配置到eclipse中使用,这几天有时间整理一下使用心得,有一些自己配置遇到的细节问题。
Tomcat:一个Servlets和JSP页面的容器,以提供网站服务。
一、Tomcat安装
安装方式:①运行.exe安装包
&n
网站架构发展的过程
ayaoxinchao
数据库 应用服务器 网站架构
1.初始阶段网站架构:应用程序、数据库、文件等资源在同一个服务器上
2.应用服务和数据服务分离:应用服务器、数据库服务器、文件服务器
3.使用缓存改善网站性能:为应用服务器提供本地缓存,但受限于应用服务器的内存容量,可以使用专门的缓存服务器,提供分布式缓存服务器架构
4.使用应用服务器集群改善网站的并发处理能力:使用负载均衡调度服务器,将来自客户端浏览器的访问请求分发到应用服务器集群中的任何
[信息与安全]数据库的备份问题
comsci
数据库
如果你们建设的信息系统是采用中心-分支的模式,那么这里有一个问题
如果你的数据来自中心数据库,那么中心数据库如果出现故障,你的分支机构的数据如何保证安全呢?
是否应该在这种信息系统结构的基础上进行改造,容许分支机构的信息系统也备份一个中心数据库的文件呢?
&n
使用maven tomcat plugin插件debug关联源代码
商人shang
maven debug 查看源码 tomcat-plugin
*首先需要配置好'''maven-tomcat7-plugin''',参见[[Maven开发Web项目]]的'''Tomcat'''部分。
*配置好后,在[[Eclipse]]中打开'''Debug Configurations'''界面,在'''Maven Build'''项下新建当前工程的调试。在'''Main'''选项卡中点击'''Browse Workspace...'''选择需要开发的
大访问量高并发
oloz
大访问量高并发
大访问量高并发的网站主要压力还是在于数据库的操作上,尽量避免频繁的请求数据库。下面简
要列出几点解决方案:
01、优化你的代码和查询语句,合理使用索引
02、使用缓存技术例如memcache、ecache将不经常变化的数据放入缓存之中
03、采用服务器集群、负载均衡分担大访问量高并发压力
04、数据读写分离
05、合理选用框架,合理架构(推荐分布式架构)。
cache 服务器
小猪猪08
cache
Cache 即高速缓存.那么cache是怎么样提高系统性能与运行速度呢?是不是在任何情况下用cache都能提高性能?是不是cache用的越多就越好呢?我在近期开发的项目中有所体会,写下来当作总结也希望能跟大家一起探讨探讨,有错误的地方希望大家批评指正。
1.Cache 是怎么样工作的?
Cache 是分配在服务器上
mysql存储过程
香水浓
mysql
Description:插入大量测试数据
use xmpl;
drop procedure if exists mockup_test_data_sp;
create procedure mockup_test_data_sp(
in number_of_records int
)
begin
declare cnt int;
declare name varch
CSS的class、id、css文件名的常用命名规则
agevs
JavaScript UI 框架 Ajax css
CSS的class、id、css文件名的常用命名规则
(一)常用的CSS命名规则
头:header
内容:content/container
尾:footer
导航:nav
侧栏:sidebar
栏目:column
页面外围控制整体布局宽度:wrapper
左右中:left right
全局数据源
AILIKES
java tomcat mysql jdbc JNDI
实验目的:为了研究两个项目同时访问一个全局数据源的时候是创建了一个数据源对象,还是创建了两个数据源对象。
1:将diuid和mysql驱动包(druid-1.0.2.jar和mysql-connector-java-5.1.15.jar)copy至%TOMCAT_HOME%/lib下;2:配置数据源,将JNDI在%TOMCAT_HOME%/conf/context.xml中配置好,格式如下:&l
MYSQL的随机查询的实现方法
baalwolf
mysql
MYSQL的随机抽取实现方法。举个例子,要从tablename表中随机提取一条记录,大家一般的写法就是:SELECT * FROM tablename ORDER BY RAND() LIMIT 1。但是,后来我查了一下MYSQL的官方手册,里面针对RAND()的提示大概意思就是,在ORDER BY从句里面不能使用RAND()函数,因为这样会导致数据列被多次扫描。但是在MYSQL 3.23版本中,
JAVA的getBytes()方法
bijian1013
java eclipse unix OS
在Java中,String的getBytes()方法是得到一个操作系统默认的编码格式的字节数组。这个表示在不同OS下,返回的东西不一样!
String.getBytes(String decode)方法会根据指定的decode编码返回某字符串在该编码下的byte数组表示,如:
byte[] b_gbk = "
AngularJS中操作Cookies
bijian1013
JavaScript AngularJS Cookies
如果你的应用足够大、足够复杂,那么你很快就会遇到这样一咱种情况:你需要在客户端存储一些状态信息,这些状态信息是跨session(会话)的。你可能还记得利用document.cookie接口直接操作纯文本cookie的痛苦经历。
幸运的是,这种方式已经一去不复返了,在所有现代浏览器中几乎
[Maven学习笔记五]Maven聚合和继承特性
bit1129
maven
Maven聚合
在实际的项目中,一个项目通常会划分为多个模块,为了说明问题,以用户登陆这个小web应用为例。通常一个web应用分为三个模块:
1. 模型和数据持久化层user-core,
2. 业务逻辑层user-service以
3. web展现层user-web,
user-service依赖于user-core
user-web依赖于user-core和use
【JVM七】JVM知识点总结
bit1129
jvm
1. JVM运行模式
1.1 JVM运行时分为-server和-client两种模式,在32位机器上只有client模式的JVM。通常,64位的JVM默认都是使用server模式,因为server模式的JVM虽然启动慢点,但是,在运行过程,JVM会尽可能的进行优化
1.2 JVM分为三种字节码解释执行方式:mixed mode, interpret mode以及compiler
linux下查看nginx、apache、mysql、php的编译参数
ronin47
在linux平台下的应用,最流行的莫过于nginx、apache、mysql、php几个。而这几个常用的应用,在手工编译完以后,在其他一些情况下(如:新增模块),往往想要查看当初都使用了那些参数进行的编译。这时候就可以利用以下方法查看。
1、nginx
[root@361way ~]# /App/nginx/sbin/nginx -V
nginx: nginx version: nginx/
unity中运用Resources.Load的方法?
brotherlamp
unity视频 unity资料 unity自学 unity unity教程
问:unity中运用Resources.Load的方法?
答:Resources.Load是unity本地动态加载资本所用的方法,也即是你想动态加载的时分才用到它,比方枪弹,特效,某些实时替换的图像什么的,主张此文件夹不要放太多东西,在打包的时分,它会独自把里边的一切东西都会集打包到一同,不论里边有没有你用的东西,所以大多数资本应该是自个建文件放置
1、unity实时替换的物体即是依据环境条件
线段树-入门
bylijinnan
java 算法 线段树
/**
* 线段树入门
* 问题:已知线段[2,5] [4,6] [0,7];求点2,4,7分别出现了多少次
* 以下代码建立的线段树用链表来保存,且树的叶子结点类似[i,i]
*
* 参考链接:http://hi.baidu.com/semluhiigubbqvq/item/be736a33a8864789f4e4ad18
* @author lijinna
全选与反选
chicony
全选
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>全选与反选</title>
vim一些简单记录
chenchao051
vim
mac在/usr/share/vim/vimrc linux在/etc/vimrc
1、问:后退键不能删除数据,不能往后退怎么办?
答:在vimrc中加入set backspace=2
2、问:如何控制tab键的缩进?
答:在vimrc中加入set tabstop=4 (任何
Sublime Text 快捷键
daizj
快捷键 sublime
[size=large][/size]Sublime Text快捷键:Ctrl+Shift+P:打开命令面板Ctrl+P:搜索项目中的文件Ctrl+G:跳转到第几行Ctrl+W:关闭当前打开文件Ctrl+Shift+W:关闭所有打开文件Ctrl+Shift+V:粘贴并格式化Ctrl+D:选择单词,重复可增加选择下一个相同的单词Ctrl+L:选择行,重复可依次增加选择下一行Ctrl+Shift+L:
php 引用(&)详解
dcj3sjt126com
PHP
在PHP 中引用的意思是:不同的名字访问同一个变量内容. 与C语言中的指针是有差别的.C语言中的指针里面存储的是变量的内容在内存中存放的地址 变量的引用 PHP 的引用允许你用两个变量来指向同一个内容 复制代码代码如下:
<?
$a="ABC";
$b =&$a;
echo
SVN中trunk,branches,tags用法详解
dcj3sjt126com
SVN
Subversion有一个很标准的目录结构,是这样的。比如项目是proj,svn地址为svn://proj/,那么标准的svn布局是svn://proj/|+-trunk+-branches+-tags这是一个标准的布局,trunk为主开发目录,branches为分支开发目录,tags为tag存档目录(不允许修改)。但是具体这几个目录应该如何使用,svn并没有明确的规范,更多的还是用户自己的习惯。
对软件设计的思考
e200702084
设计模式 数据结构 算法 ssh 活动
软件设计的宏观与微观
软件开发是一种高智商的开发活动。一个优秀的软件设计人员不仅要从宏观上把握软件之间的开发,也要从微观上把握软件之间的开发。宏观上,可以应用面向对象设计,采用流行的SSH架构,采用web层,业务逻辑层,持久层分层架构。采用设计模式提供系统的健壮性和可维护性。微观上,对于一个类,甚至方法的调用,从计算机的角度模拟程序的运行情况。了解内存分配,参数传
同步、异步、阻塞、非阻塞
geeksun
非阻塞
同步、异步、阻塞、非阻塞这几个概念有时有点混淆,在此文试图解释一下。
同步:发出方法调用后,当没有返回结果,当前线程会一直在等待(阻塞)状态。
场景:打电话,营业厅窗口办业务、B/S架构的http请求-响应模式。
异步:方法调用后不立即返回结果,调用结果通过状态、通知或回调通知方法调用者或接收者。异步方法调用后,当前线程不会阻塞,会继续执行其他任务。
实现:
Reverse SSH Tunnel 反向打洞實錄
hongtoushizi
ssh
實際的操作步驟:
# 首先,在客戶那理的機器下指令連回我們自己的 Server,並設定自己 Server 上的 12345 port 會對應到幾器上的 SSH port
ssh -NfR 12345:localhost:22
[email protected]
# 然後在 myhost 的機器上連自己的 12345 port,就可以連回在客戶那的機器
ssh localhost -p 1
Hibernate中的缓存
Josh_Persistence
一级缓存 Hiberante缓存 查询缓存 二级缓存
Hibernate中的缓存
一、Hiberante中常见的三大缓存:一级缓存,二级缓存和查询缓存。
Hibernate中提供了两级Cache,第一级别的缓存是Session级别的缓存,它是属于事务范围的缓存。这一级别的缓存是由hibernate管理的,一般情况下无需进行干预;第二级别的缓存是SessionFactory级别的缓存,它是属于进程范围或群集范围的缓存。这一级别的缓存
对象关系行为模式之延迟加载
home198979
PHP 架构 延迟加载
形象化设计模式实战 HELLO!架构
一、概念
Lazy Load:一个对象,它虽然不包含所需要的所有数据,但是知道怎么获取这些数据。
延迟加载貌似很简单,就是在数据需要时再从数据库获取,减少数据库的消耗。但这其中还是有不少技巧的。
二、实现延迟加载
实现Lazy Load主要有四种方法:延迟初始化、虚
xml 验证
pengfeicao521
xml xml解析
有些字符,xml不能识别,用jdom或者dom4j解析的时候就报错
public static void testPattern() {
// 含有非法字符的串
String str = "Jamey친ÑԂ
div设置半透明效果
spjich
css 半透明
为div设置如下样式:
div{filter:alpha(Opacity=80);-moz-opacity:0.5;opacity: 0.5;}
说明:
1、filter:对win IE设置半透明滤镜效果,filter:alpha(Opacity=80)代表该对象80%半透明,火狐浏览器不认2、-moz-opaci
你真的了解单例模式么?
w574240966
java 单例 设计模式 jvm
单例模式,很多初学者认为单例模式很简单,并且认为自己已经掌握了这种设计模式。但事实上,你真的了解单例模式了么。
一,单例模式的5中写法。(回字的四种写法,哈哈。)
1,懒汉式
(1)线程不安全的懒汉式
public cla