第一组:杨昊 数组自定义下标
新框架全面使用AngularJS,这种框架可以实现双向绑定,确实非常方便,那么问题来了。现在有这么一个需求:
前台向后台请求数据,返回的数据的结构十分麻烦,至少两个数组嵌套,类似于Result:{[1:{},2:[[{},{},{}],{}]]}。假如现在想将数据最内层的某个字段绑定到输入框进行操作,同样实现双向绑定,类似于ng-repeat=”x in list track by $index”这种遍历,并使用ng-model=”x.xxx”进行绑定,这样是行不通的,尤其是当前的需求是将该字段修改后还要摘出来形成新数组发给后台,由于数据的长度不固定,怎么定位到需要修改的数据就是个大问题。
之前我有介绍过,像这种ng-repeat循环嵌套的数据,可以使用$index,$parent.$index,$parent.$parent.$index等来进行定位,但是这样很容易出错。那么重点来了(划重点!!!):Js中的数组是支持自定义下标的!Js中的数组是支持自定义下标的!Js中的数组是支持自定义下标的!重要的话说三遍。
要想给数组自定义下标,只需要继承Object对象即可实现,比如:
新建: var object = new Object();
增加: object[strIndex ] = value; (strIndex 为string)
删除: delete object[strIndex ];
遍历: for ( var strObjIndex in object ) object[strObjIndex ];
例:
var obj = new Object();
obj["first"] = "my"; [图片上传中...(2.png-f3107f-1513127243354-0)]
obj["second"] = "name";
obj["third"] = "is";
obj["fourth"] = "chenssy";
针对上面的需求,我的解决方案是这样的:
既然之后要摘出想要修改的数据,何不绑定之前就将其摘出来,只需要将这些数据一一对应就行,这时候自定义下标就可以派上用场了,利用自定义的下标,你可以随意的绑定并修改:
完美!
第二组:叶佳意 素描餐厅
今天和大家分享一家餐厅,不对,是给勇敢的同学分享一家餐厅。位于西湖景区灵隐寺附近的“素描餐厅”,具体位置输入餐厅名在地图上都能搜到的。
灵隐附近环境清幽,绿化好、空气清新很适合天气好的双休日去走一走逛一逛。这家店的装修很用心,有露天座位、也有阁楼的靠窗位置。白天去的话可以坐在二楼或者三楼用餐,还能看到西湖(听说的,我去的时候天黑了,啥也看不到)。
重点还是他家的创意菜。为什么说是给勇敢的同学推荐呢?他们家推荐菜品:榴莲大肠、榴莲烤鸡。
榴莲大肠是把榴莲肉装进大肠一起加热,嚼的时候有大肠的韧劲也有榴莲细腻的口感,真的觉得有种臭味相投的好感!!还有好多招牌菜去的太晚都卖完了也是难过。写太多菜品的点评就有点像大众点评,同学们有兴趣或者正好在那边墙裂推荐去试试!!!吃饭也是很有意思的事儿~
第三组:蔡永坚 Get和Set
在早期学习c#的过程中,经常遇到这样的语句:
public string StudentName
{
get{return stuName;}
set{stuName=value;}
}
属性的get和set都是可执行的程序语句组合,具有行为的特点;而使用具有get访问器和set访问器的属性时候就像使用字段一样,即可以作为左值接受数据,又可以作为右值输出数据,系统正是按照属性出现在语句中的位置,自动地选择是调用get还是调用set。
属性的读写控制
属性中的get和set可以只用一个,如果只有get而没有set,那么这个属性只可读出,不可写入;如果只有set而没有get,那么这个属性是只写入,不可读出。
在属性中完成更多功能
既然get和set是程序,那当然可以做更多的事情。一个合理的分工是:设计字段是为了便于内部方法使用,而尽量与外界隔绝;设计属性考虑的是方便外界的使用,但是不让外界知道的数据一律不给。
具体说明:
set访问器与返回void的方法类似。它使用称为value的隐式参数,此参数的类型是属性的类型。当对属性赋值时,用提供新值的参数调用set访问器。例如:
e1.Name = "Joe"; // The set accessor is invoked here
在set访问器中对局部变量声明使用隐式参数名 (value)是错误的。
在类中定义一个属性
public class Student
{
private string name
public string Name
{
set{name=value;}//这里是给私有属性name赋值
get{return name;}//这里取出私有属性name的值
}
}
c#在定义类时,通常要把类中声明的对象封装起来,使得外界不能访问这个属性。上述
代码中如果去掉set部分,则外界只能读取name的值,如果去掉get部分,则只能给name赋值。这样就可以控制外界对私有属性name的访问权限了,这种写法是C#的一个特性。当然你也可以通过自己创建函数来对name进行取值和赋值,但这样就显得比较麻烦了。
属性与普通变量不同就在于, 普通变量就是放在屋子里的东西, 是什么样明明白白. 而属性则是在屋子的门口放了个守门人, 你拿东西放东西要经过他。
这个守门人就是属性访问器, 拿东西就是 get, 放东西就是 set. 怎么拿怎么放是它说了算, 虽然你觉得好像就是直接拿直接放差不多.
GET、SET就是对外的接口 ,一般在实例中访问成员数据需要这个成员数据的访问方式为PUBLIC ,现在C#很高级了,GET就是获取,SET就是设置,但是它提供了更好的收缩性,对GET 和SET 可以单独设置访问权限。比如你对某个成员数据只能读取或者只写,或者只有派生类可以访问等。相对以前来说,没有属性访问器,需要通过函数来调用私有成员数据,属性提供了高效的访问模式和简单的书写。 为了安全就用属性来给字段赋值,因为 在set中你可以对数据的安全进行验证。
第四组:张元一 Cookie/Session机制详解
1.1.2 记录用户访问次数
Java中把Cookie封装成了javax.servlet.http.Cookie类。每个Cookie都是该Cookie类的对象。服务器通过操作Cookie类对象对客户端Cookie进行操作。通过request.getCookie()获取客户端提交的所有Cookie(以Cookie[]数组形式返回),通过response.addCookie(Cookiecookie)向客户端设置Cookie。
Cookie对象使用key-value属性对的形式保存用户状态,一个Cookie对象保存一个属性对,一个request或者response同时使用多个Cookie。因为Cookie类位于包javax.servlet.http.*下面,所以JSP中不需要import该类。
1.1.3 Cookie的不可跨域名性
很多网站都会使用Cookie。例如,Google会向客户端颁发Cookie,Baidu也会向客户端颁发Cookie。那浏览器访问Google会不会也携带上Baidu颁发的Cookie呢?或者Google能不能修改Baidu颁发的Cookie呢?
答案是否定的。Cookie具有不可跨域名性。根据Cookie规范,浏览器访问Google只会携带Google的Cookie,而不会携带Baidu的Cookie。Google也只能操作Google的Cookie,而不能操作Baidu的Cookie。
Cookie在客户端是由浏览器来管理的。浏览器能够保证Google只会操作Google的Cookie而不会操作Baidu的Cookie,从而保证用户的隐私安全。浏览器判断一个网站是否能操作另一个网站Cookie的依据是域名。Google与Baidu的域名不一样,因此Google不能操作Baidu的Cookie。
需要注意的是,虽然网站images.google.com与网站www.google.com同属于Google,但是域名不一样,二者同样不能互相操作彼此的Cookie。
注意:用户登录网站www.google.com之后会发现访问images.google.com时登录信息仍然有效,而普通的Cookie是做不到的。这是因为Google做了特殊处理。本章后面也会对Cookie做类似的处理。
1.1.4 Unicode编码:保存中文
中文与英文字符不同,中文属于Unicode字符,在内存中占4个字符,而英文属于ASCII字符,内存中只占2个字节。Cookie中使用Unicode字符时需要对Unicode字符进行编码,否则会乱码。
提示:Cookie中保存中文只能编码。一般使用UTF-8编码即可。不推荐使用GBK等中文编码,因为浏览器不一定支持,而且JavaScript也不支持GBK编码。
第五组:王炳钧 List之并/交/差集
List之Union(),Intersect(),Except() 亦可以说是数学中的并集,交集,差集
Union()
这个方法将会Union(并集)两个序列(集合)连接成一个新列表(集合)
方法定义是:
Intersect ()
它将产生两个序列的交集.
方法定义是:
Except ()
它是从一个集合中删除存在另一个集合中的项.两个序列产生的集合差
方法定义是:
实例代码分别如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
namespace test
{
class Program
{
static void Main(string[] args)
{
IList oneStudents = new List();
oneStudents.Add(new Student(1,false,"小新1","徐汇"));
oneStudents.Add(new Student(2,false,"小新2","闵行"));
oneStudents.Add(new Student(3, false, "小新3", "嘉定"));
oneStudents.Add(new Student(4, false, "小新4", "闸北"));
IList twoStudents = new List();
twoStudents.Add(new Student(5, false, "小新5", "贵州"));
twoStudents.Add(new Student(6, false, "小新6", "湖北"));
twoStudents.Add(new Student(7, false, "小新7", "山东"));
twoStudents.Add(new Student(8, false, "小新8", "西藏"));
IList threeStudents = new List();
threeStudents.Add(new Student(1, false, "小新1", "徐汇"));
threeStudents.Add(new Student(2, false, "小新2", "闵行"));
var bingji = oneStudents.Union(twoStudents, new StudentListEquality()).ToList();//并(全)集
var jiaoji = oneStudents.Intersect(threeStudents, new StudentListEquality()).ToList();//交集
var chaji = oneStudents.Except(threeStudents, new StudentListEquality()).ToList();//差集
Console.WriteLine();
Console.WriteLine("以下是并集的结果");
bingji.ForEach(x =>
{
Console.WriteLine(x.StudentId.ToString() + " " + x.Sex.ToString() + " " + x.Name.ToString()+" "+x.Address.ToString());
});
Console.WriteLine();
Console.WriteLine("以下是交集的结果");
jiaoji.ForEach(x =>
{
Console.WriteLine(x.StudentId.ToString() + " " + x.Sex.ToString() + " " + x.Name.ToString() + " " + x.Address.ToString());
});
Console.WriteLine();
Console.WriteLine("以下是差集的结果");
chaji.ForEach(x =>
{
Console.WriteLine(x.StudentId.ToString() + " " + x.Sex.ToString() + " " + x.Name.ToString() + " " + x.Address.ToString());
});
}
}
public class Student
{
public Student(int studentId, bool sex, String name, String address)
{
this.StudentId = studentId;
this.Sex = sex;
this.Name = name;
this.Address = address;
}
public int StudentId { get; set; }
public bool Sex { get; set; }
public String Name { get; set; }
public String Address { get; set; }
}
public class StudentListEquality : IEqualityComparer
{
public bool Equals(Student x, Student y)
{
return x.StudentId == y.StudentId;
}
public int GetHashCode(Student obj)
{
if (obj == null)
{
return 0;
}
else
{
return obj.ToString().GetHashCode();
}
}
}
}
以上运行的结果是:
以上的结果是重载了含有参数的IEqualityComparer
var bingji = oneStudents.Union(twoStudents).ToList();//并(全)集
var jiaoji = oneStudents.Intersect(threeStudents).ToList();//交集
var chaji = oneStudents.Except(threeStudents).ToList();//差集
但是对于List
代码如下所示
IList firstNumbers = new List()
{ 1,2,3,4,5,6,7 };
IList secondNumbers = new List()
{ 8,9,10 };
IList thressNumbers = new List()
{ 1,2,3 };
result1 = firstNumbers.Union(secondNumbers).ToList();
var result2 = firstNumbers.Intersect(thressNumbers).ToList();
var result3 = firstNumbers.Except(thressNumbers).ToList();
Console.WriteLine("以下是并集的结果");
result1.ForEach(x => Console.WriteLine(x));
Console.WriteLine();
Console.WriteLine("以下是交集的结果");
result2.ForEach(x => Console.WriteLine(x));
Console.WriteLine();
Console.WriteLine("以下是差集的结果");
result3.ForEach(x => Console.WriteLine(x));
Console.WriteLine("以上是简单类型如:int string long。。。。。没有实现IEqualityComparer接口");
结果: