2017.12.13 新模板中遇到的问题、JavaScript数组方法、存储过程介绍、Cookie/Session机制详解、Winform技巧

第一组 姚成栋

不知道大家在用新模板的时候有没有遇到过这样的情况:


image.png

添加页面数据太多,上下滑动输入数据太麻烦,无法一目了然地看所有输入的数据,而且如果一不小心点到了边上,刚刚输入的数据就都没了。为了解决这些问题,我们使用通过路由加载新页面的方式来打开添加编辑页面。(其实也不算新,因为新模板中加载页面就是用的这种方法)。效果大致如下:


image.png

是不是觉得似曾相识?你想的没错,就是我们平时用的路由加载页面。只不过我们平时用的时候是直接打开新的页面,不需要传数据,这边我们需要带一些数据。(比方说,编辑页面需要带一个tid过去)
实现方式如下,在controller中:


image.png

在路由中:


image.png

然后就是创建OriginalUnitInfoSearch.html文件,然后就完成啦

第二组 冯佳丽 JavaScript数组方法总结

后篇:

17.sort

作用:sort() 方法用于对数组的元素进行排序。
返回值:Array,排序后的数组
原数组:改变
注意:排序顺序可以是字母或数字,并按升序或降序。字母排序的话直接调用sort()方法;数字排序必须通过一个函数作为参数来调用。函数指定数字是按照升序(a-b)还是降序排列(b-a)
语法:array.sort(sortfunction)
语法参数解析:sortfunction可选,规定排序顺序,必须是函数

var arr1=[32,4,17,42,2,11];
console.log(arr1.sort());       // [11, 17, 2, 32, 4, 42]
console.log(arr1);       // [11, 17, 2, 32, 4, 42]
var arr2=[32,4,17,42,2,11];
console.log(arr2.sort(function(a,b){
    return a-b;
}));       // [2, 4, 11, 17, 32, 42]
console.log(arr2);       // [2, 4, 11, 17, 32, 42]
var arr3=[32,4,17,42,2,11];
console.log(arr3.sort(function(a,b){
    return b-a;
}));       // [42, 32, 17, 11, 4, 2]
console.log(arr3);       // [42, 32, 17, 11, 4, 2]
var arr4=['af','fc','ab','cd','fcd'];
console.log(arr4.sort());       //['ab','af','cd','fc','fcd']
console.log(arr4);       //['ab','af','cd','fc','fcd']
18.reverse

作用:reverse() 方法用于反转数组中元素的顺序。
返回值:Array,反转顺序后的数组
原数组:改变
语法:array.reverse()

var arr1=[1,2,3,4,5];
console.log(arr1.reverse());        // [5, 4, 3, 2, 1]
console.log(arr1);        // [5, 4, 3, 2, 1]
19.pop

作用:pop() 方法用于删除数组的最后一个元素并返回删除的元素。
返回值:任何类型,被删除的元素
原数组:改变
语法:array.pop()

var arr1=[1,2,3,4,5];
console.log(arr1.pop());    //5
console.log(arr1);  //[1,2,3,4]
20.push

作用:push()方法用于向数组的末尾添加一个或多个元素,并返回新的长度。
返回值:Number,数组新长度
原数组:改变
语法:array.push(item1, item2, …, itemX)
语法参数解析:参数必需,要添加到数组的元素,可一个或者多个

var arr1=[1,2,3,4];
console.log(arr1.push(1));      //5
console.log(arr1);      //[1,2,3,4,1]
console.log(arr1.push('a','b'));      //7
console.log(arr1);      //[1,2,3,4,1,'a','b']
21:shift

作用:shift()方法用于删除数组的第一个元素,并且返回它。
返回值:任何类型,被删除的元素
原数组:改变
语法:array.shift()

var arr1=[1,2,3,4,5];
console.log(arr1.shift());      //1
console.log(arr1);      //[2,3,4,5]
22.unshift

作用:unshift()方法可向数组的开头添加一个或更多元素,并返回新的长度。
返回值:Number,数组新长度
原数组:改变
语法:array.unshift(item1,item2, …, itemX)
语法参数解析:可选,向数组起始位置添加的一个或者多个元素。

var arr1=[1,2,3,4,5];
console.log(arr1.unshift('a'));     //6
console.log(arr1);     //['a',1,2,3,4,5]
console.log(arr1.unshift(12,'b'));     //8
console.log(arr1);     //[12,'b','a',1,2,3,4,5]
23.slice

作用:slice()方法可选取数组的一部分,并返回一个新数组。
返回值:Array,被提取的部分数组
原数组:不改变
语法:array.slice(start, end)
语法参数解析:start必需,规定从何处开始选取,如果是负数,他表示从数组尾部开始算起的位置即-1 指最后一个元素;end可选,规定从何处结束选取,没有则默认为到最后一个元素,若为负数,则表示是从数组尾部开始算起的元素。

var arr1=[1,2,3,4,5,6,7,8];
console.log(arr1.slice(3));     //[4,5,6,7,8]
console.log(arr1);     //[1,2,3,4,5,6,7,8]
console.log(arr1.slice(3,6));     //[4,5,6]
console.log(arr1.slice(-2));     //[7,8]
console.log(arr1.slice(-2,4));     //[]
console.log(arr1.slice(4,-2));     //[5,6]
console.log(arr1.slice(-4,-2));     //[5,6]
console.log(arr1.slice(-2,-4));     //[]
24.splice

作用:splice()方法用于插入、删除或替换数组的元素。
返回值:Array,操作删除或者替换的数组
原数组:改变
语法:array.splice(index,howmany,item1,…..,itemX)
语法参数解析:index必需,规定从何处添加/删除元素,该参数是开始插入和(或)删除的数组元素的下标,必须是数字;howmany必需,规定应该删除多少元素,必须是数字,但可以是 “0”,若为空则默认删除从 index 开始到原数组结尾的所有元素;item可选,表示要添加到数组的新元素

var arr1=[1,2,3,4,5,6,7,8,9,10];
console.log(arr1.splice(2));        //[3, 4, 5, 6, 7, 8, 9, 10]
console.log(arr1);      //[1,2]
var arr2=[1,2,3,4,5,6,7,8,9,10];
console.log(arr2.splice(2,4,'a'));        //[3, 4, 5, 6]
console.log(arr2);      //[1,2,'a',7,8,9,10]
var arr3=[1,2,3,4,5,6,7,8,9,10];
console.log(arr3.splice(4,3));        //[ 5, 6, 7]
console.log(arr3);      //[1,2,3,4,8,9,10]
25.valueOf

作用:valueOf() 方法返回数组对象的原始值。
返回值:Array,数组对象原始值,相当于原数组
原数组:不改变
语法:array.valueOf()

var arr1=[1,2,3,4,5];
console.log(arr1.valueOf());        //[1, 2, 3, 4, 5]
console.log(arr1);      //[1, 2, 3, 4, 5]

第三组 蔡永坚 存储过程介绍

存储过程,非常类似于C#语言中的方法,它可以重复调用。当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句。这样就可以提高存储过程的性能。

存储过程的概念

存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。

存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数、输出参数、返回单个或多个结果集以及返回值。

由于存储过程在创建时即在数据库服务器上进行了编译并存储在数据库中,所以存储过程运行要比单个的SQL语句块要快。同时由于在调用时只需用提供存储过程名和必要的参数信息,所以在一定程度上也可以减少网络流量、简单网络负担。

目前具体的项目中没有使用sql存储过程,都用的封装好的框架,简单说下存储过程的优缺点。

优点:
  1. 存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。

  2. 当对数据库进行复杂操作时(如对多个表进行 Update,Insert,Query,Delete 时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。这些操作,如果用程序来完成,就变成了一条条的 SQL 语句,可能要多次连接数据库。而换成存储,只需要连接一次数据库就可以了。

  3. 存储过程可以重复使用,可减少数据库开发人员的工作量。

  4. 安全性高,可设定只有某此用户才具有对指定存储过程的使用权。

缺点:
  1. 运行速度: 大多数高级的数据库系统都有statement cache的,所以编译sql的花费没什么影响。但是执行存储过程要比直接执行sql花费更多(检查权限等),所以对于很简单的sql,存储过程没有什么优势。

  2. 网络负荷:如果在存储过程中没有多次数据交互,那么实际上网络传输量和直接sql是一样的。

  3. 团队开发:很遗憾,比起成熟的IDE,没有什么很好存储过程的IDE工具来支持,也就是说,这些必须手工完成。

  4. 安全机制:对于传统的C/S结构,连接数据库的用户可以不同,所以安全机制有用;但是在web的三层架构中,数据库用户不是给用户用的,所以基本上,只有一个用户,拥有所有权限(最多还有一个开发用户)。这个时候,安全机制有点多余。

  5. 用户满意:实际上这个只是要将访问数据库的接口统一,是用存储过程,还是EJB,没太大关系,也就是说,在三层结构中,单独设计出一个数据访问层,同样能实现这个目标。

  6. 开发调试:一样由于IDE的问题,存储过程的开发调试要比一般程序困难。

  7. 移植性:算了,这个不用提,反正一般的应用总是绑定某个数据库的,不然就无法靠优化数据库访问来提高性能了。

  8. 维护性:的确,存储过程有些时候比程序容易维护,这是因为可以实时更新DB端的存储过程,但是在3层结构下,更新server端的数据访问层一样能实现这个目标,可惜现在很多平台不支持实时更新而已。


第四组 张元一 Cookie/Session机制详解

1.1.5 BASE64编码:保存二进制图片

Cookie不仅可以使用ASCII字符与Unicode字符,还可以使用二进制数据。例如在Cookie中使用数字证书,提供安全度。使用二进制数据时也需要进行编码。

注意:

本程序仅用于展示Cookie中可以存储二进制内容,并不实用。由于浏览器每次请求服务器都会携带Cookie,因此Cookie内容不宜过多,否则影响速度。Cookie的内容应该少而精。

1.1.6 设置Cookie的所有属性

除了name与value之外,Cookie还具有其他几个常用的属性。每个属性对应一个getter方法与一个setter方法。Cookie类的所有属性如表1.1所示。
表1.1 Cookie常用属性

属 性 名 描 述
String name 该Cookie的名称。Cookie一旦创建,名称便不可更改
Object value 该Cookie的值。如果值为Unicode字符,需要为字符编码。如果值为二进制数据,则需要使用BASE64编码
int maxAge 该Cookie失效的时间,单位秒。如果为正数,则该Cookie在maxAge秒之后失效。如果为负数,该Cookie为临时Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该Cookie。如果为0,表示删除该Cookie。默认为–1
boolean secure 该Cookie是否仅被使用安全协议传输。安全协议。安全协议有HTTPS,SSL等,在网络上传输数据之前先将数据加密。默认为false
String path 该Cookie的使用路径。如果设置为“/sessionWeb/”,则只有contextPath为“/sessionWeb”的程序可以访问该Cookie。如果设置为“/”,则本域名下contextPath都可以访问该Cookie。注意最后一个字符必须为“/”
String domain 可以访问该Cookie的域名。如果设置为“.google.com”,则所有以“google.com”结尾的域名都可以访问该Cookie。注意第一个字符必须为“.”
String comment 该Cookie的用处说明。浏览器显示Cookie信息的时候显示该说明
int version 该Cookie使用的版本号。0表示遵循Netscape的Cookie规范,1表示遵循W3C的RFC 2109规范
1.1.7 Cookie的有效期

Cookie的maxAge决定着Cookie的有效期,单位为秒(Second)。Cookie中通过getMaxAge()方法与setMaxAge(int maxAge)方法来读写maxAge属性。如果maxAge属性为正数,则表示该Cookie会在maxAge秒之后自动失效。浏览器会将maxAge为正数的Cookie持久化,即写到对应的Cookie文件中。无论客户关闭了浏览器还是电脑,只要还在maxAge秒之前,登录网站时该Cookie仍然有效。下面代码中的Cookie信息将永远有效。

Cookie cookie = new Cookie("username","helloweenvsfei");   // 新建Cookie
cookie.setMaxAge(Integer.MAX_VALUE);           // 设置生命周期为MAX_VALUE
response.addCookie(cookie);                    // 输出到客户端

如果maxAge为负数,则表示该Cookie仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该Cookie即失效。maxAge为负数的Cookie,为临时性Cookie,不会被持久化,不会被写到Cookie文件中。Cookie信息保存在浏览器内存中,因此关闭浏览器该Cookie就消失了。Cookie默认的maxAge值为–1。

如果maxAge为0,则表示删除该Cookie。Cookie机制没有提供删除Cookie的方法,因此通过设置该Cookie即时失效实现删除Cookie的效果。失效的Cookie会被浏览器从Cookie文件或者内存中删除,

例如:

Cookie cookie = new Cookie("username","helloweenvsfei");   // 新建Cookie
cookie.setMaxAge(0);                          // 设置生命周期为0,不能为负数
response.addCookie(cookie);                    // 必须执行这一句

response对象提供的Cookie操作方法只有一个添加操作add(Cookie cookie)。
要想修改Cookie只能使用一个同名的Cookie来覆盖原来的Cookie,达到修改的目的。删除时只需要把maxAge修改为0即可。

注意:

从客户端读取Cookie时,包括maxAge在内的其他属性都是不可读的,也不会被提交。浏览器提交Cookie时只会提交name与value属性。maxAge属性只被浏览器用来判断Cookie是否过期。


第五组 王炳钧 Winform技巧

一、屏蔽窗体右上角关闭按钮

1.重写OnClosing
protected override void OnClosing(CancelEventArgs e)
{
  if(this.Visible)
  {
    e.Cancel=true;
   //
   // WHATE TODO 
   //
  }
}
2.重写WndProc
protected override void WndProc(ref Message m)
{
const int WM_SYSCOMMAND = 0x0112;
const int SC_CLOSE = 0xF060;
if (m.Msg == WM_SYSCOMMAND && (int) m.WParam == SC_CLOSE)
{
// User clicked close button
this.WindowState = FormWindowState.Minimized;
return;
}
base.WndProc(ref m);
}

二、屏蔽CTRL-V

在WinForm中的TextBox控件没有办法屏蔽CTRL-V的剪贴板粘贴动作,如果需要一个输入框,但是不希望用户粘贴剪贴板的内容,可以改用RichTextBox控件,并且在KeyDown中屏蔽掉CTRL-V键,例子:

private void richTextBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
if(e.Control && e.KeyCode==Keys.V)
e.Handled = true;
}

三、应用程序单例运行

#region 单实例运行
/// <summary>
/// 单实例运行
/// </summary>
/// <param name="frm">所要运行的主窗体</param>
public static void SingleRun(Form frm)
{
  System.Threading.Mutex mutex = new System.Threading.Mutex(false,"SINGLE_INSTANCE_MUTEX");
  if (!mutex.WaitOne(0, false))
  {
 mutex.Close();
 mutex = null;
  }
  if (mutex != null)
  {
 Application.Run(frm);
  }
  else
  {
 MessageBox.Show("应用程序已启动","信息提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
  }
}
#endregion
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,507评论 6 13
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,015评论 11 349
  • 今天起的有点晚,没办法和戈茵老师进行互动,有点小遗憾。不过没关系,走进这个课堂,我就很知足了。今天的主题是...
    爱自己活当下阅读 190评论 0 0
  • 2015年11月9日 星期一 农历九月廿八 【各地业务及活动新闻】 (1)线上事业部:微银财富新版平台与积分商城...
    615f70a33950阅读 178评论 0 0
  • 1. 词汇&表达 (1) laborious taking a lot of time and effort 耗时...
    Mia215阅读 314评论 2 2