| 文升's profileMy SpacePhotosBlogLists | Help |
|
February 13 Windows 2003网络负载均衡的实现一、网络负载平衡的优点 August 09 asp.net将图片上传并存入SqlServer中一,上传并存入SqlServer 然后在后置代码文件UpPhoto.aspx.cs添加btnAdd按钮的单击事件处理代码: //连接数据库 SqlCommand cmd=new SqlCommand("UpdateImage",conn); cmd.Parameters.Add("@UpdateImage",SqlDbType.Image); //如果你希望不使用存储过程来添加图片把上面四句代码改为: conn.Open(); 二,从SqlServer中读取并显示出来 ShowPhoto.aspx主体代码:
1,存入sqlserver //连接数据库 SqlCommand cmd=new SqlCommand("UpdateImage",conn); cmd.Parameters.Add("@UpdateImage",SqlDbType.Image); conn.Open(); ms.Close(); 2,读取并显示在picturebox中 string strSql="select FImage from test where id=1"; SqlCommand cmd=new SqlCommand(strSql,conn); conn.Open(); MemoryStream ms=new MemoryStream((byte[])reader["FImage"]);
reader.Close(); ptbShow.Image=image;
然后在后置代码文件UpPhoto.aspx.cs添加btnAdd按钮的单击事件处理代码: //连接数据库 SqlCommand cmd=new SqlCommand("UpdateImage",conn); cmd.Parameters.Add("@UpdateImage",SqlDbType.Image); //如果你希望不使用存储过程来添加图片把上面四句代码改为: conn.Open(); 二,从SqlServer中读取并显示出来 ShowPhoto.aspx主体代码:
1,存入sqlserver //连接数据库 SqlCommand cmd=new SqlCommand("UpdateImage",conn); cmd.Parameters.Add("@UpdateImage",SqlDbType.Image); conn.Open(); ms.Close(); 2,读取并显示在picturebox中 string strSql="select FImage from test where id=1"; SqlCommand cmd=new SqlCommand(strSql,conn); conn.Open(); MemoryStream ms=new MemoryStream((byte[])reader["FImage"]);
reader.Close(); ptbShow.Image=image; javascript用回车键实现Tab键功能我前段时间看了MS的ASP.NET讲座,在里面谈到了如何让"回车键"使文本框的焦点一个个下移.其中提了三种方法,最好的一种是这样的: 用客户端脚本在页面添加document的onkeydown事件,让页面在接受到回车事件后,进行Tab键的功能,即只要把event的keyCode由13变为9 VBScript代码: <script language="vbscript"> sub document_onkeydown if event.keyCode=13 then event.keyCode=9 end if end sub </script> Javascript代码如下: <script language="javascript" for="document" event="onkeydown"> <!-- if(event.keyCode==13) event.keyCode=9; --> </script> 这样的处理方式,可以实现焦点往下移动,但对于按钮也起同样的作用,一般的客户在输入完资料以后,跳到按钮后,最好能直接按"回车"进行数据的提交.因此,对上面的方法要进行一下修改,应该对于"提交"按钮不进行焦点转移.而直接激活提交.
因此我对上面的代码进行了一个修改,即判断事件的"源",是否为提交按钮,代码如下: <script language="javascript" for="document" event="onkeydown"> <!-- if(event.keyCode==13 && event.srcElement.type!='button' && event.srcElement.type!='submit' && event.srcElement.type!='reset' && event.srcElement.type!='textarea' && event.srcElement.type!='') event.keyCode=9; --> </script> 判断是否为button, 是因为在HTML上会有type="button" 判断是否为submit,是因为HTML上会有type="submit" 判断是否为reset,是因为HTML上的"重置"应该要被执行 判断是否为空,是因为对于HTML上的"<a>链接"也应该被执行,这种情况发生的情况不多,可以使用"tabindex=-1"的方式来取消链接获得焦点. August 01 C#格式化
June 12 Visual Studio.NET快捷键Visual Studio.NET快捷键[ 2005-07-12 17:28:51 | 作者: admin ]
正则表达式小结正则表达式小结[ 2005-07-16 10:22:54 | 作者: admin ] 配中文字符的正则表达式: [\u4e00-\u9fa5] 匹配双字节字符(包括汉字在内):[^\x00-\xff] 应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1) String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;} 匹配空行的正则表达式:\n[\s| ]*\r 匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/ 匹配首尾空格的正则表达式:(^\s*)|(\s*$) 利用正则表达式限制网页表单里的文本框输入内容: 用正则表达式限制只能输入中文:onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))" 用正则表达式限制只能输入全角字符: onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))" 用正则表达式限制只能输入数字:onkeyup="value=value.replace(/[^\d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))" 用正则表达式限制只能输入数字和英文:onkeyup="value=value.replace(/[\W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))" 正则表达式,相关链接 http://blog.csdn.net/laily/category/19548.aspx http://blog.csdn.net/laily/archive/2004/06/30/30525.aspx 微软的正则表达式教程(五):选择/编组和后向引用 http://blog.csdn.net/laily/archive/2004/06/30/30522.aspx 微软的正则表达式教程(四):限定符和定位符 http://blog.csdn.net/laily/archive/2004/06/30/30517.aspx 微软的正则表达式教程(三):字符匹配 http://blog.csdn.net/laily/archive/2004/06/30/30514.aspx 微软的正则表达式教程(二):正则表达式语法和优先权顺序 http://blog.csdn.net/laily/archive/2004/06/30/30511.aspx 微软的正则表达式教程(一):正则表达式简介 http://blog.csdn.net/laily/archive/2004/06/30/30360.aspx 小程序大作为:高级查找/替换、正则表达式练习器、Javascript脚本程序调试器 "^\d+$" //非负整数(正整数 + 0) "^[0-9]*[1-9][0-9]*$" //正整数 "^((-\d+)|(0+))$" //非正整数(负整数 + 0) "^-[0-9]*[1-9][0-9]*$" //负整数 "^-?\d+$" //整数 "^\d+(\.\d+)?$" //非负浮点数(正浮点数 + 0) "^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$" //正浮点数 "^((-\d+(\.\d+)?)|(0+(\.0+)?))$" //非正浮点数(负浮点数 + 0) "^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$" //负浮点数 "^(-?\d+)(\.\d+)?$" //浮点数 "^[A-Za-z]+$" //由26个英文字母组成的字符串 "^[A-Z]+$" //由26个英文字母的大写组成的字符串 "^[a-z]+$" //由26个英文字母的小写组成的字符串 "^[A-Za-z0-9]+$" //由数字和26个英文字母组成的字符串 "^\w+$" //由数字、26个英文字母或者下划线组成的字符串 "^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$" //email地址 "^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$" //url /^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/ // 年-月-日 /^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/ // 月/日/年 "^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$" //Emil "(d+-)?(d{4}-?d{7}|d{3}-?d{8}|^d{7,8})(-d+)?" //电话号码 "^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$" //IP地址 ^([0-9A-F]{2})(-[0-9A-F]{2}){5}$ //MAC地址的正则表达式 ^[-+]?\d+(\.\d+)?$ //值类型正则表达式 "^\\d+$" //非负整数(正整数 + 0) "^[0-9]*[1-9][0-9]*$" //正整数 "^((-\\d+)|(0+))$" //非正整数(负整数 + 0) "^-[0-9]*[1-9][0-9]*$" //负整数 "^-?\\d+$" //整数 "^\\d+(\\.\\d+)?$" //非负浮点数(正浮点数 + 0) "^(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*))$" //正浮点数 "^((-\\d+(\\.\\d+)?)|(0+(\\.0+)?))$" //非正浮点数(负浮点数 + 0) "^(-(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*)))$" //负浮点数 "^(-?\\d+)(\\.\\d+)?$" //浮点数 ^[0-9A-Za-z_ ]+(.[jJ][pP][gG]|.[gG][iI][fF])$ //上传文件格式只能是.gif或.jpg ^(((19)|(20))\d{2})(((((-|/)0?)|0)[1-9])|((-|/)?1[0-2]))((((((-|/)0?)|0)[1-9])|((-|/)?[1-2][0-9]))|((-|/)?3[0-1]))$ //日期格式判断 ^[\u4E00-\u9FA5]*$ //任意中文 [^'^“^”^\^!^@^#^$^%^\^^&^*^(^)^<^>^《^》^?^。^,^?^¥^\{^\}^\][^\]]{2,} //图片标题至少2个字符,不应包含'“ ” ! @ # $ % ^ & * ( ) < > 《 》{ } [ ] ? 。,? ¥ asp.net 正确获取当前URL获取当前URL我一直使用HttpContext.Current.Request.Url.ToString(),今天Tinyfool指出我的一个Bug,调试发现,ToString()函数并不可靠。 如果当前URL为 http://localhost/search.aspx?user=tinyfool&tag=%BC%BC%CA%F5 通过HttpContext.Current.Request.Url.ToString()获取到的却是 http://localhost/search.aspx?user=tinyfool&tag=¼¼Êõ 这显然不对,怎么办?用HttpContext.Current.Request.Url.PathAndQuery好了,这个得到的正确的。:) June 09 保存页面function savePage(text)
{ if(document.queryCommandEnabled('saveAS')) { var para = 'toolbar=0,titlebar=0,menubar=0,resizable=0,Height=7,Width=8,status=0,top=2000,left=2000,scrollbars=0'; win=open('about:blank','',para); win.charset='GB2312'; win.document.write(text); win.document.execCommand('SaveAs',true,'data.htm'); win.close(); } }
function savePageASxls(text,title) { if(document.queryCommandEnabled('saveAS')) { var para = 'toolbar=0,titlebar=0,menubar=0,resizable=0,Height=7,Width=8,status=0,top=2000,left=2000,scrollbars=0'; win=open('about:blank','',para); win.charset='GB2312'; win.document.write(text); win.document.execCommand('SaveAs',true,title + '.xls'); win.close(); } } June 06 双击复制下面当前页面地址,发送给朋友!<script> function copyCode(o){o.select();var js=o.createTextRange();js.execCommand("Copy");alert("复制成功!");} document.write("<textarea onfocus=this.select() style='width:88%;overflow-y:visible;' ondblclick=copyCode(this) rows=1>"); document.write(self.location+"</textarea>"); </script> May 28 常用正则表达式"^\d+$" //非负整数(正整数 + 0) "^[0-9]*[1-9][0-9]*$" //正整数 "^((-\d+)|(0+))$" //非正整数(负整数 + 0) "^-[0-9]*[1-9][0-9]*$" //负整数 "^-?\d+$" //整数 "^\d+(\.\d+)?$" //非负浮点数(正浮点数 + 0) "^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$" //正浮点数 "^((-\d+(\.\d+)?)|(0+(\.0+)?))$" //非正浮点数(负浮点数 + 0) "^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$" //负浮点数 "^(-?\d+)(\.\d+)?$" //浮点数 "^[A-Za-z]+$" //由26个英文字母组成的字符串 "^[A-Z]+$" //由26个英文字母的大写组成的字符串 "^[a-z]+$" //由26个英文字母的小写组成的字符串 "^[A-Za-z0-9]+$" //由数字和26个英文字母组成的字符串 "^\w+$" //由数字、26个英文字母或者下划线组成的字符串 "^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$" //email地址 "^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$" //url/^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/ // 年-月-日 /^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/ // 月/日/年 "^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$" //Emil "(d+-)?(d{4}-?d{7}|d{3}-?d{8}|^d{7,8})(-d+)?" //电话号码 "^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$" //IP地址 首先引入命名空间 May 24 网页快捷键accesskey刚刚看到了一个网站上讲用accesskey可以定义一个快捷键,比如下面语法: <a href="/" accesskey="H"><span class="underline">H</span>ome</a>span的underline class是为了让H下面出现一个下划线,是我自己定义的。这样你的网页就能看到:Home 这样的效果了,当你按下alt+H时,会发现一个虚框出现在Home的周围了,也就是说此时的focus时落在这里了,按下enter或sapce都可以相当于点击它了,对于残疾人可以起到很大的帮助作用。 accesskey的优先级是最高点 ,可以屏蔽掉浏览器的快捷键。但是在没有这种的accesskey的网页上你按下alt+H是什么结果呢?可以看到的是“帮助”啊!自己站上的东西千万不要和IE等的工具冲突。这里列举一下默认&组合: IE: A(favorites) D(address) E(edit) F(file) H(help) T(tools) V(view) FireFox:B(bookmark) D(address) E(edit) F(file) G(goto) H(help) T(tools) V(view) May 15 如何下载网页?如何下载网页?首先使用 System.Net.WebRequestFactory 类来获得一个 WebRequest 对象: WebRequest request = WebRequestFactory.Create( "http://localhost" ); 然后请求应答: WebResponse response = request.GetResponse(); GetResponse 方法被阻塞直到下载完成。然后你能像下面那样访问应答流: Stream s = response.GetResponseStream(); // Output the downloaded stream to the console StreamReader sr = new StreamReader( s ); string line; while( (line = sr.ReadLine()) != null ) Console.WriteLine( line ); 注意 WebRequest 和 WebReponse 对象分别向下兼容 HttpWebRequest 和 HttpWebReponse 对象,它们被用来访问和 http 相关的功能。 如何使用代理服务器 (proxy)?两种—这样做以便影响所有 Web 请求: System.Net.GlobalProxySelection.Select = new DefaultControlObject( "proxyname", 80 ); 另外一种,要想对特定的 Web 请求设置代理服务,这样做: ProxyData proxyData = new ProxyData(); proxyData.HostName = "proxyname"; proxyData.Port = 80; proxyData.OverrideSelectProxy = true; HttpWebRequest request = (HttpWebRequest)WebRequestFactory.Create( "http://localhost" ); request.Proxy = proxyData; April 28 开源项目网址
ASP.Net中让网页“立即过时”让网页“立即过时”有时候是一个很有用的功能,比如防止用户使用后退来破坏程序逻辑;程序主动刷新某个页面等等。 第一种方法: 在ASP.NET中使用下面的语句就能实现这个功能。 Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache); 备注:这种方法似乎只有IE的结果是对的,Firefox好像不行。。。。。。 第二种支持所有浏览器的方法: 在页面中添加如下代码: <META HTTP-EQUIV="Pragma" CONTENT="no-cache"> <META HTTP-EQUIV="Cache-Control" CONTENT="no-cache"> <META HTTP-EQUIV="Expires" CONTENT="-1"> 更多信息可以参考: http://support.microsoft.com/default.aspx?scid=kb;zh-cn;234067 弹出的窗口之定时关闭控制【弹出的窗口之定时关闭控制】 下面我们再对弹出窗口进行【弹出的窗口之定时关闭控制】 下面我们再对弹出窗口进行一些控制,效果就更好了。如果我们再将一小段代码加入弹出的页面(注意是加入到page.html的HTML中,可不是主页面中,否则…),让它在10秒钟后自动关闭是不是更酷了? 首先,将如下代码加入page.html文件的<head>区: <script language="javascript"> function closeit() { setTimeout("self.close()",10000) file://毫秒 } </script> 然后,再用<body onload="closeit()">这一句话代替page.html中原有的<BODY>这一句就可以了。(这一句话千万不要忘记写啊!这一句的作用是调用关闭窗口的代码,10秒钟后就自行关闭该窗口。) 一些控制,效果就更好了。如果我们再将一小段代码加入弹出的页面(注意是加入到page.html的HTML中,可不是主页面中,否则…),让它在10秒钟后自动关闭是不是更酷了? 首先,将如下代码加入page.html文件的<head>区: <script language="javascript"> function closeit() { setTimeout("self.close()",10000) file://毫秒 } </script> 然后,再用<body onload="closeit()">这一句话代替page.html中原有的<BODY>这一句就可以了。(这一句话千万不要忘记写啊!这一句的作用是调用关闭窗口的代码,10秒钟后就自行关闭该窗口。) April 24 javascript:类型转换"javascript:类型转换" 在表达式中使用变量时,JavaScript会自动地将一种类型值变成另一种类型。也就是说在表达式中可有不同类型的数据组合,JavaScript在运算时完成使表达式有意义所必需的类型转换。在JavaScript中类型的转换是按其运算的优先级进行的,一般来说,字符串运算的优先级较高,然后依次是浮点运算、整型运算和逻辑运算。 例如:表达式"test"+5,先将数字5转换成字符串"5",并附加到字符串"test"后面,结果为"test"+5 注意:所有情况下,非字符串运算符使用字符串运算时,JavaScript都将其运算符转变成字符串: * 数字值转换为相应的字符串值。 * 布尔值转换为1和0以支持数字运算。 * null值变成字符串运算的"null"或布尔false或数字运算0。 ======================================== 函数(Function)是进行特定任务的一组JavaScript代码,通常返回一个值。函数可能没有参数或有多个参数。参数指定函数要处理的数据。 JavaScript提供了3个显式的类型转换函数,分别是eval()、parseInt()和parseFloat()。 eval()函数:将字符串表达式转换成数字值。例如,语句total=eval("432.1*10")的结果是total=4321即将数值4321赋予total变量。 parseInt()函数:把字符串转换成整数。返回是从字符串的第一个字符开始,如果字符不是以整数开头则返回0。parseInt()函数还可以转换十六进制数或十进制数。 例如:parseInt("123xyz") 返回123,而parseInt("xyz")返回0。 parseFloat()函数:类似于parseInt()函数,它返回字符串上包含的第一个浮点数。如果字符串不以有效浮点数开头,则返回0。 例如:parseFloat("2.1e4xyz")返回21000;而parseFloat("xyz")返回0。 December 28 如何在传统 ASP 和 ASP.NET 之间共享会话状态简介Microsoft ASP.NET 是最新的 Microsoft 技术,用于开发基于 Web 的应用程序。相比传统的 ASP 脚本技术而言,它具有很多优点,其中包括:1) 将 UI 表示形式从业务逻辑中分离出来,从而提供更好的开发结构; 2) 其代码是完全编译的,而在传统 ASP 中代码是解释的;和 3) 其编译特性结合其高速缓存支持,就意味着相对用传统 ASP 编写的等效站点而言,使用 ASP.NET 编写的站点的性能有显著提高。 尽管将现有的 ASP 应用程序转换到 ASP.NET 具有潜在的益处,但很多现有的 ASP 应用程序都具有关键的使命并且是相当复杂的。这种转换过程可能需要大量资源,并可能给现有的应用程序带来额外的风险。要解决这些问题,一种方法就是同时运行 ASP 和 ASP.NET,并一次只将应用程序的一部分转换为 ASP.NET。为了同时运行新的和旧的应用程序,就需要一种机制在传统 ASP 和 ASP.NET 之间共享会话状态。在本文中,我将讨论如何利用 Microsoft.NET 框架的若干类和序列化特性来共享这些会话状态。 概念综述Cookie 是 Web 应用程序用来标识用户会话的最常用方法,可供传统 ASP 和 ASP.NET 二者用来标识会话状态。而用 ASP 脚本将会话状态信息存储在内存中,且不能与其他应用程序(如 ASP.NET)共享。如果会话状态以一种通用格式存储在 Microsoft SQL Server 中,则传统的 ASP 和 ASP.NET 都能访问会话状态。 在此示例中,使用了一个名为 mySession 的 cookie 来标识用户会话。当用户向 Web 应用程序发出请求时,该用户将被发放一个唯一的 cookie 以便标识该会话。在后续的请求中,浏览器将该唯一的 cookie 发送回服务器以标识该会话。在加载所请求的 Web 页面之前,一个自定义的对象将利用该唯一 cookie 从 SQL Server 中重新加载用户会话数据。在 Web 页面中通过该自定义的对象即可访问会话状态。在 Web 请求结束后,随着该请求的终止,会话数据将被保存回 SQL Server 中(参见图 1)。 ![]() 图 1. 示例数据流 ASP.NET 实现在 ASP.NET 中,每个 Web 页面都是从 System.Web.UI.Page 类派生出来的。Page 类中包含 HttpSession 对象的一个实例以用于会话数据。在本示例中,从 System.Web.UI.Page 派生了一个名为 SessionPage 的自定义 Page 类,以实现与 Page 类完全相同的各种特性。派生页的唯一不同之处就是利用一个自定义的会话对象重写了默认的 HttpSession。(利用实例变量的 new 修饰符,C# 允许派生类隐藏基类的成员。) public class SessionPage : System.Web.UI.Page
{
...
public new mySession Session = null;
...
}
自定义的会话类负责利用 HybridDictionary 对象将会话状态存储到内存中。(HybridDictionary 能够高效地处理任何数量的会话元素。)为了实现与传统 ASP 之间的互操作性,该自定义的会话类将会话数据类型限定为仅允许字符串型。(默认的 HttpSession 允许将任何类型的数据存储在会话中,而这将不能与传统 ASP 互操作。) [Serializable]
public class mySession
{
private HybridDictionary dic = new HybridDictionary();
public mySession()
{
}
public string this [string name]
{
get
{
return (string)dic[name.ToLower()];
}
set
{
dic[name.ToLower()] = value;
}
}
}
Page 类公开不同的事件和方法以供进行自定义。特别地,OnInit 方法用于设置 Page 对象的初始化状态。如果该请求不具有 mySession cookie,则将给请求者发放一个新的 mySession cookie。否则,将利用一个自定义的数据访问对象(SessionPersistence)从 SQL Server 中检索会话数据。dsn 和 SessionExpiration 值是从 web.config 中检索的。 override protected void OnInit(EventArgs e)
{
InitializeComponent();
base.OnInit(e);
}
private void InitializeComponent()
{
cookie = this.Request.Cookies[sessionPersistence.SessionID];
if (cookie == null)
{
Session = new mySession();
CreateNewSessionCookie();
IsNewSession = true;
}
else
Session = sessionPersistence.LoadSession(
Server.UrlDecode(cookie.Value).ToLower().Trim(),
dsn,
SessionExpiration
);
this.Unload += new EventHandler(this.PersistSession);
}
private void CreateNewSessionCookie()
{
cookie = new HttpCookie(sessionPersistence.SessionID,
sessionPersistence.GenerateKey());
this.Response.Cookies.Add(cookie);
}
为了获得最佳性能,SessionPersistence 类利用 Microsoft .NET 框架的 BinaryFormatter,以二进制格式对会话状态进行序列化和反序列化。随后,可以将所得到的二进制会话状态数据以 art 字段类型存储在 SQL Server 中。 public mySession LoadSession(string key, string dsn,
int SessionExpiration)
{
SqlConnection conn = new SqlConnection(dsn);
SqlCommand LoadCmd = new SqlCommand();
LoadCmd.CommandText = command;
LoadCmd.Connection = conn;
SqlDataReader reader = null;
mySession Session = null;
try
{
LoadCmd.Parameters.Add("@ID", new Guid(key));
conn.Open();
reader = LoadCmd.ExecuteReader();
if (reader.Read())
{
DateTime LastAccessed =
reader.GetDateTime(1).AddMinutes(SessionExpiration);
if (LastAccessed >= DateTime.Now)
Session = Deserialize((Byte[])reader["Data"]);
}
}
finally
{
if (reader != null)
reader.Close();
if (conn != null)
conn.Close();
}
return Session;
}
private mySession Deserialize(Byte[] state)
{
if (state == null) return null;
mySession Session = null;
Stream stream = null;
try
{
stream = new MemoryStream();
stream.Write(state, 0, state.Length);
stream.Position = 0;
IFormatter formatter = new BinaryFormatter();
Session = (mySession)formatter.Deserialize(stream);
}
finally
{
if (stream != null)
stream.Close();
}
return Session;
}
当该请求结束时,将激发 Page 类的 Unload 事件,注册用于 Unload 事件的事件处理程序将会话数据序列化成二进制格式,并将所得的二进制数据保存到 SQL Server 中。 private void PersistSession(Object obj, System.EventArgs arg)
{ sessionPersistence.SaveSession(
Server.UrlDecode(cookie.Value).ToLower().Trim(),
dsn, Session, IsNewSession);
}
public void SaveSession(string key, string dsn,
mySession Session, bool IsNewSession)
{
SqlConnection conn = new SqlConnection(dsn);
SqlCommand SaveCmd = new SqlCommand();
SaveCmd.Connection = conn;
try
{
if (IsNewSession)
SaveCmd.CommandText = InsertStatement;
else
SaveCmd.CommandText = UpdateStatement;
SaveCmd.Parameters.Add("@ID", new Guid(key));
SaveCmd.Parameters.Add("@Data", Serialize(Session));
SaveCmd.Parameters.Add("@LastAccessed", DateTime.Now.ToString());
conn.Open();
SaveCmd.ExecuteNonQuery();
}
finally
{
if (conn != null)
conn.Close();
}
}
private Byte[] Serialize(mySession Session)
{
if (Session == null) return null;
Stream stream = null;
Byte[] state = null;
try
{
IFormatter formatter = new BinaryFormatter();
stream = new MemoryStream();
formatter.Serialize(stream, Session);
state = new Byte[stream.Length];
stream.Position = 0;
stream.Read(state, 0, (int)stream.Length);
stream.Close();
}
finally
{
if (stream != null)
stream.Close();
}
return state;
}
SessionPage 类及其相关类都封装在 SessionUtility 程序集中。在新的 ASP.NET 项目中,将建立一个对该 SessionUtility 程序集的引用,并且为了与传统 ASP 代码共享会话,将从 SessionPage 而不是 Page 类派生出每个页面。一旦完成迁移过程,通过注释掉 SessionPage 类中的 Session 变量声明即可解除基类 HttpSession 的隐藏,从而新的应用程序可切换回使用本机的 HttpSession 对象。 ASP 实现本机的 ASP 会话只能将会话数据存储在内存中。为了将会话数据存储到 SQL Server 中,我们编写了一个自定义的 Microsoft Visual Basic6.0 COM 对象以管理会话状态,而不使用本机的会话对象进行管理。这个 COM 对象将在每个 Web 请求开始时得以实例化,并从 SQL Server 处重新加载会话数据。当 ASP 脚本完成时,此对象将终止,并且会话状态将被保存回 SQL Server 中。 Visual Basic 6 COM Session 对象的主要目的就是提供对 Microsoft Internet Information Server 内部对象的访问。Visual Basic 6.0 COM Session 对象使用 SessionUtility 程序集的 mySession 类来保留会话状态,并使用 SessionUtility 的 SessionPersistence 类从 SQL Server 中加载会话数据或将会话数据保存回 SQL Server。利用 regasm.exe 实用工具,mySession 和 SessionPersistence 类可被公开为 COM 对象。regasm.exe 实用工具能够注册并创建一个类库,以便 COM 客户端使用各个框架类。 在该对象的构造过程中,会话状态信息得以重新加载。构造函数 (class_initialize) 将首先从 Application 对象中检索会话 cookie、会话超时 (SessionTimeOut) 和数据库连接字符串 (SessionDSN),并创建 mySession 类的一个实例以持有这些会话数据。然后,构造函数将尝试利用给定的 cookie 从 SQL Server 中重新加载会话数据。如果 SQL Server 不包含相应的会话信息,或者该会话已经过期,则将发放一个新的 cookie。如果 SQL Sever 确实返回会话状态数据,则这些会话状态将被存储在 mySession 对象中。 Private Sub Class_Initialize()
On Error GoTo ErrHandler:
Const METHOD_NAME As String = "Class_Initialize"
Set mySessionPersistence = New SessionPersistence
Set myObjectContext = GetObjectContext()
mySessionID = ReadSessionID()
myDSNString = GetConnectionDSN()
myTimeOut = GetSessionTimeOut()
myIsNewSession = False
Call InitContents
Exit Sub
ErrHandler:
Err.Raise Err.Number, METHOD_NAME & ":" & Err.Source, Err.Description
End Sub
Private Sub InitContents()
On Error GoTo ErrHandler:
Const METHOD_NAME As String = "InitContents"
If mySessionID = "" Then
Set myContentsEntity = New mySession
mySessionID = mySessionPersistence.GenerateKey
myIsNewSession = True
Else
Set myContentsEntity =
mySessionPersistence.LoadSession(mySessionID, myDSNString, myTimeOut)
End If
Exit Sub
ErrHandler:
Err.Raise Err.Number, METHOD_NAME & ":" & Err.Source, Err.Description
End Sub
当该对象实例超出脚本的作用范围时,析构函数 (class_terminate) 将执行。析构函数将利用 SessionPersistence.SaveSession() 方法保持会话数据。如果这是新会话,析构函数还会向浏览器回送一个新 cookie。 Private Sub Class_Terminate()
On Error GoTo ErrHandler:
Const METHOD_NAME As String = "Class_Terminate"
Call SetDataForSessionID
Exit Sub
ErrHandler:
Err.Raise Err.Number, METHOD_NAME & ":" & Err.Source, Err.Description>
End Sub
Private Sub SetDataForSessionID()
On Error GoTo ErrHandler:
Const METHOD_NAME As String = "SetDataForSessionID"
Call mySessionPersistence.SaveSession(mySessionID,
myDSNString, myContentsEntity, myIsNewSession)
If myIsNewSession Then Call WriteSessionID(mySessionID)
Set myContentsEntity = Nothing
Set myObjectContext = Nothing
Set mySessionPersistence = Nothing
Exit Sub
ErrHandler:
Err.Raise Err.Number, METHOD_NAME & ":" & Err.Source, Err.Description
End Sub
单击本文顶部的链接,您可以下载 ASP.NET SessionUtility 项目的源代码 — COM 会话管理器和演示代码。 演示程序本演示程序的设计目的为递增并显示一个数字。不管加载哪个页面,该数字将总是递增,因为其数值存储在 SQL Server 中且在传统 ASP 和 ASP.NET 之间共享。 演示程序的设置步骤
演示程序的运行步骤
在现有的 ASP 应用程序中嵌入 COM 对象在开发 ASP 应用程序时,惯例是在每个脚本的开始处包含一个文件以便共享公共代码和常量。要加入自定义的会话对象,最佳的方法就是在公共的包含文件中添加相应的实例化代码。最后一个步骤就是将对该会话对象的全部引用替换为自定义的会话变量名。 局限性/改进如果现有的 ASP 应用程序将一个 COM 对象存储在 Session 对象中,则此解决方案并不支持这种情况。在这种情况下,需要一个自定义的封送拆收器来序列化/反序列化各种状态,以便使用自定义的会话对象。此外,此解决方案不支持存储字符串类型数组。但只需稍加努力,我们就可利用 Microsoft Visual Basic6.0 Join 函数将所有的数组元素组合成单个字符串,然后再将其存入会话对象中,从而实现这种功能。利用 Visual Basic 6.0 Split 函数将该字符串分解成单独的数组元素即可完成反向操作。在 .NET 框架方面,Join 和 Split 方法都是 String 类的成员。 小结ASP.NET 代表了一种全新的编程典范和结构,并且比传统的 ASP 具有更多优势。虽然从 ASP 迁移到 ASP.NET 并不是一个简单的过程,但 ASP.NET 更好的编程模型和更高的性能使得这种转换过程物有所值。除了将 COM 对象存储在 Session 对象中的情况外,本文所述的方法提供了一种解决方案,使得这种迁移过程更加简单。 关于作者 Billy Yuen 就职于北加州的 Microsoft 硅谷技术中心。此中心致力于开发 Microsoft .NET 框架解决方案。如果希望与他联系,可发送电子邮件至billyy@microsoft.com。 JavaScript事件综合查询click() 对象.click() 使对象被点击。 closed 对象.closed 对象窗口是否已关闭true/false clearTimeout(对象) 清除已设置的setTimeout对象 clearInterval(对象) 清除已设置的setInterval对象 confirm("提示信息") 弹出确认框,确定返回true取消返回false cursor:样式 更改鼠标样式 hand crosshair text wait help default auto e/s/w/n-resize event.clientX 返回最后一次点击鼠标X坐标值; event.clientY 返回最后一次点击鼠标Y坐标值; event.offsetX 返回当前鼠标悬停X坐标值 event.offsetY 返回当前鼠标悬停Y坐标值 document.write(document.lastModified) 网页最后一次更新时间 document.ondblclick=x 当双击鼠标产生事件 document.onmousedown=x 单击鼠标键产生事件 document.body.scrollTop; 返回和设置当前竖向滚动条的坐标值,须与函数配合, document.body.scrollLeft; 返回和设置当前横向滚动务的坐标值,须与函数配合, document.title document.title="message"; 当前窗口的标题栏文字 document.bgcolor document.bgcolor="颜色值"; 改变窗口背景颜色 document.Fgcolor document.Fgcolor="颜色值"; 改变正文颜色 document.linkcolor document.linkcolor="颜色值"; 改变超联接颜色 document.alinkcolor document.alinkcolor="颜色值"; 改变正点击联接的颜色 document.VlinkColor document.VlinkColor="颜色值"; 改变已访问联接的颜色 document.forms.length 返回当前页form表单数 document.anchors.length 返回当前页锚的数量 document.links.length 返回当前页联接的数量 document.onmousedown=x 单击鼠标触发事件 document.ondblclick=x 双击鼠标触发事件 defaultStatus window.status=defaultStatus; 将状态栏设置默认显示 function function xx(){...} 定义函数 isNumeric 判断是否是数字 innerHTML xx=对象.innerHTML 输入某对象标签中的html源代码 innerText divid.innerText=xx 将以div定位以id命名的对象值设为XX location.reload(); 使本页刷新,target可等于一个刷新的网页 Math.random() 随机涵数,只能是0到1之间的数,如果要得到其它数,可以为*10,再取整 Math.floor(number) 将对象number转为整数,舍取所有小数 Math.min(1,2) 返回1,2哪个小 Math.max(1,2) 返回1,2哪个大 navigator.appName 返回当前浏览器名称 navigator.appVersion 返回当前浏览器版本号 navigator.appCodeName 返回当前浏览器代码名字 navigator.userAgent 返回当前浏览器用户代标志 onsubmit onsubmit="return(xx())" 使用函数返回值 opener opener.document.对象 控制原打开窗体对象 prompt xx=window.prompt("提示信息","预定值"); 输入语句 parent parent.框架名.对象 控制框架页面 return return false 返回值 random 随机参数(0至1之间) reset() form.reset(); 使form表单内的数据重置 split("") string.split("") 将string对象字符以逗号隔开 submit() form对象.submit() 使form对象提交数据 String对象的 charAt(x)对象 反回指定对象的第多少位的字母 lastIndexOf("string") 从右到左询找指定字符,没有返回-1 indexOf("string") 从左到右询找指定字符,没有返回-1 LowerCase() 将对象全部转为小写 UpperCase() 将对象全部转为大写 substring(0,5) string.substring(x,x) 返回对象中从0到5的字符 setTimeout("function",time) 设置一个超时对象 setInterval("function",time) 设置一个超时对象 toLocaleString() x.toLocaleString() 从x时间对象中获取时间,以字符串型式存在 typeof(变量名) 检查变量的类型,值有:String,Boolean,Object,Function,Underfined window.event.button==1/2/3 鼠标键左键等于1右键等于2两个键一起按为3 window.screen.availWidth 返回当前屏幕宽度(空白空间) window.screen.availHeight 返回当前屏幕高度(空白空间) window.screen.width 返回当前屏幕宽度(分辨率值) window.screen.height 返回当前屏幕高度(分辨率值) window.document.body.offsetHeight; 返回当前网页高度 window.document.body.offsetWidth; 返回当前网页宽度 window.resizeTo(0,0) 将窗口设置宽高 window.moveTo(0,0) 将窗口移到某位置 window.focus() 使当前窗口获得焦点 window.scroll(x,y) 窗口滚动条坐标,y控制上下移动,须与函数配合 window.open() window.open("地址","名称","属性") 属性:toolbar(工具栏),location(地址栏),directions,status(状态栏), menubar(菜单栏),scrollbar(滚动条),resizable(改变大小), width(宽),height(高),fullscreen(全 屏),scrollbars(全屏时无滚动条无参 数,channelmode(宽屏),left(打开窗口x坐标),top(打开窗口y坐标) window.location = 'view-source:' + window.location.href 应用事件查看网页源代码; a=new Date(); //创建a为一个新的时期对象 y=a.getYear(); //y的值为从对象a中获取年份值 两位数年份 y1=a.getFullYear(); //获取全年份数 四位数年份 m=a.getMonth(); //获取月份值 d=a.getDate(); //获取日期值 d1=a.getDay(); //获取当前星期值 h=a.getHours(); //获取当前小时数 m1=a.getMinutes(); //获取当前分钟数 s=a.getSeconds(); //获取当前秒钟数 对象.style.fontSize="文字大小"; 单位:mm/cm/in英寸/pc帕/pt点/px象素/em文字高 1in=1.25cm 1pc=12pt 1pt=1.2px(800*600分辩率下) 文本字体属性: fontSize大小 family字体 color颜色 fontStyle风格,取值为normal一般,italic斜体,oblique斜体且加粗 fontWeight加粗,取值为100到900不等,900最粗,light,normal,bold letterSpacing间距,更改文字间距离,取值为,1pt,10px,1cm textDecoration:文字修饰;取值,none不修饰,underline下划线,overline上划线 background:文字背景颜色, backgroundImage:背景图片,取值为图片的插入路径 点击网页正文函数调用触发器: 1.onClick 当对象被点击 2.onLoad 当网页打开,只能书写在body中 3.onUnload 当网页关闭或离开时,只能书写在body中 4.onmouseover 当鼠标悬于其上时 5.onmouseout 当鼠标离开对象时 6.onmouseup 当鼠标松开 7.onmousedown 当鼠标按下键 8.onFocus 当对象获取焦点时 9.onSelect 当对象的文本被选中时 10.onChange 当对象的内容被改变 11.onBlur 当对象失去焦点 onsubmit=return(ss())表单调用时返回的值 直线 border-bottom:1x solid black 虚线 border-bottom:1x dotted black 点划线 border-bottom:2x dashed black 双线 border-bottom:5x double black 槽状 border-bottom:1x groove black 脊状 border-bottom:1x ridge black 1.边缘高光glow(color=颜色,strength=亮光大小)<br> 2.水平翻转fliph() 使对象水平翻转180度<br> 3.垂直翻转flipv() 使对象垂直翻转180度<br> 4.对象模糊blur(add=true/false direction=方向 strength=强度) add指定是否按印象画派进行模糊direction模糊方向strength模糊强度 5.对象透明alpha(opaction=0-100,finishopacity=0-100,style=0/1/2/3) opaction对象整体不透明值finishopacity当对象利用了渐透明时该项指定结束透明位置的不透明值style指定透明方式0为整体透明,1为线型透明,2为圆型透明,3为矩形透明 6.去除颜色chroma(color=颜色值)使对象中颜色与指定颜色相同区域透明 7.建立阴影dropshadow(color=阴影颜色,offx=水平向左偏离像素,offy=水平向下偏离像素) 8.去色gray()使对象呈灰度显示 9.负片效果invert()使对象呈底片效果 10.高光light()使对象呈黑色显示 11.遮盖mask(color=颜色)使整个对象以指定颜色进行蒙板一次 opacity 表透明度水平.0~100,0表全透明,100表完全不透明 finishopacity表想要设置的渐变透明效果.0~100. style 表透明区的形状.0表统一形状.1表线形.2表放射形.3表长方形. startx.starty表渐变透明效果的开始时X和Y坐标. finishx,finishy渐变透明效果结束时x,y 的坐标. add有来确定是否在模糊效果中使有原有目标.值为0,1.0表"否",1表"是". direction设置模糊的方向.0度表垂直向上,45度为一个单位.默认值是向左270度.left,right,down,up. strength 只能用整数来确定.代表有多少个像素的宽度将受到模糊影响.默认是5个. color要透明的颜色. offx,offy分别是x,y 方向阴影的偏移量. positive指投影方式.0表透明像素生成阴影.1表只给出不透明像素生成阴影.. AddAmbient:加入包围的光源. AddCone:加入锥形光源. AddPoint加入点光源 Changcolor:改变光的颜色. Changstrength:改变光源的强度. Clear:清除所有的光源. MoveLight:移动光源. freq是波纹的频率,在指定在对象上一区需要产生多少个完事的波纹. lightstrength可对于波纹增强光影的效果.显著0~100正整数,正弦波开始位置是0~360度.0表从0度开始,25表从90度开始. strength表振幅大小. hand style="cursor:hand" crosshair style="cursor:crosshair" text style="cursor:text" wait style="cursor:wait" default style="cursor:default" help style="cursor:help" e-resize style="cursor:e-resize" ne-resize style="cursor:ne-resize" n-resize style="cursor:n-resize" nw-resize style="cursor:nw-resize" w-resize style="cursor:w-resize" s-resize style="cursor:s-resize" sw-resize style="cursor:sw-resize " se-resize style="cursor:se-resize" auto style="cursor:auto" November 30 ASP.Net配置文件一、认识Web.config文件 |
|
|