社区
C#
帖子详情
asp.net 一般处理程序传参数含有中文会乱码
鱼歌
2012-03-28 04:51:14
ashx文件接收到的参数含有中文时就会出现乱码 怎么解决
context.Response.ContentType = "text/plain";
string conts = context.Request.QueryString["contents"];
...全文
302
13
打赏
收藏
asp.net 一般处理程序传参数含有中文会乱码
ashx文件接收到的参数含有中文时就会出现乱码 怎么解决 context.Response.ContentType = "text/plain"; string conts = context.Request.QueryString["contents"];
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
13 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
鱼歌
2012-03-28
打赏
举报
回复
[Quote=引用 12 楼 的回复:]
escape(参数)
[/Quote]
具体点 怎么用
zj25810
2012-03-28
打赏
举报
回复
escape(参数)
鱼歌
2012-03-28
打赏
举报
回复
[Quote=引用 10 楼 的回复:]
应该是可以的,这个是和编码有关!
[/Quote]
那有什么切实的好办法没
qianwan3
2012-03-28
打赏
举报
回复
应该是可以的,这个是和编码有关!
孟子E章
2012-03-28
打赏
举报
回复
[Quote=引用 8 楼 yylyhl 的回复:]
引用 6 楼 的回复:
人家传的是什么样子的?
进行Url编码是编写Web程序的基本知识。它要是传内容不进行编码,这样的内容能传过来吗?
xx.ashx?contents=a#b ?xx
就是不涉及到乱码,你能接收到a#b ?xx吗?
就是说 别人没编码就传过来 乱码这边也不能解决?
[/Quote]
也不是不能解决,就看传来的是什么样子的。
不过,进行编码后再传,是基本的做法。你可以跟对方说明
鱼歌
2012-03-28
打赏
举报
回复
[Quote=引用 6 楼 的回复:]
人家传的是什么样子的?
进行Url编码是编写Web程序的基本知识。它要是传内容不进行编码,这样的内容能传过来吗?
xx.ashx?contents=a#b ?xx
就是不涉及到乱码,你能接收到a#b ?xx吗?
[/Quote]
就是说 别人没编码就传过来 乱码这边也不能解决?
qianwan3
2012-03-28
打赏
举报
回复
或者指定为gb2312
孟子E章
2012-03-28
打赏
举报
回复
人家传的是什么样子的?
进行Url编码是编写Web程序的基本知识。它要是传内容不进行编码,这样的内容能传过来吗?
xx.ashx?contents=a#b +?xx
就是不涉及到乱码,你能接收到 完整的a#b +?xx吗?
qianwan3
2012-03-28
打赏
举报
回复
你把你的页面编码方式设置为UTF-8试下!
堆代码的爱因斯坦
2012-03-28
打赏
举报
回复
System.Web.HttpUtility.UrlEncode()
传递前编码
接收时解码
魏飞翔
2012-03-28
打赏
举报
回复
[Quote=引用 2 楼 的回复:]
引用 1 楼 的回复:
你传的时候需要进行编码
xx.ashx?contents=<%=Server.UrlEncode("中文")%>
问题是 我给别人提供接口 所以乱码什么的都要尽量在.ashx里解决 有什么好办法没 我试了好几种都不行
[/Quote]
不太明白 ,LZ 什么意思,孟总不都告诉你了吗 编码下
鱼歌
2012-03-28
打赏
举报
回复
[Quote=引用 1 楼 的回复:]
你传的时候需要进行编码
xx.ashx?contents=<%=Server.UrlEncode("中文")%>
[/Quote]
问题是 我给别人提供接口 所以乱码什么的都要尽量在.ashx里解决 有什么好办法没 我试了好几种都不行
孟子E章
2012-03-28
打赏
举报
回复
你传的时候需要进行编码
xx.ashx?contents=<%=Server.UrlEncode("中文")%>
关于
asp.net
中
中文
产生
乱码
问题
关于
asp.net
中
中文
产生
乱码
问题
ASP.NET
jquery.uploadify文件上传控件测试项目(已解决
中文
乱码
)
ASP.NET
jquery.uploadify文件上传控件测试项目(已解决
中文
乱码
)
C#编程经验技巧宝典
C#编程经验技巧宝典源代码,目录如下:第1章 开发环境 11.1 Visual Studio开发环境安装与配置 20001 安装Visual Studio 2005开发环境须知 20002 配置合适的Visual Studio 2005开发环境 20003 设置程序代码行序号 30004 开发环境全屏显示 30005 设置窗口的自动隐藏功能 30006 根据需要创建所需解决方案 40007 如何使用“验证的目标架构”功能 41.2 Visual Studio开发环境的使用 40008 为程序设置版本和帮助信息 40009 设置Windows应用程序启动窗体 50010 设置Web应用程序起始页 50011 如何设置程序的出错窗口 50012 如何进行程序调试 60013 如何结束不能正常运行的程序 60014 如何锁定窗体中的控件 60015 统一窗体中控件的字体设置 70016 通过“格式”菜单布局窗体 70017 起始页中的“Visual Studio开发人员新闻” 71.3 MSDN帮助的使用 80018 有效利用Visual Studio 2005附带程序 80019 有效使用MSDN帮助 90020 如何设置MSDN帮助 91.4 其他 100021 如何添加项目引用 100022 如何添加Web引用 100023 如何添加引用第3方控件 110024 如何生成DLL文件 110025 如何使用不安全代码 11第2章 语言基础 132.1 注释 140026 如何对代码进行注释 140027 #region、#endregion关键字的使用技巧 140028 “///”符号的使用技巧 140029 使用注释取消程序语句的执行 152.2 语句 150030 跳转语句GOTO的使用 150031 Continue语句的使用 160032 Break语句的使用 160033 Return语句的使用 170034 如何实现无限循环 170035 巧用foreach语句控制控件 180036 有效使用switch case语句 182.3 运算符 190037 如何使用引号赋值 190038 巧用“^=”运算符 190039 巧用位移运算符 200040 使用条件运算符 200041 巧用分隔符 200042 如何处理转义字符 210043 “;”结束符问题 210044 如何使用“??”操作符 222.4 表达式与关键词 220045 正确使用“&&”和“||” 220046 如何
处理程序
“溢出”错误 230047 有效使用base关键字 230048 typeof表达式的使用 230049 params关键字可以指定多参
数
240050 using关键字的用法 240051 变量的作用域 252.5 其他 260052 有效使用this对象 260053 如何声明变量 260054 如何声明相同类型的多个变量 260055 利用Object变量传递参
数
270056 强行改变运算符的运算顺序 27第3章 程序算法 293.1
数
据结构 300057 如何实现单向链表 300058 如何实现双向链表 350059 如何实现堆栈 410060 队列的实现 430061 树的实现 443.2 排序 480062 如何实现选择排序算法 480063 如何实现冒泡排序算法 490064 如何实现快速排序算法 500065 如何实现插入排序算法 500066 如何实现希尔排序算法 513.3 常见算法的实际应用 520067 计算1+22+33+44+……+nn的值 520068 计算10!的值 520069 求最大公约
数
520070 求最小公倍
数
530071 判断素
数
的算法 530072 如何判断一个
数
是否是完
数
540073 歌德巴赫猜想的算法 540074 八皇后问题 540075 用回溯法找出n个自然
数
中取r个
数
的全排列 550076 约瑟夫环问题 560077 猴子选大王 570078 如何判断IP是否正确 570079 如何将小写金额转换为大写金额 570080 统计文本字
数
580081 文本中首字母改为大写 590082 C#随机
数
的产生 590083 身份证从15位升至18位算法 600084 十进制
数
转二进制
数
的算法 600085 十进制
数
转八进制
数
的算法 610086 十进制
数
转十六进制
数
的算法 620087 二、八、十六进制
数
转十进制
数
的算法 633.4 密码算法 650088 使用MD5算法对密码进行加密 650089 “凯撒”密码的算法 65第4章 字符及字符串处理技术 674.1 字符及字符串转换 680090 如何获得字母的ASCII码 680091 如何根据ASCII码获得字母 680092 编程中经常使用的ASCII码 680093 获得汉字的区位码 690094 如何根据区位码获得汉字 690095 如何将行字符串转换为列字符串 700096 如何将
数
字转换为字符串 700097 如何将字符串转换为
数
字 700098 如何将
数
字转换为日期格式 710099 如何将
数
字转换为货币格式 710100 将字母全部转换大写 710101 将字母全部转换小写 720102 将字符串首字母转换大写 720103 如何进行字节
数
组和字符串的相互转换 720104 如何把一个按空格分割的字符串存储在一个ArrayList
数
组中 734.2 获取字符串信息 730105 如何获得一个字符串的长度 730106 如何获得一个字符串中
数
字的长度 740107 如何获得字符串中
数
字或字母的长度 740108 如何获得字符串中某个
数
字的位置 750109 获得字符串中汉字的个
数
760110 获得字符串中指定后几位字符 760111 计算字符串中子字符串出现的次
数
760112 获得字符串中大写字母的个
数
770113 获得某字符在字符串中最后出现的位置 780114 如何找出字符串中某一字符的所有位置 784.3 常用字符及字符串处理技术 790115 如何判断是否为
数
字 790116 如何在字符串中查找指定字符 790117 如何在字符串中用一子串替换另一子串 800118 将新字符串添加到已有字符串中 800119 如何在字符串中添加多个空格 810120 如何根据标点符号分行 810121 如何将字符串颠倒输出 820122 如何设置小
数
的保留位
数
820123 如何对字符串进行组合或分解 820124 判断字符串中某一字符是否大写 830125 按要求生成指定位
数
编号 830126 确定两字符串是否相等 840127 判断两字符串中指定子串是否相等 840128 判断字符串是否为日期格式 850129 清除字符串中指定的字符 850130 复制字符串中指定的字符 850131 巧截字符串的
数
字 860132 如何存储变长字符串 860133 在进行字符串比较时忽略大小写 870134 如何去除字符串尾空格 870135 如何去掉字符串中所有空格 880136 如何进行文本加密与解密 880137 如何区别0、空字符串、Null、Empty和Nothing 890138 从字符串中分离文件路径、文件名及扩展名 890139 如何批量替换某一类字符串 89第5章
数
据处理 915.1
数
字处理技巧 920140 如何对计算结果四舍五放入 920141 如何将商品金额小写转换成大写 920142 如何根据生日自动计算员工年龄 930143 如何设置货币值中使用的小
数
位
数
930144 如何自定义货币值中的小
数
点 940145 如何自定义货币值中小
数
点左边
数
字分组字符 940146 如何自定义货币值中小
数
点左边每一组的位
数
950147 如何自定义百分比值中小
数
的位
数
950148 如何自定义百分比小
数
点 960149 如何自定义百分比小
数
点左边
数
字分组字符 960150 如何自定义百分比小
数
点左边每一组的位
数
970151 如何自定义百分比符号 970152 如何自定义
数
字小
数
点右边的保留位
数
980153 如何自定义
数
字小
数
点左边分组位
数
980154 格式化输入
数
据为货币格式 990155 如何计算两个整
数
的乘积 990156 如何将二进制
数
转换为十进制
数
1000157 如何将二进制
数
转换为八进制
数
1000158 如何将二进制
数
转换为十六进制
数
1000159 如何实现0~9之间随机整
数
1010160 如何实现0~1之间随机
数
1010161 如何返回
数
字的绝对值 1015.2 控件
数
据处理技巧 1020162 如何实现C#中用键完成TAB的功能 1020163 如何限制文本框密码输入长度 1020164
数
据输入为空提示 1030165 如何设置文本框光标到末尾 1030166 输入法调整技巧 1030167 锁定文本框内的文本 1030168 使用Message.Show输出用户信息 1045.3 图片
数
据处理技巧 1040169 如何将图片存入
数
据库 1040170 如何将图片从
数
据库中读取出来 1040171 如何只允许输入指定图片格式 1050172 如何设置录入图片统一图片大小 1055.4
数
组处理技巧 1050173 如何转换
数
组类型 1050174 如何复制
数
组中一系列元素的元素 1060175 如何检索指定条件
数
组中的元素 1070176 如何动态改变
数
组长度 1080177 如何反转
数
组中元素的顺序 1080178 如何排序
数
组中的元素的顺序 1090179 如何创建动态
数
组 1105.5 NET应用技巧 1100180 如何使用
ASP.NET
技术对口令加密 1100181 如何设定
ASP.NET
全局变量 1110182 如何设定全局联接
数
据库对象 1110183 如何在
ASP.NET
中获得客户端IP地址 1110184 如何在
ASP.NET
中获取文件的扩展名 1110185 如何在
ASP.NET
中用URL在页面之间传值 1120186 如何使用IsPostBack实现
ASP.NET
页面加载 1120187 如何利用输出缓存技术缓存
ASP.NET
页面 1120188 如何在
ASP.NET
中显示当前IE浏览器头信息 1135.6 其他应用技巧 1140189 如何判断年份是否为闰年 1140190 如何根据年份判断十二生肖 1140191 如何根据IP地址获取本机域名 1150192 如何获取“我的文档”系统文件夹路径 1150193 如何获取应用程序当前执行的路径 1160194 如何获取当前操作系统的信息 1160195 如何实现基本
数
据类型随意转换 1160196 如何生成全局唯一标识符(GUID) 118第6章 资料验证技术 1196.1 网络验证应用技巧 1200197 如何使用正则表达式验证E-mail格式 1200198 如何使用正则表达式验证IP地址 1200199 如何使用正则表达式验证URL 1206.2 常用
数
字验证技巧 1210200 如何使用正则表达式验证电话号码 1210201 如何使用正则表达式验证输入密码条件 1210202 如何使用正则表达式验证邮政编号 1210203 如何使用正则表达式验证手机号 1220204 如何使用正则表达式验证身份证号 1220205 如何使用正则表达式验证两位小
数
1220206 如何使用正则表达式验证一年的12个月份 1230207 如何使用正则表达式验证一个月的31天 1230208 如何使用正则表达式验证
数
字输入 1230209 如何使用正则表达式验证密码长度 1240210 如何使用正则表达式验证非零的正整
数
1240211 如何使用正则表达式验证非零的负整
数
1246.3 常用字符验证技巧 1250212 如何使用正则表达式验证大写字母 1250213 如何使用正则表达式验证小写字母 1250214 使用正则表达式检查字符串中重复出现的词 1250215 如何使用正则表达式替换字符串 1260216 如何使用正则表达式拆分字符串 1270217 如何使用正则表达式验证输入字母 1270218 如何使用正则表达式验证
中文
汉字输入 1280219 如何使用正则表达式验证输入字符串 128第7章 日期和时间 1297.1 日期与时间的获取 1300220 获得系统当前日期 1300221 获得系统当前时间 1300222 同时获得系统当前日期和时间 1300223 如何获取当前日期是星期几 1300224 如何获取当前年的天
数
1310225 如何获取当前月的天
数
1310226 如何取得当前日期的前一天 1320227 使用TimeSpan对象获取时间间隔 1337.2 日期的格式化及其时间的比较 1330228 将日期格式化为指定格式 1330229 如何将短日期格式化为长日期格式 1340230 如何将
数
字日期转化为
中文
格式 1340231 如何对系统时间和
数
字进行比较 1350232 如何比较时间 1350233 获取两个日期之间的时间差并进行比较 1367.3 日期方法与函
数
的应用 1360234 使用DateDiff方法获取日期时间的间隔
数
1360235 在SQL语句中使用DATEADD函
数
向指定日期添加一段时间间隔 1370236 在SQL语句中使用DATEDIFF函
数
获得两个日期的间隔 1370237 如何使用Sleep方法延迟时间 1370238 如何确定程序的运行时间 1380239 如何使用ParseExact方法将字符串转化为日期格式 1380240 如何使用ToString方法格式化日期 1390241 如何使用Convert方法转换日期显示格式 1397.4 系统时间与日期的设置 1400242 如何设置系统的日期 1400243 如何设置系统的时间 1400244 如何设置系统的日期和时间 1417.5 日期与时间的应用 1420245 如何将
数
据控件中的日期以编程的方式转化为指定格式 1420246 将格式化日期的方法绑定到
数
据控件中 1420247 直接格式化绑定到
数
据控件GridView中的日期列 1430248 在
数
据控件GridView的RowDataBound事件中对绑定到GridView控件的日期列进行格式化 1430249 如何实现倒计时功能 1430250 如何创建一个
数
字时钟 144第8章 Windows窗体设计 1458.1 Windows窗体基本操作 1460251 控制窗体加载时所在的位置 1460252 控制窗体最大化、最小化 1460253 清空窗体中的图片 1460254 如何使程序窗体总在最前 1470255 如何将菜单置于窗体的左侧 1470256 将其他窗体作为当前窗体的子窗体 1470257 如何根据控件大小自动显示滚动条 1480258 如何显示About窗体 1480259 利用Show方法显示被调用窗体 1490260 Load事件将窗体加载到内存 1490261 窗体的卸载与隐藏 1490262 设置窗体的状态 1490263 如何设置窗体在桌面上的位置 1500264 如何在关闭窗体前显示确认对话框 1500265 如何去掉窗体的标题栏 1510266 如何禁止在任务栏中显示窗体标题 1520267 如何禁止缩放窗体的边框 1520268 如何设置窗体标题栏文字右对齐 1520269 如何显示窗体的属性信息 1530270 如何隐藏窗体标题栏的按钮 1538.2 Windows窗体高级操作 1530271 设置闪烁的标题栏 1530272 如何在托盘中写入应用程序图标 1540273 如何以全屏方式显示程序窗体 1540274 如何从上次关闭位置启动窗体 1540275 如何通过拖动工作区来移动窗体 1550276 如何渐变显示窗体背景颜色 1550277 如何排列MDI窗体中的子窗体 1560278 如何拖动无标题栏窗体 1578.3 特殊类型的窗体 1580279 创建一个无ICON的窗体 1580280 如何制作飘动的窗体 1580281 使用拆分窗口 1590282 用C#实现启动欢迎界面 1590283 如何实现半透明渐显窗体 1600284 基于ListView的导航界面 1600285 类似OutLook的导航界面 1620286 图形化的导航界面 1620287 如何实现类似QQ的程序界面 1620288 如何实现类似Windows XP的程序界面 1640289 制作字形窗体 1640290 制作图形窗体 1640291 随机更换背景的窗体 1658.4 菜单、工具栏和状态栏的设计 1660292 带图标的菜单 1660293 带历史信息的菜单 1660294 可以拉伸的菜单 1670295 带背景的工具栏 1680296 浮动工具栏 1680297 带下拉菜单的工具栏 1690298 在状态栏中显示复选框 1690299 带进度条的状态栏 1690300 带图标的状态栏 1708.5 其他 1700301 界面设计要素 1700302 界面设计在程序开发中的重要性 1710303 如何设置窗体的键响应按钮 1720304 如何设置窗体的键响应按钮 1720305 窗体间
数
据的访问 172第9章 Windows窗体控件 1759.1 TextBox控件应用技巧 1760306 文本框中只能输入
数
字 1760307 如何设置TextBox控件输入多行文本 1760308 如何锁定文本框 1760309 如何控制TextBox控件中的插入点 1760310 如何创建密码文本框 1770311 如何创建只读文本框 1770312 如何在文本框字符串中放置引号 1770313 如何在TextBox控件中查看多个行 1770314 如何TextBox控件中显示回车符 1789.2 RichTextBox控件应用技巧 1780315 删除RichTextBox控件中的部分文字 1780316 RichTextBox与TextBox控件有何不同 1790317 如何使用RichTextBox控件显示文件 1790318 如何使用RichTextBox控件保存文件 1800319 如何在RichTextBox控件中查找字符 1810320 如何在RichTextBox控件插入图片 1810321 如何为RichTextBox控件添加快捷菜单 1820322 在RichTextBox控件中替换文本文字 1839.3 Button控件应用技巧 1830323 C#中轻松打造绚丽按钮 1830324 如何使Button控件大小自动适应文本长度 1840325 如何设置窗体一个默认单击按钮 1840326 如何设置窗体一个默认取消按钮 1840327 如何给按钮控件创建快捷键 1850328 如何触发Button按钮的Click事件 1850329 使用控件的Tag属性传递信息 1850330 如何在Windows窗体上停靠控件 1860331 如何动态创建Button控件 1869.4 DataGridView控件应用技巧 1870332 如何对DataGridView控件进行
数
据绑定 1870333 如何在DataGridView控件中设置
数
据的格式 1870334 如何在DataGridView控件基于文本的单元格中启用换行 1870335 如何设置DataGridView控件单元格的文本对齐方式 1870336 如何在DataGridView控件中验证
数
据输入 1880337 DataGridView控件中输入
数
据时发生的错误 1880338 如何设置DataGridView控件中网格线的样式 1890339 如何设置DataGridView控件中的边框样式 1890340 如何设置DataGridView控件中字体样式 1900341 如何设置DataGridView控件中颜色样式 1900342 获取DataGridView控件中单元格、行和列坐标 1900343 如何获取DataGridView控件中的当前单元格 1910344 如何禁止DataGridView控件中添加和删除行 1910345 DataGridView控件选中单元格时整个行背景变色 1910346 如何复制DataGridView控件单元格中的
数
据 1910347 如何在DataGridView控件实现下拉列表 1929.5 对话框控件应用技巧 1920348 如何利用FontDialog控件设置字体 1920349 如何利用ColorDialog控件设置字颜色 1930350 如何利用OpenFileDialog控件打开文件 1930351 如何获得弹出对话框的相关返回值 1940352 使用FolderBrowserDialog控件选择文件夹 1959.6 ListBox控件应用技巧 1950353 如何快速选中ListBox控件中全部条目 1950354 如何排序ListBox控件中的
数
据 1960355 如何实现ListBox控件的多项选择功能 1960356 如何在ListBox控件中查找指定的项 1960357 实现ListBox控件与ListBox控件交换
数
据 1979.7 ListView控件应用技巧 1980358 如何实现ListView控件实现动态加载
数
据 1980359 如何向ListView控件添加搜索功能 1990360 如何将
数
据中的表内容填充到ListView控件中 2000361 如何使ListView控件拥有编辑功能 2010362 如何实现ListView控件显示图标与列表 2010363 如何获取ListView控件中的选择结果 2020364 如何将图片加载ListView控件 2029.8 TreeView控件应用技巧 2030365 如何在TreeView控件结点中显示图片 2030366 如何在TreeView控件中用鼠标右键选中节点 2030367 区分TreeView控件选中各节点方式 2040368 如何实现TreeView控件节点拖放操作 2040369 如何实现带复选框的TtreeView控件 2050370 如何实现TreeView控件遍历磁盘目录 2060371 如何将
数
据库字段填充到TreeView控件 2069.9 ComboBox控件应用技巧 2070372 如何使ComboBox下拉列表显示图片 2070373 ComboBox只能从下拉列表框中选择
数
据 2080374 如何实现带查询功能的ComboBox控件 2080375 如何实现文件目录名称填充ComboBox控件 2090376 如何将
数
组绑定到ComboBox控件 2100377 如何将
数
据库字段绑定到ComboBox控件 2109.10 组件应用技巧 2110378 如何使用ProgressBar控件显示操作的进度 2110379 如何使用ToolTip控件显示提示信息 2110380 如何使用FlowLayoutPanel控件布局窗体 2120381 如何使用SplitContainer控件分隔窗体 2130382 如何使用Process组件打开系统进程 2140383 FileSystemWatcher监视文件夹内文件的更改 2149.11 其他常用件控件应用技巧 2150384 如何在状态栏中显示时间 2150385 如何在状态栏中加载图片 2150386 如何设置DateTimePicker控件显示为空文 2150387 如何判断ToolStrip控件Button控钮的单击 2150388 如何实现Panle自动调整大小充满窗体 2160389 如何实现CheckedListBox控件选重所有项 2160390 如何实现CheckBox控件的选择状态 2160391 如何使Lable控件显示出多行文字 2170392 如何使用LinkLabel控件实现超级链接 2170393 如何设置MaskedTextBox控件输入验证 2180394 如何使用NotifyIcon控件创建任务托盘 2190395 如何控制PictureBox控件显示图片风格 219第10章 Web页面设计 22110.1 网页外观设计 2220396 将CSS样式表应用到页面中 2220397 在页面的源码中直接定义样式表 2220398 动态加载主题到页面中 2230399 利用Table布局Web页面 2230400 FrameSet框架的应用 2240401 IFrame框架的应用 2240402 页面尺寸自动适应1024×768像素和800×600分辨率 22510.2 网页性能设计 2250403 用meta标签来增强网页性能 2250404 什么情况下使用缓冲
会
提高速度 2260405 使用OutputCache指令实现页面缓存 2260406 设置网页缓存的位置 2270407 使用Cache类实现应用程序
数
据缓存 2270408 缓存网页的不同版本 22710.3 Web页的绑定 2280409 如何绑定变量 2280410 如何绑定集合 2280411 如何绑定表达式 2290412 如何绑定方法结果 2300413 巧用DataBinder.Eval()方法进行
数
据绑定 2300414 如何将DropDownList控件绑定到GridView控件中 23110.4 开发Web页的常用功能 2310415 使用QueryString变量在页面之间传值 2310416 页面定时刷新如何实现 2320417 显示只有
数
字的验证码图片 2320418 显示
数
字和英文字母组合的验证码图片 2320419 页面定时刷新后跳转到其他页 2330420 打开新的窗口并传送参
数
2330421 动态显示用户头像 2330422 利用Pannel控件显示和隐藏一组控件 2330423 如何在GridView控件上添加删除确认 2340424 如何为GridView控件添加编号列 2340425 FindControl方法的应用 2340426 如何实现单击表格行打开另一页并传递参
数
2350427 如何实现双击表格行超级链接到另一页并传递参
数
2350428 如何实现单击表格行改变颜色 2350429 鼠标移动改变表格行的颜色 2350430 如何在Web页中使用表格控件 23610.5 Web.Config文件的配置 2370431 通过Encoding的设置实现页面无
乱码
2370432 限制上传文件大小与时间 2370433 配置验证级别 23710.6 开发Web页其他功能 2380434 如何使Pannel实现横向滚动纵向自动扩展 2380435 属性MaintainScrollPositionOnPostBack实现网页定位 2380436 自动隐藏式菜单 2380437 关闭弹出窗口刷新父窗口 2390438 弹出网页模式对话框 2400439 弹出全屏显示网页 2410440 为什么要生成静态页 2420441 用快捷键+实现屏蔽 2420442 如何在Web页中使用广告控件 2420443 滚动显示博客公告 243第11章 HTML客户端控件与服务器控件 24511.1
数
据控件应用技巧 2460444 如何将
数
组绑定到GridView
数
据控件中 2460445 使用GridView Web服务器控件绑定
数
据源 2460446 使用GridView Web服务器控件自定义外观风格 2470447 使用GridView Web服务器控件的简单排序 2470448 如何在GridView Web服务器控件中分页 2480449 使用GridView Web服务器控件编辑
数
据 2490450 使用GridView Web服务器控件删除
数
据 2510451 如何使用GridView Web服务器控件选择
数
据 2520452 单击GridView控件按钮刷新保持原来的位置 2530453 向GridView Web控件中添加CheckBox控件 2530454 如何使用GridView Web控件实现超级链接 2540455 在GridView Web控件中高亮显示鼠标所在行 2560456 实现DataList Web服务器控件
数
据绑定功能 2560457 如何实现DataList Web服务器控件分页功能 2580458 实现查看DataList控件中
数
据的详细信息 2590459 如何在DataList控件中创建多个列 2600460 如何实现DetailsView 控件分页功能 2610461 将DataSet类对象绑定到Repeater
数
据控件中 26211.2 导航控件应用技巧 2630462 TreeView、SiteMapDataSource控件和SiteMap文件实现导航 2630463 如何在TreeView控件中添加连接线 2640464 以编程方式向TreeView控件中添加节点 2640465 如何在TreeView控件中显示CheckBox控件 2650466 如何判断TreeView控件中被勾选的节点 2650467 用SiteMapPath控件绑定SiteMap文件实现导航 2660468 如何设置SiteMapPath控件路径分隔符 2660469 如何设置SiteMapPath控件路径方向 2670470 如何设置SiteMapPath控件父节点显示个
数
2670471 如何设置SiteMapPath控件提示字符 2680472 如何用Menu控件绑定SiteMap文件实现导航 2680473 如何设置Menu控件显示静态菜单 2690474 如何以编程方式创建Menu控件 27011.3 标准控件应用技巧 2710475 使用HyperLink服务器控件实现页面间传值 2710476 如何使用Input(Reset)实现文本框清空功能 2710477 如何取消DropDownLidt控件的激发验证 2720478 使用FileUpload服务器控件实现文件上传 2720479 使用LinkButton服务器控件实现超级链接 2730480 实现DropDownList服务器控件的
数
据绑定 2730481 如何改变DropDownList服务器控件中的项 2740482 指定ListBox服务器控件中的项的目的移位顺序 2750483 响应ListBox服务器控件的改变事件 2760484 如何使用CheckBox服务器控件 2760485 如何使用CheckBoxList服务器控件 2770486 使用RadioButtonList服务器控件巧用单项选择 2780487 使用BulletedList控件显示项目符号和编号 2790488 如何使用HiddenField控件 2800489 如何使用Literal控件显示静态文本 2810490 如何使用AdRotator控件制作广告 2810491 如何使用Wizard Web服务器控件制作导航页 2820492 使用XML服务器控件转换XML文档 2830493 使用MultiView与View控件制作导航页面 2860494 使用PlaceHolder控件实现动态添加控件 2890495 如何实现带滚动条的Panel面板 2900496 使用Substitution控件在缓存页面插入内容 290第12章 内置对象 29312.1
ASP.NET
基本对象 2940497 使用Session对象在页面之间传值 2940498 如何使用Session验证用户登录 2940499 配置Session的生命周期 2940500 如何遍历Session对象 2950501 使用Application对象在页面之间传值 2950502 存取Application变量内容 2950503 如何锁定Application对象 2960504 如何使用Application实现站点访问量统计 2960505 如何删除Application变量内容 2960506 使用ViewState对象在同一个页面传值 29712.2 Response与Request对象 2970507 如何解决Response.Redirect方法传递汉字时出现的错误 2970508 使用Response.BinaryWrite方法输出二进制图像 2970509 Response对象将文本文件的内容写回客户端浏览器 2980510 如何使用Request接收页面间传值 2980511 使用Request对象的Browser属性获取客户端浏览器信息 2980512 获取客户端和服务器端IP地址 2990513 使用Request对象获取客户端的表单信息 3000514 使用Request对象的PhysicalApplicationPath属性获取服务器的绝对路径 3000515 使用Request对象的CurrentExecutionFilePath属性获取当前页面的路径 3000516 如何获取
ASP.NET
中所有Request的属性 3000517 缓存区的应用 30112.3 Cookie对象 3020518 使用Cookie的优缺点 3020519 使用Cookie对象在页面之间传值 3020520 如何使用Cookie验证用户登录 3030521 Cookie可以存储哪些值 3030522 使用Cookie对象保存和读取客户端信息 3030523 如何加密Cookie中的
数
据 3040524 创建及存取多个键值的Cookie对象 3040525 如何遍历Cookie集合 3040526 设定Cookie变量的生命周期 3050527 如何删除客户端的Cookies 3050528 如何删除多值Cookie中的某个值 3050529 如何使用Cookie处理网上重复投票 3050530 如何使用户第2次访问我的网站不用提交信息 30612.4 Server对象 3070531 使用Server.Transfer方法在页面之间传值 3070532 使用Server.MapPath方法获取服务器的物理地址 3080533 使用Server.UrlEncode方法对字符串进行编码 3080534 使用Server.UrlDecode方法对字符串进行解码 3080535 利用Server对象进行HTML编码输出 3080536 利用Server对象进行HTML解码输出 309第13章 图形图像技术 31113.1 图像预览及转换 3120537 如何设计缩略图功能的图片浏览器 3120538 如何浏览大图片 3120539 如何局部放大图片 3130540 如何实现剪切图片 31313.2 图形缩放与变换 3150541 如何缩放图片 3150542 如何转换图像文件格式 31513.3 图像效果 3160543 如何以底片效果显示图像 3160544 如何以浮雕效果显示图像 3170545 如何以黑白效果显示图像 3180546 如何以柔化效果显示图像 3190547 如何以锐化效果显示图像 3200548 如何以雾化效果显示图像 3210549 如何以光照效果显示图像 3220550 如何以百叶窗效果显示图像 3230551 如何以马赛克效果显示图像 3250552 如何以任意角度旋转图像 3260553 如何以椭圆形显示图像 3270554 如何以不同的透明度显示图像 3280555 如何以不同分辨率显示图像 3280556 如何以不同翻转方式显示图像 3290557 如何以油画效果显示图像 3300558 如何以扭曲效果显示图像 3310559 如何以分块效果显示图像 3320560 如何以四周扩散方式显示图像 3330561 如何以从上向下拉伸方式显示图像 3340562 如何以从左向右拉伸方式显示图像 3350563 如何以上下反转方式显示图像 3350564 如何以上下对接方式显示图像 3360565 如何以左右反转方式显示图像 3370566 如何以左右对接方式显示图像 3380567 如何以淡入淡出效果显示图像 3390568 如何以积木效果显示图像 34113.4 图像字体 3420569 如何以渐变色效果显示文字 3420570 如何以倾斜效果显示文字 3430571 如何以阴影效果显示文字 3430572 如何以倒影效果显示文字 3440573 如何以投影效果显示文字 3440574 如何以浮雕效果显示文字 3450575 如何以印版效果显示文字 3460576 如何为文字填充图片纹理 3460577 如何创建可旋转文字 34713.5 图像识别及图像工具 3470578 如何获取图像的像素值 3470579 如何设置图像的像素值 3480580 如何校正图像显示颜色 3490581 如何使用阈值校正图像显示颜色 3510582 如何获得图像信息 3520583 如何制作简单的画图工具 3530584 如何将图片以Image类型存储到
数
据库 3560585 如何从
数
据库中读取Image类型的字段 35713.6 图像应用及其他 3580586 如何在Web页面上显示图像 3580587 绘制渐变背景图像 3590588 确定鼠标是否在图形范围内 3590589 如何绘制柱形图 3600590 如何绘制饼形图 3620591 如何绘制折线图 3640592 如何绘制图形验证码 3660593 如何在桌面上全屏显示图像 3670594 如何利用Image制作小动画 3680595 如何使用鼠标拖动图片 3680596 如何获取当前鼠标的形状 369第14章 动画与多媒体 37114.1 声音控制 3720597 如何播放WAV声音文件 3720598 如何播放默认的Beep事件声音 3720599 如何播放默认的Hand事件声音 3720600 如何播放默认的Asterisk事件声音 3720601 如何播放默认的Question事件声音 3730602 如何播放默认的Exclamation事件声音 3730603 如何设置计算机喇叭发出的声音 3730604 如何同步加载并播放声音文件 3740605 如何异步加载并播放声音文件 37414.2 多媒体及其他 3750606 C#实现动画效果 3750607 C#设计屏幕保护程序 3750608 如何实现滚动字幕 3760609 如何播放AVI动画文件 3760610 如何播放Flash 3770611 用C#实现家庭影集 3780612 C#实现电影特效 3790613 如何实现Word艺术字 3790614 检查是否安装声卡 3800615 带有记忆功能的MP3 3800616 打开和关闭光驱 3810617 如何收听网络电台 3820618 如何通过剪贴板复制粘贴图像 3820619 如何转换图像文件的保存格式 3830620 如何制作自动播放的MP3播放器 3840621 学校体操定时音乐播放 3850622 如何从ARGB分量值创建Color结构 3850623 如何动画显示窗体 3860624 如何获取系统的图像编码器信息 3870625 如何获取系统的图像解码器信息 388第15章 键盘与鼠标 38915.1 鼠标操作技巧 3900626 鼠标双击窗体时模拟键盘Tab键操作 3900627 定义鼠标指针形状 3900628 自定义鼠标的图片 3910629 鼠标拖放复制文本 3910630 如何使用鼠标单击添加控件 3920631 如何获得鼠标在窗体上的位置 3920632 如何交换鼠标左右键功能 3920633 如何隐藏和显示鼠标 3930634 如何获取光标闪烁的频率 3940635 如何获得屏幕上鼠标的坐标 3940636 如何限制鼠标在某一区域工作 3940637 如何利用鼠标绘图 3950638 如何获取鼠标双击时间间隔 3960639 如何获取鼠标键
数
3960640 如何显示鼠标的等待光标 3970641 如何禁用鼠标左键 3970642 如何模拟鼠标操作 3980643 如何实现鼠标穿透窗体 3990644 如何记录鼠标行为 39915.2 键盘操作技巧应用 4000645 如何禁用输入法编辑器 4000646 如何打开和关闭输入法编辑器 4000647 回车转换成Tab键 4000648 如何获取组合键 4010649 如何获取功能键 4010650 如何判断NumLock键和CapsLock键是否锁定 4010651 如何屏蔽+键关闭窗体 4020652 如何实现按下键关闭窗体 4020653 如何避免按键产生“嘀”声 4030654 如何设置键盘热键 403第16章 文件、文件管理及
数
据流 40516.1 获取文件基本信息 4060655 获取文件创建的日期和时间 4060656 如何检索路径中的文件名和扩展名 4060657 如何获得文件的大小 4070658 如何修改文件属性 4070659 如何监视文件系统变化情况 4080660 如何获取文件的系统启动方式 4080661 如何获取文件名禁止使用的字符 4090662 如何获取路径名禁止使用的字符 4100663 如何获取指定目录的上级目录 41016.2 文件基本操作 4110664 判断文件是否存在 4110665 创建一个文件用于写入UTF-8编码的文本 4110666 OpenRead方法打开现有文件并读取 4120667 打开现有UTF-8编码文本文件并进行读取 4120668 OpenWrite方法打开现有文件并进行写入 4130669 如何读取文件中的第一行
数
据 4130670 如何向文件中写入
数
据 4130671 如何读取文件中所有
数
据 4140672 如何创建临时文件 4140673 如何实现文件替换 4150674 使用递归法删除文件夹中所有文件 4150675 如何更改文件扩展名 4160676 如何实现复制文件 4160677 如何修改文件名 4160678 如何删除文件 4170679 如何上传文件 4170680 如何下载文件 4180681 如何拖放文件 4190682 如何搜索文件 41916.3 文件夹基本操作 4200683 如何创建文件夹 4200684 如何移动文件夹 4200685 如何修改文件夹名称 4210686 如何遍历文件夹 4210687 如何删除文件夹 42216.4
数
据流操作 4220688 如何读写内存
数
据流 4220689 如何创建二进制文件 4230690 如何读取二进制文件 4230691 如何使用缓冲流 42416.5 加密、解密及解压缩文件 4250692 加密和解密文件 4250693 如何使用对称算法加密文件 4250694 如何使用对称算法解密文件 4260695 如何使用GZip压缩文件 4270696 如何使用GZip解压文件 4280697 如何使用WinRAR压缩文件 4290698 如何使用WinRAR解压文件 42916.6 其他 4300699 设置文件的访问模式 4300700 如何在C#应用程序中使用INI文件 4300701 如何操作帮助文件 4310702 如何操作Word文件 4320703 如何操作Excel文件 4330704 如何将文本文件转换成网页文件 4340705 如何产生随机文件夹名或文件名 4350706 如何将长文件名转换成短文件名 4360707 如何用程序创建XML文档并写入内容 4360708 如何通过DataSet对象读取XML文件 4380709 如何动态创建XML文件节点 4390710 如何实现XML文件
数
据类型的转换 4390711 将图片保存到XML文件中 4400712 如何比较两个文件的内容是否相同 4400713 如何以缩略图形式上传图片文件 4410714 如何解析只有一种格式的文本文件 4420715 如何解析
含有
多种格式的文本文件 443第17章 Windows开发技术 44517.1 获取计算机系统信息 4460716 如何获取系统时间 4460717 如何获取系统目录 4460718 如何获取计算机名称 4460719 如何获取当前程序运行目录 4460720 如何获得操作系统版本号 44617.2 获取计算机硬件信息 4460721 如何获取CPU编号 4460722 如何获取显示设备的PNPDeviceID 4470723 如何获取声音设备的PNPDeviceID 4470724 如何获取硬盘编号 4470725 如何获取CPU的版本信息 4480726 如何获取CPU的产品名称信息 4480727 如何获取CPU的制造商名称 4480728 如何获取主板制造商 4490729 如何获取主板编号 4490730 如何获取主板型号 4490731 如何获取磁盘空间 4500732 如何获取磁盘剩余空间 4500733 如何确定屏幕的分辨率 4510734 如何获得磁盘的卷标 4520735 如何获得磁盘的文件系统类型 45217.3 获取特殊文件夹路径 4530736 如何获取ProgramFiles目录全路径 4530737 如何获取桌面目录全路径 4530738 如何获取开始菜单目录全路径 4540739 如何获取用户程序组目录全路径 4540740 如何获取文档模板目录全路径 4550741 如何获取收藏夹目录全路径 4550742 如何获取共享组件目录全路径 4560743 如何获取我的图片目录全路径 4560744 如何获取Internet历史记录全路径 4570745 如何获取Internet临时文件目录全路径 4570746 如何设置可用样式 45717.4 获得Windows当前用户 4580747 如何获取当前用户 4580748 如何判断当前用户是否是普通用户 4580749 如何判断当前用户是否是超级用户 4580750 如何判断当前用户是否是系统管理员 4590751 如何判断当前用户是否是系统操作员 4590752 如何判断当前用户是否是备份操作员 4600753 如何判断当前用户是否是打印操作员 4600754 如何判断当前用户是否是复制程序员 4610755 如何判断当前用户是否是账户操作员 46117.5 Windows日志 4620756 如何获取系统日志信息 4620757 如何获取安全日志信息 4620758 如何获取应用程序日志信息 4630759 如何创建并写入自定义日志信息 4640760 如何向系统日志写入自定义
数
据 4640761 如何向应用程序日志写入自定义信息 46517.6 计算机控制 4650762 列举系统中所有窗口 4650763 C#实现键盘钩子 4650764 如何关闭计算机 4660765 如何抓屏 4660766 如何休眠计算机 4670767 如何禁止使用Windows任务管理器 4680768 如何为文件新增右键菜单项 4680769 如何设置系统仅能运行的程序 4690770 如何获取本地计算机上所有的进程 4690771 如何启动一个进程 4700772 怎样杀死一个进程 4700773 如何获取远程计算机上所有的进程 47017.7 其他相关技术 4700774 如何在注册表中保存窗体的大小和位置 4700775 如何实现程序间注册表内传递变量 4710776 在使用OpenFileDialog中的相对路径问题 4710777 如何设置启动时自动执行程序 4710778 C#编程实现Windows XP风格的界面 4710779 用C#实现文件查找功能 4730780 如何序列化对象 4730781 如何实现特殊形状的窗体 4740782 如何移动正在使用的文件 4740783 如何实现类似QQ的程序界面 4750784 如何实现动画显示窗体 4760785 如何显示和隐藏任务栏 4770786 如何实现OutLook界面 4780787 如何在C#中回车换行 4780788 如何获取进程的命令行 4790789 如何按行读取文本并显示行
数
4790790 如何在Form中嵌入Excel 4790791 如何使用互斥量禁止程序运行两个实例 4800792 如何使用进程名禁止程序运行两个实例 4800793 如何获取控制台应用程序的显示结果 4810794 如何用@代替路径中的转义字符 482第18章 程序应用控制 48318.1 提取信息 4840795 判断驱动器类型并获取其属性 4840796 如何得到本地机器的IP 4840797 如何得到本地运行的EXE的路径 4850798 得到计算机所有正在运行的进程 4850799 获得Windows的启动模式 4850800 获取鼠标的按钮个
数
及鼠标安装状态 4850801 检测计算机是否存在网络连接 4860802 如何判断计算机的联机状态 4860803 获取计算机屏幕分辨率 4860804 获取计算机当前登录的用户名称 48618.2 系统控制 4860805 远程关闭或重新启动计算机 4860806 创建应用程序快捷方式 4870807 启动Windows系统服务 4880808 在C#应用程序中控制输入法 4880809 打开“区域和语言选项”对话框并指定选项卡 4890810 如何执行命令行命令? 4890811 如何修改计算机的默认打印机 4900812 如何实现行业软件系统注销功能 4900813 如何将计算机设置为休眠状态 4900814 在Windows系统中建立事件日志 4910815 如何使PC喇叭发音 49118.3 程序控制 4910816 使用回车键控制鼠标焦点 4910817 如何调用可执行应用程序 4920818 TextBox上禁用鼠标右鍵 4920819 如何实现屏幕截图 4920820 如何将截取的图片保存为指定图片格式 4930821 如何复制程序本身 4930822 分段显示电话号码颜色 4930823 软件版本号是如何组成的 4930824 单击“关闭”按钮或按+键时最小化窗口 4940825 屏蔽RichTextBox控件+快捷键 49518.4 其他 4950826 将DataGridView控件中的
数
据导入Excel 4950827 无法获取自定义环境变量的值 4960828 将组件放到COM+服务器上去 4960829 调用非托管的DLL文件 4970830 如何将GridView控件
数
据导入Word 4970831 如何将GridView控件
数
据导入Excel 4970832 单片机如何实现在线调试 4980833 单片机如何实现内存优化管理 4980834 单片机实现文件系统管理 4980835 杀死进程 4980836 如何下载某网站上的图片资源 498第19章 SQL查询相关技术 50119.1 常用SQL查询技术 5020837 如何在查询中正确使用单引号“’” 5020838 SQL中SELECT语句的执行顺序 5020839 在查询时查询
数
据为指定长度的
数
据 5020840 如何利用WHERE参
数
过滤
数
据 5030841 如何正确地理解和运用SQL中的判式 5030842 如何正确地理解和使用SQL中的关键字 50319.2 比较、逻辑运算符查询 5040843 如何使用算术运算符号进行比较查询 5040844 如何使用比较运算符号进行比较查询 5040845 如何使用AND逻辑运算符查询 5050846 如何使用OR逻辑运算符查询 5060847 如何联合使用AND和OR运算符查询 5060848 如何在查询中正确使用逻辑操作符 5070849 利用通配符进行查询 50719.3 SQL关键字查询 5080850 如何使用ESCAPE关键字规定转义字符 5080851 如何使用BETWEEN进行范围查询 5080852 如何使用NOT BETWEEN进行范围查询 5090853 如何使用GROUP BY子句查询 5090854 如何使用HAVING语句过滤分组
数
据 5100855 如何使用ALL关键字查询 5100856 如何使用CUBE关键字查询 51119.4 表结构与性能 5110857 检测信息是否存在 5110858 @@CPU_BUSY获取CPU的工作时间 5110859 如何获取磁盘读写次
数
5120860 获取SQL Server服务器名 5120861 获取
数
据库标识号 5120862 判断用户是否访问
数
据的权限 5120863 显示表中列信息 5120864 显示表中任意列名称 5130865 提高SQL性能加快执行速度 5130866 控制批处理内语句的执行 5130867 执行查询但是显示列信息 5140868 获取连接或试图连接的次
数
5140869 获取当前
数
据库的语言名 51419.5 时间与谓词 5140870 时间函
数
的使用 5140871 设置
数
据库时间表显形式 5150872 格式化日期显示格式 5150873 如何正确理解SQL中的NULL值 5160874 如何使用IsNull()函
数
来处理空值 5160875 如何使用Nullif()函
数
来处理空值 5160876 查询空值(NULL)的技巧 5170877 利用关键字DISTINCT去除重复记录 5170878 巧用TOP子句获取信息 5180879 巧用CONTAINS谓词检索信息 5180880 通过ISNULL替换信息 5190881 比较COMPUTE和GROUP BY 5190882 如何对指定时间段进行查询 5190883 对某期间的
数
据进行查询的几种方法 5190884 NOT与谓词进行组合条件的查询 52019.6 聚合函
数
5200885 聚合函
数
SUM的使用 5200886 聚合函
数
AVG的使用 5210887 如何使用聚合函
数
MAX 5210888 如何使用聚合函
数
MIN 5220889 如何使用聚合函
数
COUNT 5220890 如何使用聚合函
数
First或Last 52319.7 子查询与连接查询 5230891 union与连接之间的区别 5230892 如何应用IN查询表中的记录信息 5240893 使用一个单行的子查询来更新列 5240894 使用IN引入子查询限定查询范围 5240895 在UPDATE语句中应用子查询 5250896 如何应用子查询 5250897 EXISTS与子查询联合应用 5250898 在FROM子句中的子查询 5250899 在DELETE语句中应用子查询 5260900 子查询与聚合函
数
的应用 5260901 有效使用内连接 5260902 如何使用LEFT OUTER JOIN查询 5260903 如何使用RIGHT OUTER JOIN查询 5270904 利用CASE语句查询结果 52719.8 交叉表 5280905 Access中利用TRASFORM分析
数
据 5280906 Access中利用TRASFORM动态分析
数
据 5290907 SQL Server实现静态交叉表 5290908 SQL Server实现动态交叉表 53119.9 常用
数
据操作 5320909 如何对字符串进行查询 5320910 如何进行单条
数
据的添加 5330911 如何进行批量
数
据的添加 5330912 如何对
数
据进行修改 5340913 如何对
数
据进行删除 5340914 对
数
据库
数
据进行局部删除 53419.10 高级应用 5350915 如何使用临时表 5350916 如何查询表中的列名 5350917 在查询中如何防止输入指定符串 5360918 查询指定长度的
数
据 5360919 获取当前
数
据库的详细信息 5370920 在查询过程中灵活定义与使用别名 53819.11 视图、存储过程和触发器的使用 5380921 如何正确认识视图 5380922 如何获取
数
据库中的全部用户视图 5390923 如何通过视图修改
数
据 5390924 如何正确理解存储过程 5400925 如何获取
数
据库中的全部存储过程 5400926 如何正确认识触发器 5410927 Update触发器在系统日志中的应用 5420928 触发器的嵌套使用 5420929 获取
数
据库中的触发器 54319.12 其他 5440930 在查询程序中使用变量 5440931 对查询结果进行排序 5440932 批量获取结果集信息 5450933 对查询结果生成表 5450934 实现
数
据类型转换 5460935 获取当前
数
据库的登录用户名 5460936 如何正确理解
数
据库键字 5460937 将结果转换为XML形式 5470938 追加查询结果到已存在的表 5470939 利用对多个表中的字段创建新记录集 5470940 利用EXECUTE执行SQL语句 548第20章
数
据库技术 54920.1 Access
数
据库的使用 5500941 如何为Access
数
据库设置密码 5500942 如何创建加密的Access
数
据库 5500943 建立Access
数
据库连接 5510944 与加密后的Access
数
据库建立连接 5510945 如何提取Access
数
据库中的
数
据表名 5510946 随机读取Access
数
据库记录 5520947 将Access
数
据库导入到Excel中(
ASP.NET
) 5520948 在.NET 2.0框架下动态创建Access
数
据库 5530949 在.NET 2.0框架下动态创建Access
数
据表 5530950 如何备份Access
数
据库 55420.2 SQL
数
据库的使用 5540951 建立SQL Server
数
据库连接 5540952 如何使用ODBC访问SQL Server
数
据库 5550953 读取SQL Server
数
据表结构 5560954 在C#中分离SQL Server
数
据库 5570955 C#中附加SQL Server
数
据库 5580956 C#中附加单文件SQL Server
数
据库 5590957 备份SQL Server
数
据库 5590958 还原SQL Server
数
据库 5600959 开启SQL Server
数
据库服务 5610960 断开SQL Server
数
据库服务 5620961 如何判断SQL Server
数
据库连接状态 5620962 获取连接SQL Server
数
据库的名称 5630963 获取SQL Server的连接统计
数
据 5630964 如何调用SQL Server存储过程 5630965 如何生成SQL
数
据库脚本 5640966 SQL Server 2000无法安装的解决办法 56520.3 其他 5650967 如何判断记录是否为NULL 5650968 建立Oracle
数
据库连接 5660969 如何在
数
据表中设置主键 5660970 DataSet读取XML文件中
数
据作为
数
据源 5670971 如何读取Fox的DBF文件 5670972 通用方法实现
数
据增、删、改功能 5670973 通用方法获取查询结果DataSet
数
据集 5680974 同时查询多条SQL语句 5680975 如何判断是否查询到结果 5680976 将图片以二进制格式存储到
数
据库中(
asp.net
) 5690977 从DataReader对象读取
数
据的技巧 5690978 随机显示
数
据库记录 5690979 通过DataTable获得
数
据表的主键 5690980 将Access
数
据库转化为SQL Server
数
据库 5700981 将SQL Server
数
据库转化为Access
数
据库 5710982 如何避免
数
据库死锁现象 5720983 如何调用带输入参
数
的存储过程 5720984 如何获取存储过程返回的结果集 5730985 取得
数
据表某个单元格的值 5730986 在
ASP.NET
2.0下将
数
据绑定DropDownList 5730987 在ADO.NET中实现
数
据库的事务处理 5740988 将任意文件保存到
数
据库中 5740989 将存储在
数
据库中的文件提取出来 5750990 合并具有相同
数
据表结构的查询结果 5750991 使用DataTable进行
数
据检索 5750992 使用DataView对
数
据进行检索和排序 5760993 使用DataSet建立DataTable明细表 576第21章 打印与报表技术 57921.1 报表设计技术 5800994 如何快速创建水晶报表 5800995 如何编写带图片的报表 5820996 如何使图片成为整个报表的背景 5830997 如何设置水晶报表中节的背景图片 5830998 如何设置水晶报表中节的背景色 5840999 如何设置水晶报表的页面 5841000 如何在报表中添加节 5841001 如何在报表中移动节的顺序 5851002 如何在报表中合并节 5851003 如何在报表中册除节 5851004 如何在报表中显示与隐藏节 5861005 如何设置多列样式报表 5861006 如何设置报表中节的高度 5871007 如何设置报表的摘要信息 5871008 如何设置报表的打印日期与时间 58721.2 报表格式化类对象技巧 5881009 如何在报表中使用文本对象 5881010 如何移动对象操作 5881011 如何对齐多个对象 5891012 如何使用公式字段 5891013 如何在报表中使用线 5901014 如何在报表中使用方框 59021.3 报表
数
据排序与分组技巧 5911015 如何排序报表
数
据 5911016 如何报表
数
据分组 5911017 如何报表中筛选
数
据 5921018 如何对分组报表中的页码进行设置 59221.4 报表的应用技巧 5931019 如何在水晶报表中使用交叉表 5931020 如何在水晶报表中使用子报表 5941021 如何动态显示子报表 5961022 如何删除子报表 5971023 如何在报表中计算百分比 59721.5 Windows打印控件应用技巧 5991024 如何使用PrintDocument控件打印窗体
数
据 5991025 如何使用PrintPreviewContronl控件预览 5991026 使用PrintPreviewDialog对话框 6001027 如何使用PrintDialog对话框打印 6011028 如何使用PageSetupDialog对话框设置页面 6011029 如何使用PrintDocument控件打印文本文件 602第22章 C#高级应用开发 60522.1 线程的使用 6061030 如何开始一个线程 6061031 如何结束一个线程 6061032 如何使线程休眠 6061033 如何挂起一个线程 6061034 如何判断线程的状态 6061035 如何实现线程的同步 6071036 如何避免死锁 60722.2 .NET 2.0的新特性 6071037 如何使用泛型 6071038 如何使用匿名方法 6081039 如何使用迭代器 6091040 如何使用分部类 61022.3 C#WebService 6101041 建立SQL Server返回
数
据集WebService 6101042 利用WebService传送图片 61122.4 文件监视 6111043 如何监视文件的创建 6111044 如何监视文件的改变 6121045 如何监视文件的重命名 6121046 如何监视文件的删除 61322.5 C#高级应用 6131047 如何将聊天程序做成Windows服务 6131048 COM+服务解决同时访问大量
数
据并发性 6151049 COM+服务实现银行转账系统 6171050 如何用Remoting技术传送文件 6191051 大规模
数
据访问时缓解服务器压力 620第23章 硬件及相关开发技术 62323.1 语音卡、IC卡、神龙卡的使用 6241052 利用语音卡拨
ssh(structs,spring,hibernate)框架中的上传下载
Struts+Spring+Hibernate实现上传下载 本文将围绕SSH文件上传下载的主题,向您详细讲述如何开发基于SSH的Web程序。SSH各框架的均为当前最新版本: •Struts 1.2 •Spring 1.2.5 •Hibernate 3.0 本文选用的
数
据库为Oracle 9i,当然你可以在不改动代码的情况下,通过配置文件的调整将其移植到任何具有Blob字段类型的
数
据库上,如MySQL,SQLServer等。 总体实现 上传文件保存到T_FILE表中,T_FILE表结构如下: 图 1 T_FILE表结构 其中: •FILE_ID:文件ID,32个字符,用Hibernate的uuid.hex算法生成。 •FILE_NAME:文件名。 •FILE_CONTENT:文件内容,对应Oracle的Blob类型。 •REMARK:文件备注。 文件
数
据存储在Blob类型的FILE_CONTENT表字段上,在Spring中采用OracleLobHandler来处理Lob字段(包括Clob和Blob),由于在程序中不需要引用到oracle
数
据驱动程序的具体类且屏蔽了不同
数
据库处理Lob字段方法上的差别,从而撤除程序在多
数
据库移植上的樊篱。 1.首先
数
据表中的Blob字段在Java领域对象中声明为byte[]类型,而非java.sql.Blob类型。 2.
数
据表Blob字段在Hibernate持久化映射文件中的type为org.springframework.orm.hibernate3.support.BlobByteArrayType,即Spring所提供的用户自定义的类型,而非java.sql.Blob。 3在Spring中使用org.springframework.jdbc.support.lob.OracleLobHandler处理Oracle
数
据库的Blob类型字段。 通过这样的设置和配置,我们就可以象持久化表的一般字段类型一样处理Blob字段了。 以上是Spring+Hibernate将文件二进制
数
据持久化到
数
据库的解决方案,而Struts通过将表单中file类型的组件映射为ActionForm中类型为org.apache.struts.upload. FormFile的属性来获取表单提交的文件
数
据。 工程的类按SSH的层次结构划分为
数
据持久层、业务层和Web层;WEB-INF下的applicationContext.xml为Spring的配置文件,struts-config.xml为Struts的配置文件,file-upload.jsp为文件上传页面,file-list.jsp为文件列表页面。 本文后面的章节将从
数
据持久层->业务层->Web层的开发顺序,逐层讲解文件上传下载的开发过程。
数
据持久层 1、领域对象及映射文件 您可以使用Hibernate Middlegen、HIbernate Tools、Hibernate Syhchronizer等工具或手工的方式,编写Hibernate的领域对象和映射文件。其中对应T_FILE表的领域对象Tfile.java为: 代码 1 领域对象Tfile 1. package sshfile.model; 2. public class Tfile 3.{ 4. private String fileId; 5. private String fileName; 6. private byte[] fileContent; 7. private String remark; 8. …//getter and setter 9. } 特别需要注意的是:
数
据库表为Blob类型的字段在Tfile中的fileContent类型为byte[]。Tfile的Hibernate映射文件Tfile.hbm.xml放在Tfile .java类文件的相同目录下: 代码 2 领域对象映射文件 1. <?xml version="1.0"?> 2. <!DOCTYPE hibernate-mapping PUBLIC 3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > 5. <hibernate-mapping> 6. <class name="sshfile.model.Tfile" table="T_FILE"> 7. <id name="fileId" type="java.lang.String" column="FILE_ID"> 8. <generator class="uuid.hex"/> 9. </id> 10. <property name="fileContent" 11. type="org.springframework.orm.hibernate3.support.BlobByteArrayType" 12. column="FILE_CONTENT" lazy="true"/> 13. …//其它一般字段的映射 14. </class> 15. </hibernate-mapping> fileContent字段映射为Spring所提供的BlobByteArrayType类型,BlobByteArrayType是用户自定义的
数
据类型,它实现了Hibernate 的org.hibernate.usertype.UserType接口。BlobByteArrayType使用从sessionFactory获取的Lob操作句柄lobHandler将byte[]的
数
据保存到Blob
数
据库字段中。这样,我们就再没有必要通过硬编码的方式,先insert然后再update来完成Blob类型
数
据的持久化,这个原来难伺候的老爷终于被平民化了。关于lobHandler的配置请见本文后面的内容。 此外lazy="true"说明地返回整个Tfile对象时,并不返回fileContent这个字段的
数
据,只有在显式调用tfile.getFileContent()方法时才真正从
数
据库中获取fileContent的
数
据。这是Hibernate3引入的新特性,对于包含重量级大
数
据的表字段,这种抽取方式提高了对大字段操作的灵活性,否则加载Tfile对象的结果集时如果总是返回fileContent,这种批量的
数
据抽取将可以引起
数
据库的"洪泛效应"。 2、DAO编写和配置 Spring强调面向接口编程,所以我们将所有对Tfile的
数
据操作的方法定义在TfileDAO接口中,这些接口方法分别是: •findByFildId(String fileId) •save(Tfile tfile) •List findAll() TfileDAOHibernate提供了对TfileDAO接口基于Hibernate的实现,如代码 3所示: 代码 3 基于Hibernate 的fileDAO实现类 1. package sshfile.dao; 2. 3. import sshfile.model.*; 4. import org.springframework.orm.hibernate3.support.HibernateDaoSupport; 5. import java.util.List; 6. 7. public class TfileDAOHibernate 8. extends HibernateDaoSupport implements TfileDAO 9. { 10. public Tfile findByFildId(String fileId) 11. { 12. return (Tfile) getHibernateTemplate().get(Tfile.class, fileId); 13. } 14. public void save(Tfile tfile) 15. { 16. getHibernateTemplate().save(tfile); 17. getHibernateTemplate().flush(); 18. } 19. public List findAll() 20. { 21. return getHibernateTemplate().loadAll(Tfile.class); 22. } 23. } TfileDAOHibernate通过扩展Spring提供的Hibernate支持类HibernateDaoSupport而建立,HibernateDaoSupport封装了HibernateTemplate,而HibernateTemplate封装了Hibernate所提供几乎所有的的
数
据操作方法,如execute(HibernateCallback action),load(Class entityClass, Serializable id),save(final Object entity)等等。 所以我们的DAO只需要简单地调用父类的HibernateTemplate就可以完成几乎所有的
数
据库操作了。 由于Spring通过代理Hibernate完成
数
据层的操作,所以原Hibernate的配置文件hibernate.cfg.xml的信息也转移到Spring的配置文件中: 代码 4 Spring中有关Hibernate的配置信息 1. <beans> 2. <!--
数
据源的配置 //--> 3. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 4. destroy-method="close"> 5. <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/> 6. <property name="url" value="jdbc:oracle:thin:@localhost:1521:ora9i"/> 7. <property name="username" value="test"/> 8. <property name="password" value="test"/> 9. </bean> 10. <!-- Hibernate
会
话工厂配置 //--> 11. <bean id="sessionFactory" 12. class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 13. <property name="dataSource" ref="dataSource"/> 14. <property name="mappingDirectoryLocations"> 15. <list> 16. <value>classpath:/sshfile/model</value> 17. </list> 18. </property> 19. <property name="hibernateProperties"> 20. <props> 21. <prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop> 22. <prop key="hibernate.cglib.use_reflection_optimizer">true</prop> 23. </props> 24. </property> 25. </bean> 26. <!-- Hibernate 模板//--> 27. <bean id="hibernateTemplate" 28. class="org.springframework.orm.hibernate3.HibernateTemplate"> 29. <property name="sessionFactory" ref="sessionFactory"/> 30. </bean> 31. <!--DAO配置 //--> 32. <bean id="tfileDAO" class="sshfile.dao.TfileDAOHibernate"> 33. <property name="hibernateTemplate" ref="hibernateTemplate" /> 34. </bean> 35. … 36. </beans> 第3~9行定义了一个
数
据源,其实现类是apache的BasicDataSource,第11~25行定义了Hibernate的
会
话工厂,
会
话工厂类用Spring提供的LocalSessionFactoryBean维护,它注入了
数
据源和资源映射文件,此外还通过一些键值对设置了Hibernate所需的属性。 其中第16行通过类路径的映射方式,将sshfile.model类包目录下的所有领域对象的映射文件装载进来,在本文的例子里,它将装载进Tfile.hbm.xml映射文件。如果有多个映射文件需要声明,使用类路径映射方式显然比直接单独指定映射文件名的方式要简便。 第27~30行定义了Spring代理Hibernate
数
据操作的HibernateTemplate模板,而第32~34行将该模板注入到tfileDAO中。 需要指定的是Spring 1.2.5提供了两套Hibernate的支持包,其中Hibernate 2相关的封装类位于org.springframework.orm.hibernate2.*包中,而Hibernate 3.0的封装类位于org.springframework.orm.hibernate3.*包中,需要根据您所选用Hibernate版本进行正确选择。 3、Lob字段处理的配置 我们前面已经指出Oracle的Lob字段和一般类型的字段在操作上有一个明显的区别--那就是你必须首先通过Oracle的empty_blob()/empty_clob()初始化Lob字段,然后获取该字段的引用,通过这个引用更改其值。所以要完成对Lob字段的操作,Hibernate必须执行两步
数
据库访问操作,先Insert再Update。 使用BlobByteArrayType字段类型后,为什么我们就可以象一般的字段类型一样操作Blob字段呢?可以确定的一点是:BlobByteArrayType不可能逾越Blob天生的操作方式,原来是BlobByteArrayType
数
据类型本身具体
数
据访问的功能,它通过LobHandler将两次
数
据访问的动作隐藏起来,使Blob字段的操作在表现上和其他一般字段业类型无异,所以LobHandler即是那个"苦了我一个,幸福十亿人"的那位幕后英雄。 LobHandler必须注入到Hibernate
会
话工厂sessionFactory中,因为sessionFactory负责产生与
数
据库交互的Session。LobHandler的配置如代码 5所示: 代码 5 Lob字段的处理句柄配置 1. <beans> 2. … 3. <bean id="nativeJdbcExtractor" 4. class="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor" 5. lazy-init="true"/> 6. <bean id="lobHandler" 7. class="org.springframework.jdbc.support.lob.OracleLobHandler" lazy-init="true"> 8. <property name="nativeJdbcExtractor"> 9. <ref local="nativeJdbcExtractor"/> 10. </property> 11. </bean> 12. … 13. </beans> 首先,必须定义一个能够从连接池中抽取出本地
数
据库JDBC对象(如OracleConnection,OracleResultSet等)的抽取器:nativeJdbcExtractor,这样才可以执行一些特定
数
据库的操作。对于那些仅封装了Connection而未包括Statement的简单
数
据连接池,SimpleNativeJdbcExtractor是效率最高的抽取器实现类,但具体到apache的BasicDataSource连接池,它封装了所有JDBC的对象,这时就需要使用CommonsDbcpNativeJdbcExtractor了。Spring针对几个著名的Web服务器的
数
据源提供了相应的JDBC抽取器: •WebLogic:WebLogicNativeJdbcExtractor •WebSphere:WebSphereNativeJdbcExtractor •JBoss:JBossNativeJdbcExtractor 在定义了JDBC抽取器后,再定义lobHandler。Spring 1.2.5提供了两个lobHandler: •DefaultLobHandler:适用于大部分的
数
据库,如SqlServer,MySQL,对Oracle 10g也适用,但不适用于Oracle 9i(看来Oracle 9i确实是个怪胎,谁叫Oracle 公司自己都说Oracle 9i是一个过渡性的产品呢)。 •OracleLobHandler:适用于Oracle 9i和Oracle 10g。 由于我们的
数
据库是Oracle9i,所以使用OracleLobHandler。 在配置完LobHandler后, 还需要将其注入到sessionFactory的Bean中,下面是调用后的sessionFactory Bean的配置: 代码 6 将lobHandler注入到sessionFactory中的配置 1. <beans> 2. … 3. <bean id="sessionFactory" 4. class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 5. <property name="dataSource" ref="dataSource"/> 6. <!-- 为处理Blob类型字段的句柄声明 //--> 7. <property name="lobHandler" ref="lobHandler"/> 8. … 9. </bean> 10. … 11. </beans> 如第7所示,通过sessionFactory的lobHandler属性进行注入。 业务层 1、业务层接口 "面向接口而非面向类编程"是Spring不遗余力所推荐的编程原则,这条原则也已经为大部开发者所接受;此外,JDK的动态代理只对接口有效,否则必须使用CGLIB生成目标类的子类。我们依从于Spring的倡导为业务类定义一个接口: 代码 7 业务层操作接口 1. public interface FileService 2. { 3. void save(FileActionForm fileForm);//将提交的上传文件保存到
数
据表中 4. List getAllFile();//得到T_FILE所示记录 5. void write(OutputStream os,String fileId);//将某个文件的文件
数
据写出到输出流中 6. String getFileName(String fileId);//获取文件名 7. } 其中save(FileActionForm fileForm)方法,将封装在fileForm中的上传文件保存到
数
据库中,这里我们使用FileActionForm作为方法入参,FileActionForm是Web层的表单
数
据对象,它封装了提交表单的
数
据。将FileActionForm直接作为业务层的接口入参,相当于将Web层传播到业务层中去,即将业务层绑定在特定的Web层实现技术中,按照分层模型学院派的观点,这是一种反模块化的设计,但在"一般"的业务系统并无需提供多种UI界面,系统Web层将来切换到另一种实现技术的可能性也微乎其微,所以笔者觉得没有必要为了这个业务层完全独立于调用层的过高目标而去搞一个额外的隔离层,浪费了原材料不说,还将系统搞得过于复杂,相比于其它原则,"简单"始终是最大的一条原则。 getAllFile()负责获取T_FILE表所有记录,以便在网页上显示出来。 而getFileName(String fileId)和write(OutputStream os,String fileId)则用于下载某个特定的文件。具体的调用是将Web层将response.getOutputStream()传给write(OutputStream os,String fileId)接口,业务层直接将文件
数
据输出到这个响应流中。具体实现请参见错误!未找到引用源。节下载文件部分。 2、业务层接口实现类 FileService的实现类为FileServiceImpl,其中save(FileActionForm fileForm)的实现如下所示: 代码 8 业务接口实现类之save() 1. … 2. public class FileServiceImpl 3. implements FileService 4. { 5. private TfileDAO tfileDAO; 6. public void save(FileActionForm fileForm) 7. { 8. Tfile tfile = new Tfile(); 9. try 10. { 11. tfile.setFileContent(fileForm.getFileContent().getFileData()); 12. } 13. catch (FileNotFoundException ex) 14. { 15. throw new RuntimeException(ex); 16. } 17. catch (IOException ex) 18. { 19. throw new RuntimeException(ex); 20. } 21. tfile.setFileName(fileForm.getFileContent().getFileName()); 22. tfile.setRemark(fileForm.getRemark()); 23. tfileDAO.save(tfile); 24. } 25. … 26. } 在save(FileActionForm fileForm)方法里,完成两个步骤: 其一,象在水桶间倒水一样,将FileActionForm对象中的
数
据倒入到Tfile对象中; 其二,调用TfileDAO保存
数
据。 需要特别注意的是代码的第11行,FileActionForm的fileContent属性为org.apache.struts.upload.FormFile类型,FormFile提供了一个方便的方法getFileData(),即可获取文件的二进制
数
据。通过解读FormFile接口实现类DiskFile的原码,我们可能知道FormFile本身并不缓存文件的
数
据,只有实际调用getFileData()时,才从磁盘文件输入流中获取
数
据。由于FormFile使用流读取方式获取
数
据,本身没有缓存文件的所有
数
据,所以对于上传超大体积的文件,也是没有问题的;但是,由于
数
据持久层的Tfile使用byte[]来缓存文件的
数
据,所以并不适合处理超大体积的文件(如100M),对于超大体积的文件,依然需要使用java.sql.Blob类型以常规流操作的方式来处理。 此外,通过FileForm的getFileName()方法就可以获得上传文件的文件名,如第21行代码所示。 write(OutputStream os,String fileId)方法的实现,如代码 9所示: 代码 9 业务接口实现类之write() 1. … 2. public class FileServiceImpl 3. implements FileService 4. { 5. 6. public void write(OutputStream os, String fileId) 7. { 8. Tfile tfile = tfileDAO.findByFildId(fileId); 9. try 10. { 11. os.write(tfile.getFileContent()); 12. os.flush(); 13. } 14. catch (IOException ex) 15. { 16. throw new RuntimeException(ex); 17. } 18. } 19. … 20. } write(OutputStream os,String fileId)也简单地分为两个操作步骤,首先,根据fileId加载表记录,然后将fileContent写入到输出流中。 3、Spring事务配置 下面,我们来看如何在Spring配置文件中为FileService配置声明性的事务 1. <beans> 2. … 3. <bean id="transactionManager" 4. class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 5. <property name="sessionFactory" ref="sessionFactory"/> 6. </bean> 7. <!-- 事务处理的AOP配置 //--> 8. <bean id="txProxyTemplate" abstract="true" 9. class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> 10. <property name="transactionManager" ref="transactionManager"/> 11. <property name="transactionAttributes"> 12. <props> 13. <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> 14. <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop> 15. <prop key="save">PROPAGATION_REQUIRED</prop> 16. <prop key="write">PROPAGATION_REQUIRED,readOnly</prop> 17. </props> 18. </property> 19. </bean> 20. <bean id="fileService" parent="txProxyTemplate"> 21. <property name="target"> 22. <bean class="sshfile.service.FileServiceImpl"> 23. <property name="tfileDAO" ref="tfileDAO"/> 24. </bean> 25. </property> 26. </bean> 27. </beans> Spring的事务配置包括两个部分: 其一,定义事务管理器transactionManager,使用HibernateTransactionManager实现事务管理; 其二,对各个业务接口进行定义,其实txProxyTemplate和fileService是父子节点的关系,本来可以将txProxyTemplate定义的内容合并到fileService中一起定义,由于我们的系统仅有一个业务接口需要定义,所以将其定义的一部分抽象到父节点txProxyTemplate中意义确实不大,但是对于真实的系统,往往拥有为
数
众多的业务接口需要定义,将这些业务接口定义内容的共同部分抽取到一个父节点中,然后在子节点中通过parent进行关联,就可以大大简化业务接口的配置了。 父节点txProxyTemplate注入了事务管理器,此外还定义了业务接口事务管理的方法(允许通过通配符的方式进行匹配声明,如前两个接口方法),有些接口方法仅对
数
据进行读操作,而另一些接口方法需要涉及到
数
据的更改。对于前者,可以通过readOnly标识出来,这样有利于操作性能的提高,需要注意的是由于父类节点定义的Bean仅是子节点配置信息的抽象,并不能具体实现化一个Bean对象,所以需要特别标注为abstract="true",如第8行所示。 fileService作为一个目标类被注入到事务代理器中,而fileService实现类所需要的tfileDAO实例,通过引用3.2节中定义的tfileDAO Bean注入。 Web层实现 1、Web层的构件和交互流程 Web层包括主要3个功能: •上传文件。 •列出所有已经上传的文件列表,以供点击下载。 •下载文件。 Web层实现构件包括与2个JSP页面,1个ActionForm及一个Action: •file-upload.jsp:上传文件的页面。 •file-list.jsp:已经上传文件的列表页面。 •FileActionForm:file-upload.jsp页面表单对应的ActionForm。 •FileAction:继承org.apache.struts.actions.DispatchAction的Action,这样这个Action就可以通过一个URL参
数
区分中响应不同的请求。 Web层的这些构件的交互流程如图 6所示: 图 6 Web层Struts流程图 其中,在执行文件上传的请求时,FileAction在执行文件上传后,forward到loadAllFile出口中,loadAllFile加载
数
据库中所有已经上传的记录,然后forward到名为fileListPage的出口中,调用file-list.jsp页面显示已经上传的记录。 2、FileAction功能 Struts 1.0的Action有一个弱项:一个Action只能处理一种请求,Struts 1.1中引入了一个DispatchAction,允许通过URL参
数
指定调用Action中的某个方法,如http://yourwebsite/fileAction.do?method=upload即调用FileAction中的upload方法。通过这种方式,我们就可以将一些相关的请求集中到一个Action当中编写,而没有必要为某个请求操作编写一个Action类。但是参
数
名是要在struts-config.xml中配置的: 1. <struts-config> 2. <form-beans> 3. <form-bean name="fileActionForm" type="sshfile.web.FileActionForm" /> 4. </form-beans> 5. <action-mappings> 6. <action name="fileActionForm" parameter="method" path="/fileAction" 7. type="sshfile.web.FileAction"> 8. <forward name="fileListPage" path="/file-list.jsp" /> 9. <forward name="loadAllFile" path="/fileAction.do?method=listAllFile" /> 10. </action> 11. </action-mappings> 12. </struts-config> 第6行的parameter="method"指定了承载方法名的参
数
,第9行中,我们还配置了一个调用FileAction不同方法的Action出口。 FileAction共有3个请求响应的方法,它们分别是: •upload(…):处理上传文件的请求。 •listAllFile(…):处理加载
数
据库表中所有记录的请求。 •download(…):处理下载文件的请求。 下面我们分别对这3个请求处理方法进行讲解。 2.1 上传文件 上传文件的请求处理方法非常简单,简之言之,就是从Spring容器中获取业务层处理类FileService,调用其save(FileActionForm form)方法上传文件,如下所示: 1. public class FileAction 2. extends DispatchAction 3. { 4. //将上传文件保存到
数
据库中 5. public ActionForward upload(ActionMapping mapping, ActionForm form, 6. HttpServletRequest request, 7. HttpServletResponse response) 8. { 9. FileActionForm fileForm = (FileActionForm) form; 10. FileService fileService = getFileService(); 11. fileService.save(fileForm); 12. return mapping.findForward("loadAllFile"); 13. } 14. //从Spring容器中获取FileService对象 15. private FileService getFileService() 16. { 17. ApplicationContext appContext = WebApplicationContextUtils. 18. getWebApplicationContext(this.getServlet().getServletContext()); 19. return (FileService) appContext.getBean("fileService"); 20. } 21. … 22. } 由于FileAction其它两个请求处理方法也需要从Spring容器中获取FileService实例,所以我们特别提供了一个getFileService()方法(第15~21行)。重构的一条原则就是:"发现代码中有重复的表达式,将其提取为一个变量;发现类中有重复的代码段,将其提取为一个方法;发现不同类中有相同的方法,将其提取为一个类"。在真实的系统中,往往拥有多个Action和多个Service类,这时一个比较好的设置思路是,提供一个获取所有Service实现对象的工具类,这样就可以将Spring 的Service配置信息屏蔽在一个类中,否则Service的配置名字散落在程序各处,维护性是很差的。 2.2 列出所有已经上传的文件 listAllFile方法调用Servie层方法加载T_FILE表中所有记录,并将其保存在Request域中,然后forward到列表页面中: 1. public class FileAction 2. extends DispatchAction 3. { 4. … 5. public ActionForward listAllFile(ActionMapping mapping, ActionForm form, 6. HttpServletRequest request, 7. HttpServletResponse response) 8. throws ModuleException 9. { 10. FileService fileService = getFileService(); 11. List fileList = fileService.getAllFile(); 12. request.setAttribute("fileList",fileList); 13. return mapping.findForward("fileListPage"); 14. } 15. } file-list.jsp页面使用Struts标签展示出保存在Request域中的记录: 1. <%@page contentType="text/html; charset=GBK"%> 2. <%@taglib uri="/WEB-INF/struts-logic.tld" prefix="logic"%> 3. <%@taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%> 4. <html> 5. <head> 6. <title>file-download</title> 7. </head> 8. <body bgcolor="#ffffff"> 9. <ol> 10. <logic:iterate id="item" name="fileList" scope="request"> 11. <li> 12. <a href='fileAction.do?method=download&fileId= 13. <bean:write name="item"property="fileId"/>'> 14. <bean:write name="item" property="fileName"/> 15. </a> 16. </li> 17. </logic:iterate> 18. </ol> 19. </body> 20. </html> 展现页面的每条记录挂接着一个链接地址,形如:fileAction.do?method=download&fileId=xxx,method参
数
指定了这个请求由FileAction的download方法来响应,fileId指定了记录的主键。 由于在FileActionForm中,我们定义了fileId的属性,所以在download响应方法中,我们将可以从FileActionForm中取得fileId的值。这里涉及到一个处理多个请求Action所对应的ActionForm的设计问题,由于原来的Action只能对应一个请求,那么原来的ActionForm非常简单,它仅需要将这个请求的参
数
项作为其属性就可以了,但现在一个Action对应多个请求,每个请求所对应的参
数
项是不一样的,此时的ActionForm的属性就必须是多请求参
数
项的并集了。所以,除了文件上传请求所对应的fileContent和remark属性外还包括文件下载的fileId属性: 图 7 FileActionForm 当然这样
会
造成属性的冗余,比如在文件上传的请求中,只
会
用到fileContent和remark属性,而在文件下载的请求时,只
会
使用到fileId属性。但这种冗余是
会
带来好处的--它使得一个Action可以处理多个请求。 2.3 下载文件 在列表页面中点击一个文件下载,其请求由FileAction的download方法来响应,download方法调用业务层的FileService方法,获取文件
数
据并写出到response的响应流中。通过合理设置HTTP响应头参
数
,将响应流在客户端表现为一个下载文件对话框,其代码如下所示: 代码 10 业务接口实现类之download 1. public class FileAction 2. extends DispatchAction 3. { 4. … 5. public ActionForward download(ActionMapping mapping, ActionForm form, 6. HttpServletRequest request, 7. HttpServletResponse response) 8. throws ModuleException 9. { 10. FileActionForm fileForm = (FileActionForm) form; 11. FileService fileService = getFileService(); 12. String fileName = fileService.getFileName(fileForm.getFileId()); 13. try 14. { 15. response.setContentType("application/x-msdownload"); 16. response.setHeader("Content-Disposition", 17. "attachment;" + " filename="+ 18. new String(fileName.getBytes(), "ISO-8859-1")); 19. fileService.write(response.getOutputStream(), fileForm.getFileId()); 20. } 21. catch (Exception e) 22. { 23. throw new ModuleException(e.getMessage()); 24. } 25. return null; 26. } 27. } 第15~18行,设置HTTP响应头,将响应类型设置为application/x-msdownload MIME类型,则响应流在IE中将弹出一个文件下载的对话框,如图 4所示。IE所支持的MIME类型多达26种,您可以通过这个网址查看其他的MIME类型: http://msdn.microsoft.com/workshop/networking/moniker/overview/appendix_a.asp。 如果下载文件的文件名
含有
中文
字符,如果不对其进行硬编码,如第18行所示,客户文件下载对话框中出现的文件名将
会
发生
乱码
。 第19行代码获得response的输出流,作为FileServie write(OutputStream os,String fileId)的入参,这样文件的内容将写到response的输出流中。 3、web.xml文件的配置 Spring容器在何时启动呢?我可以在Web容器初始化来执行启动Spring容器的操作,Spring提供了两种方式启动的方法: •通过org.springframework.web.context .ContextLoaderListener容器监听器,在Web容器初始化时触发初始化Spring容器,在web.xml中通过<listener></listener>对其进行配置。 •通过Servlet org.springframework.web.context.ContextLoaderServlet,将其配置为自动启动的Servlet,在Web容器初始化时,通过这个Servlet启动Spring容器。 在初始化Spring容器之前,必须先初始化log4J的引擎,Spring也提供了容器监听器和自动启动Servlet两种方式对log4J引擎进行初始化: •org.springframework.web.util .Log4jConfigListener •org.springframework.web.util.Log4jConfigServlet 下面我们来说明如何配置web.xml启动Spring容器: 代码 11 web.xml中对应Spring的配置内容 1. <web-app> 2. <context-param> 3. <param-name>contextConfigLocation</param-name> 4. <param-value>/WEB-INF/applicationContext.xml</param-value> 5. </context-param> 6. <context-param> 7. <param-name>log4jConfigLocation</param-name> 8. <param-value>/WEB-INF/log4j.properties</param-value> 9. </context-param> 10. <servlet> 11. <servlet-name>log4jInitServlet</servlet-name> 12. <servlet-class>org.springframework.web.util.Log4jConfigServlet</servlet-class> 13. <load-on-startup>1</load-on-startup> 14. </servlet> 15. <servlet> 16. <servlet-name>springInitServlet</servlet-name> 17. <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class> 18. <load-on-startup>2</load-on-startup> 19. </servlet> 20. … 21. </web-app> 启动Spring容器时,需要得到两个信息:Spring配置文件的地址和Log4J属性文件,这两上信息分别通过contextConfigLocationWeb和log4jConfigLocation容器参
数
指定,如果有多个Spring配置文件,则用逗号隔开,如: /WEB-INF/applicationContext_1.xml, /WEB-INF/applicationContext_1.xm2 由于在启动ContextLoaderServlet之前,必须事先初始化Log4J的引擎,所以Log4jConfigServlet必须在ContextLoaderServlet之前启动,这通过<load-on-startup>来指定它们启动的先后顺序。
乱码
是开发Web应用程序一个比较老套又常见问题,由于不同Web应用服务器的默认编码是不一样的,为了方便Web应用在不同的Web应用服务器上移植,最好的做法是Web程序自身来处理编码转换的工作。经典的作法是在web.xml中配置一个编码转换过滤器,Spring就提供了一个编码过滤器类CharacterEncodingFilter,下面,我们为应用配置上这个过滤器: 1. <web-app> 2. … 3. <filter> 4. <filter-name>encodingFilter</filter-name> 5. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 6. <init-param> 7. <param-name>encoding</param-name> 8. <param-value>GBK</param-value> 9. </init-param> 10. </filter> 11. <filter-mapping> 12. <filter-name>encodingFilter</filter-name> 13. <url-pattern>/*</url-pattern> 14. </filter-mapping> 15. … 16. </web-app> Spring的过滤器类是org.springframework.web.filter.CharacterEncodingFilter,通过encoding参
数
指定编码转换类型为GBK,<filter-mapping>的配置使该过滤器截获所有的请示。 Struts的框架也需要在web.xml中配置,想必读者朋友对Struts的配置都很熟悉,故在此不再提及,请参见本文所提供的源码。 总结 本文通过一个文件上传下载的Web应用,讲解了如何构建基于SSH的Web应用,通过Struts和FormFile,Spring的LobHandler以及Spring为HibernateBlob处理所提供的用户类BlobByteArrayType ,实现上传和下载文件的功能仅需要廖廖
数
行的代码即告完成。读者只需对程序作稍许的调整,即可处理Clob字段: •领域对象对应Clob字段的属性声明为String类型; •映射文件对应Clob字段的属性声明为org.springframework.orm.hibernate3.support.ClobStringType类型。
XML轻松学习手册--XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解
XML越来越热,关于XML的基础教程网络上也随处可见。可是一大堆的概念和术语往往让人望而生畏,很多朋友问我:XML到底有什么用,我们是否需要学习它?我想就我个人学习过程的心得和经验,写一篇比较全面的介绍文章。首先有两点是需要肯定的: 第一:XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解,等待只
会
让你失去机
会
; 第二:新知识肯定
会
有很多新概念,尝试理解和接受,您才可能提高。不要害怕和逃避,毕竟我们还年轻。 本文共分五大部分。分别是XML快速入门,XML的概念,XML的术语,XML的实现,XML的实例分析。最后附录介绍了XML的相关资源。作者站在普通网页设计人员的角度,用平实生动的语言,向您讲述XML的方方面面,帮助你拨开XML的神秘面纱,快速步入XML的新领域。 • 第一章:XML快速入门 • 一. 什么是XML? • 二. XML是新概念吗? • 三. 使用XML有什么好处? • 四. XML很难学吗? • 五. XML和HTML的区别 • 六. XML的严格格式 • 七. 关于XML的更多 • 第二章:XML概念 • 一. 扩展性 • 二. 标识 • 三. 语言 • 四. 结构化 • 五. Meta
数
据 • 六. 显示 • 七. DOM • 第三章:XML的术语 • 导言 • 一.XML文档的有关术语 • 二.DTD的有关术语 • 第四章:XML的语法 • 一.XML语法规则 • 二.元素的语法 • 三.注释的语法 • 四.CDATA的语法 • 五.Namespaces的语法 • 六.entity的语法 • 七.DTD的语法 • 第五章:XML实例解释 • 一.定义新标识 • 二.建立XML文档 • 三.建立相应的HTML文件 • 第六章:XML相关资源 五. XML和HTML的区别 XML和HTML都来自于SGML,它们都
含有
标记,有着相似的语法,HTML和XML的最大区别在于:HTML是一个定型的标记语言,它用固有的标记来描述,显示网页内容。比如表示首行标题,有固定的尺寸。相对的,XML则没有固定的标记,XML不能描述网页具体的外观,内容,它只是描述内容的
数
据形式和结构。 这是一个质的区别:网页将
数
据和显示混在一起,而XML则将
数
据和显示分开来。 我们看上面的例子,在myfile.htm中,我们只关心页面的显示方式,我们可以设计不同的界面,用不同的方式来排版页面,但
数
据是储存在myfile.xml中,不需要任何改变。 (如果你是程序员,你
会
惊讶的发现,这与模块化面向对象编程的思想极其相似!其实网页何尝不是一种程序呢?) 正是这种区别使得XML在网络应用和信息共享上方便,高效,可扩展。所以我们相信,XML做为一种先进的
数
据处理方法,将使网络跨越到一个新的境界。 六. XML的严格格式 吸取HTML松散格式带来的经验教训,XML一开始就坚持实行"良好的格式"。 我们先看HTML的一些语句,这些语句在HTML中随处可见: 1. sample 2.sample 3.sample 4.samplar 在XML文档中,上述几种语句的语法都是错误的。因为: 1.所有的标记都必须要有一个相应的结束标记; 2.所有的XML标记都必须合理嵌套; 3.所有XML标记都区分大小写; 4.所有标记的属性必须用""括起来; 所以上列语句在XML中正确的写法是 1. sample 2.sample 3.sample 4.samplar 另外,XML标记必须遵循下面的命名规则: 1.名字中可以包含字母、
数
字以及其它字母; 2.名字不能以
数
字或"_" (下划线) 开头; 3.名字不能以字母 xml (或 XML 或 Xml ..) 开头; 4.名字中不能包含空格。 在XML文档中任何的差错,都
会
得到同一个结果:网页不能被显示。各浏览器开发商已经达成协议,对XML实行严格而挑剔的解析,任何细小的错误都
会
被报告。你可以将上面的myfile.xml修改一下,比如将改为,然后用IE5直接打开myfile.xml,
会
得到一个出错信息页面: XML轻松学习手册 ajie
C#
111,131
社区成员
642,542
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章