使用ASP.NET MVC,注解一下
PO :persistent object持久对象
1 .有时也被称为Data对象,对应数据库中的entity,可以简单认为一个PO对应数据库中的一条记录。
2 .在hibernate持久化框架中与insert/delet操作密切相关。
3 .PO中不应该包含任何对数据库的操作。
这一对象,在我看来,就数据库嘛……
---------------------------------------------------------
POJO :plain ordinary java object 无规则简单java对象
一个中间对象,可以转化为PO、DTO、VO。
1 .POJO持久化之后==〉PO
(在运行期,由Hibernate中的cglib动态把POJO转换为PO,PO相对于POJO会增加一些用来管理数据库entity状态的属性和方法。PO对于programmer来说完全透明,由于是运行期生成PO,所以可以支持增量编译,增量调试。)
2 .POJO传输过程中==〉DTO
3 .POJO用作表示层==〉VO
PO 和VO都应该属于它。
在.Net多层结构中,叫做MODEL层或ENTITY层。如果用Entity Framework CodeFirst,就是POCO模型。
----------------------------------------------------------
BO :business object 业务对象
封装业务逻辑为一个对象(可以包括多个PO,通常需要将BO转化成PO,才能进行数据的持久化,反之,从DB中得到的PO,需要转化成BO才能在业务层使用)。
关于BO主要有三种概念
1 、只包含业务对象的属性;
2 、只包含业务方法;
3 、两者都包含。
在实际使用中,认为哪一种概念正确并不重要,关键是实际应用中适合自己项目的需要。
Service层或BLL层----------------------------------------------------------
VO :value object值对象 / view object表现层对象
1 .主要对应页面显示(web页面/swt、swing界面)的数据对象。
2 .可以和表对应,也可以不,这根据业务的需要。
注 :在struts中,用ActionForm做VO,需要做一个转换,因为PO是面向对象的,而ActionForm是和view对应的,要将几个PO要显示的属性合成一个ActionForm,可以使用BeanUtils的copy方法。
传说中的VIEWMODEL,MVVM模式中不可少的一部分。在ASP.NET MVC中亦很重要的界面模型。 ----------------------------------------------------------
DTO (TO) :Data Transfer Object数据传输对象
1 .用在需要跨进程或远程传输时,它不应该包含业务逻辑。
2 .比如一张表有100个字段,那么对应的PO就有100个属性(大多数情况下,DTO 内的数据来自多个表)。但view层只需显示10个字段,没有必要把整个PO对象传递到client,这时我们就可以用只有这10个属性的DTO来传输数据到client,这样也不会暴露server端表结构。到达客户端以后,如果用这个对象来对应界面显示,那此时它的身份就转为VO。
在我看来这就是VO....
----------------------------------------------------------
DAO :data access object数据访问对象
1 .主要用来封装对DB的访问(CRUD操作)。
2 .通过接收Business层的数据,把POJO持久化为PO。
Entityframe Work也好 Repository也好 DAL也好,都是它了
posted @ 2012-04-12 23:13 李宏 阅读(22) 评论(2) 编辑
为ExtJS 4 系列树添加可将节点拖动到叶子节点上的功能,可配置。
使用方法:将以下代码复制,新建立一js文件后,将其引用在ext核心js后即可。
使用时,通过allowLeafInserts属性进行叶子节点是否可拖动的配置,默认值为true。
啊啊啊啊…………又通宵了……
1 /*以下改动为是:给树添加允许为叶子节点添加子节点功能 --by lihong 2012/2/24
2 通过TreeViewDragDrop的allowLeafInserts为true或false进行配置
3 例:
4 // Ext.define('myTree', {
5 // extend: 'Ext.tree.Panel',
6 // viewConfig: {
7 // plugins: {
8 // ptype: 'treeviewdragdrop',
9 // allowLeafInserts : true
10 // }
11 // }
12 // }
13 //*/
14 Ext.override(Ext.tree.ViewDropZone, {
15 getPosition: function (e, node) {
16 var view = this.view,
17 record = view.getRecord(node),
18 y = e.getPageY(),
19 noAppend = record.isLeaf(),
20 noBelow = false,
21 region = Ext.fly(node).getRegion(),
22 fragment;
23
24 if (record.isRoot()) {
25 return 'append';
26 }
27
28 if (this.appendOnly) {
29 return noAppend ? false : 'append';
30 }
31 if (!this.allowParentInsert) {
32 //leehom modify begin
33 noBelow = this.allowLeafInserts || (record.hasChildNodes() && record.isExpanded());
34 //leehom modify end
35 }
36
37 fragment = (region.bottom - region.top) / (noAppend ? 2 : 3);
38 if (y >= region.top && y < (region.top + fragment)) {
39 return 'before';
40 }
41 else if (!noBelow && (noAppend || (y >= (region.bottom - fragment) && y <= region.bottom))) {
42 return 'after';
43 }
44 else {
45 return 'append';
46 }
47 },
48 handleNodeDrop: function (data, targetNode, position) {
49 var me = this,
50 view = me.view,
51 parentNode = targetNode.parentNode,
52 store = view.getStore(),
53 recordDomNodes = [],
54 records, i, len,
55 insertionMethod, argList,
56 needTargetExpand,
57 transferData,
58 processDrop;
59 if (data.copy) {
60 records = data.records;
61 data.records = [];
62 for (i = 0, len = records.length; i < len; i++) {
63 data.records.push(Ext.apply({}, records[i].data));
64 }
65 }
66 me.cancelExpand();
67 if (position == 'before') {
68 insertionMethod = parentNode.insertBefore;
69 argList = [null, targetNode];
70 targetNode = parentNode;
71 }
72 else if (position == 'after') {
73 if (targetNode.nextSibling) {
74 insertionMethod = parentNode.insertBefore;
75 argList = [null, targetNode.nextSibling];
76 }
77 else {
78 insertionMethod = parentNode.appendChild;
79 argList = [null];
80 }
81 targetNode = parentNode;
82 }
83 else {
84 //leehom add begin
85 if (this.allowLeafInserts) {
86 if (targetNode.get('leaf')) {
87 targetNode.set('leaf', false);
88 targetNode.set('expanded', true);
89 }
90 }
91 //leehom add end
92 if (!targetNode.isExpanded()) {
93 needTargetExpand = true;
94 }
95 insertionMethod = targetNode.appendChild;
96 argList = [null];
97 }
98
99 transferData = function () {
100 var node;
101 for (i = 0, len = data.records.length; i < len; i++) {
102 argList[0] = data.records[i];
103 node = insertionMethod.apply(targetNode, argList);
104
105 if (Ext.enableFx && me.dropHighlight) {
106 recordDomNodes.push(view.getNode(node));
107 }
108 }
109 if (Ext.enableFx && me.dropHighlight) {
110 Ext.Array.forEach(recordDomNodes, function (n) {
111 if (n) {
112 Ext.fly(n.firstChild ? n.firstChild : n).highlight(me.dropHighlightColor);
113 }
114 });
115 }
116 };
117 if (needTargetExpand) {
118 targetNode.expand(false, transferData);
119 }
120 else {
121 transferData();
122 }
123 }
124 });
125
126
127 Ext.override(Ext.tree.plugin.TreeViewDragDrop, {
128 allowLeafInserts: true,
129
130 onViewRender: function (view) {
131 var me = this;
132 if (me.enableDrag) {
133 me.dragZone = Ext.create('Ext.tree.ViewDragZone', {
134 view: view,
135 allowLeafInserts: me.allowLeafInserts,
136 ddGroup: me.dragGroup || me.ddGroup,
137 dragText: me.dragText,
138 repairHighlightColor: me.nodeHighlightColor,
139 repairHighlight: me.nodeHighlightOnRepair
140 });
141 }
142
143 if (me.enableDrop) {
144 me.dropZone = Ext.create('Ext.tree.ViewDropZone', {
145 view: view,
146 ddGroup: me.dropGroup || me.ddGroup,
147 allowContainerDrops: me.allowContainerDrops,
148 appendOnly: me.appendOnly,
149 allowLeafInserts: me.allowLeafInserts,
150 allowParentInserts: me.allowParentInserts,
151 expandDelay: me.expandDelay,
152 dropHighlightColor: me.nodeHighlightColor,
153 dropHighlight: me.nodeHighlightOnDrop
154 });
155 }
156 }
157 });
158 ////////////////树叶子节点改动结束//////////////////////////////////////////////////////////
2 通过TreeViewDragDrop的allowLeafInserts为true或false进行配置
3 例:
4 // Ext.define('myTree', {
5 // extend: 'Ext.tree.Panel',
6 // viewConfig: {
7 // plugins: {
8 // ptype: 'treeviewdragdrop',
9 // allowLeafInserts : true
10 // }
11 // }
12 // }
13 //*/
14 Ext.override(Ext.tree.ViewDropZone, {
15 getPosition: function (e, node) {
16 var view = this.view,
17 record = view.getRecord(node),
18 y = e.getPageY(),
19 noAppend = record.isLeaf(),
20 noBelow = false,
21 region = Ext.fly(node).getRegion(),
22 fragment;
23
24 if (record.isRoot()) {
25 return 'append';
26 }
27
28 if (this.appendOnly) {
29 return noAppend ? false : 'append';
30 }
31 if (!this.allowParentInsert) {
32 //leehom modify begin
33 noBelow = this.allowLeafInserts || (record.hasChildNodes() && record.isExpanded());
34 //leehom modify end
35 }
36
37 fragment = (region.bottom - region.top) / (noAppend ? 2 : 3);
38 if (y >= region.top && y < (region.top + fragment)) {
39 return 'before';
40 }
41 else if (!noBelow && (noAppend || (y >= (region.bottom - fragment) && y <= region.bottom))) {
42 return 'after';
43 }
44 else {
45 return 'append';
46 }
47 },
48 handleNodeDrop: function (data, targetNode, position) {
49 var me = this,
50 view = me.view,
51 parentNode = targetNode.parentNode,
52 store = view.getStore(),
53 recordDomNodes = [],
54 records, i, len,
55 insertionMethod, argList,
56 needTargetExpand,
57 transferData,
58 processDrop;
59 if (data.copy) {
60 records = data.records;
61 data.records = [];
62 for (i = 0, len = records.length; i < len; i++) {
63 data.records.push(Ext.apply({}, records[i].data));
64 }
65 }
66 me.cancelExpand();
67 if (position == 'before') {
68 insertionMethod = parentNode.insertBefore;
69 argList = [null, targetNode];
70 targetNode = parentNode;
71 }
72 else if (position == 'after') {
73 if (targetNode.nextSibling) {
74 insertionMethod = parentNode.insertBefore;
75 argList = [null, targetNode.nextSibling];
76 }
77 else {
78 insertionMethod = parentNode.appendChild;
79 argList = [null];
80 }
81 targetNode = parentNode;
82 }
83 else {
84 //leehom add begin
85 if (this.allowLeafInserts) {
86 if (targetNode.get('leaf')) {
87 targetNode.set('leaf', false);
88 targetNode.set('expanded', true);
89 }
90 }
91 //leehom add end
92 if (!targetNode.isExpanded()) {
93 needTargetExpand = true;
94 }
95 insertionMethod = targetNode.appendChild;
96 argList = [null];
97 }
98
99 transferData = function () {
100 var node;
101 for (i = 0, len = data.records.length; i < len; i++) {
102 argList[0] = data.records[i];
103 node = insertionMethod.apply(targetNode, argList);
104
105 if (Ext.enableFx && me.dropHighlight) {
106 recordDomNodes.push(view.getNode(node));
107 }
108 }
109 if (Ext.enableFx && me.dropHighlight) {
110 Ext.Array.forEach(recordDomNodes, function (n) {
111 if (n) {
112 Ext.fly(n.firstChild ? n.firstChild : n).highlight(me.dropHighlightColor);
113 }
114 });
115 }
116 };
117 if (needTargetExpand) {
118 targetNode.expand(false, transferData);
119 }
120 else {
121 transferData();
122 }
123 }
124 });
125
126
127 Ext.override(Ext.tree.plugin.TreeViewDragDrop, {
128 allowLeafInserts: true,
129
130 onViewRender: function (view) {
131 var me = this;
132 if (me.enableDrag) {
133 me.dragZone = Ext.create('Ext.tree.ViewDragZone', {
134 view: view,
135 allowLeafInserts: me.allowLeafInserts,
136 ddGroup: me.dragGroup || me.ddGroup,
137 dragText: me.dragText,
138 repairHighlightColor: me.nodeHighlightColor,
139 repairHighlight: me.nodeHighlightOnRepair
140 });
141 }
142
143 if (me.enableDrop) {
144 me.dropZone = Ext.create('Ext.tree.ViewDropZone', {
145 view: view,
146 ddGroup: me.dropGroup || me.ddGroup,
147 allowContainerDrops: me.allowContainerDrops,
148 appendOnly: me.appendOnly,
149 allowLeafInserts: me.allowLeafInserts,
150 allowParentInserts: me.allowParentInserts,
151 expandDelay: me.expandDelay,
152 dropHighlightColor: me.nodeHighlightColor,
153 dropHighlight: me.nodeHighlightOnDrop
154 });
155 }
156 }
157 });
158 ////////////////树叶子节点改动结束//////////////////////////////////////////////////////////
posted @ 2012-02-24 05:29 李宏 阅读(287) 评论(1) 编辑
找到 Ext.ux.grid.menu.ListMenu 类,位于 extjs/examples/us/grid/menu/listmenu.js。
修改show方法为:
show: function () {
var lastArgs = null;
return function () {
if (this.loadOnShow && !this.loaded) {
this.store.load();
this.callParent(lastArgs);
} else {
this.callParent(lastArgs);
}
};
} (),
或使用Ext.override方法在其它文件进行修正。推荐使用override方法。
修改后,使用正常。
var listProvince = Ext.create("SMS.store.Selected.Province");
var filgerColumns = [
{ dataIndex: 'ID' },
{ dataIndex: 'ProvinceID', type: 'list', store: listProvince, labelField: 'text' },
{ dataIndex: 'Name' }
];
posted @ 2011-08-24 14:44 李宏 阅读(129) 评论(1) 编辑
.x-btn-default-small .x-btn-inner, .x-btn-default-medium .x-btn-inner, .x-btn-default-large .x-btn-inner, .x-btn-default-toolbar-small .x-btn-inner, .x-btn-default-toolbar-medium .x-btn-inner, .x-btn-default-toolbar-large .x-btn-inner, .x-menu-item-text, .x-html-editor-tb .x-font-select, .x-panel-header-default, .x-panel-header-text-default, .x-panel-header-default-framed, .x-tip-header, .x-tip-body, .x-form-invalid-tip-body, .x-tip-header-text, .x-progress-text, .x-toolbar, .x-toolbar .x-form-item-label, .x-toolbar .x-toolbar-text, .x-window-header-text-default, .x-tab-bar, .x-tab button, .x-grid-rowbody, .x-grid-row .x-grid-cell, .x-grid-group-title, .x-grid-row-editor .x-form-field, .x-grid-row-editor .x-form-display-field, .x-form-invalid-under, .x-fieldset-header, .x-column-header, .x-mask-msg div, .x-btn-group-header-text-default-framed, table.x-datepicker-inner a, .x-monthpicker-item, .x-dd-drag-ghost
{
font-size: 12px;
}
.x-column-header
{
text-shadow:0 0 0 rgba(255, 255, 255, 0.3);
{
font-size: 12px;
}
.x-column-header
{
text-shadow:0 0 0 rgba(255, 255, 255, 0.3);
}
posted @ 2011-08-24 14:38 李宏 阅读(501) 评论(0) 编辑
写了一通宵的表达式树实现动态拼接查询条件,才发现MICROSOFT提供了System.Linq.Dynamic这个东东……悲剧,吐血……
posted @ 2011-08-15 16:55 李宏 阅读(25) 评论(0) 编辑
搞培训这么多年了,可相关学习文档一直不满意,现准备重新编写相关部分,目录如下:
- HTML概述
- HTML语法
- HTML标签
- HTML实例--用户注册页面
- CSS概述
- CSS语法
- CSS选择器
- 文档流与盒子模型(块、内联、行、内容、可转换)
- CSS实例--用户注册页面
- 浏览器兼容性问题
- JavaScript概述
- JavaScript语法
- JQUERY
- BOM
- DOM(JS重点,使用JS与JQUERY同时实现代码)
- 综合实例--企业网页(7个页面,首页、文章列表、文章显示、产品列表、产品展示、留言列表、留言发布、单栏目页)
- 综合实例--后台管理界面(4个页面,登陆、管理框架、列表、编辑)
不定期更新中………………
posted @ 2011-08-09 19:12 李宏 阅读(154) 评论(3) 编辑
摘要: 关于EF、SL、DomainDataSource的说明园子上够多了,这儿就不多说了。 1.安装VS2010与Silverlight 4 Tools…… 2.打开VS2010,新键Silverlight项目,如图一所示: 图1.新键项目 注:请选中"启用WCF RIA服务"的CheckBox. 建立好项目后,解决方案里的文件如图2所示: 图2.解决方案...阅读全文
posted @ 2010-07-09 16:49 李宏 阅读(483) 评论(14) 编辑
摘要: 1.在SL中查询时,记得using System.ServiceModel.DomainServices.Client,否则会出现xxx.GetxxxQuerys()不出现Take、Where等等扩展方法,也不能 from x in xxx.xxxx where。会报如下异常:未能为源类型“System.ServiceModel.DomainServices.Client.Entity...阅读全文
posted @ 2010-06-03 03:48 李宏 阅读(199) 评论(1) 编辑
摘要: Visual Studio 2010 Professional:emule下载:ed2k://|file|cn_visual_studio_2010_professional_x86_dvd_532145.iso|2591844352|6001253431afe573e4344f5a0b1d9cac|/Visual Studio 2010 Ultimate:emule下载:ed2k://|file...阅读全文
posted @ 2010-05-28 23:34 李宏 阅读(474) 评论(2) 编辑

