HRDM项目经验总结——树结构菜单、session的三种保存机制、代码效率
概述
上周,Memory和我们介绍了他在HRDM项目中总结的一些经验心得,共同分享了部分优秀代码和模块的写法。主要包括三点:树结构菜单、session的三种保存机制、代码效率,本文将重点讲解session的三种保存机制。
一、树结构菜单
1. 树结构菜单常见功能
1.1无限级异步加载
思路:因采取异步加载,所以舍弃递归算法,使用点击事件从服务器获取子节点,从而实现无限级加载。
1.2收缩、展开子节点
思路:将ul元素的内容显示或隐藏,如果ul内没有HTML,则异步加载子节点。
1.3节点多选框
思路:用Jquery在li元素中追加checkbox,需要判断选中时,另写方法遍历树结构区域。
1.4简单结构操作(添加、删除、重命名)节点
思路:保存点击节点的父节点id,异步执行相关数据库操作,然后根据保存的id重新加载子节点。
1.5仿windows右键操作
思路:用Jquery的contextmenu事件可以很方便的实现该效果,需要注意的是控制右键菜单出现在树结构上的位置和左击页面任意地方要能隐藏右键菜单(暂不支持二级菜单)。
1.6追踪定位
思路:某些操作(删除、添加等)会改变树结构布局,树结构需要刷新,为了良好的用户体验,需要尽量使树结构刷新后保持原来形状和位置。有时树展开的子节点太多,导致DIV出现滚动条,就需要捕捉offsetTop属性了。
二、session的三种保存机制
1. Session丢失的原因
1.1 Web.config被修改了或者杀毒软件扫描了Web.Config
解决办法是:使杀病毒软件屏蔽扫描Web.Config文件,程序运行时自己也不要去编辑它。
1.2 程序内部误调释放Session的代码或者服务器内存不足
解决办法是:检查代码有无Session.Abandon()之类的代码,谨慎使用Session.Abandon()。
1.3 程序有框架页面和跨域情况
解决办法是:在Window服务中将ASP.NET State Service 启动
1.4 IIS进程重启或崩溃
由于Asp.net程序是默认配置,在默认配置中sessionState标签有个属性mode,它可以有3种取值:InProc、State Service、SQLServer。默认情况下是InProc,也就是将Session保存在进程内(IIS5是aspnet_wp.exe,而IIS6是W3wp.exe),这个进程不稳定,在某些事件发生时,进程会重起,甚至崩溃,所以造成了存储在该进程内的Session丢失。
解决方法:将mode取值StateService或SQLServer可避免这种原因导致Session丢失。
2. Session保存机制--寄存IIS进程(默认)
Session保存机制默认情况下是InProc,也就是将Session保存在进程内,这个进程不稳定,在某些事件发生时,进程会重起,所以造成了存储在该进程内的Session丢失。 因此,一般会采用session寄存在State Service进程或者寄存在数据库中。
3. Session保存机制--寄存State Service进程
3.1 采用寄存State Service进程的机制:首先要确保服务器已经打开了“ASP.NET状态服务”这项系统服务,打开后在任务管理器中就可以查看到名为aspnet_state.exe的进程。
3.2 配置web.config:127.0.0.1代表本机 42424是默认端口
<sessionState mode="StateServer"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="data source=127.0.0.1; Trusted_Connection=yes"
cookieless="false" timeout="20"/>
</sessionState>
4. Session保存机制--寄存数据库的实例
4.1配置SQL Server来存储Session状态,配置工作需要通过一个叫aspnet_regsql.exe的命令行工具来完成
格式为:aspnet_regsql.exe -S <SQL Server IP/服务器名> -U <User Name> -P <Password> -E -ssadd -sstype c -d <Database Name>
操作步骤:
开始>运行>cmd>C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regsql.exe -S . -U sa -P 123456 -ssadd -sstype c -d aspnetdb
此时,SQLServer中Session状态数据库中就生成相应的表和存储过程
4.2配置Web.config来存储Session状态
成功配置SQLServer服务器来支持存储Session状态后,下一步需要在ASP.NET Web应用程序中的Web.Config文件修改sessionState配置项以使Session状态数据库生效。
配置代码为:
<sessionState
mode="SQLServer"
sqlConnectionString="server=.\SQLEXPRESS;
database=**;user=**;pwd=**"
allowCustomSqlDatabase="true" cookieless="false" timeout="20">
</sessionState>
运行程序后,在数据库中就可以看到表[ASPStateTempSessions]中存放的数据:
5.Session三种保存机制的对比
三、代码效率
1. C#代码效率
1.1 优化循环体
循环是比较重复运行的地方,如果循环次数很大,循环体内不好的代码对效率的影响就会被放大而变的突出。
1 Vector vect = new Vector(1000); 2 ... 3 for( inti=0; i<vect.size(); i++){ 4 ... 5 } 6 int size = vect.size(); 7 for( int i=0; i < size; i++){ 8 ... 9 }
1.2 尽量减少new
尽量少用new来初始化一个类的实例,当一个对象是用new进行初始化时,其构造函数链的所有构造函数都被调用到,所以new操作符是很消耗系统资源的,new一个对象耗时往往是局部变量赋值耗时的上千倍。同时,当生成对象后,系统还要花时间进行垃圾回收和处理。尽量重复使用一个对象,而不是声明新的对象。尽量在使用时再创建该对象。
1 NewObject obj = new NewObject(); 2 int value = 0; 3 if (i > 0) { 4 value = obj.getValue(); 5 } 6 int value = 0; 7 if (i > 0){ 8 NewObject obj = new NewObject(); 9 value = obj.getValue(); 10 }
1.3 String与StringBuild的使用技巧
由于String 对象是引用类型,所以如果我们试图将两个String对象相加的时候,它实际的执行是产生一个中间对象StringBuilder ,并调用它的append ()法来进行相加的,最后调用StringBuilder的toString()方法来返回一个String对象,如果只是一般的相加差别不大,但是如果是在循环中,性能差距就较明显。