第一组 姚成栋
不知道大家在用新模板的时候有没有遇到过这样的情况:
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存储过程,都用的封装好的框架,简单说下存储过程的优缺点。
优点:
-
存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
-
当对数据库进行复杂操作时(如对多个表进行 Update,Insert,Query,Delete 时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。这些操作,如果用程序来完成,就变成了一条条的 SQL 语句,可能要多次连接数据库。而换成存储,只需要连接一次数据库就可以了。
-
存储过程可以重复使用,可减少数据库开发人员的工作量。
-
安全性高,可设定只有某此用户才具有对指定存储过程的使用权。
缺点:
-
运行速度: 大多数高级的数据库系统都有statement cache的,所以编译sql的花费没什么影响。但是执行存储过程要比直接执行sql花费更多(检查权限等),所以对于很简单的sql,存储过程没有什么优势。
-
网络负荷:如果在存储过程中没有多次数据交互,那么实际上网络传输量和直接sql是一样的。
-
团队开发:很遗憾,比起成熟的IDE,没有什么很好存储过程的IDE工具来支持,也就是说,这些必须手工完成。
-
安全机制:对于传统的C/S结构,连接数据库的用户可以不同,所以安全机制有用;但是在web的三层架构中,数据库用户不是给用户用的,所以基本上,只有一个用户,拥有所有权限(最多还有一个开发用户)。这个时候,安全机制有点多余。
-
用户满意:实际上这个只是要将访问数据库的接口统一,是用存储过程,还是EJB,没太大关系,也就是说,在三层结构中,单独设计出一个数据访问层,同样能实现这个目标。
-
开发调试:一样由于IDE的问题,存储过程的开发调试要比一般程序困难。
-
移植性:算了,这个不用提,反正一般的应用总是绑定某个数据库的,不然就无法靠优化数据库访问来提高性能了。
-
维护性:的确,存储过程有些时候比程序容易维护,这是因为可以实时更新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
网友评论