﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-细心!用心!耐心!-文章分类-项目框架的设想</title><link>http://www.blogjava.net/jesson2005/category/19583.html</link><description>吾非文人，乃市井一俗人也，读百卷书，跨江河千里，故申城一游； 
一两滴辛酸，三四年学业，五六点粗墨，七八笔买卖，九十道人情。</description><language>zh-cn</language><lastBuildDate>Sun, 17 Jun 2012 08:47:30 GMT</lastBuildDate><pubDate>Sun, 17 Jun 2012 08:47:30 GMT</pubDate><ttl>60</ttl><item><title>java千万级别数据生成文件思路和优化</title><link>http://www.blogjava.net/jesson2005/articles/380886.html</link><dc:creator>张金鹏</dc:creator><author>张金鹏</author><pubDate>Fri, 15 Jun 2012 13:41:00 GMT</pubDate><guid>http://www.blogjava.net/jesson2005/articles/380886.html</guid><wfw:comment>http://www.blogjava.net/jesson2005/comments/380886.html</wfw:comment><comments>http://www.blogjava.net/jesson2005/articles/380886.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jesson2005/comments/commentRss/380886.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jesson2005/services/trackbacks/380886.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/jesson2005/articles/380886.html'>阅读全文</a><img src ="http://www.blogjava.net/jesson2005/aggbug/380886.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jesson2005/" target="_blank">张金鹏</a> 2012-06-15 21:41 <a href="http://www.blogjava.net/jesson2005/articles/380886.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>图片自动生成器</title><link>http://www.blogjava.net/jesson2005/articles/240838.html</link><dc:creator>张金鹏</dc:creator><author>张金鹏</author><pubDate>Sun, 16 Nov 2008 11:15:00 GMT</pubDate><guid>http://www.blogjava.net/jesson2005/articles/240838.html</guid><wfw:comment>http://www.blogjava.net/jesson2005/comments/240838.html</wfw:comment><comments>http://www.blogjava.net/jesson2005/articles/240838.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jesson2005/comments/commentRss/240838.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jesson2005/services/trackbacks/240838.html</trackback:ping><description><![CDATA[<p>文章来源 <a href="http://www.qcampus.cn/">http://www.qcampus.cn</a></p>
<p>动态IP,天气预报签名&nbsp; <a href="http://ip.ipwind.cn/">http://ip.ipwind.cn/</a> </p>
<p>FLASH导航菜单生成：<a href="http://www.hostsun.com/gr/">http://www.hostsun.com/gr/</a>...</p>
<p>图片菜单生成：<a href="http://www.hostsun.com/gr/">http://www.hostsun.com/gr/</a>...</p>
<p>下拉菜单：<a href="http://www.hostsun.com/gr/">http://www.hostsun.com/gr/</a>...</p>
<p>鼠标移过图片菜单特效：<a href="http://www.hostsun.com/gr/">http://www.hostsun.com/gr/</a>...</p>
<p>CSS（导航菜单）：<a href="http://www.hostsun.com/gr/">http://www.hostsun.com/gr/</a>...</p>
<p>DHTML（导航菜单）：<a href="http://www.hostsun.com/gr/">http://www.hostsun.com/gr/</a>...</p>
<p>DHTML ToolTip（导航菜单）：<a href="http://www.hostsun.com/gr/">http://www.hostsun.com/gr/</a>...</p>
<p>Java s cript Menu Generators<br />
集合CSS（按钮）：<a href="http://www.hostsun.com/gr/">http://www.hostsun.com/gr/</a>...</p>
<p>弹窗代码生成：<a href="http://www.hostsun.com/gr/">http://www.hostsun.com/gr/</a>...</p>
<p>IE5.5滚动条代码生成：<a href="http://www.hostsun.com/gr/">http://www.hostsun.com/gr/</a>... <br />
粉丝身份证：<a href="http://id.igogo8.com/">http://id.igogo8.com/</a>&nbsp; </p>
<p>制作印章：<a href="http://www.makepic.com/print.php">http://www.makepic.com/print.php</a>&nbsp; </p>
<p>邮址图片生成：<a href="http://www.makepic.com/email.php">http://www.makepic.com/email.php</a></p>
<p>条形码生成：<a href="http://www.makepic.com/barcode.php">http://www.makepic.com/barcode.php</a></p>
<p>Kiss学堂 颁发结业证：<a href="http://www.makepic.com/kiss/cert.php">http://www.makepic.com/kiss/cert.php</a>&nbsp; </p>
<p>生成头像：<a href="http://www.eoool.com/ImageDIY/DIYChooseImg.aspx?ImgSize=96x96x1">http://www.eoool.com/ImageDIY/DIYChooseImg.aspx?ImgSize=96x96x1</a></p>
<p>邮件：<a href="http://www.eoool.com/Sevice.aspx?TypeID=1">http://www.eoool.com/Sevice.aspx?TypeID=1</a>&nbsp; </p>
<p>聊天图标：<a href="http://www.eoool.com/Sevice.aspx?TypeID=2">http://www.eoool.com/Sevice.aspx?TypeID=2</a> </p>
<p>博客图标：<a href="http://www.eoool.com/Sevice.aspx?TypeID=3">http://www.eoool.com/Sevice.aspx?TypeID=3</a>&nbsp; </p>
<p>网络书签：<a href="http://www.eoool.com/Sevice.aspx?TypeID=5">http://www.eoool.com/Sevice.aspx?TypeID=5</a></p>
<p>朋友圈：<a href="http://www.eoool.com/Sevice.aspx?TypeID=4">http://www.eoool.com/Sevice.aspx?TypeID=4</a></p>
<p>按扭：<a href="http://www.eoool.com/Sevice.aspx?TypeID=11">http://www.eoool.com/Sevice.aspx?TypeID=11</a></p>
<p>生成拼凑图：<a href="http://blog.outer-court.com/letters/">http://blog.outer-court.com/letters/</a></p>
<p>一个日本武士刀劈出你需要的字：&nbsp; <br />
<a href="http://tools.fodey.com/generators/animated/ninjatext.asp">http://tools.fodey.com/generators/animated/ninjatext.asp</a></p>
<p>生成几种卡通人物对话动态图片：&nbsp; <br />
<a href="http://tools.fodey.com/generators/animated/talking_squirrel.asp">http://tools.fodey.com/generators/animated/talking_squirrel.asp</a></p>
<p>香烟盒生成，可以做警告图片：<a href="http://tools.fodey.com/generators/cigarette_packet/generator.cig">http://tools.fodey.com/generators/cigarette_packet/generator.cig</a> </p>
<p>支持多种域名的Email图标的生成: <a href="http://www.nhacks.com/email/">http://www.nhacks.com/email/</a><br />
两个地址支持两种风格任意文本的Email图标的生成:<br />
<a href="http://sagittarius.dip.jp/~toshi/cgi-bin/designmail/designmail.html">http://sagittarius.dip.jp/~toshi/cgi-bin/designmail/designmail.html</a><br />
<a href="http://sagittarius.dip.jp/~toshi/cgi-bin/catmark/catmark.html">http://sagittarius.dip.jp/~toshi/cgi-bin/catmark/catmark.html</a></p>
<p>在线favicon生成器: <a href="http://www.html-kit.com/e/favicon.cgi">http://www.html-kit.com/e/favicon.cgi</a></p>
<p>支持各种类型图片的生成，可以选择设置的条件非常灵活:<br />
<a href="http://www.abi-station.com/tchinese/">http://www.abi-station.com/tchinese/</a></p>
<p>支持大量中文字体签名图标生成: <a href="http://www.youmade.com/font/">http://www.youmade.com/font/</a></p>
<p>Flickr杂志封面生成器: <a href="http://flagrantdisregard.com/flickr/magazine.php">http://flagrantdisregard.com/flickr/magazine.php</a><br />
动态生成有趣图片:<br />
爱因斯坦<br />
<a href="http://www.hetemeel.com/einsteinform.php">http://www.hetemeel.com/einsteinform.php</a><br />
山姆大叔<br />
<a href="http://www.hetemeel.com/unclesamform.php">http://www.hetemeel.com/unclesamform.php</a><br />
辞典<br />
<a href="http://www.hetemeel.com/dictionaryform.php">http://www.hetemeel.com/dictionaryform.php</a><br />
魔法师<br />
<a href="http://www.imagegenerator.net/create/dumbledore/">http://www.imagegenerator.net/create/dumbledore/</a></p>
<p>Flickr Logo风格图片生成器: <a href="http://flickr.nosv.org/">http://flickr.nosv.org/</a></p>
<p>按钮生成网站: <br />
<a href="http://kalsey.com/tools/buttonmaker/">http://kalsey.com/tools/buttonmaker/</a><br />
<a href="http://www.lucazappa.com/brilliantMaker/buttonImage.php">http://www.lucazappa.com/brilliantMaker/buttonImage.php</a><br />
<a href="http://www.feedforall.com/public/rss-graphic-tool.htm">http://www.feedforall.com/public/rss-graphic-tool.htm</a><br />
<a href="http://www.kalsey.com/tools/buttonmaker/">http://www.kalsey.com/tools/buttonmaker/</a><br />
<a href="http://www.yugatech.com/make.php">http://www.yugatech.com/make.php</a><br />
<a href="http://www.hkwebs.net/catalog/tools/buttonmaker/index.php">http://www.hkwebs.net/catalog/tools/buttonmaker/index.php</a></p>
<p>Email图标生成网站: <br />
<a href="http://email.playtime.uni.cc/">http://email.playtime.uni.cc/</a> <br />
<a href="http://services.nexodyne.com/email/">http://services.nexodyne.com/email/</a> <br />
<a href="http://gizmo967.mgs3.org/Gmail/">http://gizmo967.mgs3.org/Gmail/</a> <br />
<a href="http://www.hkwebs.net/catalog/tools/gmail/">http://www.hkwebs.net/catalog/tools/gmail/</a> <br />
<a href="http://sagittarius.dip.jp/~toshi/cgi-bin/designmail/designmail.html">http://sagittarius.dip.jp/~toshi/cgi-bin/designmail/designmail.html</a> <br />
<a href="http://www.eoool.com/">http://www.eoool.com/</a></p>
<p>Logo生成网站: <br />
<a href="http://phorum.com.tw/Generator.aspx">http://phorum.com.tw/Generator.aspx</a> <br />
<a href="http://www.logoyes.com/lc_leftframe.htm">http://www.logoyes.com/lc_leftframe.htm</a> <br />
<a href="http://cooltext.com/Default.aspx">http://cooltext.com/Default.aspx</a></p>
<p>Banner图片制作网站: <br />
<a href="http://www.bannerbreak.com/index.php">http://www.bannerbreak.com/index.php</a></p>
<p>在线图片生成网站: <br />
<a href="http://www.streetsigngenerator.com/">http://www.streetsigngenerator.com/</a> <br />
<a href="http://www.letterjames.de/">http://www.letterjames.de/</a></p>
<p>图片分割器: <a href="http://www.html-kit.com/e/is.cgi">http://www.html-kit.com/e/is.cgi</a></p>
<p>立体图片生成器: <a href="http://www.chami.com/html-kit/services/imge/">http://www.chami.com/html-kit/services/imge/</a></p>
<p>图片生成邮票: <a href="http://photo.stamps.com/PhotoStamps/?source=si00001331">http://photo.stamps.com/PhotoStamps/?source=si00001331</a> </p>
<p>个性拼图: <a href="http://www.jigcool.com/jigonline/jigonline1_sc.php">http://www.jigcool.com/jigonline/jigonline1_sc.php</a> </p>
<p>印章制作: <a href="http://caishu.sina.com.cn/">http://caishu.sina.com.cn/</a></p>
<p>韩国身份证的生成以及验证:<br />
<a href="http://www.udeng.com/images/hanguo.htm">http://www.udeng.com/images/hanguo.htm</a> </p>
<p>GIF图片的文字LOGO在线生成:<br />
<a href="http://www.3dtextmaker.com/cgi-bin/3dtext.pl">http://www.3dtextmaker.com/cgi-bin/3dtext.pl</a> </p>
<p>在线制作logo,bannar的网站:<br />
<a href="http://www.crazystudy.com/">http://www.crazystudy.com</a> </p>
<p>SAINT.Assess the Security of Computer Networks <br />
<a href="http://www.saintcorporation.com/saint/">http://www.saintcorporation.com/saint/</a></p>
<p>Abacus.Intrusion Prevention System <br />
<a href="http://www.psionic.com/abacus/">http://www.psionic.com/abacus/</a> </p>
<p>Firewall Generator（在线生成简单的防火墙脚本） <br />
<a href="http://www.citadec.com/FirewallGenerator.html">http://www.citadec.com/FirewallGenerator.html</a> </p>
<p>身份证号码在线生成器 <br />
<a href="http://i972.net/~gen/">http://i972.net/~gen/</a> </p>
<p>在线字体图片生成 <br />
<a href="http://www.youmade.com/font/">http://www.youmade.com/font/</a> </p>
<p>中外破解补丁和注册机在线求救 <br />
<a href="http://hmay.qq.topzj.com/">http://hmay.qq.topzj.com/</a> </p>
<p>在线生成条码打印 <br />
<a href="http://www.027hc.com/y1.asp">http://www.027hc.com/y1.asp</a> <br />
<a href="http://www.nlscan.com/soucecentre/demo.asp">http://www.nlscan.com/soucecentre/demo.asp</a> <br />
<a href="http://www.gzbonny.com/asp/barcode.asp">http://www.gzbonny.com/asp/barcode.asp</a> </p>
<p>在线图形特效生成 <br />
<a href="http://www.chami.com/">http://www.chami.com/</a> </p>
<p>聊天工具在线状态生成器 <br />
<a href="http://www.onlinestatus.org/forum/usage.php">http://www.onlinestatus.org/forum/usage.php</a> </p>
<p>在线转换工具zamzar，能转换100M以下的到40种格式的文件，包括<br />
图象格式：bmp, gif, jpg, png, tiff;<br />
文档格式：csv, doc, html, odp, ods, odt, cx, pdf, ppt, ps, rtf, txt, xls, xml;<br />
音频格式：aac, ac3, amr, au, flac, m4a, mmf, mp3, ogg, wav, wma;<br />
视频格式：3gp, avi, flv, gvi, ipod, mov, mp4, mpg, ogg<br />
功能相当不错的了，可以说是一个比较全能的工具了，而且页面简洁易用，速度也很不错！！<br />
<a href="http://www.zamzar.com/">http://www.zamzar.com/</a></p>
<p>kaocre是日本的一个专门生成表情图象的网站，提供20种脸形，52种眼睛形状，47种嘴巴形状，而其中呢脸形主要是颜色上的区别。所以根据组合原理，在这个页面上实际上能生成48880种不同的图象来，这么多表情图象已经很充分了，如果你想为自己的博客换一组新表情，不妨考虑下这个在线的工具哦！ <br />
<a href="http://www.kaocre.com/">http://www.kaocre.com/</a></p>
<p>在这个网站上有13个有趣的小工具，特别是对图像的特效处理效果很不错，比如点acid选项进入编辑你可以上载一张图片，然后就可以做出很魔幻的效果来，还有eyes，wavey,glitter，Star pen 都可以为照片加上一些有趣的特效，3Dstereogram是做三维立体图的,puzzle是DIY 拼图的工具，其他工具包括，留言，统计，投票，即时涂鸦，拼图，3D涂鸦等，作好之后会自动生成代码以便在网站或blog中引用。<br />
<a href="http://www.flash-gear.com/index.php">http://www.flash-gear.com/index.php</a></p>
<p>一个在线的图象修改工具，它主要的方面就是对图片进行恶搞，比如加胡须，加头发，戴帽子等等，非常实用，对所加的各个元素可以自由调整大小，方向等，直到感觉浑然一体为止，然后做的图效果也非常逼真，非常有趣的一个工具！<br />
<a href="http://www.pikipimp.com/">http://www.pikipimp.com/</a></p>
<p>输入文字就发音的网站，只支持繁体中文<a href="http://www.putonghuaonline.com/">http://www.putonghuaonline.com/</a></p>
<p>制作在线通辑令<a href="http://www.glassgiant.com/wanted/">http://www.glassgiant.com/wanted/</a></p>
<p>在你的照片上添加有趣的对话框<a href="http://www.bubblesnaps.com/">http://www.bubblesnaps.com/</a></p>
<p>这个网站提供各种有趣的在线拼图<a href="http://www.thebroth.com/">http://www.thebroth.com/</a></p>
<p>生成自己的卡通头像<a href="http://cartoon.msn.com.cn/">http://cartoon.msn.com.cn/</a></p>
<p>在线素描<a href="http://flashface.ctapt.de/">http://flashface.ctapt.de</a></p>
<p>在线制作徵章<a href="http://www.says-it.com/seal/index.php">http://www.says-it.com/seal/index.php</a></p>
<p>各种动画图标制作<a href="http://ajaxload.info/">http://ajaxload.info/</a></p>
<p>字体图片制作<a href="http://cooltext.com/">http://cooltext.com/</a></p>
<p>做个图片让别人来拼<a href="http://www.flash-gear.com/puzzle">http://www.flash-gear.com/puzzle</a></p>
<p>在线媒体转换工具<a href="http://media-convert.com/">http://media-convert.com/</a></p>
<p>处用FLASH技术构建，把图片及音乐混合做成、流媒体<a href="http://www.photoshow.com/">http://www.photoshow.com/</a></p>
<p>拼你的博客<a href="http://pingoat.com/">http://pingoat.com/</a></p>
<p>在线做个以自己照片做硬币人物的硬币图片，<a href="http://onlinewahn.de/generator/m-maker.htm">http://onlinewahn.de/generator/m-maker.htm</a></p>
<p>在线制作FLASH小影片<a href="http://www.dfilm.com/index_movie_start.html">http://www.dfilm.com/index_movie_start.html</a></p>
<p>在线截屏url后网址的网站<a href="http://images.websnapr.com/?url=www.578453175.com">http://images.websnapr.com/?url=www.578453175.com</a></p>
<p>在线国画涂鸦<a href="http://jacksonpollock.org/">http://jacksonpollock.org/</a></p>
<p>在线图片处理：<a href="http://www1.iephotoshop.com/">http://www1.iephotoshop.com/</a>电信入口<a href="http://www.iephotoshop.com/">http://www.iephotoshop.com/</a>网通入口</p>
<p>DIY网络拼图小工具让你快速将自己的图片DIY成网络拼图，还设有计时器与排行榜。 <a href="http://www.webpuzzle.cn/">http://www.webpuzzle.cn</a></p>
<p>在线剪纸(FLASH版)http://snowflakes.barkleyus.com/</p>
<p>测试你的纯情指数<a href="http://www.578453175.com/blog/article.asp?id=173">http://www.578453175.com/blog/article.asp?id=173</a> </p>
<p>这个绝对是经典，泡坛人的福音<br />
这个绝对是经典，泡坛人的福音<br />
觉得不错才给大家弄来的！<br />
<br />
粉丝身份证：<a href="http://id.igogo8.com/" target="_blank"><font color="#2f5fa1">http://id.igogo8.com/</font></a><br />
制作印章：<a href="http://www.makepic.com/print.php" target="_blank"><font color="#2f5fa1">http://www.makepic.com/print.php</font></a><br />
邮址图片生成：<a href="http://www.makepic.com/email.php" target="_blank"><font color="#2f5fa1">http://www.makepic.com/email.php</font></a><br />
条形码生成：<a href="http://www.makepic.com/barcode.php" target="_blank"><font color="#2f5fa1">http://www.makepic.com/barcode.php</font></a><br />
Kiss学堂 颁发结业证：<a href="http://www.makepic.com/kiss/cert.php" target="_blank"><font color="#2f5fa1">http://www.makepic.com/kiss/cert.php</font></a><br />
生成头像：<a href="http://www.eoool.com/ImageDIY/DIYChooseImg.aspx?ImgSize=96x96x1" target="_blank"><font color="#2f5fa1">http://www.eoool.com/ImageDIY/DIYChooseImg.aspx?ImgSize=96x96x1</font></a><br />
邮件：<a href="http://www.eoool.com/Sevice.aspx?TypeID=1" target="_blank"><font color="#2f5fa1">http://www.eoool.com/Sevice.aspx?TypeID=1</font></a><br />
聊天图标：<a href="http://www.eoool.com/Sevice.aspx?TypeID=2" target="_blank"><font color="#2f5fa1">http://www.eoool.com/Sevice.aspx?TypeID=2</font></a><br />
博客图标：<a href="http://www.eoool.com/Sevice.aspx?TypeID=3" target="_blank"><font color="#2f5fa1">http://www.eoool.com/Sevice.aspx?TypeID=3</font></a><br />
网络书签：<a href="http://www.eoool.com/Sevice.aspx?TypeID=5" target="_blank"><font color="#2f5fa1">http://www.eoool.com/Sevice.aspx?TypeID=5</font></a><br />
朋友圈：<a href="http://www.eoool.com/Sevice.aspx?TypeID=4" target="_blank"><font color="#2f5fa1">http://www.eoool.com/Sevice.aspx?TypeID=4</font></a><br />
按扭：<a href="http://www.eoool.com/Sevice.aspx?TypeID=11" target="_blank"><font color="#2f5fa1">http://www.eoool.com/Sevice.aspx?TypeID=11</font></a><br />
生成拼凑图：<a href="http://blog.outer-court.com/letters/" target="_blank"><font color="#2f5fa1">http://blog.outer-court.com/letters/</font></a><br />
一个曰本武士刀劈出你需要的字：<a href="http://tools.fodey.com/generators/animated/ninjatext.asp" target="_blank"><font color="#2f5fa1">http://tools.fodey.com/generators/animated/ninjatext.asp</font></a><br />
生成几种卡通人物对话动态图片：<a href="http://tools.fodey.com/generators/animated/talking_squirrel.asp" target="_blank"><font color="#2f5fa1">http://tools.fodey.com/generators/animated/talking_squirrel.asp</font></a><br />
香烟盒生成，可以做警告图片：<a href="http://tools.fodey.com/generators/cigarette_packet/generator.cig" target="_blank"><font color="#2f5fa1">http://tools.fodey.com/generators/cigarette_packet/generator.cig</font></a><br />
支持多种域名的Email图标的生成：<a href="http://www.nhacks.com/email/" target="_blank"><font color="#2f5fa1">http://www.nhacks.com/email/</font></a><br />
两个地址支持两种风格任意文本的Email图标的生成：<br />
<a href="http://sagittarius.dip.jp/~toshi" target="_blank"><font color="#2f5fa1">http://sagittarius.dip.jp/~toshi</font></a> ... ail/designmail.html<br />
<a href="http://sagittarius.dip.jp/~toshi/cgi-bin/catmark/catmark.html" target="_blank"><font color="#2f5fa1">http://sagittarius.dip.jp/~toshi/cgi-bin/catmark/catmark.html</font></a><br />
在线favicon生成器：<a href="http://www.html-kit.com/e/favicon.cgi" target="_blank"><font color="#2f5fa1">http://www.html-kit.com/e/favicon.cgi</font></a><br />
支持各种类型图片的生成，可以选择设置的条件非常灵活：<a href="http://www.abi-station.com/tchinese/" target="_blank"><font color="#2f5fa1">http://www.abi-station.com/tchinese/</font></a><br />
支持大量中文字体签名图标生成：<a href="http://www.youmade.com/font/" target="_blank"><font color="#2f5fa1">http://www.youmade.com/font/</font></a><br />
Flickr杂志封面生成器：<a href="http://flagrantdisregard.com/flickr/magazine.php" target="_blank"><font color="#2f5fa1">http://flagrantdisregard.com/flickr/magazine.php</font></a><br />
动态生成有趣图片：<br />
爱因斯坦：<br />
<a href="http://www.hetemeel.com/einsteinform.php" target="_blank"><font color="#2f5fa1">http://www.hetemeel.com/einsteinform.php</font></a><br />
山姆大叔：<br />
<a href="http://www.hetemeel.com/unclesamform.php" target="_blank"><font color="#2f5fa1">http://www.hetemeel.com/unclesamform.php</font></a><br />
辞典：<br />
<a href="http://www.hetemeel.com/dictionaryform.php" target="_blank"><font color="#2f5fa1">http://www.hetemeel.com/dictionaryform.php</font></a><br />
魔法师：<br />
<a href="http://www.imagegenerator.net/create/dumbledore/" target="_blank"><font color="#2f5fa1">http://www.imagegenerator.net/create/dumbledore/</font></a><br />
Flickr Logo风格图片生成器：<a href="http://flickr.nosv.org/" target="_blank"><font color="#2f5fa1">http://flickr.nosv.org/</font></a><br />
按钮生成网站：<br />
<a href="http://kalsey.com/tools/buttonmaker/" target="_blank"><font color="#2f5fa1">http://kalsey.com/tools/buttonmaker/</font></a><br />
<a href="http://www.lucazappa.com/brilliantMaker/buttonImage.php" target="_blank"><font color="#2f5fa1">http://www.lucazappa.com/brilliantMaker/buttonImage.php</font></a><br />
<a href="http://www.feedforall.com/public/rss-graphic-tool.htm" target="_blank"><font color="#2f5fa1">http://www.feedforall.com/public/rss-graphic-tool.htm</font></a><br />
<a href="http://www.kalsey.com/tools/buttonmaker/" target="_blank"><font color="#2f5fa1">http://www.kalsey.com/tools/buttonmaker/</font></a><br />
<a href="http://www.yugatech.com/make.php" target="_blank"><font color="#2f5fa1">http://www.yugatech.com/make.php</font></a><br />
<a href="http://www.hkwebs.net/catalog/tools/buttonmaker/index.php" target="_blank"><font color="#2f5fa1">http://www.hkwebs.net/catalog/tools/buttonmaker/index.php</font></a><br />
Email图标生成网站：<br />
<a href="http://email.playtime.uni.cc/" target="_blank"><font color="#2f5fa1">http://email.playtime.uni.cc/</font></a><br />
<a href="http://services.nexodyne.com/email/" target="_blank"><font color="#2f5fa1">http://services.nexodyne.com/email/</font></a><br />
<a href="http://gizmo967.mgs3.org/Gmail/" target="_blank"><font color="#2f5fa1">http://gizmo967.mgs3.org/Gmail/</font></a><br />
<a href="http://www.hkwebs.net/catalog/tools/gmail/" target="_blank"><font color="#2f5fa1">http://www.hkwebs.net/catalog/tools/gmail/</font></a><br />
<a href="http://sagittarius.dip.jp/~toshi" target="_blank"><font color="#2f5fa1">http://sagittarius.dip.jp/~toshi</font></a> ... ail/designmail.html<br />
<a href="http://www.eoool.com/" target="_blank"><font color="#2f5fa1">http://www.eoool.com/</font></a><br />
Logo生成网站：<br />
<a href="http://phorum.com.tw/Generator.aspx" target="_blank"><font color="#2f5fa1">http://phorum.com.tw/Generator.aspx</font></a><br />
<a href="http://www.logoyes.com/lc_leftframe.htm" target="_blank"><font color="#2f5fa1">http://www.logoyes.com/lc_leftframe.htm</font></a><br />
<a href="http://cooltext.com/Default.aspx" target="_blank"><font color="#2f5fa1">http://cooltext.com/Default.aspx</font></a><br />
Banner图片制作网站：<a href="http://www.bannerbreak.com/index.php" target="_blank"><font color="#2f5fa1">http://www.bannerbreak.com/index.php</font></a><br />
在线图片生成网站：<br />
<a href="http://www.streetsigngenerator.com/" target="_blank"><font color="#2f5fa1">http://www.streetsigngenerator.com/</font></a><br />
<a href="http://www.letterjames.de/" target="_blank"><font color="#2f5fa1">http://www.letterjames.de/</font></a><br />
图片分割器：<a href="http://www.html-kit.com/e/is.cgi" target="_blank"><font color="#2f5fa1">http://www.html-kit.com/e/is.cgi</font></a><br />
立体图片生成器：<a href="http://www.chami.com/html-kit/services/imge/" target="_blank"><font color="#2f5fa1">http://www.chami.com/html-kit/services/imge/</font></a><br />
图片生成邮票:：<a href="http://photo.stamps.com/PhotoStamps/?source=si00001331" target="_blank"><font color="#2f5fa1">http://photo.stamps.com/PhotoStamps/?source=si00001331</font></a><br />
个性拼图：<a href="http://www.jigcool.com/jigonline/jigonline1_sc.php" target="_blank"><font color="#2f5fa1">http://www.jigcool.com/jigonline/jigonline1_sc.php</font></a><br />
印章制作：<a href="http://caishu.sina.com.cn/" target="_blank"><font color="#2f5fa1">http://caishu.sina.com.cn/</font></a><br />
韩国身份证的生成以及验证：<a href="http://www.udeng.com/images/hanguo.htm" target="_blank"><font color="#2f5fa1">http://www.udeng.com/images/hanguo.htm</font></a><br />
GIF图片的文字LOGO在线生成：<a href="http://www.3dtextmaker.com/cgi-bin/3dtext.pl" target="_blank"><font color="#2f5fa1">http://www.3dtextmaker.com/cgi-bin/3dtext.pl</font></a><br />
在线制作logo,bannar的网站：<a href="http://www.crazystudy.com/" target="_blank"><font color="#2f5fa1">http://www.crazystudy.com</font></a>&lt;<br />
SAINT.Assess the Security of Computer Networks：<a href="http://www.saintcorporation.com/saint/" target="_blank"><font color="#2f5fa1">http://www.saintcorporation.com/saint/</font></a><br />
Abacus.Intrusion Prevention System：<a href="http://www.psionic.com/abacus/" target="_blank"><font color="#2f5fa1">http://www.psionic.com/abacus/</font></a><br />
Firewall Generator（在线生成简单的防火墙脚本）：<a href="http://www.citadec.com/FirewallGenerator.html" target="_blank"><font color="#2f5fa1">http://www.citadec.com/FirewallGenerator.html</font></a><br />
身份证号码在线生成器：<a href="http://i972.net/~gen/" target="_blank"><font color="#2f5fa1">http://i972.net/~gen/</font></a><br />
在线字体图片生成：<a href="http://www.youmade.com/font/" target="_blank"><font color="#2f5fa1">http://www.youmade.com/font/</font></a><br />
中外破解补丁和注册机在线求救：<a href="http://hmay.qq.topzj.com/" target="_blank"><font color="#2f5fa1">http://hmay.qq.topzj.com/</font></a><br />
在线生成条码打印：<br />
<a href="http://www.027hc.com/y1.asp" target="_blank"><font color="#2f5fa1">http://www.027hc.com/y1.asp</font></a><br />
<a href="http://www.nlscan.com/soucecentre/demo.asp" target="_blank"><font color="#2f5fa1">http://www.nlscan.com/soucecentre/demo.asp</font></a><br />
<a href="http://www.gzbonny.com/asp/barcode.asp" target="_blank"><font color="#2f5fa1">http://www.gzbonny.com/asp/barcode.asp</font></a><br />
在线图形特效生成：<a href="http://www.chami.com/" target="_blank"><font color="#2f5fa1">http://www.chami.com/</font></a><br />
聊天工具在线状态生成器：<a href="http://www.onlinestatus.org/forum/usage.php" target="_blank"><font color="#2f5fa1">http://www.onlinestatus.org/forum/usage.php</font></a><br />
个性签名图/闪字在线生成<br />
<a href="http://zfwlpt.go1.icpcn.com/qqzone/qqcz.htm" target="_blank"><font color="#2f5fa1">http://zfwlpt.go1.icpcn.com/qqzone/qqcz.htm</font></a><br />
变色贴彩字转换工具<br />
<a href="http://zfwlpt.go1.icpcn.com/qqzone/qqcolor.htm" target="_blank"><font color="#2f5fa1">http://zfwlpt.go1.icpcn.com/qqzone/qqcolor.htm</font></a><br />
汉字简体/繁体在线转换工具<br />
<a href="http://zfwlpt.go1.icpcn.com/qqzone/QQhanzi.htm" target="_blank"><font color="#2f5fa1">http://zfwlpt.go1.icpcn.com/qqzone/QQhanzi.htm</font></a></p>
<img src ="http://www.blogjava.net/jesson2005/aggbug/240838.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jesson2005/" target="_blank">张金鹏</a> 2008-11-16 19:15 <a href="http://www.blogjava.net/jesson2005/articles/240838.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个完整的接口技术解决方案（八）</title><link>http://www.blogjava.net/jesson2005/articles/120735.html</link><dc:creator>张金鹏</dc:creator><author>张金鹏</author><pubDate>Tue, 29 May 2007 09:33:00 GMT</pubDate><guid>http://www.blogjava.net/jesson2005/articles/120735.html</guid><wfw:comment>http://www.blogjava.net/jesson2005/comments/120735.html</wfw:comment><comments>http://www.blogjava.net/jesson2005/articles/120735.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jesson2005/comments/commentRss/120735.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jesson2005/services/trackbacks/120735.html</trackback:ping><description><![CDATA[<h2><a id=viewpost1_TitleUrl href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550162.html">一个完整的接口技术解决方案（八） </a></h2>
&nbsp;题注：&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;发表这篇解决方案，属于非盈利目的。主要是为了让大家了解一种接口技术解决方案文档的编写格式以及让大家评审在我的这个技术解决方案中的不足之处，以便大家指出并加以改进。&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;转载，下载或与各种形式使用这篇文章，必须注明文章的作者，出处。&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;其他未尽事宜，以国家法律规定的为准！&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;作者：南疯<br><br>
<h1><a name=_Toc150138098></a><a name=_Toc143523700><span><span><span>10<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>网页地址</span></span></a></h1>
<p><a name=_Toc143523701><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>外协系统<span>Web Service</span>测试地址<span>(ENI</span>内网<span>)</span>：</span></a></p>
<p><a href="http://xxx.xxx.xxx.xxx/PECS_CONSTRUCTION_INTERFACE/INTERFACE.ASMX"><span><span>http://xxx.xxx.xxx.xxx/PECS_CONSTRUCTION_INTERFACE/INTERFACE.ASMX</span></span></a><span></span></p>
<p><span><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>WSDL</span></span><span><span>文档地址：</span></span></p>
<p><a href="http://xxx.xxx.xxx.xxx/PECS_CONSTRUCTION_INTERFACE/INTERFACE.ASMX"><span><span>http://xxx.xxx.xxx.xxx/PECS_CONSTRUCTION_INTERFACE/INTERFACE.ASMX</span></span></a><span><span>?WSDL</span></span></p>
<p><span><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>外协系统正式使用地址：</span></span></p>
<p><span><span>待定。</span></span></p>
<p><span><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>施工系统<span>Web Service</span>测试地址<span>(ENI</span>内网<span>)</span>：</span></span></p>
<p><span>&nbsp;</span></p>
<p><span><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>施工系统正式使用地址：</span></span></p>
<p><span>&nbsp;</span></p>
<h1><span>11<a name=_Toc150138099><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>Web Service</span></a></span><span><span><span>接口</span></span></span></h1>
<h2>11<a name=_Toc150138100><span><span><font face=Arial>.1</font><span>&nbsp;&nbsp;&nbsp; </span></span></span><span>接口命名规范</span></a></h2>
<p><span>对于业务数据，根据前面的表英文名，接口名称全部是大写。如果：</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>前面带有 <span>QUERY_ </span>的，表示对这个表进行查询并下载记录。</span></p>
<p><span>比如：<span>UPDATE_</span></span><span> BEGINWORKREPORT </span><span>表示对开工报告进行</span><span>进行查询并下载记录</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>前面带有 <span>UPDATE_ </span>的，表示对这个表进行新增或者修改记录。</span></p>
<p><span>比如：<span>UPDATE_</span></span><span> BEGINWORKREPORT </span><span>表示对开工报告进行新增或修改记录</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>施工系统接受外协系统发送的变更字典信息接口为：<span>UPDATE_DICTIONARY</span></span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>前面带有<span> DELETE_ </span>的，表示对这个表进行删除记录。</span></p>
<p><span>比如：<span>DELETE _</span></span><span> BEGINWORKREPORT </span><span>表示对开工报告进行删除记录</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>其他的外协系统特别提供的接口命名，请见后面的<span>11.4</span></span></p>
<h2>11<a name=_Toc150138101><span><span><font face=Arial>.2</font><span>&nbsp;&nbsp;&nbsp; </span></span></span><span>输入参数</span></a></h2>
<p><span>所有的接口都仅仅接受一个参数，参数变量名为：</span><span>strXML</span><span>，文本类型</span></p>
<h2>11<a name=_Toc150138102><span><span><font face=Arial>.3</font><span>&nbsp;&nbsp;&nbsp; </span></span></span><span>输出参数</span></a></h2>
<p><span>所有的接口都返回文本数据类型的数据，接受返回值的客户端变量由客户端自行定义。</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2>11<a name=_Toc150138103><span><span><font face=Arial>.4</font><span>&nbsp;&nbsp;&nbsp; </span></span></span><span>外协系统提供的其他接口</span></a></h2>
<p><span>外协系统特别提供的</span><span>Web Service</span><span>接口名（注意：不全部是大写）（参数遵循前面的规则）：</span></p>
<div align=center>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=175>
            <p align=center><strong><span>接口名称</span></strong></p>
            </td>
            <td vAlign=top width=234>
            <p align=center><strong><span>说</span><span> </span></strong><strong><span>明</span></strong></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span>GetFileInfo</span></p>
            </td>
            <td vAlign=top width=234>
            <p><span>获得文档的基本信息</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span>GetFileInfoWithBrother</span></p>
            </td>
            <td vAlign=top width=234>
            <p><span>获得文档的基本信息<span>(</span>带有所有的兄弟记录<span>)</span></span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span>GetFileInfoWithParent</span></p>
            </td>
            <td vAlign=top width=234>
            <p><span>获得文档的基本信息<span>(</span>带有所有的父亲记录<span>)</span></span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span>UploadFile</span></p>
            </td>
            <td vAlign=top width=234>
            <p><span>上传文档</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span>DeleteFile</span></p>
            </td>
            <td vAlign=top width=234>
            <p><span>删除文档</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span>GetDictionary</span></p>
            </td>
            <td vAlign=top width=234>
            <p><span>获得字典信息</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width=234>
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width=234>
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width=234>
            <p>&nbsp;</p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p>&nbsp;</p>
<h1>12<a name=_Toc143523702><span><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>附录：待定问题</span></span></a></h1>
<h1>&nbsp;</h1>
<img src ="http://www.blogjava.net/jesson2005/aggbug/120735.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jesson2005/" target="_blank">张金鹏</a> 2007-05-29 17:33 <a href="http://www.blogjava.net/jesson2005/articles/120735.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个完整的接口技术解决方案（七）</title><link>http://www.blogjava.net/jesson2005/articles/120733.html</link><dc:creator>张金鹏</dc:creator><author>张金鹏</author><pubDate>Tue, 29 May 2007 09:31:00 GMT</pubDate><guid>http://www.blogjava.net/jesson2005/articles/120733.html</guid><wfw:comment>http://www.blogjava.net/jesson2005/comments/120733.html</wfw:comment><comments>http://www.blogjava.net/jesson2005/articles/120733.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jesson2005/comments/commentRss/120733.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jesson2005/services/trackbacks/120733.html</trackback:ping><description><![CDATA[<h2><a id=viewpost1_TitleUrl href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550156.html">一个完整的接口技术解决方案（七） </a></h2>
题注：&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;发表这篇解决方案，属于非盈利目的。主要是为了让大家了解一种接口技术解决方案文档的编写格式以及让大家评审在我的这个技术解决方案中的不足之处，以便大家指出并加以改进。&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;转载，下载或与各种形式使用这篇文章，必须注明文章的作者，出处。&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;其他未尽事宜，以国家法律规定的为准！&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;作者：南疯 <br><br>
<h1>9<a name=_Toc143523699><span><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>信息数据项</span></span></a></h1>
<h2>9<a name=_Toc150138095><span><span><font face=Arial>.1</font><span>&nbsp;&nbsp;&nbsp; </span></span></span><span>数据表</span></a></h2>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=175>
            <p align=center><a name=OLE_LINK2></a><a name=OLE_LINK1><span><strong><span>英文名</span></strong></span></a></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p align=center><span><span><strong><span>中文名</span></strong></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132>
            <p align=center><span><span><strong><span>说 明</span></strong></span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>PROJECT3</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>三级项目基本信息表</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132>
            <p><span><span><span>仅接受查询下载</span></span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>PROJECT1</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>一级项目基本信息表</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132>
            <p><span><span><span>仅接受查询下载</span></span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>RELATIONMAN</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>项目合作伙伴</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132>
            <p><span><span><span>仅接受查询下载</span></span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>DIMENSIONS</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>项目建设规模</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132>
            <p><span><span><span>仅接受查询下载</span></span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>MILEPOST</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>（三级项目）里程碑</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132>
            <p><span><span><span>仅接受查询下载</span></span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>DISASSEMBLE</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>项目分解</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132>
            <p><span><span><span>仅接受查询下载</span></span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>PROJECTDOWN</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>项目下达、委托、受理</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132>
            <p><span><span><span>仅接受查询下载</span></span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>BEGINWORKREPORT</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>开工报告</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132><span></span>
            <p><span><span>&nbsp;</span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>ENDWORKREPORT</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>完工报告</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132><span></span>
            <p><span><span>&nbsp;</span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>CHECKREPORT</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>验收报告</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132><span></span>
            <p><span><span>&nbsp;</span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>ENDWORKREPORT_DIMENS</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>完工<span>(</span>验收<span>)</span>报告建设规模</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132><span></span>
            <p><span><span>&nbsp;</span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>CONTRACT_SIGN</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>施工合同签订过程信息</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132><span></span>
            <p><span><span>&nbsp;</span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>SERVER_BILL</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>工程服务采购清单基本信息</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132><span></span>
            <p><span><span>&nbsp;</span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>SERVER_BILL_ITEMS</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>工程服务采购单明细</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132><span></span>
            <p><span><span>&nbsp;</span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>CONST_FILES</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>施工文件信息</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132><span></span>
            <p><span><span>&nbsp;</span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>STOP_WORK_APPLY</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>停工申请</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132><span></span>
            <p><span><span>&nbsp;</span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>STOPWORK_INFORM</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>停工通知</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132><span></span>
            <p><span><span>&nbsp;</span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>RESUME_WORK_APPLY</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>复工申请信息</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132><span></span>
            <p><span><span>&nbsp;</span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>DELAY<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>临时延期申请信息</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132><span></span>
            <p><span><span>&nbsp;</span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>RESUME_WORK_INFORM</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>复工通知信息</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132><span></span>
            <p><span><span>&nbsp;</span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>CONST_SCHEDULE</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>施工进度</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132><span></span>
            <p><span><span>&nbsp;</span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>CONST_REPORT</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>施工报告</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132><span></span>
            <p><span><span>&nbsp;</span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>SONST_BALAN</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>施工结算</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132><span></span>
            <p><span><span>&nbsp;</span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>DESIGNCOMMISSION</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>设计委托、回复信息</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132>
            <p><span><span><span>仅接受查询下载</span></span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>DESIGNCOMMISSIONITEMS</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>设计委托对应项目列表</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132>
            <p><span><span><span>仅接受查询下载</span></span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>DESIGNFILE</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>设计文件信息</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132>
            <p><span><span><span>仅接受查询下载</span></span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>BUDGETSUMTABLEITEMS</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>预算总表</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132>
            <p><span><span><span>仅接受查询下载</span></span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>BUDGET_FIXPRJ2</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>建筑安装工程费用概算表<span>(</span>表二<span>)</span></span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132>
            <p><span><span><span>仅接受查询下载</span></span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>BUDGET_FIXPRJ<st1:chmetcnv w:st="on" UnitName="a" SourceValue="3" HasSpace="False" Negative="False" NumberType="1" TCSC="0">3A</st1:chmetcnv></span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>建筑安装工程量概算表<span>(</span>表三<span>)</span>甲</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132>
            <p><span><span><span>仅接受查询下载</span></span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>BUDGET_FIXPRJ3B</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>建筑安装工程施工机械使用费概算表<span>(</span>表三<span>)</span>乙</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132>
            <p><span><span><span>仅接受查询下载</span></span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>BUDGET_EQUIPMENT_A</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>器材概算表<span>(</span>表四<span>)</span>甲<span>(</span>国内主要材料表<span>)</span></span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132>
            <p><span><span><span>仅接受查询下载</span></span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>BUDGET_EQUIPMENT_B</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>器材概算表<span>(</span>表四<span>)</span>甲<span>(</span>国内需要安装设备表<span>)</span></span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132>
            <p><span><span><span>仅接受查询下载</span></span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>BUDGET_EQUIPMENT_C</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>器材概算表<span>(</span>表四<span>)</span>甲<span>(</span>国内不需要安装设备表<span>)</span></span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132>
            <p><span><span><span>仅接受查询下载</span></span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>BUDGET_IMPORT_EQUIPMENT</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>引进工程器材概算表<span>(</span>表四<span>)</span>乙<span>(</span>引进需要安装设备表<span>)</span></span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132>
            <p><span><span><span>仅接受查询下载</span></span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>BUDGET_OTHER_FARE</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>工程建设其他费用概算表<span>(</span>表五<span>)</span>甲</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132>
            <p><span><span><span>仅接受查询下载</span></span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>BUDGET_LITTLE_BULD</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>小型建筑工程表</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132>
            <p><span><span><span>仅接受查询下载</span></span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>SURV_REPORT</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>监理报告</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132>
            <p><span><span><span>仅接受查询下载</span></span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>SURV_INFORM</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>监理通知单</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132>
            <p><span><span><span>仅接受查询下载</span></span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>SURV_RELATE</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>监理联系单</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132>
            <p><span><span><span>仅接受查询下载</span></span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>PROCESS_CHECK</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>过程检查报告</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132>
            <p><span><span><span>仅接受查询下载</span></span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>CHANGE_PRJ</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>工程变更申请</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132><span></span>
            <p><span><span>&nbsp;</span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=511 colSpan=3>
            <p align=center><span><span><strong><span>以下表不属于业务数据表</span></strong></span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>USER</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>用户信息</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132><span></span>
            <p><span><span>&nbsp;</span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>DEPARTMENT</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>单位信息</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132><span></span>
            <p><span><span>&nbsp;</span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>DICTIONARY</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>字典信息</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132><span></span>
            <p><span><span>&nbsp;</span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p><span><span><span>FILES</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204>
            <p><span><span><span>文档信息表</span></span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132><span></span>
            <p><span><span>&nbsp;</span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175><span></span>
            <p><span><span>&nbsp;</span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204><span></span>
            <p><span><span>&nbsp;</span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132><span></span>
            <p><span><span>&nbsp;</span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175><span></span>
            <p><span><span>&nbsp;</span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204><span></span>
            <p><span><span>&nbsp;</span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132><span></span>
            <p><span><span>&nbsp;</span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175><span></span>
            <p><span><span>&nbsp;</span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204><span></span>
            <p><span><span>&nbsp;</span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132><span></span>
            <p><span><span>&nbsp;</span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175><span></span>
            <p><span><span>&nbsp;</span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204><span></span>
            <p><span><span>&nbsp;</span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132><span></span>
            <p><span><span>&nbsp;</span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175><span></span>
            <p><span><span>&nbsp;</span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204><span></span>
            <p><span><span>&nbsp;</span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132><span></span>
            <p><span><span>&nbsp;</span></span></p>
            </td>
            <span></span>
        </tr>
        <tr>
            <td vAlign=top width=175><span></span>
            <p><span><span>&nbsp;</span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=204><span></span>
            <p><span><span>&nbsp;</span></span></p>
            </td>
            <span></span>
            <td vAlign=top width=132><span></span>
            <p><span><span>&nbsp;</span></span></p>
            </td>
            <span></span>
        </tr>
    </tbody>
</table>
<p>&nbsp;</p>
<h2>9<a name=_Toc150138096><span><span><font face=Arial>.2</font><span>&nbsp;&nbsp;&nbsp; </span></span></span><span>字段信息</span></a></h2>
<p><span>（参见附件所带的</span><span>Excel</span><span>文件）</span></p>
<h2><a name=_Toc150138097><span><span><font face=Arial>1.3</font><span>&nbsp;&nbsp;&nbsp; </span></span></span><span>字典类型</span></a></h2>
<p><span>（未列出.）</span></p>
<table cellSpacing=0 cellPadding=0 border=1>
    <thead>
        <tr>
            <td vAlign=top width=175>
            <p align=center><strong><span>字典类型</span></strong></p>
            </td>
            <td vAlign=top width=168>
            <p align=center><strong><span>字典类型<span>ID</span></span></strong></p>
            </td>
            <td vAlign=top width=132>
            <p align=center><strong><span>说 明</span></strong></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width=168>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width=132>
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width=168>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width=132>
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=175>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width=168>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width=132>
            <p>&nbsp;</p>
            </td>
        </tr>
    </thead>
    <tbody>
    </tbody>
</table>
<img src ="http://www.blogjava.net/jesson2005/aggbug/120733.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jesson2005/" target="_blank">张金鹏</a> 2007-05-29 17:31 <a href="http://www.blogjava.net/jesson2005/articles/120733.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个完整的接口技术解决方案（六） </title><link>http://www.blogjava.net/jesson2005/articles/120732.html</link><dc:creator>张金鹏</dc:creator><author>张金鹏</author><pubDate>Tue, 29 May 2007 09:31:00 GMT</pubDate><guid>http://www.blogjava.net/jesson2005/articles/120732.html</guid><wfw:comment>http://www.blogjava.net/jesson2005/comments/120732.html</wfw:comment><comments>http://www.blogjava.net/jesson2005/articles/120732.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jesson2005/comments/commentRss/120732.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jesson2005/services/trackbacks/120732.html</trackback:ping><description><![CDATA[<h2><a id=viewpost1_TitleUrl href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550153.html">一个完整的接口技术解决方案（六） </a></h2>
题注：&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;发表这篇解决方案，属于非盈利目的。主要是为了让大家了解一种接口技术解决方案文档的编写格式以及让大家评审在我的这个技术解决方案中的不足之处，以便大家指出并加以改进。&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;转载，下载或与各种形式使用这篇文章，必须注明文章的作者，出处。&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;其他未尽事宜，以国家法律规定的为准！&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;作者：南疯&nbsp;<br><br>
<h3><font size=5>8</font><a name=_Toc150138089><span><span><font size=5>.2.13</font><span>&nbsp;&nbsp; </span></span></span><span><font size=5>获得字典</font></span></a></h3>
<p><span>施工系统提交字典的分类<span>ID</span>，向外协系统发送请求。外协系统根据字典分类<span>ID</span>，返回对应的字典代码信息。字典代码的信息返回不受最大返回记录<span>100</span>条的限制，一次返回全部的该类字典代码。</span></p>
<span><strong>请求报文：<br></strong>
<div><strong><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span>&lt;?</span><span>xml&nbsp;version="1.0"&nbsp;encoding="utf-8"</span><span>?&gt;</span></strong><span><br><strong><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></strong></span><strong><span>&lt;</span><span>XmlData</span><span>&gt;</span></strong><span><br><strong><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</strong></span><strong><span>&lt;</span><span>UserInfo</span><span>&gt;</span></strong><span><br><strong><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</strong></span><strong><span>&lt;</span><span>User</span><span>&gt;</span><span>ZhangSan</span><span>&lt;/</span><span>User</span><span>&gt;</span></strong><span><br><strong><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</strong></span><strong><span>&lt;</span><span>PassWord</span><span>&gt;</span><span>123456</span><span>&lt;/</span><span>PassWord</span><span>&gt;</span></strong><span><br><strong><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</strong></span><strong><span>&lt;/</span><span>UserInfo</span><span>&gt;</span></strong><span><br><strong><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</strong></span><strong><span>&lt;</span><span>Description</span><span>&gt;</span></strong><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;/</span><span>Description</span><span>&gt;</span></strong><span><br><strong><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</strong></span><strong><span>&lt;</span><span>Records</span><span>&gt;</span></strong><span><br><strong><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</strong></span><strong><span>&lt;</span><span>DictionaryID</span><span>&gt;</span><span>201</span><span>&lt;/</span><span>DictionaryID</span><span>&gt;</span></strong><span><br><strong><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</strong></span><strong><span>&lt;/</span><span>Records</span><span>&gt;</span></strong><span><br><strong><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></strong></span><strong><span>&lt;/</span><span>XmlData</span><span>&gt;</span></strong><span><br><strong><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></strong></span></div>
<strong>响应报文：<br>
<div><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span>&lt;?</span><span>xml&nbsp;version="1.0"&nbsp;encoding="utf-8"</span><span>?&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span>&lt;</span><span>XmlData</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;</span><span>Description</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Result</span><span>&gt;</span><span>成功</span><span>&lt;/</span><span>Result</span><span>&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;!--</span><span>如果失败，则返回信息是&#8220;失败：（错误信息）&#8221;</span><span>--&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;/</span><span>Description</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;</span><span>Records</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field1</span><span>&gt;</span><span>Value1</span><span>&lt;/</span><span>Field1</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field2</span><span>&gt;</span><span>Value2</span><span>&lt;/</span><span>Field2</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field3</span><span>&gt;</span><span>Value3</span><span>&lt;/</span><span>Field3</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field1</span><span>&gt;</span><span>Value1</span><span>&lt;/</span><span>Field1</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field2</span><span>&gt;</span><span>Value2</span><span>&lt;/</span><span>Field2</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field3</span><span>&gt;</span><span>Value3</span><span>&lt;/</span><span>Field3</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field1</span><span>&gt;</span><span>Value1</span><span>&lt;/</span><span>Field1</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field2</span><span>&gt;</span><span>Value2</span><span>&lt;/</span><span>Field2</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field3</span><span>&gt;</span><span>Value3</span><span>&lt;/</span><span>Field3</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;/</span><span>Records</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span>&lt;/</span><span>XmlData</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span></div>
</strong></span>
<p><strong><span>报文说明：</span></strong></p>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=151>
            <p align=center><strong><span>标签名</span></strong></p>
            </td>
            <td vAlign=top width=417>
            <p align=center><strong><span>说明</span></strong></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>XmlData</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>报文数据主体</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>Description</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>报文头部信息</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>Records</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>记录集合</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>Record</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>一行记录</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>UserInfo</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>业务认证的用户信息</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>User</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p align=left><span>业务用户登录名</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>PassWord</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p align=left><span>业务用户验证口令</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>DictionaryID</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>字典类型<span>ID</span>。请求下载的字典类型，外协根据字典类型返回对应的字典。</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>Field1</span><span>&gt;</span></p>
            <p><span>&lt;</span><span>Field2</span><span>&gt;</span></p>
            <p><span>&lt;</span><span>Field3</span><span>&gt;</span></p>
            <p><span>&lt;</span><span>Field4</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>一行字典中的英文字段名称。实际中，这些标签都是字典的英文名。字段的标签全部是大写。</span></p>
            <p><span>具体的字段名称请参见提供的数据模型</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>Result</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>反馈报文中的下载成功与否信息。</span></p>
            <p><span>如果下载成功，则信息是&#8220;成功&#8221;</span></p>
            <p><span>如果下载失败，则信息是&#8220;失败：（后面是错误的详细信息）<span>&#8221;</span></span></p>
            </td>
        </tr>
    </tbody>
</table>
<br>
<h2><a name=_Toc150138090><span><span><font face=Arial>8.3</font><span>&nbsp;&nbsp;&nbsp; </span></span></span><span>外协系统向施工系统发送请求</span></a></h2>
<p><span>外协系统向施工系统发送请求的数据目前有几点需要考虑：</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>如何请求发送一个变更后的业务数据</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>如何请求发送一个变更后的字典数据</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>文档发送请求</span></p>
<p><span>外协系统不会主动发送文档的变更信息给施工系统，因为文档的信息（文档的<span>ID</span>）变更是体现在业务的信息当中的，外协系统向施工系统发送业务的变更信息当中就包含了变更了的文档<span>ID</span>，只有在施工系统中进行业务需要获得文档的信息的时候，由施工系统主动发送请求到外协系统获得文档的信息或下载文档。</span></p>
<p><span>针对前面这些问题，接口方案的解决方法如下：</span></p>
<p>&nbsp;</p>
<h3><a name=_Toc150138091></a><font size=5><st1:chsdate w:st="on" Year="1899" Month="12" Day="30" IsLunarDate="False" IsROCDate="False"><span><span>8.3.1</span></span></st1:chsdate><span><span>发送变更后的数据</span></span></font></h3>
<p><span>外协系统在业务数据发生变更（新增、修改、逻辑删除）的时候，会自动发送请求到施工系统要求施工系统进行更新。</span></p>
<p><span>注意，外协系统中没有记录上的物理删除，外协系统中所有的删除业务都是逻辑上的删除，仅仅在删除标志位上面标记为&#8220;</span><span>1</span><span>&#8221;。所以，外协系统没有向施工系统发送物理删除的请求。</span></p>
<strong><span>请求报文：<br>
<div><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span>&lt;?</span><span>xml&nbsp;version="1.0"&nbsp;encoding="utf-8"</span><span>?&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span>&lt;</span><span>XmlData</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;</span><span>UserInfo</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>User</span><span>&gt;</span><span>ZhangSan</span><span>&lt;/</span><span>User</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>PassWord</span><span>&gt;</span><span>123456</span><span>&lt;/</span><span>PassWord</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;/</span><span>UserInfo</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;</span><span>Description</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Note</span><span>&gt;</span><span>项目经理已经对数据进行了审批</span><span>&lt;/</span><span>Note</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;/</span><span>Description</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;</span><span>Records</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>KeyField</span><span>&gt;</span><span>KeyValue</span><span>&lt;/</span><span>KeyField</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field1</span><span>&gt;</span><span>Value1</span><span>&lt;/</span><span>Field1</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field2</span><span>&gt;</span><span>Value2</span><span>&lt;/</span><span>Field2</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field3</span><span>&gt;</span><span>Value3</span><span>&lt;/</span><span>Field3</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field4</span><span>&gt;</span><span>Value4</span><span>&lt;/</span><span>Field4</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>KeyField</span><span>&gt;</span><span>KeyValue</span><span>&lt;/</span><span>KeyField</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field1</span><span>&gt;</span><span>Value1</span><span>&lt;/</span><span>Field1</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field2</span><span>&gt;</span><span>Value2</span><span>&lt;/</span><span>Field2</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field3</span><span>&gt;</span><span>Value3</span><span>&lt;/</span><span>Field3</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field4</span><span>&gt;</span><span>Value4</span><span>&lt;/</span><span>Field4</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>KeyField</span><span>&gt;</span><span>KeyValue</span><span>&lt;/</span><span>KeyField</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field1</span><span>&gt;</span><span>Value1</span><span>&lt;/</span><span>Field1</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field2</span><span>&gt;</span><span>Value2</span><span>&lt;/</span><span>Field2</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field3</span><span>&gt;</span><span>Value3</span><span>&lt;/</span><span>Field3</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field4</span><span>&gt;</span><span>Value4</span><span>&lt;/</span><span>Field4</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;/</span><span>Records</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span>&lt;/</span><span>XmlData</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span></div>
</span></strong>
<p><strong><span>响应报文：<br></p>
<div><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span>&lt;?</span><span>xml&nbsp;version="1.0"&nbsp;encoding="utf-8"</span><span>?&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span>&lt;</span><span>XmlData</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;</span><span>Description</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Result</span><span>&gt;</span><span>成功</span><span>&lt;/</span><span>Result</span><span>&gt;</span><span>&nbsp;&nbsp;</span><span>&lt;!--</span><span>如果失败，则&lt;Result&gt;里面内容是：失败：（错误原因），同时，KeyField的值为空</span><span>--&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;/</span><span>Description</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;</span><span>Records</span><span>&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;/</span><span>Records</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span>&lt;/</span><span>XmlData</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span></div>
</span><span>
<p><strong><span>报文说明：</span></strong></p>
<p>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=151>
            <p align=center><strong><span>标签名</span></strong></p>
            </td>
            <td vAlign=top width=417>
            <p align=center><strong><span>说明</span></strong></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>XmlData</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>报文数据主体</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>Description</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>报文头部信息</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>Records</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>记录集合</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>Record</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>一行记录</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>UserInfo</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>业务认证的用户信息</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>User</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p align=left><span>业务用户登录名</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>PassWord</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p align=left><span>业务用户验证口令</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>Note</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>业务的简单描述。比如：开工报告审批、施工组织方案审批 等</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>KeyField</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>一行记录中的主键英文字段名称。实际中，这些标签都是字典的英文名。字段的标签全部是大写。</span></p>
            <p><span>具体的主键字段名称请参见提供的数据模型</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>Field1</span><span>&gt;</span></p>
            <p><span>&lt;</span><span>Field2</span><span>&gt;</span></p>
            <p><span>&lt;</span><span>Field3</span><span>&gt;</span></p>
            <p><span>&lt;</span><span>Field4</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>一行记录中的英文字段名称。实际中，这些标签都是字典的英文名。字段的标签全部是大写。</span></p>
            <p><span>具体的字段名称请参见提供的数据模型</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>Result</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>反馈报文中的保存成功与否信息。</span></p>
            <p><span>如果保存成功，则信息是&#8220;成功&#8221;</span></p>
            <p><span>如果保存失败，则信息是&#8220;失败：（后面是错误的详细信息）<span>&#8221;</span></span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width=417>
            <p>&nbsp;</p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><span>&nbsp;</p>
<h3><a name=_Toc150138092></a><font size=5><st1:chsdate w:st="on" Year="1899" Month="12" Day="30" IsLunarDate="False" IsROCDate="False"><span><span>8.3.2</span></span></st1:chsdate><span><span>发送变更后的字典</span></span></font></h3>
<p><span>外协系统在字典数据发生变更（新增、修改、逻辑删除）的时候，会自动发送请求到施工系统要求施工系统进行更新施工系统的对照字典。</span></p>
<p><span>即使是仅仅一个字典条目发生了改变，外协系统向施工系统发送的报文中还是包含了该类字典的所有条目。</span></p>
<p><span>请求报文：<br></p>
<div><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span>&lt;?</span><span>xml&nbsp;version="1.0"&nbsp;encoding="utf-8"</span><span>?&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span>&lt;</span><span>XmlData</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;</span><span>UserInfo</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>User</span><span>&gt;</span><span>ZhangSan</span><span>&lt;/</span><span>User</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>PassWord</span><span>&gt;</span><span>123456</span><span>&lt;/</span><span>PassWord</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;/</span><span>UserInfo</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;</span><span>Description</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>DictionaryID</span><span>&gt;</span><span>201</span><span>&lt;/</span><span>DictionaryID</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;/</span><span>Description</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;</span><span>Records</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Record</span><span>&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field1</span><span>&gt;</span><span>Value1</span><span>&lt;/</span><span>Field1</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field2</span><span>&gt;</span><span>Value2</span><span>&lt;/</span><span>Field2</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field3</span><span>&gt;</span><span>Value3</span><span>&lt;/</span><span>Field3</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field4</span><span>&gt;</span><span>Value4</span><span>&lt;/</span><span>Field4</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Record</span><span>&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field1</span><span>&gt;</span><span>Value1</span><span>&lt;/</span><span>Field1</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field2</span><span>&gt;</span><span>Value2</span><span>&lt;/</span><span>Field2</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field3</span><span>&gt;</span><span>Value3</span><span>&lt;/</span><span>Field3</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field4</span><span>&gt;</span><span>Value4</span><span>&lt;/</span><span>Field4</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Record</span><span>&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field1</span><span>&gt;</span><span>Value1</span><span>&lt;/</span><span>Field1</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field2</span><span>&gt;</span><span>Value2</span><span>&lt;/</span><span>Field2</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field3</span><span>&gt;</span><span>Value3</span><span>&lt;/</span><span>Field3</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field4</span><span>&gt;</span><span>Value4</span><span>&lt;/</span><span>Field4</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;/</span><span>Records</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span>&lt;/</span><span>XmlData</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span></div>
</span></span></span></strong>
<p><strong><span>响应报文：<br></p>
<div><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span>&lt;?</span><span>xml&nbsp;version="1.0"&nbsp;encoding="utf-8"</span><span>?&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span>&lt;</span><span>XmlData</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;</span><span>Description</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Result</span><span>&gt;</span><span>成功</span><span>&lt;/</span><span>Result</span><span>&gt;</span><span>&nbsp;&nbsp;</span><span>&lt;!--</span><span>如果失败，则&lt;Result&gt;里面内容是：失败：（错误原因），同时，KeyField的值为空</span><span>--&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;/</span><span>Description</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;</span><span>Records</span><span>&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;/</span><span>Records</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span>&lt;/</span><span>XmlData</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span></div>
</span><span>
<p><strong><span>报文说明：</span></strong></p>
<p>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=151>
            <p align=center><strong><span>标签名</span></strong></p>
            </td>
            <td vAlign=top width=417>
            <p align=center><strong><span>说明</span></strong></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>XmlData</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>报文数据主体</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>Description</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>报文头部信息</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>Records</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>记录集合</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>Record</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>一行记录</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>UserInfo</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>业务认证的用户信息</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>User</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p align=left><span>业务用户登录名</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>PassWord</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p align=left><span>业务用户验证口令</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>DictionaryID</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>字典类型<span>ID</span>。发生变更的字典类型。</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>Field1</span><span>&gt;</span></p>
            <p><span>&lt;</span><span>Field2</span><span>&gt;</span></p>
            <p><span>&lt;</span><span>Field3</span><span>&gt;</span></p>
            <p><span>&lt;</span><span>Field4</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>一行记录中的英文字段名称。实际中，这些标签都是字典的英文名。字段的标签全部是大写。</span></p>
            <p><span>具体的字段名称请参见提供的数据模型</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>Result</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>反馈报文中的保存成功与否信息。</span></p>
            <p><span>如果保存成功，则信息是&#8220;成功&#8221;</span></p>
            <p><span>如果保存失败，则信息是&#8220;失败：（后面是错误的详细信息）<span>&#8221;</span></span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width=417>
            <p>&nbsp;</p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><span>&nbsp;</p>
<h3><a name=_Toc150138093></a><font size=5><st1:chsdate w:st="on" Year="1899" Month="12" Day="30" IsLunarDate="False" IsROCDate="False"><span><span>8.3.3</span></span></st1:chsdate><span><span>文档发送请求</span></span></font></h3>
<p><span>&nbsp;&nbsp;&nbsp;外协系统不会主动发送文档的变更信息给施工系统，因为文档的信息（文档的<span>ID</span>）变更是体现在业务的信息当中的，外协系统向施工系统发送业务的变更信息当中就包含了变更了的文档<span>ID</span>，只有在施工系统中进行业务需要获得文档的信息的时候，由施工系统主动发送请求到外协系统获得文档的信息或下载文档。</span></span></span></strong></p>
<img src ="http://www.blogjava.net/jesson2005/aggbug/120732.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jesson2005/" target="_blank">张金鹏</a> 2007-05-29 17:31 <a href="http://www.blogjava.net/jesson2005/articles/120732.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个完整的接口技术解决方案（五） </title><link>http://www.blogjava.net/jesson2005/articles/120730.html</link><dc:creator>张金鹏</dc:creator><author>张金鹏</author><pubDate>Tue, 29 May 2007 09:29:00 GMT</pubDate><guid>http://www.blogjava.net/jesson2005/articles/120730.html</guid><wfw:comment>http://www.blogjava.net/jesson2005/comments/120730.html</wfw:comment><comments>http://www.blogjava.net/jesson2005/articles/120730.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jesson2005/comments/commentRss/120730.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jesson2005/services/trackbacks/120730.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一个完整的接口技术解决方案（五） 题注：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;发表这篇解决方案，属于非盈利目的。主要是为了让大家了解一种接口技术解决方案文档的编写格式以及让大家评审在我的这个技术解决方案中的不足之处，以便大家指出并加以改进。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;转载，下载或与各种形式使用...&nbsp;&nbsp;<a href='http://www.blogjava.net/jesson2005/articles/120730.html'>阅读全文</a><img src ="http://www.blogjava.net/jesson2005/aggbug/120730.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jesson2005/" target="_blank">张金鹏</a> 2007-05-29 17:29 <a href="http://www.blogjava.net/jesson2005/articles/120730.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个完整的接口技术解决方案（四）</title><link>http://www.blogjava.net/jesson2005/articles/120729.html</link><dc:creator>张金鹏</dc:creator><author>张金鹏</author><pubDate>Tue, 29 May 2007 09:29:00 GMT</pubDate><guid>http://www.blogjava.net/jesson2005/articles/120729.html</guid><wfw:comment>http://www.blogjava.net/jesson2005/comments/120729.html</wfw:comment><comments>http://www.blogjava.net/jesson2005/articles/120729.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jesson2005/comments/commentRss/120729.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jesson2005/services/trackbacks/120729.html</trackback:ping><description><![CDATA[<h2><a id=viewpost1_TitleUrl href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550141.html">一个完整的接口技术解决方案（四） </a></h2>
题注： <br>发表这篇解决方案，属于非盈利目的。主要是为了让大家了解一种接口技术解决方案文档的编写格式以及让大家评审在我的这个技术解决方案中的不足之处，以便大家指出并加以改进。 <br>转载，下载或与各种形式使用这篇文章，必须注明文章的作者，出处。 <br>其他未尽事宜，以国家法律规定的为准！ <br>作者：南疯 <br><br>
<p>&nbsp;</p>
<h3><font size=5>8</font><a name=_Toc150138079><span><span><font size=5>.2.3</font><span>&nbsp;&nbsp; </span></span></span><span><font size=5>修改一条记录</font></span></a></h3>
<p><span>施工系统在修改了一条记录的时候，上传的报文中与新增的报文类似，只是主键的信息不能为空。外协系统判断主键的信息，如果发现主键的信息不为空，则认为是修改了一条记录。如果施工系统报文中主键不为空，而外协系统在数据库对应的表中又没有发现对应的记录，则自动转换成新增的方式来处理这条记录。</span></p>
<p><span></span><span>外协系统在反馈中，还是会把主键返回给施工系统。但是，这种情况下，施工系统可能不再需要维护这个主键。</span></p>
<p><span></span><span>即使是仅仅修改了一个字段，施工单位还得需要上传全部的字段信息（包含被修改的字段）给外协系统。</span></p>
<p><span>施工系统不是对记录做物理删除，而仅仅是作了逻辑删除，即仅仅在记录的删除标志位上面做了&#8220;<st1:chmetcnv w:st="on" UnitName="&#8221;" SourceValue="1" HasSpace="False" Negative="False" NumberType="1" TCSC="0"><span>1</span>&#8221;</st1:chmetcnv>的标志。这种情况对记录来说，也是修改的范围。只是需要在<span>&lt;Note&gt;</span>业务的简单描述中说明&#8220;逻辑删除&#8221;。即使是逻辑删除记录，施工系统也必须上传全部的字段到外协系统。</span></p>
<p><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong></p>
<strong><span>请求报文：<br>
<div><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span>&lt;?</span><span>xml&nbsp;version="1.0"&nbsp;encoding="utf-8"</span><span>?&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span>&lt;</span><span>XmlData</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;</span><span>UserInfo</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>User</span><span>&gt;</span><span>ZhangSan</span><span>&lt;/</span><span>User</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>PassWord</span><span>&gt;</span><span>123456</span><span>&lt;/</span><span>PassWord</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;/</span><span>UserInfo</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;</span><span>Description</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Note</span><span>&gt;</span><span>停工通知确认</span><span>&lt;/</span><span>Note</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;/</span><span>Description</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;</span><span>Records</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>KeyField</span><span>&gt;</span><span>KeyValue1</span><span>&lt;/</span><span>KeyField</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>NormalField1</span><span>&gt;</span><span>Value1</span><span>&lt;/</span><span>NormalField1</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>NormalField2</span><span>&gt;</span><span>Value2</span><span>&lt;/</span><span>NormalField2</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>NormalField3</span><span>&gt;</span><span>Value3</span><span>&lt;/</span><span>NormalField3</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>NormalField4</span><span>&gt;</span><span>Value4</span><span>&lt;/</span><span>NormalField4</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>KeyField</span><span>&gt;</span><span>KeyValue2</span><span>&lt;/</span><span>KeyField</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>NormalField1</span><span>&gt;</span><span>Value1</span><span>&lt;/</span><span>NormalField1</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>NormalField2</span><span>&gt;</span><span>Value2</span><span>&lt;/</span><span>NormalField2</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>NormalField3</span><span>&gt;</span><span>Value3</span><span>&lt;/</span><span>NormalField3</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>NormalField4</span><span>&gt;</span><span>Value4</span><span>&lt;/</span><span>NormalField4</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;/</span><span>Records</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span>&lt;/</span><span>XmlData</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span></div>
</span></strong>
<p><strong><span>响应报文：<br></p>
<div><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span>&lt;?</span><span>xml&nbsp;version="1.0"&nbsp;encoding="utf-8"</span><span>?&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span>&lt;</span><span>XmlData</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;</span><span>Description</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Result</span><span>&gt;</span><span>成功</span><span>&lt;/</span><span>Result</span><span>&gt;</span><span>&nbsp;&nbsp;</span><span>&lt;!--</span><span>如果失败，则&lt;Result&gt;里面内容是：失败：（错误原因）</span><span>--&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;/</span><span>Description</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;</span><span>Records</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>KeyField</span><span>&gt;</span><span>Value1</span><span>&lt;/</span><span>KeyField</span><span>&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>KeyField</span><span>&gt;</span><span>Value2</span><span>&lt;/</span><span>KeyField</span><span>&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;/</span><span>Records</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span>&lt;/</span><span>XmlData</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<p><br></p>
<p><strong><span>报文说明：</span></strong></p>
<span>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=151>
            <p align=center><strong><span>标签名</span></strong></p>
            </td>
            <td vAlign=top width=417>
            <p align=center><strong><span>说明</span></strong></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>XmlData</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>报文数据主体</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>Description</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>报文头部信息</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>Records</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>记录集合</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>Record</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>一行记录</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>UserInfo</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>业务认证的用户信息</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>User</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p align=left><span>业务用户登录名</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>PassWord</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p align=left><span>业务用户验证口令</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>Note</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>业务的简单描述。比如：开工报告、施工组织方案 等</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>请求中的<span>&lt;</span></span><span>KeyField</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>一行记录中的主键字段。在修改的时候，施工系统所给的主键字段内容不能为空。外协系统中根据主键字段内容不为空，认为这是一条修改的记录</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>响应中的<span>&lt;</span></span><span>KeyField</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>一行记录中的主键字段。外协系统返回的主键值。这里的主键值和施工系统发送的记录的顺序是一一对应的。</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>Result</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>反馈报文中的保存成功与否信息。</span></p>
            <p><span>如果保存成功，则信息是&#8220;成功&#8221;</span></p>
            <p><span>如果保存失败，则信息是&#8220;失败：（后面是错误的详细信息）<span>&#8221;</span></span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>NormalField</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>一行记录中的英文字段名称。实际中，这些标签都是字典的英文名。字段的标签全部是大写。</span></p>
            <p><span>具体的字段名称请参见提供的数据模型</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width=417>
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width=417>
            <p>&nbsp;</p>
            </td>
        </tr>
    </tbody>
</table>
<br>
<h3><font size=5>8</font><a name=_Toc150138080><span><span><font face="Times New Roman"><font size=5>.2.4</font><span>&nbsp;&nbsp; </span></font></span></span><span><font size=5>删除一条记录</font></span></a></h3>
<p><span>这里的删除指的是物理删除。逻辑删除在记录修改的时候已经说明。</span></p>
<p><span>物理删除是彻底的从数据库中删除一条记录，不能恢复。物理删除的时候，施工系统只要在报文中提供主键的信息提交，就能够实现。</span></p>
<p><span>同样的，外协系统在反馈的报文中返回成功删除主键的信息，如果其中一条记录不能正常物理删除，则外协自动回滚所有删除的操作。即一条记录不能删除，则所有的记录都不能删除。</span></p>
<span>请求报文：<br></span>
<div><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span>&lt;?</span><span>xml&nbsp;version="1.0"&nbsp;encoding="utf-8"</span><span>?&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span>&lt;</span><span>XmlData</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;</span><span>UserInfo</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>User</span><span>&gt;</span><span>ZhangSan</span><span>&lt;/</span><span>User</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>PassWord</span><span>&gt;</span><span>123456</span><span>&lt;/</span><span>PassWord</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;/</span><span>UserInfo</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;</span><span>Description</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Note</span><span>&gt;</span><span>物理删除</span><span>&lt;/</span><span>Note</span><span>&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;/</span><span>Description</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;</span><span>Records</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>KeyField</span><span>&gt;</span><span>Value1</span><span>&lt;/</span><span>KeyField</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>KeyField</span><span>&gt;</span><span>Value2</span><span>&lt;/</span><span>KeyField</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;/</span><span>Records</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span>&lt;/</span><span>XmlData</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<p align=left><span>响应报文：</span></p>
<div><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span>&lt;?</span><span>xml&nbsp;version="1.0"&nbsp;encoding="utf-8"</span><span>?&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span>&lt;</span><span>XmlData</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;</span><span>Description</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Result</span><span>&gt;</span><span>成功</span><span>&lt;/</span><span>Result</span><span>&gt;</span><span>&nbsp;&nbsp;</span><span>&lt;!--</span><span>如果失败，则&lt;Result&gt;里面内容是：失败：（错误原因），同时，KeyField的值为空</span><span>--&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;/</span><span>Description</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;</span><span>Records</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>KeyField</span><span>&gt;</span><span>Value1</span><span>&lt;/</span><span>KeyField</span><span>&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>KeyField</span><span>&gt;</span><span>Value2</span><span>&lt;/</span><span>KeyField</span><span>&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;/</span><span>Records</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span>&lt;/</span><span>XmlData</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<br>
<p><span>报文说明：（参见数据修改说明）<br><br></p>
<h3><font size=5>8</font><a name=_Toc150138081><span><span><font face="Times New Roman"><font size=5>.2.5</font><span>&nbsp;&nbsp; </span></font></span></span><span><font size=5>文档上传</font></span></a></h3>
<p><span>外协系统中，文档的信息是保存在另外的一个表中当中的，所以，许多的业务表，往往存在一个<span>FileID</span>的主键关联到文档表。在业务表中档，可能有一个<span>FileID</span>的字段，也可能会有两个或两个以上的<span>FileID</span>字段关联到文档信息表。</span></p>
<p><span>涉及到文档的地方，往往文档的信息会比较大，所以，文档的信息不能包含在基础业务数据的报文当中一起上传。处理的方法是：</span></p>
<p><span>先上传文档的实体，从反馈的信息当中得到生成的文档<span>ID</span>（<span>FileID</span>），然后，施工系统在本地记录中的相应字段赋值文档的<span>ID</span>，最后再上传基本业务信息。</span></p>
<p><span>如果一条记录中包含有两个或两个以上的文档字段，则施工系统必须依次上传文档获得文档<span>ID</span>之后，赋值，再上传基本业务信息。</span></p>
<p><span>一个文档报文当中，只能上传一个文档。</span></p>
<p><span>文档报文如下：<br></p>
<div><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span>&lt;?</span><span>xml&nbsp;version="1.0"&nbsp;encoding="utf-8"</span><span>?&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span>&lt;</span><span>XmlData</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;</span><span>UserInfo</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>User</span><span>&gt;</span><span>ZhangSan</span><span>&lt;/</span><span>User</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>PassWord</span><span>&gt;</span><span>123456</span><span>&lt;/</span><span>PassWord</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;/</span><span>UserInfo</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;</span><span>Description</span><span>&gt;</span><span>&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;/</span><span>Description</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;</span><span>Records</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span>&lt;</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>ID</span><span>&gt;&lt;/</span><span>ID</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>FILE_PRJ_ID</span><span>&gt;</span><span>123456</span><span>&lt;/</span><span>FILE_PRJ_ID</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>FILE_TYPE</span><span>&gt;</span><span>401</span><span>&lt;/</span><span>FILE_TYPE</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>FILE_NAME</span><span>&gt;</span><span>施工组织方案.DOC</span><span>&lt;/</span><span>FILE_NAME</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>FILE_UNIT</span><span>&gt;</span><span>电信工程公司</span><span>&lt;/</span><span>FILE_UNIT</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>FILE_MAN</span><span>&gt;</span><span>张三</span><span>&lt;/</span><span>FILE_MAN</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span>&lt;</span><span>FILE_CREATE_TIME</span><span>&gt;</span><span>20061031&nbsp;153005</span><span>&lt;/</span><span>FILE_CREATE_TIME</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span>&lt;</span><span>FILE_AUTHOR</span><span>&gt;</span><span>张三</span><span>&lt;/</span><span>FILE_AUTHOR</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span>&lt;</span><span>FILE_TITLE</span><span>&gt;</span><span>项目XXX施工组织方案</span><span>&lt;/</span><span>FILE_TITLE</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span>&lt;</span><span>KeepMutiFile</span><span>&gt;</span><span>1</span><span>&lt;/</span><span>KeepMutiFile</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>FileData</span><span>&gt;</span><span>/e5asf@dfgafa#sdgsdg&#8230;&#8230;</span><span>&lt;/</span><span>FileData</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>Record</span><span>&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;/</span><span>Records</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span>&lt;/</span><span>XmlData</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span></div>
</span></span></span></span></strong>
<p align=left><strong><span>响应报文：<br></span></strong></p>
<div><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span>&lt;?</span><span>xml&nbsp;version="1.0"&nbsp;encoding="utf-8"</span><span>?&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span>&lt;</span><span>XmlData</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;</span><span>Description</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Result</span><span>&gt;</span><span>成功</span><span>&lt;/</span><span>Result</span><span>&gt;</span><span>&nbsp;&nbsp;&nbsp;</span><span>&lt;!--</span><span>如果失败，则返回信息是&#8220;失败：（错误信息）&#8221;</span><span>--&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;/</span><span>Description</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;</span><span>Records</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>ID</span><span>&gt;</span><span>123456</span><span>&lt;/</span><span>ID</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>Record</span><span>&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;/</span><span>Records</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span>&lt;/</span><span>XmlData</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<p><strong><span>报文说明：<br>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=151>
            <p align=center><strong><span>标签名</span></strong></p>
            </td>
            <td vAlign=top width=417>
            <p align=center><strong><span>说明</span></strong></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>XmlData</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>报文数据主体</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>Description</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>报文头部信息</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>Records</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>记录集合</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>Record</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>一行记录</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>UserInfo</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>业务认证的用户信息</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>User</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p align=left><span>业务用户登录名</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>PassWord</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p align=left><span>业务用户验证口令</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>ID</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>文档的<span>ID</span>，在新增上传一个文档的时候，这个<span>ID</span>永远都是空的。外协系统根据这个文件<span>ID</span>是否为空来判断是否是新的文件。</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>FILE_PRJ_ID</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>文档所属的项目<span>ID</span>，对于工程协作系统来说，一个文档永远都是会属于某个项目的。这个项目<span>ID</span>可以是一级项目，也可以是三级项目。</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>FILE_TYPE</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>文件类型。标识文件的归类。比如：</span></p>
            <p><span>D401</span><span>施工组织设计<span>= 401</span></span></p>
            <p><span>D402</span><span>施工项目计划进度<span>= 402</span></span></p>
            <p><span>D403</span><span>施工日报<span>= 403</span></span></p>
            <p><span>&lt;</span><span>FILE_TYPE</span><span>&gt;</span><span>里面的值是代码，文件类型的代码可以从字典接口中获得。</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>FILE_NAME</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>文档的文件名称，带有扩展名。</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>FILE_UNIT</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>文件创建单位，中文名</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>FILE_MAN</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>文档创建人<span>(</span>上传人<span>)</span></span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>FILE_CREATE_TIME</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>文档创建时间</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>FILE_AUTHOR</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>文档作者 （可为空）</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>FILE_TITLE</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>文档标题 （可为空）</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>KeepMutiFile</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>是否允许多个文档同时有效。这个标签的值为<span> 1 </span>或<span> 0</span>。当值为<span>1 </span>的时候，则在同样的项目<span>ID</span>、同样的文件类型中，同时可以存在多个的文档同时有效存在。这种情况下，多个文档之间是兄弟之间的关系，当前的文档是弟弟，以前的文档是兄长。当这个值为<span>0</span>的时候，则在同样的项目<span>ID</span>、同样的文件类型中，只有最后上传的文档有效，后面上传的文档会把前面的文档&#8220;挤&#8221;到历史中，成为当前文档的&#8220;父亲&#8221;。这种情况下，当前的文档和以前上传的文档之间是父子的关系。更详细的解释请参见后面的&#8220;</span><span>一条记录中一个</span><span><font face="Times New Roman">FileID</font></span><span>的字段如何上传多个文件</span><span>&#8221;主题相关内容。</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>FileData</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>文件实体内容。文件实体内容用二进制读取出来之后，然后转换成<span>base64</span>的格式。</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>Result</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>反馈报文中的保存成功与否信息。</span></p>
            <p><span>如果保存成功，则信息是&#8220;成功&#8221;</span></p>
            <p><span>如果保存失败，则信息是&#8220;失败：（后面是错误的详细信息）<span>&#8221;</span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</span><span><br></p>
<h3><font size=5>8</font><a name=_Toc150138082><span><span><font size=5>.2.6</font><span>&nbsp;&nbsp; </span></span></span><span><font size=5>一条记录中一个文档字段上传多个文件</font></span></a></h3>
<p><span><font face="Courier New">外协系统中，文档是以一种&#8220;有关系&#8221;的方式来存储的。假设有这样一个业务表<span>Table1</span>，里面有一个文档的外键字段<span>File_ID</span>。当我们往<span>Table1</span>表里面插入一条记录的时候，针对这一条记录，我们希望在<span>File_ID</span>字段中可以带有多个的文档，也即会有多个的<span>File_ID</span>。当然，我们可以把这个表字段的数据模型这个定义：<span>File1_ID</span>，<span>File2_ID,File3_ID</span>&#8230;&#8230;，需要多少个文件，我们就定义几个的<span>File_ID</span>字段。但是这样就会带来问题了，如果你定义了<span>5</span>个的<span>File_ID</span>字段，但是，用户如果想在一条记录中上传<span>6</span>个文档，那么，这样的数据模型就会满足不了用户的要求。还有一种情况，如果用户仅仅上传了<span>2</span>个文档，那么剩下的<span>3</span>个<span>File_ID</span>字段就会白白空着。甚至用户对这条记录没有上传文件，这样定义的数据模型就白白浪费了数据库的资源。</font></span></p>
<p><span><font face="Courier New">还有一种说法，我可以用记录的形式来表示啊。对的。上传多个文件，是可以在<span>Table1</span>中新增多条记录方式来表示。但是，我们的前提是，<span>Table1</span>是一个业务表，里面的一条记录就是一笔业务。如果你产生了多条记录，那么意味这这样的业务进行了多次。显然违背了业务数据保存的初衷。</font></span></p>
<p><span><font face="Courier New">外协系统引入了&#8220;父子&#8221;，&#8220;兄弟&#8221;的文档保存机制<span>, </span>即在文档信息表<span>(Files</span>表<span>)</span>中保存文档的基本信息和他们之间的关系。在同样的项目<span>ID</span>、同样的文件类型中，如果可以存在多个的文档同时有效存在，这种情况下，多个文档之间是兄弟之间的关系。后来者文档是弟弟，先到的文档是兄长。在同样的项目<span>ID</span>、同样的文件类型中，只有最后上传的文档有效，后面上传的文档会把前面的文档&#8220;挤&#8221;到历史中，成为当前文档的&#8220;父亲&#8221;。这种情况下，后来的文档和以前上传的文档之间是父子的关系。</font></span></p>
<p><span><font face="Courier New">如果文档之间是兄弟关系的话，则仅仅在业务表<span>Table1</span>中保存最小兄弟的<span>File_ID</span>；如果文档之间是父子关系的话，则仅仅保存最小辈分的文档<span>File_ID</span>。 </font></span></p>
<p><font face="Courier New"><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>兄弟和父子的文档保存方式其实都是多个文档串联的一种保存方式，但是，还是会有使用上面的区别的。兄弟关系一般使用在文档之间是平级的情况下。比如施工组织方案，可以有多个文件，但是，这多个文件是互为补充的一部分，互相依赖，又缺一不可。这种情况下，施工系统可以把这类型的文件上传给外协系统，以兄弟的方式保存，施工系统仅仅在业务表当中保存最后上传反馈回来的<span>FileID</span>即可。以后，可以使用这个最小兄弟的<span>File_ID</span>，向外协系统请求以获得他的所有兄长文档。父子的关系一般使用在下面的情景：当仅允许一个文档是最终有效的时候，或者一个文档修改之后再上传到外协系统，我们想把最后上传的文档&#8220;覆盖&#8221;前面的文档，但是，又想保留文档历史修改痕迹的时候，一般就会用到父子关系。</span></font></p>
<p><span><font face="Courier New" size=3>父子关系中，施工系统仅仅需要保留最小辈分的文档信息，以后，可以使用这个最小辈分的<span>File_ID</span>，向外协系统请求以获得他的所有历史文档。</font></span></span></strong></p>
<img src ="http://www.blogjava.net/jesson2005/aggbug/120729.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jesson2005/" target="_blank">张金鹏</a> 2007-05-29 17:29 <a href="http://www.blogjava.net/jesson2005/articles/120729.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个完整的接口技术解决方案（三）</title><link>http://www.blogjava.net/jesson2005/articles/120728.html</link><dc:creator>张金鹏</dc:creator><author>张金鹏</author><pubDate>Tue, 29 May 2007 09:27:00 GMT</pubDate><guid>http://www.blogjava.net/jesson2005/articles/120728.html</guid><wfw:comment>http://www.blogjava.net/jesson2005/comments/120728.html</wfw:comment><comments>http://www.blogjava.net/jesson2005/articles/120728.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jesson2005/comments/commentRss/120728.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jesson2005/services/trackbacks/120728.html</trackback:ping><description><![CDATA[<h2><a id=viewpost1_TitleUrl href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550138.html">一个完整的接口技术解决方案（三） </a></h2>
题注：&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;发表这篇解决方案，属于非盈利目的。主要是为了让大家了解一种接口技术解决方案文档的编写格式以及让大家评审在我的这个技术解决方案中的不足之处，以便大家指出并加以改进。&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;转载，下载或与各种形式使用这篇文章，必须注明文章的作者，出处。&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;其他未尽事宜，以国家法律规定的为准！&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;作者：南疯 <br><br>
<p>&nbsp;</p>
<h1>8<a name=_Toc143523698><span><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>数据格式</span></span></a></h1>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>在<span>Web Service</span>的调用过程中，无论是外协系统还是施工系统，都有发送数据和接收数据的要求，也即双方系统同时作为客户端又作为服务端。我们统称这些传递的数据为报文。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>客户端发送报文，属于调用；服务端接收报文，属于被调用。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>客户端和服务端互相之间通讯的请求报文和结果报文遵循<span>XML</span>格式。客户端发送请求报文，服务器解析调用报文，执行报文中所在接口对应的服务功能。生成结果报文，以<span>xml</span>格式页返回给请求者。请求者拿到结果报文，进行解析，然后再进行相应的处理。</span></p>
<h2><a name=_Toc150138075><span><span><font face=Arial>8.1</font><span>&nbsp;&nbsp;&nbsp; </span></span></span><span>约定</span></a></h2>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>报文中所有的字典信息（比如性别<span>1-</span>男，<span>2-</span>女），都以代码的值（<span>1</span>或者<span>2</span>）来传递。施工单位向外协系统发送的报文中的代码都需要转换成外协的代码，外协系统向施工系统发送的报文中的代码无需转换。</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>报文中的其他数据类型，比如货币、<span>RowID,</span>自定义对象类型等，根据需要转换成文本、数值或二进制（最终转换成<span>Base64</span>字符）的数据类型。</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>报文中数值信息，转换成文本，如：</span></p>
<p><span>&lt;ItemCount&gt;50&lt;/ItemCount&gt;</span></p>
<p><span>&lt;ValueSum&gt;12368.36&lt;/ValueSum&gt;</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>报文中数值不支持科学计数的方式。报文中数值的单位使用国标的单位，比如货币使用&#8220;元&#8221;，长度使用&#8220;米&#8221;等。无国标的单位以约定为准。</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>报文中的日期信息，转换成<span>YYYYMMDD HHmmss</span>文本格式（<span>24</span>小时制）。如果是空日期，则转换成空文本。</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>报文中的<span>true</span>和<span>false</span>数据类型，转换成<span> 0(</span>表示<span>false)</span>、<span>1</span>（表示<span>true</span>）</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>报文中的二进制数据，转换成<span>Base64</span>字符方式发送。</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>报文中的记录集，放在<span>&lt; Records&gt;</span>标签中；报文中一条记录，放在<span>&lt; Records&gt;</span>标签中。</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>报文中如果存在多条记录，则在<span>&lt;Records&gt;</span>标签中就包含多个的<span>&lt;Record&gt;</span>标签。如果报文中仅有一条记录，则<span>&lt;Records&gt;</span>标签中只包含一个<span>&lt;Record&gt;</span>标签<span>.</span>如果没有记录，则仅仅包含一个<span>&lt;Records&gt;</span>标签<span>,</span>没有<span>&lt;Record&gt;</span>标签。</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>如果返回结果数据集非常多，在性能考虑和数据量冲突的情况下，可以使用分页返回数据集的方式分批返回数据（每次返回最多<span>100</span>条记录）。服务端提供分批结果返回的功能。至于如何使用分页查询的功能，参见下面的<span>XML</span>框架说明。</span></p>
<h2><a name=_Toc150138076><span><span><font face=Arial>8.2</font><span>&nbsp;&nbsp;&nbsp; </span></span></span><span>施工系统向外协系统发送请求</span></a></h2>
<p><span>施工系统向外协系统发送请求的数据目前有几点需要考虑：</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>如何请求查询一个业务数据</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>如何新增一条记录，新增之后如何点到记录的键值</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>如何修改一条记录</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>如何删除一条记录</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>文档如何上传</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>一条记录中一个<span>FileID</span>的字段如何上传多个文件</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>如何在一条记录中补充上传文档</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>如何在一条记录中删除一个文档</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>如何获得文档的基本信息</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>如何获得文档的所有兄弟信息</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>如何获得文档的所有父亲信息</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>如何下载一个文档</span></p>
<p><span>针对这些问题，接口方案的解决方法如下：</span></p>
<h3><font size=5>8</font><a name=_Toc150138077><span><span><font size=5>.2.1</font><span>&nbsp;&nbsp; </span></span></span><span><font size=5>请求查询一个业务数据</font></span></a></h3>
<p><span>施工系统针对外协系统发送的业务数据查询请求根据业务类型有很多种。为了简化接口，而不是在接口上进行业务操作，所以，外协系统将施工系统发起的数据查询请求看作是数据下载的一种方式，而不为了复杂的业务查询请求提供复杂的条件解析。</span></p>
<p><span>外协系统提供的数据查询接口是从数据下载和数据延期性来考虑的。为了满足数据的下载，外协系统提供了按照某一个表的主键来下载数据和按照记录的变更时间范围来下载数据的两种方式查询请求。</span></p>
<strong><span>请求报文：<br>
<div><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span>&lt;?</span><span>xml&nbsp;version="1.0"&nbsp;encoding="utf-8"&nbsp;</span><span>?&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span>&lt;</span><span>XmlData</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span>&lt;</span><span>UserInfo</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>User</span><span>&gt;</span><span>ZhangSan</span><span>&lt;/</span><span>User</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>PassWord</span><span>&gt;</span><span>123456</span><span>&lt;/</span><span>PassWord</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;/</span><span>UserInfo</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;</span><span>Description</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>RowID</span><span>&gt;</span><span>0</span><span>&lt;/</span><span>RowID</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>KeyValue</span><span>&gt;</span><span>123</span><span>&lt;/</span><span>KeyValue</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>QueryBeginTime</span><span>&gt;</span><span>20061018&nbsp;153000</span><span>&lt;/</span><span>QueryBeginTime</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>QueryEndTime</span><span>&gt;</span><span>20061019&nbsp;153000</span><span>&lt;/</span><span>QueryEndTime</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;/</span><span>Description</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span>&lt;/</span><span>XmlData</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span></div>
</span></strong>
<p><strong><span>响应报文：<br></p>
<div><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span>&lt;?</span><span>xml&nbsp;version="1.0"&nbsp;encoding="utf-8"</span><span>?&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span>&lt;</span><span>XmlData</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;</span><span>Description</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>RowID</span><span>&gt;</span><span>100</span><span>&lt;/</span><span>RowID</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;/</span><span>Description</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;</span><span>Records</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field1</span><span>&gt;</span><span>Value1</span><span>&lt;/</span><span>Field1</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field2</span><span>&gt;</span><span>Value2</span><span>&lt;/</span><span>Field2</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field3</span><span>&gt;</span><span>Value3</span><span>&lt;/</span><span>Field3</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field4</span><span>&gt;</span><span>Value4</span><span>&lt;/</span><span>Field4</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field1</span><span>&gt;</span><span>Value1</span><span>&lt;/</span><span>Field1</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field2</span><span>&gt;</span><span>Value2</span><span>&lt;/</span><span>Field2</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field3</span><span>&gt;</span><span>Value3</span><span>&lt;/</span><span>Field3</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field4</span><span>&gt;</span><span>Value4</span><span>&lt;/</span><span>Field4</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field1</span><span>&gt;</span><span>Value1</span><span>&lt;/</span><span>Field1</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field2</span><span>&gt;</span><span>Value2</span><span>&lt;/</span><span>Field2</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field3</span><span>&gt;</span><span>Value3</span><span>&lt;/</span><span>Field3</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Field4</span><span>&gt;</span><span>Value4</span><span>&lt;/</span><span>Field4</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;/</span><span>Records</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span>&lt;/</span><span>XmlData</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span></div>
</span></strong><strong><span>
<p><strong><span>报文说明：<br></span><span>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=151>
            <p align=center><strong><span>标签名</span></strong></p>
            </td>
            <td vAlign=top width=417>
            <p align=center><strong><span>说明</span></strong></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>XmlData</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>报文数据主体</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>Description</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>报文头部信息</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>Records</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>记录集合</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>Record</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>一行记录</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>UserInfo</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>业务认证的用户信息</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>User</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p align=left><span>业务用户登录名</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>PassWord</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p align=left><span>业务用户验证口令</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>RowID</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>第一次请求的时候，客户端<span>RowID</span>发送<span>0</span>，表示从第<span>0</span>条记录开发返回。服务端根据条件查询，发现结果超过<span>100</span>条记录，则在返回的结果中，<span>RowID</span>的值为<span>99</span>，表示服务端当前的记录位置处在第<span>100</span>条的位置上，后面还会有剩余的记录。客户端检查返回的结果，如果发现<span>RowID</span>大于<span>0,</span>则继续发送请求进行查询。但是，客户端第二次发送请求继续查询的时候，<span>RowID</span>的值要赋值为第一次返回的值，即<span>RowID=99</span>。服务端第二次收到请求的时候，发现<span>RowID</span>是<span>99,</span>则从第<span>100</span>条返回结果。以此类推循环调用，直到服务端达到记录的末尾，这时候，服务端在返回的结果中<span>RowID=0.</span>客户端发现服务端<span>RowID=0</span>，终止循环调用。</span></p>
            <p><span>字典、用户信息、单位信息，因为返回的字段比较少，不受<span>100</span>条记录返回的限制。一次调用，就返回全部的结果。</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>KeyValue</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>查询时主键的值。这个</span><span>&lt;</span><span>KeyValue</span><span>&gt;</span><span>和下面的<span>&lt;</span><span>QueryBeginTime</span><span>&gt;&lt;</span><span>QueryEndTime</span><span>&gt;</span>是互斥的。如果在请求的时候提供了主键的值，表示客户端要求服务器按照主键的值查询一条记录。如果客户端提供了主键的值，则服务端将忽略<span>&lt;</span><span>QueryBeginTime</span><span>&gt;&lt;</span><span>QueryEndTime</span><span>&gt;</span>中的值。</span></p>
            <p><span>字典、用户信息、单位信息，因为没有查询时间范围，所以<span>&lt;</span><span>KeyValue</span><span>&gt;</span>即表示字典类型。</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>QueryBeginTime</span><span>&gt;</span></p>
            <p><span>&lt;</span><span>QueryEndTime</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>查询时时间段范围。</span><span>&lt;</span><span>QueryBeginTime</span><span>&gt;</span><span>是起始时间，<span>&lt;</span><span>QueryEndTime</span><span>&gt;</span>是结束时间。表示客户端要求服务端查询在这个时间范围之内所有变更过的记录（包括新增、修改、删除）。</span></p>
            <p><span>在外协中，一条记录新增的时候，它的创建时间和最后修改时间是一样的，以后修改记录的时候，创建时间不变，改变的仅仅是最后修改时间。同时，外协系统中删除记录仅仅在&#8220;记录是否删除&#8221;字段中标记&#8220;<span>1</span>&#8221;，并不是真正的物理删除记录。</span></p>
            <p><span>这里的时间指的是记录变更的时间，不是记录中的某个业务时间。如果用户需要按照业务时间来查询数据，则施工系统把外协系统的数据获取到本地进行保存，在施工系统中提供按照业务时间查询的功能。</span></p>
            <p><span>&lt;</span><span>QueryBeginTime</span><span>&gt;&lt;</span><span>QueryEndTime</span><span>&gt;</span><span>和<span>&lt;</span><span>KeyValue</span><span>&gt;</span>是互斥的。如果客户端需要按照时间范围来查询，则必须<span>&lt;</span><span>KeyValue</span><span>&gt;</span>空。</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>Field1</span><span>&gt;</span></p>
            <p><span>&lt;</span><span>Field2</span><span>&gt;</span></p>
            <p><span>&lt;</span><span>Field3</span><span>&gt;</span></p>
            <p><span>&lt;</span><span>Field4</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>一行记录中的英文字段名称。实际中，这些标签都是字典的英文名。字段的标签全部是大写。</span></p>
            <p><span>具体的字段名称请参见提供的数据模型</span></p>
            </td>
        </tr>
    </tbody>
</table>
</span></strong></p>
</span></strong><br>
<p>&nbsp;</p>
<h3><font size=5>8</font><a name=_Toc150138078><span><span><font size=5>.2.1</font><span>&nbsp;&nbsp; </span></span></span><span><font size=5>新增一条记录，得到记录的键值</font></span></a></h3>
<p><span>为了简化数据模型的处理，本方案不考虑主从表的并发处理情况。如果存在主从表的数据需要上传，那么，在一个事务中，施工单位首先先上传主表的记录，从反馈信息中获得主表的主键值。然后，把刚刚获得的主表的主键值赋值给从表的对应外键，再上传从表数据，得到从表的主键值。</span></p>
<p><span>如果不是主从表，而是单表，则直接上传数据，从反馈信息中得到主键值。</span></p>
<p><span>这种情况的优点是：数据和表相关，施工单位可以灵活的控制表之间的关系；同时，数据包中的报文比较简单，容易解析；接口上面比较清晰，与业务的耦合比较低。</span></p>
<p><span>缺点是：一个业务涉及的主从表不能在同一个报文中（这个缺点可以通过施工系统灵活的控制表之间关系来解决）；一个业务中可能会使用到两个或两个以上的接口，造成业务完整性上面的分离（这种缺点可以通过把业务放在一个事务中来解决）；</span></p>
<p><span>键值的返回：在调用新增接口之后，外协会按照记录的<strong>顺序</strong>返回外外协中所生成的键值。</span><span><span>&nbsp;&nbsp; </span></span><span>施工单位获得键值之后，可以在本地表中更新记录的主键值。</span></p>
<p><strong><span>请求报文：</span></strong></p>
<p><strong><span>&nbsp;</p>
<div><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span>&lt;?</span><span>xml&nbsp;version="1.0"&nbsp;encoding="utf-8"</span><span>?&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span>&lt;</span><span>XmlData</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;</span><span>UserInfo</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>User</span><span>&gt;</span><span>ZhangSan</span><span>&lt;/</span><span>User</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>PassWord</span><span>&gt;</span><span>123456</span><span>&lt;/</span><span>PassWord</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;/</span><span>UserInfo</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;</span><span>Description</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Note</span><span>&gt;</span><span>开工报告</span><span>&lt;/</span><span>Note</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;</span><span>&lt;/</span><span>Description</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;</span><span>Records</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>KeyField</span><span>&gt;&lt;/</span><span>KeyField</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>NormalField1</span><span>&gt;</span><span>Value1</span><span>&lt;/</span><span>NormalField1</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>NormalField2</span><span>&gt;</span><span>Value2</span><span>&lt;/</span><span>NormalField2</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>NormalField3</span><span>&gt;</span><span>Value3</span><span>&lt;/</span><span>NormalField3</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>NormalField4</span><span>&gt;</span><span>Value4</span><span>&lt;/</span><span>NormalField4</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>KeyField</span><span>&gt;&lt;/</span><span>KeyField</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>NormalField1</span><span>&gt;</span><span>Value1</span><span>&lt;/</span><span>NormalField1</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>NormalField2</span><span>&gt;</span><span>Value2</span><span>&lt;/</span><span>NormalField2</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>NormalField3</span><span>&gt;</span><span>Value3</span><span>&lt;/</span><span>NormalField3</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>NormalField4</span><span>&gt;</span><span>Value4</span><span>&lt;/</span><span>NormalField4</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;/</span><span>Records</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span>&lt;/</span><span>XmlData</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span></div>
</span></strong>
<p><strong><span>响应报文：<br></p>
<div><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span>&lt;?</span><span>xml&nbsp;version="1.0"&nbsp;encoding="utf-8"</span><span>?&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span>&lt;</span><span>XmlData</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;</span><span>Description</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Result</span><span>&gt;</span><span>成功</span><span>&lt;/</span><span>Result</span><span>&gt;</span><span>&nbsp;&nbsp;</span><span>&lt;!--</span><span>如果失败，则&lt;Result&gt;里面内容是：失败：（错误原因）</span><span>--&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;/</span><span>Description</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;</span><span>Records</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>KeyField</span><span>&gt;</span><span>Value1</span><span>&lt;/</span><span>KeyField</span><span>&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>KeyField</span><span>&gt;</span><span>Value2</span><span>&lt;/</span><span>KeyField</span><span>&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>Record</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span>&lt;/</span><span>Records</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span>&lt;/</span><span>XmlData</span><span>&gt;</span><span><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span></div>
</span></strong><strong><span>
<p><strong><span>报文说明：</span></strong></p>
<p>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=151>
            <p align=center><strong><span>标签名</span></strong></p>
            </td>
            <td vAlign=top width=417>
            <p align=center><strong><span>说明</span></strong></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>XmlData</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>报文数据主体</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>Description</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>报文头部信息</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>Records</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>记录集合</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>Record</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>一行记录</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>UserInfo</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>业务认证的用户信息</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>User</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p align=left><span>业务用户登录名</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>PassWord</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p align=left><span>业务用户验证口令</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>Note</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>业务的简单描述。比如：开工报告、施工组织方案 等</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>请求中的<span>&lt;</span></span><span>KeyField</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>一行记录中的主键字段。在新增的时候，施工系统所给的主键字段内容为空。外协系统中根据主键字段内容为空，认为这是一条新增的记录</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>响应中的<span>&lt;</span></span><span>KeyField</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>一行记录中的主键字段。外协系统返回的主键值。这里的主键值和施工系统发送的记录的顺序是一一对应的。</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>&lt;</span><span>Result</span><span>&gt;</span></p>
            </td>
            <td vAlign=top width=417>
            <p><span>反馈报文中的保存成功与否信息。</span></p>
            <p><span>如果保存成功，则信息是&#8220;成功&#8221;</span></p>
            <p><span>如果保存失败，则信息是&#8220;失败：（后面是错误的详细信息）<span>&#8221;</span></span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width=417>
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width=417>
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width=417>
            <p>&nbsp;</p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p align=left>&nbsp;</p>
</span></strong>
<img src ="http://www.blogjava.net/jesson2005/aggbug/120728.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jesson2005/" target="_blank">张金鹏</a> 2007-05-29 17:27 <a href="http://www.blogjava.net/jesson2005/articles/120728.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个完整的接口技术解决方案（二） </title><link>http://www.blogjava.net/jesson2005/articles/120727.html</link><dc:creator>张金鹏</dc:creator><author>张金鹏</author><pubDate>Tue, 29 May 2007 09:26:00 GMT</pubDate><guid>http://www.blogjava.net/jesson2005/articles/120727.html</guid><wfw:comment>http://www.blogjava.net/jesson2005/comments/120727.html</wfw:comment><comments>http://www.blogjava.net/jesson2005/articles/120727.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jesson2005/comments/commentRss/120727.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jesson2005/services/trackbacks/120727.html</trackback:ping><description><![CDATA[<h2><a id=viewpost1_TitleUrl href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550128.html">一个完整的接口技术解决方案（二） </a></h2>
<p><span>&nbsp;题注：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;发表这篇解决方案，属于非盈利目的。主要是为了让大家了解一种接口技术解决方案文档的编写格式以及让大家评审在我的这个技术解决方案中的不足之处，以便大家指出并加以改进。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;转载，下载或与各种形式使用这篇文章，必须注明文章的作者，出处。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;其他未尽事宜，以国家法律规定的为准！<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;作者：南疯<br></span></p>
<h1>4<a name=_Toc150138068><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>接口安全</span></a></h1>
<h2>4<a name=_Toc150138069><span><span><font face=Arial>.1</font><span>&nbsp;&nbsp;&nbsp; </span></span></span><span>接口认证</span></a></h2>
<p><strong><span>调用认证：</span></strong><strong></strong></p>
<p><span>虽然接口双方都是存在于电信内部网络中，但是，仍不能排除接口服务被攻击、恶意调用以及非法调用等。所以，从接口调用上，必须考虑调用的认证安全问题。</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>本方案中的接口，在客户端调用服务端的时候，必须经过调用身份认证。考虑施工系统的开发平台的多样性，但同时接口服务运行平台都是<span>Windows</span>的情况，本方案采用<span>Windows</span>安全身份认证的方式。即在访问接口所在的服务的时候，都必须进行资格审查（使用<span>Credentials</span>发送认证信息）</span><span>。</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>另外，接口采用<span>SOAP</span>协议，因此在接口配置上面需要屏蔽<span>HTTP GET </span>和<span>HTTP POST</span>等其他协议。</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>在接口中审核并进行日志的记录。</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>使用最低权限的进程帐户运行<span> Web </span>服务（通过<span> Machine.config </span>中的<span> &lt;processModel&gt; </span>元素来配置）。</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>接口不支持动态生成<span>WSDL,</span>因此作为服务端，应该禁止文档协议。</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>在服务端禁用跟踪，禁用调式编译</span></p>
<p><strong><span>业务用户认证：</span></strong><strong></strong></p>
<p><span>由于接口涉及电信工程中的各个不同的业务，有获取字典、获得项目信息、发送开工报告等，所以，建立一套业务的用户认证机制是必须的。不同的用户，所具备有的授权不一样，所能执行的业务也不一样。同时，业务用户认证中的用户信息也是记录接口日志中的重要组成部分。</span></p>
<p><span>本方案采用的是在接口信息中包含业务认证用户信息的方式来进行认证。服务端在收到请求的时候，应先验证业务的授权用户，如果该业务用户没有执行当前业务的权限，应终止业务的执行，并给出非法用户的警告信息反馈回客户端。</span></p>
<p><span>一般情况下，业务认证的用户是系统中的用户。业务认证其实就是应用系统认证的组成部分。</span></p>
<p><span>业务认证的用户信息经过加密之后包含在要发送的信息（<span>XML</span>体）中，即在发送的信息中包含业务用户的信息（参见下面的数据格式说明）。</span></p>
<p>&nbsp;</p>
<p><strong>&nbsp;</strong></p>
<h2>4<a name=_Toc150138070><span><span><font face=Arial>.2</font><span>&nbsp;&nbsp;&nbsp; </span></span></span><span>数据安全</span></a></h2>
<p><span>数据的安全表现为如何保证数据在网络传输过程中不会被截获并被解析其中的内容而引起信息泄露与如何保证数据在传输的过程中的数据的完整性两个方面。</span></p>
<p><span>Web Service</span><span>采用<span>XML</span>数据格式来传输信息。所以，无论是发送数据还是返回结果，都要求采用对<span>XML</span>数据加密之后来传输。至于采用何种方式的加密技术，本方案为了保密，只能在开发的时候由开发人员口头告知。涉及到加密技术就要涉及到加密的密钥问题。目前，外协系统和施工系统接口上有很多种类型的业务，到底是每种类型的业务采用不同的密钥，还是按分组来采用同一种密钥的方式，还是所有的业务全部采用同一种的密钥的方式，按照需求各有不同的选择。本方案采用的是最后一种的方式。密钥的发布由作为服务方来发布，由客户端获取。密钥的发布方式待定。</span></p>
<p><span>为了保证数据的完整性，首先：方案采用数据签名（<span>SOAP Security Extensions: Digital Signature</span>）。利用<span>XML</span>的数字签名（<span>XML Digital Signature syntax [XML-Signature]</span>）对<span>SOAP</span>进行扩展，在<span>SOAP</span>的头元素中定义签名属性（<span>&lt;SOAP-SEC:Signature&gt;</span>）来实现。其次：限制并验证<span> Web </span>方法输入的类型、长度、格式和范围，验证对<span> XML </span>输入数据的验证是基于已协商的架构等。</span></p>
<p><span>&nbsp;<br></span></p>
<h1>&nbsp;</h1>
<h1>5<a name=_Toc150138071><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>事务处理</span></a></h1>
<p><span>事务是一组相关的任务，作为独立于其他任务的独立单元成功（提交）或失败（中止）。分布式事务是影响多个资源的事务。要提交分布式事务，所有参与者都必须保证对数据的任何更改是永久的。不论系统崩溃或是发生其他无法预料的事件，更改都必须是持久的。即使只有一个参与者无法保证这一点，整个事务也将失败，在事务范围内对数据的任何更改均将回滚。</span></p>
<p><span>外协系统和施工系统是处于网络之上的两个分布式接口，使用的是分布式事务。要启用分布式事务，可能需要通过网络启用<span> MS DTC</span>（考虑外协平台和施工平台都是运行在<span>Windows</span>上），以便在使用应用了最新的<span> Service Pack </span>的较新操作系统（例如<span> Windows XP </span>或<span> Windows 2003</span>）时使用分布式事务。如果启用了<span> Windows </span>防火墙（<span>Windows XP Service Pack 2 </span>的默认设置），必须允许<span> MS DTC </span>服务使用网络或打开<span> MS DTC </span>端口。</span></p>
<p><span>接口中的服务端和客户端的环境事务始终相同，客户端创建的事务上下文并应用对于服务端的当前的事务，以便对于该事务上下文是当前的。这样的事务会造成性能损失，因为可能需要继承原来的上下文，但是，这样的事务确保了在数据库操作的时候信息的完整性。接口中事务的发起总是由客户端发起的，并负责事务的提交和回滚等控制。<br><br><br><br></span></p>
<p><span><span><br></p>
<h1>6<a name=_Toc150138072><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>性能考虑</span></a></h1>
<p><span>在接口设计的时候就应该考虑性能上面的问题，不要在事后再加入性能。同时，在项目的开发过程要反复进行测试，可以从机器的吞吐量和响应时间两个基本的指标来衡量接口的性能。接口上面的性能考虑主要从下面几个方面来优化：</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>使用一次连接，多次调用，优化连接资源。</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>对于并行的接口调用使用异步的调用方式。</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>优化线程池减少竞争。</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>考虑使用</span><span><font face=Verdana>XML</font></span><span>压缩。</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>如果不需要返回，考虑使用单工通讯的方式。</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>适当的设置（如果有代理）代理超时，页面超时，<span>WebService</span>超时。</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>设计<span>"</span>大块头<span>"</span>的接口减少往返。</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>基于消息的编程而不是远程过程调用<span>(RPC) </span>。</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>使用<span>XML</span>字串作为参数。</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>尽量使用原始数据类型参数。</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>避免在调用之间维护服务器状态。</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>考虑为复杂的<span>WebMethod</span>提供输入校验。</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>考虑对<span>WebMethod</span>的结果使用缓存。</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>选择适用的大数据包传送方式。</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>避免调用本地的<span>WebService</span>。</span></p>
<p><span>&nbsp;<br></span></p>
<h1>&nbsp;</h1>
<h1>7<a name=_Toc150138073><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>容错处理</span></a></h1>
<p><span>客户端向服务端发送数据，服务端解析数据，反馈信息给客户端，这中间的环节只要某一个环节出现问题，都会造成接口的失败。按照失败产生的环节分类，我们可以从三个方面来处理接口的失败。</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>网络连接失败：在调用接口的时候，由于网络不通，造成数据不能正常传输。这样，客户端应该能够记录发送的日志，按照一定的时间间隔重试发送。本方案定为重试发送<span>20</span>次，每次时间间隔<span>2</span>小时。如果一直发生网络不通的情况，该发送日志被保存下来，待后手工发送。所以，客户端系统应该实现手工发送数据的功能。</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>反馈错误信息：服务端在解析数据包，执行数据包业务的时候，可能会发生异常。所以，服务端应当能够捕捉异常信息，比如&#8220;非法<span>XML</span>格式&#8221;等，然后反馈给客户端。客户端在接受到这类的错误信息之后，应当进行日志记录，能够自动或手工分析异常的信息。</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>网络连接正常，但是无信息反馈：这种情况下，一般是服务端出现了异常，但是又没有捕捉到的情况下发生。这种情况下，客户端把这种错误当作&#8220;网络连接失败&#8221;来处理。服务端应能够实现相同数据包重新发送过来的处理机制。</span></span></span></p>
<img src ="http://www.blogjava.net/jesson2005/aggbug/120727.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jesson2005/" target="_blank">张金鹏</a> 2007-05-29 17:26 <a href="http://www.blogjava.net/jesson2005/articles/120727.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个完整的接口技术解决方案（一）</title><link>http://www.blogjava.net/jesson2005/articles/120726.html</link><dc:creator>张金鹏</dc:creator><author>张金鹏</author><pubDate>Tue, 29 May 2007 09:24:00 GMT</pubDate><guid>http://www.blogjava.net/jesson2005/articles/120726.html</guid><wfw:comment>http://www.blogjava.net/jesson2005/comments/120726.html</wfw:comment><comments>http://www.blogjava.net/jesson2005/articles/120726.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jesson2005/comments/commentRss/120726.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jesson2005/services/trackbacks/120726.html</trackback:ping><description><![CDATA[<h2><a id=viewpost1_TitleUrl href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html">一个完整的接口技术解决方案（一）</a> </h2>
题注：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;发表这篇解决方案，属于非盈利目的。主要是为了让大家了解一种接口技术解决方案文档的编写格式以及让大家评审在我的这个技术解决方案中的不足之处，以便大家指出并加以改进。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;转载，下载或与各种形式使用这篇文章，必须注明文章的作者，出处。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;其他未尽事宜，以国家法律规定的为准！<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;作者：南疯<br><br>
<div align=right>
<table cellSpacing=0 cellPadding=0 width=285 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=95>
            <p><strong><span>文档编号：</span></strong></p>
            </td>
            <td vAlign=top width=190>
            <p><strong><span>T-JKJS</span></strong></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=95>
            <p><strong><span>文档版本：</span></strong></p>
            </td>
            <td vAlign=top width=190>
            <p><strong><span>0.01</span></strong></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=95>
            <p><strong><span>项目编号：</span></strong></p>
            </td>
            <td vAlign=top width=190>
            <p><strong><span>XX-DX-</span></strong><strong><span> <st1:place w:st="on"><st1:city w:st="on">PECS</st1:city></st1:place></span></strong><strong></strong></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p align=center><strong>&nbsp;</strong></p>
<p align=center><strong>&nbsp;</strong></p>
<p><span><strong><font color=#000080 size=7>《XX电信工程外部协作系统》</font></strong></span></p>
<p align=center><span><strong>Project Exterior Cooperation System</strong></span></p>
<p><span><strong><font face=宋体 color=#000080 size=7>&nbsp;</font></strong></span></p>
<p align=center><span><strong>施工单位接口技术解决方案<br><span></p>
<p align=center><strong></strong></p>
<div align=center>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=84>
            <p><font size=2><strong><span>编写人：</span></strong></font></p>
            </td>
            <td vAlign=top width=120>
            <p><span><font size=2><strong>南疯</strong></font></span></p>
            </td>
            <td vAlign=top width=74>
            <p><span><font size=2><strong>日期：</strong></font></span></p>
            </td>
            <td vAlign=top width=120>
            <p><font size=2><strong><st1:chsdate w:st="on" Year="2006" Month="10" Day="30" IsLunarDate="False" IsROCDate="False"><span>2006-10-30</span></st1:chsdate></strong></font></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=84>
            <p><span><font size=2><strong>审核人：</strong></font></span></p>
            </td>
            <td vAlign=top width=120>
            <p><font size=2><strong></strong></font></p>
            </td>
            <td vAlign=top width=74>
            <p><font size=2><strong></strong></font><span><font size=2><strong>日期：</strong></font></span></p>
            </td>
            <td vAlign=top width=120>
            <p><span><font size=2><strong>&nbsp;</strong></font></span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=84>
            <p><span><font size=2><strong>批准人：</strong></font></span></p>
            </td>
            <td vAlign=top width=120>
            <p><font size=2><strong></strong></font><font size=2><strong></strong></font></p>
            </td>
            <td vAlign=top width=74>
            <p><font size=2><strong></strong></font><font size=2><strong></strong></font><span><font size=2><strong>日期：</strong></font></span></p>
            </td>
            <td vAlign=top width=120>
            <p><span><strong><font size=2>&nbsp;</font></strong></span></p>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p><strong><span>XXXXXX信息科技股份有限公司 </span></strong></p>
<p><strong><span><font size=3>&nbsp;</font></span></strong></p>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=60>
            <p><span>地址：</span></p>
            </td>
            <td vAlign=top width=300>
            <p><span>XXXXXXX</span></p>
            </td>
            <td vAlign=top width=177>
            <p><span>邮编：XXXXXX</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=60>
            <p><span>电话：</span></p>
            </td>
            <td vAlign=top width=300>
            <p><span><font face="Times New Roman">XXXXXXXX</font></span></p>
            </td>
            <td vAlign=top width=177>
            <p><span>传真：XXXXXX</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=60>
            <p><span>网站：</span></p>
            </td>
            <td vAlign=top width=477 colSpan=2>
            <p><span><span>XXXXXXXXX</span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
</span></strong></span>
<div>
<p><strong><font size=5><span><br>修改记录（</span><span>Revision Chart</span><span>）</span></font></strong></p>
</div>
<table cellSpacing=0 cellPadding=0 width="100%" border=1>
    <tbody>
        <tr>
            <td vAlign=top width="12%">
            <p align=center><span><strong>版本号</strong></span></p>
            </td>
            <td vAlign=top width="13%">
            <p align=center><strong><span>批准人</span></strong></p>
            </td>
            <td vAlign=top width="12%">
            <p align=center><strong><span>修改人</span></strong></p>
            </td>
            <td vAlign=top width="16%">
            <p align=center><strong><span>修改日期</span></strong></p>
            </td>
            <td vAlign=top width="45%">
            <p align=center><strong><span>修改记录</span></strong></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="12%">
            <p><span>0.01</span></p>
            </td>
            <td vAlign=top width="13%">
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width="12%">
            <p><span>南疯</span></p>
            </td>
            <td vAlign=top width="16%">
            <p><st1:chsdate w:st="on" Year="2006" Month="10" Day="30" IsLunarDate="False" IsROCDate="False"><span>2006-10-30</span></st1:chsdate></p>
            </td>
            <td vAlign=top width="45%">
            <p><span>第一次创建</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="12%">
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width="13%">
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width="12%">
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width="16%">
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width="45%">
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="12%">
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width="13%">
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width="12%">
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width="16%">
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width="45%">
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="12%">
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width="13%">
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width="12%">
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width="16%">
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width="45%">
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="12%">
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width="13%">
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width="12%">
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width="16%">
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width="45%">
            <p>&nbsp;</p>
            </td>
        </tr>
    </tbody>
</table>
<p>&nbsp;</p>
<p><strong><span><br>0.02</span></strong><strong><span>详细修改记录：</span></strong><strong></strong></p>
<table cellSpacing=0 cellPadding=0 width="100%" border=1>
    <tbody>
        <tr>
            <td vAlign=top width="11%">
            <p align=center><strong><span>序号</span></strong><strong></strong></p>
            </td>
            <td vAlign=top width="88%">
            <p align=center><strong><span>内容</span></strong><strong></strong></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="11%">
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width="88%">
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="11%">
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width="88%">
            <p>&nbsp;</p>
            </td>
        </tr>
    </tbody>
</table>
<p><span>&nbsp;</p>
<p align=center><span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138059"><strong><font size=2>1</font></strong><span><span>&nbsp;&nbsp;<font color=#000000 size=3>&nbsp;&nbsp; </font></span></span><strong><font face="Times New Roman"><font size=3><font color=#000000><font size=+0><span><span>引言</span></span><span><span>.... </span></span><span>5</span></font></font></font></font></strong></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138060"><font size=3><font color=#000000><font size=+0>1.1<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font face="Times New Roman"><span><span>编写目的</span></span><span><span>... </span></span><span>5</span></font></font></font></font></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138061"><font size=3><font color=#000000><font size=+0>1.2<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font face="Times New Roman"><span><span>覆盖范围</span></span><span><span>... </span></span><span>5</span></font></font></font></font></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138062"><font size=3><font color=#000000><font size=+0>1.3<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font face="Times New Roman"><span><span>预期读者与阅读建议</span></span><span><span>... </span></span><span>5</span></font></font></font></font></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138063"><font size=3><font color=#000000><font size=+0>1.4<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font face="Times New Roman"><span><span>文档约定</span></span><span><span>... </span></span><span>5</span></font></font></font></font></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138064"><font size=3><font color=#000000><font size=+0>1.5<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font face="Times New Roman"><span><span>术语与缩略语</span></span><span><span>... </span></span><span>5</span></font></font></font></font></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138065"><font size=3><font color=#000000><font size=+0>1.6<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font face="Times New Roman"><span><span>参考文献</span></span><span><span>... </span></span><span>6</span></font></font></font></font></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138066"><font size=3><font color=#000000><font size=+0><strong>2</strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><font face="Times New Roman"><span><span>概述</span></span><span><span>.... </span></span><span>7</span></font></strong></font></font></font></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138067"><font size=3><font color=#000000><font size=+0><strong>3</strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><font face="Times New Roman"><span><span>接口方式</span></span><span><span>.... </span></span><span>8</span></font></strong></font></font></font></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138068"><font size=3><font color=#000000><font size=+0><strong>4</strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><font face="Times New Roman"><span><span>接口安全</span></span><span><span>.... </span></span><span>9</span></font></strong></font></font></font></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138069"><font size=3><font color=#000000><font size=+0>4.1<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font face="Times New Roman"><span><span>接口认证</span></span><span><span>... </span></span><span>9</span></font></font></font></font></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138070"><font size=3><font color=#000000><font size=+0>4.2<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font face="Times New Roman"><span><span>数据安全</span></span><span><span>... </span></span><span>10</span></font></font></font></font></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138071"><font size=3><font color=#000000><font size=+0><strong>5</strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><font face="Times New Roman"><span><span>事务处理</span></span><span><span>.... </span></span><span>10</span></font></strong></font></font></font></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138072"><font size=3><font color=#000000><font size=+0><strong>6</strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><font face="Times New Roman"><span><span>性能考虑</span></span><span><span>.... </span></span><span>11</span></font></strong></font></font></font></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138073"><font size=3><font color=#000000><font size=+0><strong>7</strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><font face="Times New Roman"><span><span>容错处理</span></span><span><span>.... </span></span><span>12</span></font></strong></font></font></font></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138074"><font size=3><font color=#000000><font size=+0><strong>8</strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><font face="Times New Roman"><span><span>数据格式</span></span><span><span>.... </span></span><span>12</span></font></strong></font></font></font></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138075"><font size=3><font color=#000000><font size=+0>8.1<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font face="Times New Roman"><span><span>约定</span></span><span><span>... </span></span><span>13</span></font></font></font></font></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138076"><font size=3><font color=#000000><font size=+0>8.2<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font face="Times New Roman"><span><span>施工系统向外协<span>系统发送请求</span></span></span><span><span>... </span></span><span>13</span></font></font></font></font></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138077"><font size=3><font color=#000000><font size=+0><em>8.2.1</em><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><em><font face="Times New Roman"><span><span>请求查询一个业务数据</span></span><span><span>... </span></span><span>14</span></font></em></font></font></font></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138078"><font size=3><font color=#000000><font size=+0><em>8.2.2</em><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><em><font face="Times New Roman"><span><span>新增一条记录，得到记录的键值</span></span><span><span>... </span></span><span>17</span></font></em></font></font></font></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138079"><font size=3><font color=#000000><font size=+0><em>8.2.3</em><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><em><font face="Times New Roman"><span><span>修改一条<span>记录</span></span></span><span><span>... </span></span><span>19</span></font></em></font></font></font></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138080"><font size=3><font color=#000000><font size=+0><em>8.2.4</em><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><em><font face="Times New Roman"><span><span>删除一条记录</span></span><span><span>... </span></span><span>21</span></font></em></font></font></font></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138081"><font size=3><font color=#000000><font size=+0><em>8.2.5</em><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><em><font face="Times New Roman"><span><span>文档上传</span></span><span><span>... </span></span><span>23</span></font></em></font></font></font></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138082"><font size=3><font color=#000000><font size=+0><em>8.2.6</em><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><em><font face="Times New Roman"><span><span>一条记录中一个文档字段上传多个文件</span></span><span><span>... </span></span><span>25</span></font></em></font></font></font></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138083"><font size=3><font color=#000000><font size=+0><em>8.2.7</em><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><em><font face="Times New Roman"><span><span>补充上传文档</span></span><span><span>... </span></span><span>26</span></font></em></font></font></font></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138084"><font size=3><font color=#000000><font size=+0><em>8.2.8</em><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><em><font face="Times New Roman"><span><span>在记录中删除一个文档</span></span><span><span>... </span></span><span>27</span></font></em></font></font></font></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138085"><font size=3><font color=#000000><font size=+0><em>8.2.9</em><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><em><font face="Times New Roman"><span><span>获得文档的基本信息</span></span><span><span>... </span></span><span>28</span></font></em></font></font></font></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138086"><font size=3><font color=#000000><font size=+0><em>8.2.10</em><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><em><font face="Times New Roman"><span><span>获得文档的所有兄弟信息</span></span><span><span>... </span></span><span>31</span></font></em></font></font></font></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138087"><font size=3><font color=#000000><font size=+0><em>8.2.11</em><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><em><font face="Times New Roman"><span><span>获得文档的所有父亲信息</span></span><span><span>... </span></span><span>32</span></font></em></font></font></font></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138088"><font size=3><font color=#000000><font size=+0><em>8.2.12</em><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><em><font face="Times New Roman"><span><span>下载一个文档</span></span><span><span>... </span></span><span>32</span></font></em></font></font></font></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138089"><font size=3><font color=#000000><font size=+0><em>8.2.13</em><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><em><font face="Times New Roman"><span><span>获得字典</span></span><span><span>... </span></span><span>34</span></font></em></font></font></font></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138090"><font size=3><font color=#000000><font size=+0>8.3<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font face="Times New Roman"><span><span>外协系统向施工系统发送请求</span></span><span><span>... </span></span><span>35</span></font></font></font></font></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138091"><em><font size=3><font color=#000000><font size=+0>8.3.1<font face="Times New Roman"><span><span>发送变更后的数据</span></span><span><span>... </span></span><span>36</span></font></font></font></font></em></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138092"><em><font size=3><font color=#000000><font size=+0>8.3.2<font face="Times New Roman"><span><span>发送变更后的字典</span></span><span><span>... </span></span><span>38</span></font></font></font></font></em></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138093"><em><font size=3><font color=#000000><font size=+0>8.3.3<font face="Times New Roman"><span><span>文档发送请求</span></span><span><span>... </span></span><span>40</span></font></font></font></font></em></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138094"><font size=3><font color=#000000><font size=+0><strong>9</strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><font face="Times New Roman"><span><span>信息数据项</span></span><span><span>.... </span></span><span>40</span></font></strong></font></font></font></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138095"><font size=3><font color=#000000><font size=+0>9.1<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font face="Times New Roman"><span><span>数据表</span></span><span><span>... </span></span><span>40</span></font></font></font></font></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138096"><font size=3><font color=#000000><font size=+0>9.2<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font face="Times New Roman"><span><span>字段信息</span></span><span><span>... </span></span><span>42</span></font></font></font></font></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138097"><font size=3><font color=#000000><font size=+0>9.3<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font face="Times New Roman"><span><span>字典类型</span></span><span><span>... </span></span><span>42</span></font></font></font></font></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138098"><font size=3><font color=#000000><font size=+0><strong>10</strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><font face="Times New Roman"><span><span>网页地址</span></span><span><span>.... </span></span><span>44</span></font></strong></font></font></font></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138099"><font size=3><font color=#000000><font size=+0><strong>11</strong><span><span>&nbsp;&nbsp;&nbsp; </span></span><strong>Web Service<font face="Times New Roman"><span><span>接口</span></span><span><span>.... </span></span><span>44</span></font></strong></font></font></font></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138100"><font size=3><font color=#000000><font size=+0>11.1<span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font face="Times New Roman"><span><span>接口命名规范</span></span><span><span>... </span></span><span>44</span></font></font></font></font></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138101"><font size=3><font color=#000000><font size=+0>11.2<span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font face="Times New Roman"><span><span>输入参数</span></span><span><span>... </span></span><span>44</span></font></font></font></font></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138102"><font size=3><font color=#000000><font size=+0>11.3<span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font face="Times New Roman"><span><span>输出参数</span></span><span><span>... </span></span><span>45</span></font></font></font></font></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138103"><font size=3><font color=#000000><font size=+0>11.4<span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font face="Times New Roman"><span><span>外协系统提供的其他接口</span></span><span><span>... </span></span><span>45</span></font></font></font></font></a></span></span></p>
<p><span><span><a href="http://www.cnblogs.com/name-lh/archive/2006/11/04/550112.html#_Toc150138104"><font size=3><font color=#000000><font size=+0><strong>12</strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font face="Times New Roman"><strong><span><span>附录：待定问题</span></span><span><span>.... </span></span><span>45</span></strong></font></font></font></font></a></span></span></p>
<p>&nbsp;</p>
<h1><a name=_Toc150138059></a><a name=_Toc143523689></a><a name=_Toc137279392></a><a name=_Toc108492602></a><a name=_Toc102278899><span><span><span><span><span><span>1<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>引言</span></span></span></span></span></a></h1>
<h2><a name=_Toc150138060></a><a name=_Toc143523690></a><a name=_Toc137279393></a><a name=_Toc108492603></a><a name=_Toc102278900><span><span><span><span><span><span><font face=Arial>1.1</font><span>&nbsp;&nbsp;&nbsp; </span></span></span><span>编写目的</span></span></span></span></span></a></h2>
<p><font face=宋体><font size=3>&nbsp;&nbsp;&nbsp;<font face="Times New Roman" color=#000000>本文档为XX电信工程外部协作系统（以下简称外协系统）与电信工程施工单位内部系统（以下简称施工系统）接口技术解决方案，以此作为外协系统与施工系统实施接口的技术方案依据和项目设计标准。</font></font></font></p>
<h2><a name=_Toc150138061></a><a name=_Toc143523691></a><a name=_Toc137279394></a><a name=_Toc108492604></a><a name=_Toc102278901><span><span><span><span><span><span><font face=Arial>1.2</font><span>&nbsp;&nbsp;&nbsp; </span></span></span><span>覆盖范围</span></span></span></span></span></a></h2>
<p><font face=宋体 size=3>&nbsp;&nbsp;&nbsp;XX电信工程外部协作系统项目组</font></p>
<p><font face=宋体 size=3>&nbsp;&nbsp;&nbsp;施工系统接口开发技术组</font></p>
<h2><a name=_Toc150138062></a><a name=_Toc143523692></a><a name=_Toc137279395></a><a name=_Toc108492605></a><a name=_Toc102278902><span><span><span><span><span><span><font face=Arial>1.3</font><span>&nbsp;&nbsp;&nbsp; </span></span></span><span>预期读者与阅读建议</span></span></span></span></span></a></h2>
<p><font face=宋体 size=3>&nbsp;&nbsp;&nbsp;XX电信企业信息化部</font></p>
<p><font size=3><font face=宋体><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XX</span></span>电信工程建设部</font></font></p>
<p><font face=宋体 size=3>&nbsp;&nbsp;&nbsp;XXXX公司开发人员</font></p>
<p><font face=宋体 size=3>&nbsp;&nbsp;&nbsp;施工系统开发人员</font></p>
<h2><a name=_Toc150138063></a><a name=_Toc143523693></a><a name=_Toc137279396></a><a name=_Toc108492606></a><a name=_Toc102278903><span><span><span><span><span><span><font face=Arial>1.4</font><span>&nbsp;&nbsp;&nbsp; </span></span></span><span>文档约定</span></span></span></span></span></a></h2>
<p><font size=3><font face=宋体><strong>粗体正文</strong>表示强调内容</font></font></p>
<p><font size=3><font face=宋体><span>&nbsp;&nbsp;&nbsp;红色正文</span>表示未完成或需要今后考虑的内容</font></font></p>
<p><font size=3><font face=宋体><span>&nbsp;&nbsp;&nbsp;蓝色正文</span>表示待讨论内容</font></font></p>
<h2><a name=_Toc150138064></a><a name=_Toc143523694></a><a name=_Toc137279397></a><a name=_Toc108492607></a><a name=_Toc102278905></a><a name=_Toc102278904></a><a name=_Toc102279128></a><a name=_Toc102279199></a><a name=_Toc102279270></a><a name=_Toc102279348></a><a name=_Toc102279416></a><a name=_Toc102279484></a><a name=_Toc102279552></a><span><span><span><span><span><span><span><font face=Arial>1.5</font><span>&nbsp;&nbsp;&nbsp; </span></span></span></span></span></span></span></span><span><span><span><span><span><span>术语与缩略语</span></span></span></span></span></span><a name=_Toc102278906></a></h2>
<p>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=151>
            <p align=center><a name=_Toc102278907><strong><span>术语、缩略语</span></strong></a><strong></strong></p>
            </td>
            <td vAlign=top width=420>
            <p align=center><a name=_Toc102278908><strong><span>定</span><span><span>&nbsp;&nbsp;&nbsp; </span></span></strong></a><span><strong><span>义</span></strong></span><strong></strong></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>外协系统</span></p>
            </td>
            <td vAlign=top width=420>
            <p><span>XX电信工程外部协作系统</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><span>施工系统</span></p>
            </td>
            <td vAlign=top width=420>
            <p><span>电信工程施工单位内部系统</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p><st1:city w:st="on"><st1:place w:st="on"><span>PECS</span></st1:place></st1:city></p>
            </td>
            <td vAlign=top width=420>
            <p><span>XX电信工程外部协作系统英文简称</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width=420>
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=151>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width=420>
            <p>&nbsp;</p>
            </td>
        </tr>
    </tbody>
</table>
<a name=_Toc150138065></a><a name=_Toc143523695></a><a name=_Toc137279398></a><a name=_Toc108492608></a><a name=_Toc102278910></a><a name=_Toc102278909></a><a name=_Toc102279133></a><a name=_Toc102279204></a><a name=_Toc102279275></a><a name=_Toc102279353></a><a name=_Toc102279421></a><a name=_Toc102279489></a><a name=_Toc102279555></a><span><span><span><span><span><span><br><br></span></span></span></span></span></span></span></p>
<h2><a name=_Toc150138065></a><a name=_Toc143523695></a><a name=_Toc137279398></a><a name=_Toc108492608></a><a name=_Toc102278910><span><span><span><span><span><span><font face=Arial>1.6</font><span>&nbsp;&nbsp;&nbsp; </span></span></span><span>参考文献</span></span></span></span></span></a></h2>
<p>(XXXX)<br><br><br><br></p>
<h1>2<a name=_Toc143523696><span><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>概述</span></span></a></h1>
<p><font face=宋体>&nbsp;&nbsp;&nbsp;建设XX电信工程外部协作系统的目标，是在工程项目的管理、建设、使用和实施单位之间搭建起数据交换和协同工作的信息平台，延伸与拓展工程建设管理信息化的应用范围，实现通信工程建设过程的信息化管理，促进工程项目的管理部门、建设部门、实施部门和使用部门之间业务流程协调有序地开展，实现工程项目设计、施工、监理管理功能，将相关的设计、施工、监理单位纳入到工程建设管理中，完善工程项目建设过程管理体系，通过信息化推动管理的规范化，在信息化的应用过程中不断探索市场环境下工程建设管理的新思路和新方法。</font></p>
<p><span>根据工程部业务工作的实际情况，项目首先满足工程建设管理中应用最广泛、问题最突出的基本需求。</span></p>
<p><span>项目功能需求包括：</span><span> </span></p>
<p><span><span>&#216;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>建立工程外部协作系统与</span><span>MSS</span><span>等系统的接口；</span></p>
<p><span><span>&#216;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>建立设计协作服务、监理协作服务、施工协作服务模块，为邮电设计院、电话监理公司和电信工程公司提供工程部所需的协作服务，保证工程建设实施流程的开展；</span></p>
<p><span><span>&#216;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>在建立工程协作服务模块的基础上，建立工程外部协作系统与邮电设计院、电话监理公司、电信工程公司信息系统的接口，实现工程部与三家实施单位的信息交互与业务协作；</span></p>
<p><span>本技术解决方案就是针对实现工程建设部与三家实施单位信息交互与业务协作接口中施工单位接口的技术解决方案的组成部分。</span></p>
<p><span>在接口的调用过程中，存在施工系统调用外协系统接口的情况，这时候，施工系统作为客户端，外协系统作为服务端；也存在外协系统调用施工系统的情况，这时候，外协系统作为客户端，施工系统作为服务端。本方案中，除了特殊另外说明外，不考虑外协系统和施工系统角色换位的问题。如果一方发起了调用，那么它就是客户端，另一方就是服务端。反之亦然。<br></span></p>
<h1>4&nbsp; <a name=_Toc143523697><span><span>接口方式</span></span></a></h1>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>工程外协系统与施工系统之间的接口采用<span>Web Service</span>接口形式来进行业务数据的交互。</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>接口数据传输采用<span>XML</span>数据交换格式，<span>utf-8</span>编码。</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>在外协系统中提供<span>Web Service</span>的<span>API</span>接口。提供由施工系统调用获得信息；并且提供施工系统提交信息的<span>API</span>接口。</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>同样，在施工系统中提供<span>Web Service</span>的<span>API</span>接口。提供由外协系统提交信息的<span>API</span>接口。</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>考虑到工程外协中的数据信息不仅包括了XX电信工程公司的数据而且还包含了其他的施工单位的数据信息。而这些单位也各有其各自工程应用系统。这样，外协系统对各个施工单位系统所提供的接口<span>API</span>及其参数信息、格式均是统一的。同时，也要求各个施工单位所提供的接口<span>API</span>及其参数、格式等也必须要求统一。外协系统与施工系统属于一对多的关系。</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>外协系统要求能够有目的，信息有过滤的把业务信息通过接口正确的发送给相应施工系统接口。非相关的信息不要发送给对应的施工系统。</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>施工系统建立用户映像对照表、字典对照表、单位对照表等数据映像，传递给外协的数据使用的是映像中转换后的外协系统能够识别数据；同时，接收到的数据也根据对照表转换成各自能够解释的数据格式。</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>数据初始化的时候，由施工系统主动调用外协系统的接口，以获得用户信息、字典信息、单位信息、项目信息等基础信息。以后，一旦发生数据的变动，由外协系统主动往施工系统发送信息。</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>外协系统不主动请求施工系统获得数据，但是外协系统会主动请求施工系统发送数据。</span></p>
<p><span><span>u<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>施工系统主动请求外协系统获得数据，也会主动请求外协系统发送数据。</span></p>
<img src ="http://www.blogjava.net/jesson2005/aggbug/120726.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jesson2005/" target="_blank">张金鹏</a> 2007-05-29 17:24 <a href="http://www.blogjava.net/jesson2005/articles/120726.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>乱码问题之终极解决</title><link>http://www.blogjava.net/jesson2005/articles/115549.html</link><dc:creator>张金鹏</dc:creator><author>张金鹏</author><pubDate>Sun, 06 May 2007 04:53:00 GMT</pubDate><guid>http://www.blogjava.net/jesson2005/articles/115549.html</guid><wfw:comment>http://www.blogjava.net/jesson2005/comments/115549.html</wfw:comment><comments>http://www.blogjava.net/jesson2005/articles/115549.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jesson2005/comments/commentRss/115549.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jesson2005/services/trackbacks/115549.html</trackback:ping><description><![CDATA[<table cellSpacing=0 cellPadding=0 width="98%" align=center border=0>
    <tbody>
        <tr>
            <td align=middle colSpan=2 height=40>
            <h1>乱码问题之终极解决</h1>
            </td>
        </tr>
        <tr align=middle>
            <td colSpan=2 height=40>
            <script type=text/javascript><!--
            google_ad_client = "pub-8263014661871932";
            google_ad_width = 468;
            google_ad_height = 60;
            google_ad_format = "468x60_as";
            google_ad_type = "text_image";
            //2007-02-14: 新闻内容页面上面
            google_ad_channel = "8423241514";
            google_color_border = "FFFFFF";
            google_color_bg = "FFFFFF";
            google_color_link = "333333";
            google_color_text = "333333";
            google_color_url = "003366";
            //--></script>
            <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript>
            </script>
            </td>
        </tr>
        <tr>
            <td colSpan=2 height=40>&nbsp;</td>
        </tr>
        <tr>
            <td colSpan=2><span class=STYLE2>
            <div id=article>
            <p>这里讨论下 新手学习，高手指教 一起研究下<br>(以 tomcat mysql 做例子 我推荐所有的编码采用utf-8)</p>
            <p>1 工程<br>工程内所有的 .java .jsp .xml .txt 都有默认的编码 默认的是系统环境的编码<br>我们中文系统通常是GBK 推荐都采用utf-8 <br>utf-8 的时候 你编译 生成doc 可能会遇到乱码（特别是采用ant 的时候,生成doc你几乎100%会遇到）</p>
            <p>解决方法 以ant 为例子<br>编译 注意 encoding 参数<br>&lt;target name="build" &gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;mkdir dir="${build.dir}" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;javac encoding="utf-8" destdir="${build.dir}" target="1.3" debug="true" deprecation="false" optimize="false" failonerror="true"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;src path="${src.dir}" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;classpath refid="master-classpath" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/javac&gt;<br>&nbsp;&nbsp; &lt;/target&gt;</p>
            <p>生成doc 注意 encoding 和 charset<br>&lt;target name="doc"&gt;<br>&lt;mkdir dir="doc" /&gt;<br>&lt;javadoc charset="utf-8" encoding="utf-8" packagenames="${packages}" sourcepath="src" destdir="doc" author="true" version="true" use="true" splitindex="true" &gt;<br>&lt;classpath refid="master-classpath" /&gt;<br>&lt;/javadoc&gt;<br>&lt;/target&gt;</p>
            <p>这里 的encoding 就是指的你 java 文件的编码格式 javac 和javadoc 都有这个参数<br>charset 指的是 生成 doc 后的编码方式 javadoc 的参数</p>
            <p>2 数据库<br>mysql 的编码最复杂 从4以后 mysql 号称支持多编码 它更灵活了 我们也更麻烦了<br>mysql 有4个级别的编码 <br>系统级<br>库级<br>表级<br>sql语句级<br>请保持采用统一的编码 推荐utf-8<br>其它数据库要简单的多 一般都是一种编码</p>
            <p>3 web server <br>tomcat 为例<br>tomcat server.xml 中一个参数<br>&lt;Connectorport="8080" maxHttpHeaderSize="8192"<br>maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<br>enableLookups="false" redirectPort="8443" acceptCount="100"<br>connectionTimeout="20000" disableUploadTimeout="true" URIncoding="utf-8"/&gt;<br>经测试 这个URIncoding 参数主要是 get 方法中采用编码</p>
            <p>4 jsp 显示层<br>第1条中说明了 jsp 文件本身的格式<br>很多朋友采用eclipse +myeclipse 生成jsp<br>它自动生成一个头&lt;%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%&gt;<br>不要误解 这句话不能保证你在ie里看到的不是乱码<br>pageEncoding它的意思是 这个页面本身采用的是 utf-8 (似乎只在eclipse 里有效果 ，我不确定)<br>为了在ie 里不乱码&nbsp; 你还得加一句 &lt;%@ page contentType="text/html; charset=UTF-8"%&gt;<br>它不能在(myeclispe)自动生成&nbsp; 推荐修改 myeclipse的模板 在下边的目录里<br>MyEclipse\eclipse\plugins\com.genuitec.eclipse.wizards_4.0.1\Templates<br>里边的jsp模版 你加上&lt;%@ page contentType="text/html; charset=${encoding}"%&gt;</p>
            <p>5 filter<br>自从tomcat 4 以后 网上就流传了一个SetCharacterEncodingFilter 过滤器 搜一下有很多<br>很好用 web.xml 中加入<br>&lt;filter&gt;<br> &lt;filter-name&gt;Set Character Encoding&lt;/filter-name&gt;<br> &lt;filter-class&gt;filters.SetCharacterEncodingFilter&lt;/filter-class&gt;<br> &lt;init-param&gt;<br> &lt;param-name&gt;encoding&lt;/param-name&gt;<br> &lt;param-value&gt;utf-8&lt;/param-value&gt;<br> &lt;/init-param&gt;<br>&lt;/filter&gt;<br> &lt;filter-mapping&gt;<br> &lt;filter-name&gt;Set Character Encoding&lt;/filter-name&gt;<br> &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br> &lt;/filter-mapping&gt;</p>
            <p>6 资源文件<br>首先保证 文件本身是utf-8<br>然后部署的时候用 native2ascii 转换 <br>这里给出 ant 里的例子<br>&lt;native2ascii encoding="utf-8" dest="${web.dir}/WEB-INF/classes" src="${src.dir}" includes="**/*.properties" /&gt;</p>
            </div>
            </span></td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/jesson2005/aggbug/115549.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jesson2005/" target="_blank">张金鹏</a> 2007-05-06 12:53 <a href="http://www.blogjava.net/jesson2005/articles/115549.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XML和J2EE的完美结合</title><link>http://www.blogjava.net/jesson2005/articles/115548.html</link><dc:creator>张金鹏</dc:creator><author>张金鹏</author><pubDate>Sun, 06 May 2007 04:50:00 GMT</pubDate><guid>http://www.blogjava.net/jesson2005/articles/115548.html</guid><wfw:comment>http://www.blogjava.net/jesson2005/comments/115548.html</wfw:comment><comments>http://www.blogjava.net/jesson2005/articles/115548.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jesson2005/comments/commentRss/115548.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jesson2005/services/trackbacks/115548.html</trackback:ping><description><![CDATA[<table cellSpacing=0 cellPadding=0 width="98%" align=center border=0>
    <tbody>
        <tr>
            <td align=middle colSpan=2 height=40>
            <h1>XML和J2EE的完美结合</h1>
            </td>
        </tr>
        <tr align=middle>
            <td colSpan=2 height=40>
            <script type=text/javascript><!--
            google_ad_client = "pub-8263014661871932";
            google_ad_width = 468;
            google_ad_height = 60;
            google_ad_format = "468x60_as";
            google_ad_type = "text_image";
            //2007-02-14: 新闻内容页面上面
            google_ad_channel = "8423241514";
            google_color_border = "FFFFFF";
            google_color_bg = "FFFFFF";
            google_color_link = "333333";
            google_color_text = "333333";
            google_color_url = "003366";
            //--></script>
            <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript>
            </script>
            </td>
        </tr>
        <tr>
            <td colSpan=2 height=40>&nbsp;</td>
        </tr>
        <tr>
            <td colSpan=2><span class=STYLE2>
            <div id=article>
            <p>当前，Java 2平台企业版（J2EE）架构在厂商市场和开发者社区中倍受推崇。作为一种工具，可扩展标记语言（XML）简化了数据交换、进程间消息交换这一类的事情，因而对开发者逐渐变得有吸引力，并开始流行起来。自然，在J2EE架构中访问或集成XML解决方案的想法也很诱人。因为这将是强大系统架构同高度灵活的数据管理方案的结合。 <br>XML的应用似乎是无穷无尽的，但它们大致上可以分为三大类： <br>●简单数据的表示和交换（针对XML的简单API（SAX）和文档对象模型（DOM）语法解析，不同的文档类型定义（DTDs）和概要（schemas）） <br>●面向消息的计算（XML-RPC（远程过程调用），SOAP协议，电子化业务XML（ebXML）） <br>●用户界面相关、表示相关的上下文（可扩展样式表语言（XSL），可扩展样式表语言转换（XSLT）） <br>这几类应用在J2EE架构中恰好有天然的对应：数据表示和交换功能是EJB组件模型中持久化服务（persistence services）的一部分，基于消息的通讯由Java消息服务（JMS）API来处理，而界面表示正是Java服务器页面（JSP）和Java Servlets的拿手好戏。 <br>在本文中，我们将看到当今基于J2EE的应用里，XML是如何在上述几个方面进行应用的，以及在相关标准的未来版本中这些应用将会如何发展。 <br>基础：数据的表示和交换 <br>原型化的XML应用（假设有的话）的内容通常是：数据以XML格式存放，为了进行显示、修改甚至写入某个XML文档而经常被读入到某个对象模型中。作为例子，假定我们正处理多种类型的媒体（图品、视频、文本文档等等），并且用下面这个简单的XML DTD来描述这些媒体的元数据： </p>
            <p><br>&lt;!ELEMENT media-asset (name, desc?, type*, media-asset*, urn)&gt; </p>
            <p>&lt;!ELEMENT name (#PCDATA)&gt; <br>&lt;!ELEMENT desc (#PCDATA)&gt; <br>&lt;!ELEMENT type (desc, mime-type?)&gt; <br>&lt;!ELEMENT mime-type (#PCDATA)&gt; <br>&lt;!ELEMENT urn (#PCDATA)&gt; <br>　　 <br>以下是一个基于上述媒体DTD的XML文档，描述了与某个课程讲座相关的内容： <br>&lt;?xml version="1.0" ?&gt;&lt;!DOCTYPE media-asset PUBLIC "-//Jim Farley//DTD <br>Media Assets//EN" "<a href="http://localhost/Articles/Sun/dtds/media.dtd"><font color=#0000ff>http://localhost/Articles/Sun/dtds/media.dtd</font></a>"&gt; <br>&lt;media-asset&gt; <br>&lt;name&gt;第14讲&lt;/name&gt; <br>&lt;desc&gt;与第14讲相关的所有内容&lt;/desc&gt; </p>
            <p>&lt;media-asset&gt; <br>&lt;name&gt;讲座的幻灯片&lt;/name&gt; <br>&lt;type&gt; <br>&lt;desc&gt;MS PowerPoint&lt;/desc&gt; <br>&lt;mime-type&gt;application/vnd.ms-powerpoint&lt;/mime-type&gt; <br>&lt;/type&gt; <br>&lt;urn&gt;http://javatraining.org/jaf/E123/lecture- <br>14/slides.ppt&lt;/urn&gt; <br>&lt;/media-asset&gt; <br>&lt;media-asset&gt; <br>&lt;name&gt;讲座的视频片断&lt;/name&gt; <br>&lt;type&gt; <br>&lt;desc&gt;RealPlayer streaming video&lt;/desc&gt; <br>&lt;mime-type&gt;video/vnd.rn-realvideo&lt;/mime-type&gt; <br>&lt;/type&gt; <br>&lt;urn&gt;http://javatraining.org/jaf/E123/lecture- <br>14/lecture.rv&lt;/urn&gt; <br>&lt;/media-asset&gt; </p>
            <p>&lt;urn&gt;http://javatraining.org/jaf/E123/lecture-14/index.jsp&lt;/urn&gt; <br>&lt;/media-asset&gt; <br>从Web或者企业级应用的角度看，能以这种方式访问数据真是一种福音，因为它体现了高度的可移动性，使我们与元数据的实际资源本身隔离。这些资源可能来自一个关系数据库系统、某种活动媒体服务器或者Web服务器上的一个静态XML文档，等等。如果想把这些数据加载到Java应用中，我们可以从当前众多的Java语言XML解析器中选用一个，通过它将XML数据装入一个DOM文档，最后遍历文档，将所有这些数据转换到我们应用系统的对象模型中。 <br>下面是个简单的基于DOM的解析程序，可对上述的媒体DTD进行解析。解析器用的是 <br>Apache Xerces： <br>　　 <br>package jaf.xml; <br>import java.util.*; <br>import java.io.IOException; <br>import org.w3c.dom.*; <br>import org.xml.sax.*; <br>　　 <br>// XML文档解析程序，使用上述媒体DTD. <br>public class MediaParser implements ErrorHandler { <br>/** 使用Apache Xerces解析器 */ <br>org.apache.xerces.parsers.DOMParser mParser = <br>new org.apache.xerces.parsers.DOMParser(); <br>/** 构造函数 */ <br>public MediaParser() { <br>// 告诉解析器验证并解析文档 <br>try { <br>mParser.setFeature( "<a href="http://xml.org/sax/features/validation"><font color=#0000ff>http://xml.org/sax/features/validation</font></a>", <br>true); <br>} <br>catch (SAXException e) { <br>System.out.println("Error setting validation on parser:"); <br>e.printStackTrace(); <br>} <br>// 设置解析器的错误处理句柄 <br>mParser.setErrorHandler(this); <br>} <br>/** 解析指定的URL，返回找到的XML文档 <br>*/ <br>public Document parse(String url) throws SAXException, IOException { <br>mParser.parse(url); <br>Document mediaDoc = mParser.getDocument(); <br>return mediaDoc; <br>} <br>/** 解析指定URL的XML文档，将内容转换成 MediaAsset 对象 <br>*/ <br>public Collection loadAssets(String url) throws SAXException, <br>IOException { <br>Document doc = parse(url); <br>Collection assets = new LinkedList(); <br>NodeList assetNodes = doc.getElementsByTagName("media-asset"); <br>for (int i = 0; i &lt; assetNodes.getLength(); i++) { <br>Node assetNode = assetNodes.item(i); <br>MediaAsset asset = new MediaAsset(assetNode); <br>assets.add(asset); <br>} <br>return assets; <br>} <br>/** <br>* 错误处理代码（为简洁起见省略了） <br>*/ <br>} <br>MediaParser类的构造函数初始化了一个Xerces DOM解析器。parse()方法告诉解析器到哪个URL去找XML源，然后得到结果文档并返回。loadAssets()方法调用parse()方法从某个XML源加载文档，然后为文档中找到的每个&#8220;media-asset&#8221;节点创建一个MediaAsset对象。 <br>以下是一个使用MediaAsset类的例子： <br>package jaf.xml; <br>import java.util.*; <br>public class MediaAsset { <br>// 资源元数据 <br>private String mName = ""; <br>private String mDesc = ""; <br>private Collection mChildren = new LinkedList(); <br>private Vector mTypes = new Vector(); <br>private String mUrn = ""; <br>protected MediaAsset(org.w3c.dom.Node assetNode) { <br>// 为简洁起见省略后面代码 <br>. <br>. <br>. <br>} <br>} <br>因为篇幅的关系省略了MediaAsset类的详细代码，但应用模式依然是清晰的。MediaAsset类遍历文档的节点，当它碰到不同的子节点时，它用子节点的内容填充自己的成员数据。如果它发现了一个嵌套的子资源节点，它只需要创建一个新的MediaAsset对象，然后将子资源节点的数据填充到新对象的成员数据中。 <br>实现上述处理的方法数不胜数。我们还可以使用其他的解析器或解析器架构，如Java API for XML Parsing (JAXP)。除了使用DOM模型外，事件驱动的SAX模型也可用于解析XML。类似的程序也可用来产生XML数据——前提是允许产生新的数据对象（在本例中是MediaAsset），它可将其相应的XML实体插入到DOM中，然后将DOM输出到一个流中（诸如一个文件，一个Socket，或者一个HTTP连接...）。还有其他更高层次的标准，可将XML映射到Java对象的过程进一步自动化（或简化）。例如，使用XML概要（Schema）和XML绑定处理引擎，您可以半自动地将满足某个XML 概要的XML数据转变成Java数据对象。代表性的引擎是Castor，是由ExoLab小组管理的一个开放源代码项目的产物。上述使用Xerces DOM的简单例子仅仅是演示了这一处理过程的底层模型。 <br>上述示例表明，在Java环境中解析或产生XML是非常方便的，这与J2EE没有必然关联。格式化为XML的数据可以从应用程序的任何层次流入或输出，这使得与外部系统的集成性无可限量。但我们能否以一种更为直接的方式将XML数据源集成到J2EE架构中去呢？ </p>
            <p><br>驾驭消息 </p>
            <p>J2EE架构包含了对JMS（Java消息服务）API的访问，以实现面向消息的通信（J2EE 1.2.1版只需JMS API即可，在J2EE 1.3版中JMS基本定型，此时必须由某个兼容J2EE平台的服务器提供一个JMS API Provider）。这一类的异步交互（与之相对的是：本地或远程方法调用所代表的同步交互）被证明在某些应用环境中是非常有用的。某些时候，交互只需要通过间接的请求或回答来实现，即：在某些情况下，发出消息后不可能立即收到答复，但我们仍希望当消息发出者重新在线时，确保他能收到答复信息。 <br>面向消息系统的实际应用之一就是企业之间的松散集成。类似于EDI（电子文档交换）时代的文档交换，两个企业由于业务的需要而交换消息，此时通常不能为了使用RPC或者RMI、CORBA、DCOM之类的远程方法交互而在两者之间进行紧密集成。象JMS API这样的消息系统允许双方交换基于JMS API的消息载荷，前提是双方在会话的时候均能提供兼容的JMS API服务。当前仍然存在的困难是：双方是否能尊从相同的格式或协议。 <br>这正是XML大显身手的时候。XML明确地被设计来解决此类数据交换问题——灵丹妙药就是&#8220;面向消息的概要表&#8221;（Message-Oriented Communication Scheme），实质就是基于一个双方认同的DTD或schema，用XML格式来交换消息载荷。 <br>JMS API支持好几种消息，其中的TextMessage代表文本消息载荷。一个简单而有效的XML消息交换方案是，在一端将我们的XML文档插入TextMessage，然后在另一端用自制的XML解析程序（如前面的MediaParser）解开数据并（可选地）将其转换成Java对象。这使得我们既可以用JMS API支持的公开预订的消息模型，也可以用JMS API支持的点对点的消息模型来发送XML消息。 <br>上述方法有一些局限，因为对于JMS运行时处理而言，XML的内容基本上是不透明的。例如，JMS API允许使用基于特定消息头的路由。这很容易理解，尤其当我们希望XML消息根据其内容采取不同走向时。例如在我们的MediaAsset例子中，我们希望公开讲座内容，但只想把特定的内容传送给那些预订了课程的人，或传送给那些表明可以接受某些媒体格式（如视频流）的人。为了发挥JMS API的价值，以便实现上述基于内容的消息路由，我们有必要从XML数据中解析出关键信息，然后在构造标准JMS API消息头时插入这些信息。这是可行的，但要实现XML信息我们就得额外地写很多代码（交换消息的双方均如此）。 <br>为了在XML和JMS API之间架起桥梁，一些厂商提供了自定义的JMS扩展，以便直接支持XML消息机制。例如，BEA系统公司基于J2EE的WebLogic应用服务器特别为TextMessage提供了XMLMessage子类，允许用XPath表达式来过滤XML消息。不过这是一种专有的扩展，这要求交换消息的双方必须都能处理这类消息。 <br>为此，Sun公司目前正在开发用于XML消息的Java API（JAXM）。其目标是提供一个高级别的标准服务，以实现基于ebXML的消息的合成与传送。一个JAXM服务提供程序可以将这类消息映射到适当的物理消息系统（诸如JMS API）中去。 <br>让XML看得见 <br>将XML同Web系统的用户界面进行集成显然是一种有益的尝试。绝大多数的界面程序，无论是基于还是不基于Web，都是将数据进行转换，然后用易读的格式展现给用户。用诸如XML这种&#8220;易消化&#8221;的格式存放数据将简化上述工作，同时它还大大提高了内容的可管理性，接下来我们就可看到这一点。不过首先要大书一笔的是，XML在Web界面层的应用得益于JSP技术的发展。 <br>一直以来大家都希望能清晰地区分Web应用程序的表示层与底层对象模型，JSP框架诞生于这些努力之中（包括早期JHTML尝试）。JSP框架允许将Java代码嵌入到HTML内容中，这样既可以实现动态内容，又不必经常修改Java Servlets的代码。在页面中包含Java技术的途径是通过JSP标记（JSP Tags），这些标记以XML风格出现。在JSP中，Java程序以代码片段、服务器端JavaBeans组件、在服务器端触发特定操作的不透明标记（标准的或自定义的）等形式存在。当某个用户通过浏览器请求JSP页面时，一个Java应用服务器解析该JSP页面，将其编译成一个Java Servlet，然后执行该Servlet以产生答复页面。 <br>一种直接将XML数据源集成到JSP的界面中去的方法是，将XML加载到JavaBeans组件中（如同我们在MediaAsset例子中所做的），然后在JSP中直接引用这些JavaBeans组件。 <br>下面是一个嵌入Java代码片断的例子： <br>&lt;html&gt; <br>&lt;head&gt; <br>&lt;title&gt;第14讲的媒体资源&lt;/title&gt; <br>&lt;/head&gt; <br>&lt;body&gt; </p>
            <p>&lt;%@ page import="jaf.xml.*" %&gt; </p>
            <p>Media Assets for Lecture 14:</p>
            <p><br>&lt;jsp:useBean class="jaf.xml.MediaAsset" id="asset" /&gt; </p>
            <p>&lt;% MediaParser parser = new MediaParser(); <br>Collection assets = parser.loadAssets("<a href="http://javaschool.org/"><font color=#0000ff>http://javaschool.org</font></a> <br>/jaf/E162/lecture14-assets.xml"); <br>Iterator iter = assets.iterator(); <br>%&gt; </p>
            <p>&nbsp;Name Type URN </p>
            <p>&lt;% <br>while (iter.hasNext()) { <br>asset = (MediaAsset)iter.next(); <br>%&gt; <br>&nbsp;&lt;jsp:getProperty name="asset" property="name" /&gt; <br>&nbsp;&lt;jsp:getProperty name="asset" property="type" /&gt; <br>&nbsp;&lt;jsp:getProperty name="asset" property="URN" /&gt; <br>&nbsp;</p>
            <p>&lt;% <br>} <br>%&gt; <br>&nbsp;<br>&lt;/body&gt; <br>&lt;/html&gt; <br>其中粗体部分为JSP代码片断和标记，其余部分是标准的HTML文本。 <br>上述程序还有一种更简洁的写法，那就是使用自定义JSP页面标记。这样我们就可以从JSP页面中剔出代码段，只使用JavaBeans组件和自定义的JSP标记即可。比如说，为了去掉创建解析器、加载资源数据到集合中的那段代码，我们可创建一个自己的标记，由它在幕后完成这些工作。以下是例子： <br>. <br>. <br>. </p>
            <p>&lt;%@ page import="jaf.xml.*" %&gt; </p>
            <p>Media Assets for Lecture 14:</p>
            <p><br>&lt;%@ taglib uri="<a href="http://javaschool.org/taglib"><font color=#0000ff>http://javaschool.org/taglib</font></a>" prefix="media" %&gt; </p>
            <p>&lt;media:load url="<a href="http://javaschool.org/jaf/E162/lecture14-assets.xml"><font color=#0000ff>http://javaschool.org/jaf/E162/lecture14-assets.xml</font></a>" <br>collectionName="assets" cursorName="asset" /&gt; </p>
            <p>. <br>. <br>. <br>使用自定义标记的最大好处是使我们的程序代码集中在一个地方（对Java技术而言，一般是指在&#8220;类&#8221;中），易于管理。这样可以将程序中对象层同界面层的集成关系定义得很清晰，修改代码所造成的影响是可以预测和管理的。 <br>直接将XML数据转换成Web显示内容的另一种方法是使用XSL和XSLT。在这种方案中，将XML数据映射成HTML（或WML等）的逻辑由XSL样式表（XSL StyleSheet）来定义。样式表描述了每个特定XML数据实体应该怎样转换成界面数据实体（如HTML表格、内联标记等）。在JSP架构中，XSL转换只能应用于特定的XML数据源，最理想的是采用一套自定义的JSP标记并引用某个XSLT处理程序。这方面的典型示例请参考java.sun.com中关于XML同JSP构架集成的白皮书。 <br>同前面那个JSP自定义标记加XML解析器组件的方案相比，XSLT方案的伸缩性要好一些，而且具有更好的可管理性。在这种情形下，我们的转换逻辑是编写在一个XSL样式表中，而不是在Java代码中。这意味着当需要修改界面时，大多数情况下只是编辑样式表或者HTML，代码不受影响。不过在决定选用何种方案之前，还是要根据实际状况仔细权衡。如果选用XSLT方案，那么就得有人负责维护这些XSL样式表（要么是负责界面的人，要么是编写程序的人）。XSLT既像内容，又像程序，因此双方都不能把责任推给对方，结果大家可能都被这不伦不类的XSLT弄得矛盾百出。从这点上考虑，采用自定义标记并由界面开发者将其嵌入表示层的方法似乎更有吸引力，因为这样软件工程师只考虑Java代码，而内容工程师也只操心内容标记。 <br>Java servlet过滤器是J2EE 1.3版在其Web层最新发布的一种Web组件。当Sevelet将请求写入某个资源或者从某个资源中读取回答信息时，过滤器可以非常方便地转换其中的头信息和内容信息。这里所说的资源可以是一个Java servlet、一个JSP页面，甚至一个静态Web页。过滤器的确很&#8220;酷&#8221;，因为它允许开发人员从转换内容的代码中分离出生成内容的那部分代码，并加以重用。当需要通过XSLT方式将XML数据转换到不同的XML应用目标时，Java servlet过滤器尤其有用。 <br>在J2EE应用程序中使用Java servlet过滤器转换其输出，以便兼容任何类型客户端的前景呼之欲出。servlet过滤器能够侦测到来自使用WAP协议（无线应用协议）的移动客户端的呼叫，并且将答复内容转换成WML（无线标记语言）格式。servlet过滤器也能检测到来自iMode无线客户的呼叫，并将其转变成cHTML（紧凑HTML）格式。当然，servlet过滤器也能够分辨出传统的HTML浏览器客户的请求，并用正确的格式进行回复。 <br>结束语 <br>在J2EE 1.2.1规范中，XML&#8220;集成&#8221;仅指组件或应用程序的XML格式的部署描述。在J2EE 1.3规范中，对XML的支持被扩展为要求具备SAX 2和DOM 2解析器，以及在兼容J2EE的服务器平台上提供XSLT转换处理程序。您可以毋庸置疑地相信，将来在J2EE架构中还会集成进更多的XML特性，因为J2EE规范的定义者们会认真倾听开发者社区中对在企业级应用中使用更多XML的渴求呼声。例如，JSR（Java定义请求）处理小组中与JAXM规范相关的部分（JSR 000067）承诺在J2EE后续规范中集成进JAXM。可以预见，在JSP架构、EJB和JDBC规范中均会有类似的变化。J2EE平台中上述组件的变革，将使Java技术开发者目前用的XML更为规范化（以及标准化），发挥出更大的威力。&nbsp; </p>
            </div>
            </span></td>
        </tr>
        <tr>
            <td width="71%">&nbsp;</td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/jesson2005/aggbug/115548.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jesson2005/" target="_blank">张金鹏</a> 2007-05-06 12:50 <a href="http://www.blogjava.net/jesson2005/articles/115548.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2EE修炼之四书五经</title><link>http://www.blogjava.net/jesson2005/articles/115547.html</link><dc:creator>张金鹏</dc:creator><author>张金鹏</author><pubDate>Sun, 06 May 2007 04:49:00 GMT</pubDate><guid>http://www.blogjava.net/jesson2005/articles/115547.html</guid><wfw:comment>http://www.blogjava.net/jesson2005/comments/115547.html</wfw:comment><comments>http://www.blogjava.net/jesson2005/articles/115547.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jesson2005/comments/commentRss/115547.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jesson2005/services/trackbacks/115547.html</trackback:ping><description><![CDATA[<table cellSpacing=0 cellPadding=0 width="98%" align=center border=0>
    <tbody>
        <tr>
            <td align=middle colSpan=2 height=40>
            <h1>J2EE修炼之四书五经</h1>
            </td>
        </tr>
        <tr align=middle>
            <td colSpan=2 height=40>
            <script type=text/javascript><!--
            google_ad_client = "pub-8263014661871932";
            google_ad_width = 468;
            google_ad_height = 60;
            google_ad_format = "468x60_as";
            google_ad_type = "text_image";
            //2007-02-14: 新闻内容页面上面
            google_ad_channel = "8423241514";
            google_color_border = "FFFFFF";
            google_color_bg = "FFFFFF";
            google_color_link = "333333";
            google_color_text = "333333";
            google_color_url = "003366";
            //--></script>
            <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript>
            </script>
            </td>
        </tr>
        <tr>
            <td colSpan=2 height=40>&nbsp;</td>
        </tr>
        <tr>
            <td colSpan=2><span class=STYLE2>
            <div id=article>J2EE其实没有四书五经，因为J2EE一直如汹涌澎湃的大江，推陈出新，不断高速发展，这是一种带领我们走向未来的技术。当然，如何在这种气势如虹的潮流之中不至于迷失方向，需要相关指南性书籍的引导。本文将从线程和模式两个方面推荐J2EE书籍，这两个方面正好是两种不同的方向，线程是从微观、底层机制入手；而模式则是从设计高度来看待J2EE。<br><br>　　线程（Thread）<br><br>　　首先，线程是很多J2EE初学者容易忽视的一个基本知识，可以说，无论你是从Java世界的哪一扇门进入J2EE的，线程是必经之道。<br><br>　　已经不记得在哪里看到过下面一段英文：<br><br>　　在过去，大概只有勇敢的程序员才勇于使用pthread和Win32线程，现代语言如Java正试图在编写一些令人恐惧的应用如并行计算等方面来挽救我们。<br><br>　　J2EE的Servlet和EJB确保我们不用担心线程以及同步等问题，我们只要象往常一样编程，容器自动会使用线程池等技术来支持我们的应用。<br><br>　　由此可见，线程是J2EE最基本的底层机制，每个Servlet/Jsp程序其实是一段线程程序，如果你不懂得线程/多线程的一些原理，如何能娴熟驾驭J2EE的Servlet/Jsp？<br><br>　　在线程计算方面有很多权威，Dou Lee无疑是这方面的杰出代表，他的并行计算包已经加入了最新的JDK1.5版本中，他的书籍都属于奠基性质，但是，这样书籍可能不是很适合只想对线程进行了解的J2EE初学者。<br><br>　　《Java线程编程》（Java Thread Programming）<br><br>　　是我推荐的第一本有关J2EE书籍，在这本书中，作者以简单的例子，形象易懂地从单线程讲解到多线程，线程池（Thread Pool）、并发同时访问对象和变量（Concurrent Access to Objects and Variables），这些都是我们在平时Servlet/Jsp编程中经常会发生疑惑的地方，在这本书的案例中，作者清晰明了地给我们展示这些细节而有重要的技术。同时，也让我们深刻地理解了直接编制多线程应用是一件&#8220;令人恐惧&#8221;的事情。<br><br>　　很有意思的是，我在一家网上书店社区里也发现了与我有同样见解的帖子，称这本书是&#8220;一本让经典成为过去的书&#8221;<br><br>　　设计模式<br><br>　　线程世界就象微生物世界一样，复杂且几乎没有边界，作为信息系统的程序员如果太执著于这样纯技术的微观层面，可能浪费太多宝贵时间和精力，在基本掌握多线程机制后，需要更加关注J2EE的设计应用了。<br><br>　　J2EE是Java世界中一个独特的框架或标准，所以，我们首先需要掌握基于Java的设计应用，这些设计应用技巧，是先行者经过长期实践总结出来的心得，他们称之为设计模式。在J2EE应用中，只有大量使用设计模式，才能体现出分离和解耦的最高宗旨，才能使得自己的J2EE系统脉络清晰、层次分明，这样的系统才真正具有良好的可伸缩性、稳固的健壮性以及方便的可维护性。<br><br>　　GoF 23种设计模式已经成为经典，2002年我在我的网站J道发表23种设计模式Java详解时，竟然在中文google里很难发现这方面的资料，这让我万分惊讶，也许国人确实是非常实在，只对算法、数据结构等这样看得见、摸得着的概念感兴趣，其实我一直反复和别人讲：设计模式不是纯抽象概念，它是实践的总结，如同UML一样，是一种交流和编码实现的语言。<br><br>　　我在2002年帮朋友购买了GoF 23种设计模式的中文版：《设计模式：可复用面向对象软件的基础》，它是2000年12月第2次印刷的版本，这样经典必读书籍，8000册在2年时间内都没有销售完毕，相比那些喧嚣炒作的书籍，在出版几个月内销售过万，越发显得我们这个社会的浮躁和急功近利了。<br><br>　　当然，这本薄薄的书虽然由四个国人鼎力协助翻译，想必他们也殚思竭虑，尽了最大努力了，可惜书中还是有很多翻译欠妥之处，影响了它的销量。<br><br>　　由于这本经典的GoF设计模式比较难懂，初学者更多应该是从实例应用中了解和掌握GoF设计模式，相关提供实例应用的书籍有下面几本：<br><br>　　Mark Grand的Patterns in Java系列；<br><br>　　美籍华人阎宏的《Java与模式》；<br><br>　　笔者的《Java实用系统开发指南》；<br><br>　　EJB <br><br>　　EJB是J2EE中一个重要组成部分，J2EE推荐将你的业务功能核心放在EJB中实现，EJB类似肯得基的&#8220;全家桶&#8221;，将实际中需要的基础功能全都打包在一起了，如果你是个挑剔或个性化的客户，我想你可能不会只满足于&#8220;全家桶&#8221;。<br><br>　　不管&#8220;全家桶&#8221;是否合适你，了解它里面装的是什么是一个必需的过程。掌握EJB需要从两个方面着手：基本原理和如何使用。<br><br>　　《精通EJB（第二版）》（后注：http://www.javafan.net/softview.jsp?ID=110）<br><br>　　是对EJB原理讲解得比较透彻，但是书中将EJB一些本质原理推卸给了Corba，而对Corba又没有仔细介绍，我认为初学者应该在这里适可而止，如果你非常对EJB底层实现感兴趣，我推荐阅读JBoss的源码，其实JBoss源码在你孜孜不倦的钻研之劲攻击下很快会土崩瓦解。<br><br>　　对象池（Object Pool）、RMI和事务机制应该是EJB原理掌握三个方向，这三种技术方向又可以推荐很多书籍供学习研究，这里就不说了。<br><br>　　EJB主要分EJB容器和EJB应用系统，初学者更多精力应该关注如何构建EJB应用系统，由于EJB提供功能强大且非常有特点，因此，使用他们要非常小心，遵循一定的前提和规则，由此，EJB设计模式是不能不了解的。<br><br>　　《EJB设计模式》（后注：http://www.javafan.net/softview.jsp?ID=69）是这方面的经典之作，在书中，作者指出了使用CMP注意特点、DAO模式的重要性、DTO模式的变种等。阅读本书的同时，如果参考SUN的PetStore源码学习，将会起到事半功倍的效果，<br><br>　　看完上面两本书，自己动手实践非常重要，EJB使用中关于EJB reference配置比较麻烦，其原理是这样：调用者---- &gt; EJB Reference ---&gt; 被调用EJB的JNDI名称 ---- &gt;被调用EJB，这些细节使用问题只有实践时才能碰到，也可以从网上寻找一些这方面的电子教程实例。<br><br>　　只有调试了一两个EJB实例，这时你才可以站出来表达你的想法：喜欢或不喜欢？架构选型时也可以提供参考意见：是轻量型还是重量型？盲目排斥EJB或认为EJB是唯一解决方案等两种极端观点是要不得的，条条大路通罗马，伸缩和性能是关键。<br><br>　　这里推荐一本从纯设计角度看待EJB/J2EE的书籍：Rod Johnson的《J2EE设计开发编程指南》，英文是Expert One-on-One J2EE Design and Development，Rod Johnson在书中从一个完美的设计角度指出了EJB缺点，这些缺点他是用黑体标识，非常醒目，同时，他将如果不使用EJB所带来的额外工作量使用正常小字体标识了，算是轻描淡写吧。当然，Rod Johnson为了将其理想的设计落实为代码，主持了Spring框架开发，如果J2EE领域有一个既符合完美的设计要求，又能支持成熟应用，同时又是业界标准，那是一个多么令人向往的事情，Spring框架至少在这方面做了有益的探索。<br><br>　　集群、Web服务和资源整合<br><br>　　对于中大型软件系统，集群和Web服务是必需掌握的技术，目前相关书籍不多。如何将J2EE新技术和现有资源整合，也属于一个探索性的领域，期待这几个方面有好的书籍问世。<br></div>
            </span></td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/jesson2005/aggbug/115547.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jesson2005/" target="_blank">张金鹏</a> 2007-05-06 12:49 <a href="http://www.blogjava.net/jesson2005/articles/115547.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2EE开发框架发展简史</title><link>http://www.blogjava.net/jesson2005/articles/115546.html</link><dc:creator>张金鹏</dc:creator><author>张金鹏</author><pubDate>Sun, 06 May 2007 04:47:00 GMT</pubDate><guid>http://www.blogjava.net/jesson2005/articles/115546.html</guid><wfw:comment>http://www.blogjava.net/jesson2005/comments/115546.html</wfw:comment><comments>http://www.blogjava.net/jesson2005/articles/115546.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jesson2005/comments/commentRss/115546.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jesson2005/services/trackbacks/115546.html</trackback:ping><description><![CDATA[<table cellSpacing=0 cellPadding=0 width="98%" align=center border=0>
    <tbody>
        <tr>
            <td align=middle colSpan=2 height=40>
            <h1>J2EE开发框架发展简史</h1>
            </td>
        </tr>
        <tr align=middle>
            <td colSpan=2 height=40>
            <script type=text/javascript><!--
            google_ad_client = "pub-8263014661871932";
            google_ad_width = 468;
            google_ad_height = 60;
            google_ad_format = "468x60_as";
            google_ad_type = "text_image";
            //2007-02-14: 新闻内容页面上面
            google_ad_channel = "8423241514";
            google_color_border = "FFFFFF";
            google_color_bg = "FFFFFF";
            google_color_link = "333333";
            google_color_text = "333333";
            google_color_url = "003366";
            //--></script>
            <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript>
            </script>
            </td>
        </tr>
        <tr>
            <td colSpan=2 height=40>&nbsp;</td>
        </tr>
        <tr>
            <td colSpan=2><span class=STYLE2>
            <div id=article>
            <p><font face=Verdana>Java2企业版为中间件领域思想的统一上发挥了很大的作用。比如，J2EE为分布式事务管理、目录服务和消息服务提供了一套标准的编程接口。J2EE的基础??Java2标准版(J2SE) ，成功地为Java提供了一套访问关系数据库的标准。 </font></p>
            <p><font face=Verdana>　　但是，就像本文中&#8220;J2EE缺乏对编程的支持&#8221;提到的一样，J2EE这个平台没有能够提供一个令人满意的应用程序编程模型（application programming model）。Sun公司和一些大的应用服务器供应商都想用开发工具来降低J2EE开发的复杂性，但是这些工具没有其他的JAVA 开发工具优秀，后者有先进的重构工具，和.NET平台相比，J2EE的工具支持显得很逊色。 </font></p>
            <p><font face=Verdana>　　很多J2EE开发工具自动产生的代码像这些工具本身同样复杂。在开源社区很多小型J2EE开发者选择了另外一种开发方式?? 一些可以降低J2EE开发难度的开发框架,较为流行的比如： Struts, Hibernate, 和 Spring Framework，他们当今很多J2EE项目种扮演着重要角色。</font></p>
            <p><font face=Verdana>　　为什么要采用框架？ </font></p>
            <p><font face=Verdana>　　框架是一由一些类组成，正式这些类为应用程序提供了一个可重用的设计――或者我们经常提到的??应用程序种的一层。应用程序代码访问类库从而执行任务，而框架是调用应用程序代码，从而管理程序的流程。这就是经常说道的好莱坞原则：&#8220;不要试图联系我们，我们到时候自会通知你。&#8221;开发者写的程序在运行时由框架调用。</font></p>
            <p><font face=Verdana>　　设计一个在各种未知背景下都可以使用的框架是很有挑战性的。框架很适合在复杂的J2EE开发中使用，它可以为开发者提供一个简单易用的模型。采用一个经过良好设计的开源框架有很多好处： </font></p>
            <p><font face=Verdana>　　?在好的框架下，开发者只需要写一些必须的代码；他们不需要直接接触底层的API。 这一点很重要。</font></p>
            <p><font face=Verdana>　　?经过良好设计的框架可以为程序提供清晰的结构并且提高程序的内聚性。好清晰的结构使得其他人可以更容易加入项目。</font></p>
            <p><font face=Verdana>　　?一个容易使用的框架可以通过一些例子和文档为用户提供最佳实践。</font></p>
            <p><font face=Verdana>　　?采用成功的框架的代码比自己的代码容易测试</font></p>
            <p><font face=Verdana>　　?框架只有提供了一些值得使用的功能才会变得流行。J2EE工程只有真正需要框架的时候才会用它，而自己的框架并不是这样，后者是处于统治地位的。</font></p>
            <p><font face=Verdana>　　J2EE本身也提供了一些框架。比如， Enterprise Java-Beans (EJB) container或者 Servlet engine，二者都运用了&#8220; 采用了好莱坞原则&#8221;这个思想，并采用运行时调用来管理对象。像Struts这些开源web应用框架正式建立在这两个框架的基础上的，本文讨论的重点也是像Struts这样建立在J2EE上的框架，他们为开发者提供了更为简单的模型，和其他的一些好处。 </font></p>
            <p><font face=Verdana>　　开源框架的出现</font></p>
            <p><font face=Verdana>　　很多大型的J2EE项目都用自己的内部框架来隐藏平台的复杂性，直到最近人们才逐渐发现一些在很多项目中都存在的共有的难题，这些难题都可以由一个较为统一的解决方案来解决。而有的框架正好可以充当这些问题的解决方案。现在有种很明显的趋势：与从前的内部框架相比，这些框架将成为这些难题的更加&#8220;标准化 &#8221;的解决方案。 </font></p>
            <p><font face=Verdana>　　J2EE平台的日益成熟是这些框架流行的一个原因。开发者知道有些地方是J2EE的标准API无能为力的，倚他们的经验来看，要弥补这个缺陷是很困难的。于此同时，一些优秀的开源框架可供使用，它们提供了极为丰富的技术文档，在它们背后还有一个专业的团队做支持，并且一切都是免费的。 </font></p>
            <p><font face=Verdana>　　Struts，在web应用程序产生时就有的开源框架。在1999－2000年，开发者们意识到JSP&#8220;Model1&#8221;的缺陷，JSP中充斥着请求处理代码和静态数据模板，这意味着你不得不把业务逻辑和复杂的HTML以及其他的标签混到一起。那个时候还没有标准的框架和J2EE的标准支持，要解决这个问题开发者就得自己实现前端控制器，这样可以把业务逻辑分离到java类中，从而可以减轻对JSP的维护难度。前端控制器模式经常运用在MVC架构中，MVC模式在OO语言的GUI开发中经常使用（这个名字总是让人误解，WEB MVC中的视图是从模型中&#8220;拉&#8221;数据；而在经典MVC中，模型把事件&#8220;推向&#8221;视图）。</font></p>
            <p><font face=Verdana>　　最初的前端控制器实现质量参差不齐。2001～2002年间，Apache开源组织发布的Struts改变了这个状况，虽然它并非一个完美的框架，但已经足够使其成为该领域事实上的标准。</font></p>
            <p><font face=Verdana>　　Struts向人们展示了开源框架的一些优点，比如，新手可以很容易地熟悉它的结构。2002年末，它成立很多J2EE项目很自然的选择，每一个认真的J2EE开发者都会对它很熟悉。</font></p>
            <p><font face=Verdana>　　Struts几乎用才每一个J2EE项目中，这使得它成为J2EE架构的一个重要组成部分。甚至很多保守的组织也将其作为软件底层的一部分，并同意接受Apache的开源协议条款。</font></p>
            <p><font face=Verdana>　　Hibernate。下一个倒下的多骨诺米牌就是持久化。J2EE提供了两个持久化的手段：JDBC，它是J2SE中访问关系数据库系统的标准API；另一个是实体Beans ,它是EJB中专门模型化持久化实体的组件。</font></p>
            <p><font face=Verdana>　　JDBC以一种错误的编程模型来强制开发者用Java代码来处理关系思想。而实体beans，先不说Sun和其他主要的J2EE供应商的吹嘘，给人很笨重的感觉：起初这门技术的应用范围很窄，连持久对象间的关系都不能处理。它使得应用程序难于测试，并且使用了一个很糟糕的查询语言。直到2003年，即使EJB2.0和2.0做了很多改进，开发者们却很少用它。</font></p>
            <p><font face=Verdana>　　早期的尝试</font></p>
            <p><font face=Verdana>　　持久化问题的解决方案是由关系-对象映射（ORM）来解决的，它可以透明地持久化普通java对象（POJO）。该思想在注释中有解释。虽然这种方案并不是专属java的。但相对与其他的社区而言比如.NET，ORM在java社区更加流行(.NET开发者总是对之抱有怀疑的态度)。</font></p>
            <p><font face=Verdana>　　早在1990年，一些商业的ORM工具就出现了，比如TopLink。但由于其价格昂贵、结构复杂并且与Sun的实体bean标准相左，所以很少人会用。不管怎样，在持久化POJO方面，这些工具与JDBC和实体Bean相比确实有了很大的进步</font></p>
            <p><font face=Verdana>　　Java Data Object于2001年在Java Community Progress(www.jcp.org)的规范中出现。它为一般的POJO提供了大多数的持久化实现(尽管很多实现都是对关系数据库的)。但Sun公司以及其他的J2EE技术提供商对该技术表现的很冷淡。所以JDO也没有能够流行。</font></p>
            <p><font face=Verdana>　　Hibernate的出现。ORM领域在2002年发生了大变化，原因有两个。首先，实体Beans在实践中失败，开发者们将其从J2EE中忽视掉了。它向开发者们说明了一个规范是如何将开发拉入泥潭的。</font></p>
            <p><font face=Verdana>　　另外的一个原因是Hibernate的发布，它是第一个功能健全的解决关系对象影射解决方案。虽然在功能上，它没有TopLink多样。但在那些最常用的功能上，Hibernate实现的更加健壮，并且有一个非常专业的团队提供全职的开发。Hibernate并不是全新的，它的ORM思想在这个领域很普遍，但它提供的编程模型比其他任何竞争者都容易使用、都来的直接，它为ORM的使用提供了更加易用、廉价的途径。</font></p>
            <p><font face=Verdana>　　于此同时，新一代的商业产品针对关系数据库提供了极其高效的JDO规范的实现。这样开发者的选择就更丰富了；还有，TopLink也朝着开发者友好的方向前进，它的liscense越来越开放了。</font></p>
            <p><font face=Verdana>　　ORM大获全胜</font></p>
            <p><font face=Verdana>　　所的这些因素是的ORM比以往更加规范。虽然很多项目仍然使用自己的持久层框架，但Hibernate，TopLink以及一些高端的JDO实现，使得使用自己持久层框架的难度相对变大、可维护性降低，自然，也没有什么理由去使用自己的框架了。</font></p>
            <p><font face=Verdana>　　虽然这些框架的功能覆盖范围已经很大了，但仍有很多地方不在其中。比如，一个基于struts，hibernate的项目，业务逻辑很难搞定。尽管对于这种问题，J2EE规范提出了解决方案（EJB），但仍旧没有一个合适的编程模型。</font></p>
            <p><font face=Verdana>　　Spring</font></p>
            <p><font face=Verdana>　　J2EE框架被大规模地运用到项目中，而项目总要负责这些框架以及自己业务代码的连接，使之真正融合到一起。Spring就是专注于这个问题的，它和Hibernate融合的很好。</font></p>
            <p><font face=Verdana>　　本质上讲，Spring是IOC(Inversion of Control)和面向切面编程(AOP)的组合体。它是一个非侵入式的框架，增强了POJO的功能。从服务上讲(With a service abstraction)，它将程序代码从J2EE环境解耦到普通的java对象（自然，这些代码可以脱离J2EE而在多种环境中运行）。它还在很多功能上提供了除EJB之外的选择――比如为所有的POJO提供声明式事务。Spring被广泛运用到很多项目中，从小的web程序到大的企业应用程序。</font></p>
            <p><font face=Verdana>　　在这个领域还有其他的产品，比如HiveMind和NamoContainer。前者和Spring的思想大致相同，只不过在IOC上有较大差异；后者将很多服务融合在PicoContainer的IOC容器中。这些产品的实现方式和J2EE的不同在于，它们都很轻便。</font></p>
            <p><font face=Verdana>　　在有J2EE API下做测试是非常困难的，这些容器将POJO从J2EE API中脱离出来，从而大大降低了测试的难度。测试一个普通的java对象，不用象测试J2EE程序那样，得先将应用程序部署到服务器上，要不就得自己动手模拟J2EE环境。提供日益流行的测试驱动的开发环境（对于开发者来说这是应得的），是这些轻量容器流行的关键因素。</font></p>
            <p><font face=Verdana>　　下一个将会是谁？</font></p>
            <p><font face=Verdana>　　人们日益对开源框架的重视，使得很多项目的成本大大降低，并且投放使用以及维护速度都增加了。现在的开源框架都有很高的质量，都提供了很好的文档＆一些书籍让开发者做参考。即便如此，两大因素是的J2EE领域充满了不确定性：开源领域和J2EE&#8220;标准&#8221;的冲突和AOP的日益重要。</font></p>
            <p><font face=Verdana>　　开源和标准之间的冲突表现在两个地方。一个是表现层，JSF的身后有Sun公司和其他的一些大公司，而在这个领域有Struts等开源产品与之竞争。在中间层，EJB 3.0采用J2SE5.0的annotations实现了依赖注入(dependency injection)的功能，但这个功能只是Spring的一个子集</font></p>
            <p><font face=Verdana>　　在这两个领域，开源产品都更加革新。JSP借鉴了ASP.NET，而Tapestry则采用了WebObjects的思想。</font></p>
            <p><font face=Verdana>　　同样的，不知道EJB3.0为何要尝试着标准化依赖注入，即使这样会使之不可避免地丧失很多功能。 EJB 3.0好像也要进入程序编写领域，而J2EE规范在这方面还没有涉足。</font></p>
            <p><font face=Verdana>　　于此同时，AOP的重要性在J2EE社区猛增，在使用上，AOP也越来越受到开发者的青睐。像Spring、dynaop等被称作&#8220;带着双拐的AOP&#8221;实现提升了AOP的知名度。而纯粹的AOP技术比如AspectJ，在将来的几年也会流行起来。</font></p>
            <p><font face=Verdana>　　其次，JBoss通过JCP和EJB3.0保持一致，它极大地推动了AOP技术。但即使如此，JCP 还没有转向AOP迹象。</font></p>
            <p><font face=Verdana>　　下一代的J2EE规范将拥抱更简单的POJO编程模型，就像Spring和Hibernate做的一样。J2EE开发者也注定要从&#8220;欺诈客户&#8221;转到以自己的编程经验开发上来。这次改变将受到大多数人的欢迎，不像以前那样每一个新规范发布后，最终都没有能很好的实现。</font></p>
            </div>
            </span></td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/jesson2005/aggbug/115546.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jesson2005/" target="_blank">张金鹏</a> 2007-05-06 12:47 <a href="http://www.blogjava.net/jesson2005/articles/115546.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2EE体系结构</title><link>http://www.blogjava.net/jesson2005/articles/115545.html</link><dc:creator>张金鹏</dc:creator><author>张金鹏</author><pubDate>Sun, 06 May 2007 04:44:00 GMT</pubDate><guid>http://www.blogjava.net/jesson2005/articles/115545.html</guid><wfw:comment>http://www.blogjava.net/jesson2005/comments/115545.html</wfw:comment><comments>http://www.blogjava.net/jesson2005/articles/115545.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jesson2005/comments/commentRss/115545.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jesson2005/services/trackbacks/115545.html</trackback:ping><description><![CDATA[<table cellSpacing=0 cellPadding=0 width="98%" align=center border=0>
    <tbody>
        <tr>
            <td align=middle colSpan=2 height=40>
            <h1>J2EE体系结构</h1>
            </td>
        </tr>
        <tr align=middle>
            <td colSpan=2 height=40>
            <script type=text/javascript><!--
            google_ad_client = "pub-8263014661871932";
            google_ad_width = 468;
            google_ad_height = 60;
            google_ad_format = "468x60_as";
            google_ad_type = "text_image";
            //2007-02-14: 新闻内容页面上面
            google_ad_channel = "8423241514";
            google_color_border = "FFFFFF";
            google_color_bg = "FFFFFF";
            google_color_link = "333333";
            google_color_text = "333333";
            google_color_url = "003366";
            //--></script>
            <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript>
            </script>
            </td>
        </tr>
        <tr>
            <td colSpan=2 height=40>&nbsp;</td>
        </tr>
        <tr>
            <td colSpan=2><span class=STYLE2>
            <div id=article>
            <p><font face=Verdana>与.NET平台相比，Sun公司的标准定义的J2EE体系结构有很少可以讨论的空间，因为就没有什么可讨论的。如果一个人注意某个具体开发商的产品，如IBM公司的WebSphere，那么就会看到其技术的最大的一部分是WebSphere专用的。比较所有开发商对J2EE的具体改进，已经超出了本文的范围，在我的经验中，大多数对J2EE作为一个平台感兴趣的公司对该标准的可移值性感兴趣。任何对可移值性感兴趣的人都会需要将他们自己局限于Sun公司所定义的标准。<br>J2EE体系结构可以被分为5部分：</font></p>
            <p><font face=Verdana>Java语言系统</font></p>
            <p><font face=Verdana>客户端程序设计模型</font></p>
            <p><font face=Verdana>中间层基础结构</font></p>
            <p><font face=Verdana>程序员企业级API</font></p>
            <p><font face=Verdana>非程序员可见API</font></p>
            <p><font face=Verdana>最后一部分，非程序员可见API，包括定义了如何将其他产品插入到J2EE中的API，如连接器API，以及J2EE模型中被最近的改进有效替代的API，如JTA（Java Transaction API）。由于从比较微软和Sun公司计划的角度来说，非程序员可见API并不重要，因此在笔者的概述中将不涉及这些方面 (就如同笔者在.NET平台概述中并没有涉及功能相当的API一样)。</font></p>
            <p><font face=Verdana>Java语言系统</font></p>
            <p><font face=Verdana>在高层次上，Java语言系统看起来与.NET Framework类似。在这两种情况中，源代码都是被翻译成一种中间语言。但是，在.NET平台中，这种中间语言是MSIL，而在Java系统中，是Java Byte Code。在这两种情况中，中间语言被带入到运行环境中。在Framework中，运行环境是Common Language Runtime。对于Java，运行环境是Java虚拟机（Java Virtual Machine）。总体而言，Common Language Runtime和Java虚拟机有类似的功能，并且在技术进步方面，都无可置疑地在发展和彼此交互跃进。</font></p>
            <p><font face=Verdana>这两种系统之间最重要的区别与源代码到中间语言的翻译有关。在.NET平台中，中间语言设计用来适应各种语言的需求。在Java中，中间语言设计用来满足Java的需求。虽然从理论上，从除Java外的语言生成Java Byte Code是可能的，但是实际上这还没有在任何一种商业产品中证明。</font></p>
            <p><font face=Verdana>客户端程序设计模型</font></p>
            <p><font face=Verdana>J2EE客户端程序设计模型重点集中在与浏览器的交互上。客户端程序设计模型有3部分：Java Applets，Java Servlets和Java Server Pages。</font></p>
            <p><font face=Verdana>Java Applets用来对在浏览器内运行的Java代码进行打包。在.NET平台空间中，这在功能上与ActiveX相当。在笔者的经验中，applets或ActiveX组件使用的相对较少。电子商务体系结构一般都是以向表示层发出请求的浏览器为基础，然后表示层使用HTML页面进行响应。这种系统并没有使用ActiveX或Java Applets，因此笔者在本白皮书中并没有讨论这些技术的任何一种。</font></p>
            <p><font face=Verdana>处理HTTP请求和HTML响应的重要技术是Java Servlets 和Java Server Pages 。这两种技术与微软空间中的ASP.NET（Active Server Pages）类似。</font></p>
            <p><font face=Verdana>.NET平台与Java表示层中间的主要区别在于处理不同的客户端功能的方式。Java表示层沿用了以前的Microsoft ASP (pre .NET)模型，它使得表示层程序员的责任是决定最终的目的浏览器（或其他瘦客户端系统），瘦客户端系统的功能，以及如何生成HTML来充分发挥瘦客户端系统的优势。</font></p>
            <p><font face=Verdana>中间层基础结构</font></p>
            <p><font face=Verdana>对于J2EE，中间层基础结构是Enterprise Java Beans (EJB)。该规范的当前版本是2.0，可以从网上获得 。与J2EE相当的.NET平台是COM+。</font></p>
            <p><font face=Verdana>在EJB和COM+之间，体系结构的差别非常少。这两种体系结构本质上是从MTS（Microsoft Transaction Server）派生出来的，是由微软公司在1996年引入的最初的面向组件的中间层基础结构。由MTS最先引入，然后合并到EJB和COM+中的重要想法包括：</font></p>
            <p><font face=Verdana>通过组件示例的共享所实现的高可伸缩性</font></p>
            <p><font face=Verdana>以中间层为中心的安全性</font></p>
            <p><font face=Verdana>自动事务处理边界管理</font></p>
            <p><font face=Verdana>EJB加入了一种新的体系结构想法，一项自动管理组件状态的技术。这项技术被称为entity beans（实体豆）。虽然这种想法具有吸引力，但是当前的实施却依赖于独立于数据库缓存的中间层数据缓存。很不幸的是，在这两种缓存之间没有保持一致性的机制。这意味着对实体豆的任何使用都会带来数据库损坏的高风险。在缓存一致性问题解决之前，在最佳试验技术方面，必须得不断考虑实体豆技术。</font></p>
            <p><font face=Verdana>要连接EJB和COM+的深入比较，请参阅笔者最近的著作 。</font></p>
            <p><font face=Verdana>程序员企业级API</font></p>
            <p><font face=Verdana>我们调用Java Enterprise API 时的最重要部分如下：</font></p>
            <p><font face=Verdana>Java Database Connection (JDBC，Java数据库连接) 2.0 ?C 是用于从Java中访问关系型数据库的API 。这与.NET平台空间中的ADO.NET相当。</font></p>
            <p><font face=Verdana>Java Naming and Directory Interface (JNDI，Java命名与目录接口) ?C 是用于从Java中访问企业名称与目录服务的信息的API 。这与.NET平台空间中的Active Directory Services Interface (ADSI，活动目录服务接口)有点类似。</font></p>
            <p><font face=Verdana>Java Message Service (JMS，Java消息服务) 1.0 ?C 是用于异步工作流的Java API 。这在功能上与Microsoft Message Queue API相当，这个API已经被排队组件所替代。</font></p>
            </div>
            </span></td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/jesson2005/aggbug/115545.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jesson2005/" target="_blank">张金鹏</a> 2007-05-06 12:44 <a href="http://www.blogjava.net/jesson2005/articles/115545.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2EE层次设计架构实例分析详解</title><link>http://www.blogjava.net/jesson2005/articles/115544.html</link><dc:creator>张金鹏</dc:creator><author>张金鹏</author><pubDate>Sun, 06 May 2007 04:43:00 GMT</pubDate><guid>http://www.blogjava.net/jesson2005/articles/115544.html</guid><wfw:comment>http://www.blogjava.net/jesson2005/comments/115544.html</wfw:comment><comments>http://www.blogjava.net/jesson2005/articles/115544.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jesson2005/comments/commentRss/115544.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jesson2005/services/trackbacks/115544.html</trackback:ping><description><![CDATA[<table cellSpacing=0 cellPadding=0 width="98%" align=center border=0>
    <tbody>
        <tr>
            <td align=middle colSpan=2 height=40>
            <h1>J2EE层次设计架构实例分析详解</h1>
            </td>
        </tr>
        <tr align=middle>
            <td colSpan=2 height=40>
            <script type=text/javascript><!--
            google_ad_client = "pub-8263014661871932";
            google_ad_width = 468;
            google_ad_height = 60;
            google_ad_format = "468x60_as";
            google_ad_type = "text_image";
            //2007-02-14: 新闻内容页面上面
            google_ad_channel = "8423241514";
            google_color_border = "FFFFFF";
            google_color_bg = "FFFFFF";
            google_color_link = "333333";
            google_color_text = "333333";
            google_color_url = "003366";
            //--></script>
            <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript>
            </script>
            </td>
        </tr>
        <tr>
            <td colSpan=2 height=40></td>
        </tr>
        <tr>
            <td colSpan=2><span class=STYLE2>
            <div id=article>
            <p><font face=Verdana>Part 1 层 　　 <br>　　层（layer）这个概念在计算机领域是非常了不得的一个概念。计算机本身就体现了一种层的概念：系统调用层、设备驱动层、操作系统层、CPU指令集。每个层都负责自己的职责。网络同样也是层的概念，最著名的OSI的七层协议。 <br>　　 <br>　　层到了软件领域也一样好用。为什么呢？我们看看使用层技术有什么好处： <br>　　 <br>　　● 你使用层，但是不需要去了解层的实现细节。 <br>　　● 可以使用另一种技术来改变基础的层，而不会影响上面的层的应用。 <br>　　● 可以减少不同层之间的依赖。 <br>　　● 容易制定出层标准。 <br>　　● 底下的层可以用来建立顶上的层的多项服务。 当然，层也有弱点： <br>　　● 层不可能封装所有的功能，一旦有功能变动，势必要波及所有的层。 <br>　　● 效率降低。 <br>　　 <br>　　当然，层最难的一个问题还是各个层都有些什么，以及要承担何种责任。 <br>　　 <br>　　典型的三层结构 <br>　　 <br>　　三层结构估计大家都很熟悉了。就是表示（presentation）层, 领域（domain）层, 以及基础架构（infrastructure）层。 <br>　　 <br>　　表示层逻辑主要处理用户和软件的交互。现在最流行的莫过于视窗图形界面（wimp）和基于html的界面了。表示层的主要职责就是为用户提供信息，以及把用户的指令翻译。传送给业务层和基础架构层。 基础架构层逻辑包括处理和其他系统的通信，代表系统执行任务。例如数据库系统交互，和其他应用系统的交互等。大多数的信息系统，这个层的最大的逻辑就是存储持久数据。 <br>　　 <br>　　还有一个就是领域层逻辑，有时也被叫做业务逻辑。它包括输入和存储数据的计算。验证表示层来的数据，根据表示层的指令指派一个基础架构层逻辑。 <br>　　 <br>　　领域逻辑中，人们总是搞不清楚什么事领域逻辑，什么是其它逻辑。例如，一个销售系统中有这样一个逻辑：如果本月销售量比上个月增长10％，就要用红色标记。要实现这个功能，你可能会把逻辑放在表示层中，比较两个月的数字，如果超出10％，就标记为红色。 <br>　　 <br>　　这样做，你就把领域逻辑放到了表示层中了。要分离这两个层，你应该现在领域层中提供一个方法，用来比较销售数字的增长。这个方法比较两个月的数字，并返回boolean类型。表示层则简单的调用该方法，如果返回true，则标记为红色。 <br>　　 <br>　　例子 <br>　　 <br>　　层技术不存在说永恒的技巧。如何使用都要看具体的情况才能够决定，下面我就列出了三个例子： <br>　　 <br>　　例子1：一个电子商务系统。要求能够同时处理大量用户的请求，用户的范围遍及全球，而且数字还在不断增长。但是领域逻辑很简单，无非是订单的处理，以 及和库存系统的连接部分。这就要求我们1、表示层要友好，能够适应最广泛的用户，因此采用html技术；2、支持分布式的处理，以胜任同时几千的访问； 3、考虑未来的升级。 <br>　　 <br>　　例子2：一个租借系统。系统的用户少的多，但是领域逻辑很复杂。这就要求我们制作一个领域逻辑非常复杂的系统，另外，还要给他们的用户提供一个方便的输入界面。这样，wimp是一个不错的选择。 <br>　　 <br>　　例子3：简单的系统。非常简单，用户少、逻辑少。但是也不是没有问题，简单意味着要快速交付，并且还要充分考虑日后的升级。因为需求在不断的增加之中。 <br>　　 <br>　　何时分层 <br>　　 <br>　　这样的三个例子，就要求我们不能够一概而论的解决问题，而是应该针对问题的具体情况制定具体的解决方法。这三个例子比较典型。 <br>　　 <br>　　第二个例子中，可能需要严格的分成三个层次，而且可能还要加上另外的中介（mediating）层。例3则不需要，如果你要做的仅是查看数据，那仅需要几个server页面来放置所有的逻辑就可以了。 <br>　　 <br>　　我一般会把表示层和领域层/基础架构层分开。除非领域层/基础架构层非常的简单，而我又可以使用工具来轻易的绑定这些层。这种两层架构的最好的例子就 是在VB、PB的环境中，很容易就可以构建出一个基于SQL数据库的windows界面的系统。这样的表示层和基础架构层非常的一致，但是一旦验证和计算 变得复杂起来，这种方式就存在先天缺陷了。 <br>　　 <br>　　很多时候，领域层和基础架构层看起来非常类似，这时候，其实是可以把它们放在一起的。可是，当领域层的业务逻辑和基础架构层的组织方式开始不同的时候，你就需要分开二者。 <br>　　 <br>　　更多的层模式 <br>　　 <br>　　三层的架构是最为通用的，尤其是对IS系统。其它的架构也有，但是并不适用于任何情况。 <br>　　 <br>　　第一种是Brown model [Brown et al]。它有五个层：表示层（Presentation），控制/中介层（Controller/Mediator），领域层（Domain）, 数据映射层（Data Mapping）, 和数据源层（Data Source）。它其实就是在三层架构种增加了两个中间层。控制/中介层位于表示层和领域层之间，数据映射层位于领域层和基础架构层之间。 <br>　　 <br>　　表示层和领域层的中介层，我们通常称之为表示-领域中介层，是一个常用的分层方法，通常针对一些非可视的控件。例如为特定的表示层组织信息格式，在不 同的窗口间导航，处理交易边界，提供Server的facade接口（具体实现原理见设计模式）。最大的危险就是，一些领域逻辑被放到这个层里，影响到其 它的表示层。 <br>　　 <br>　　我常常发现把行为分配给表示层是有好处的。这可以简化问题。但表示层模型会比较复杂，所以，把这些行为放到非可视化的对象中，并提取出一个表示-领域中介层还是值得的。 <br>　　 <br>　　Brown ISA <br>　　表示层 表示层 <br>　　控制/中介层 表示-领域中介层 <br>　　领域层 领域层 <br>　　数据映射层 数据库交互模式中的Database Mapper <br>　　数据源层 基础架构层 <br>　　 <br>　　领域层和基础架构层之间的中介层属于本书中提到的Database Mapper模式，是三种领域层到数据连接的办法之一。和表示-领域中介层一眼，有时候有用，但不是所有时候都有用。 <br>　　 <br>　　还有一个好的分层架构是J2EE的架构，这方面的讨论可以见『J2EE核心模式』一书。他的分层是客户层（Client），表示层（Presentation），业务层（Business ），整合层（Integration），资源层（Resource）。差别如下图： <br>　　 <br>　　J2EE核心 ISA <br>　　客户层 运行在客户机上的表示层 <br>　　表示层 运行在服务器上的表示层 <br>　　业务层 领域层 <br>　　整合层 基础架构层 <br>　　资源层 基础架构层通信的外部数据 <br>　　 <br>　　微软的DNA架构定义了三个层：表示层（presentation），业务层（business），和数据存储层（data access），这和我的架构相似，但是在数据的传递方式上还有很大的不同。在微软的DNA中，各层的操作都基于数据存储层传出的SQL查询结果集。这样的话，实际上是增加了表示层和业务层同数据存储层之间的耦合度。 DNA的记录集在层之间的动作类似于Data Transfer Object。转贴于 265考试网&nbsp; </font></p>
            <p><font face=Verdana>Part 2 组织领域逻辑 <br>　　 <br>　　要组织基于层的系统，首要的是如何组织领域逻辑。领域逻辑的组织有好几种模式。但其中最重要的莫过于两种方法：Transation Script和Domain Model。选定了其中的一种，其它的都容易决定。不过，这两者之间并没有一条明显的分界线。所以如何选取也是门大学问。一般来说，我们认为领域逻辑比较复杂的系统可以采用Domain Model。 <br>　　 <br>　　Transation Script就是对表示层用户输入的处理程序。包括验证和计算，存储，调用其它系统的操作，把数据回传给表示层。用户的一个动作表示一个程序，这个程序可 以是script，也可以是transation，也可以是几个子程序。在例子1中，检验，在购物车中增加一本书，显示递送状态，都可以是一个 Transation Script。 <br>　　 <br>　　Domain Model是要建立对应领域名词的模型，例如例1中的书、购物车等。检验、计算等处理都放到领域模型中。 <br>　　 <br>　　Transation Script属于结构性思维，Domain Model属于OO思维。Domain Model比较难使用，一旦习惯，你能够组织更复杂的逻辑，你的思想会更OO。到时候，即使是小的系统，你也会自然的使用Domain Model了。 <br>　　 <br>　　但如何抉择呢？如果逻辑复杂，那肯定用Domain Model：如果只需要存取数据库，那Transation Script会好一些。但是需求是在不断进化的，你很难保证以后的需求还会如此简单。如果你的团队不善于使用Domain Model，那你需要权衡一下投入产出比。另外，即使是Transation Script，也可以做到把逻辑和基础架构分开，你可以使用Gateway。 <br>　　 <br>　　对例2，毫无疑问要使用Domain Model。对例1就需要权衡了。而对于例3，你很难说它将来会不会像例2那样，你现在可以使用Transation Script，但未来你可能要使用Domain Model。所以说，架构的决策是至关紧要的。 <br>　　 <br>　　除了这两种模式，还有其它中庸的模式。Use Case Controller就是处于两者之间。只有和单个的用例相关的业务逻辑才放到对象中。所以大致上他们还是在使用Transation Script，而Domain Model只是Database Gateway的一组集合而已。我不太用这种模式。 <br>　　 <br>　　Table Module是另一个中庸模式。很多的GUI环境依托于SQL查询的返回结果。你可以建立内存中的对象，来把GUI和数据库分开来。为每个表写一个模块，因此每一行都需要关键字变量来识别每一个实例。 <br>　　 <br>　　Table Module适用于很多的组件构建于一个通用关系型数据库之上，而且领域逻辑不太复杂的情况。Microsoft COM 环境，以及它的带ADO.NET的.NET环境都适合使用这种模式。而对于Java，就不太适用了。 <br>　　 <br>　　领域逻辑的一个问题是领域对象非常的臃肿。因为对象的行为太多了，类也就太大了。它必须是一个超集。这就要考虑哪些行为是通用的，哪些不是，可以由其它的类来处理，可能是Use Case Controller，也可能是表示层。 <br>　　 <br>　　还有一个问题，复制。他会导致复杂和不一致。这比臃肿的危害更大。所以，宁可臃肿，也不要复制。等到臃肿为害时再处理它吧。 <br>　　 <br>　　选择一个地方运行领域逻辑 <br>　　 <br>　　我们的精力集中在逻辑层上。领域逻辑要么运行在Client上，要么运行在Server上。 <br>　　 <br>　　比较简单的做法是全部集中在Server上。这样你需要使用html的前端以及web server。这样做的好处是升级和维护都非常的简单，你也不用考虑桌面平台和Server的同步问题，也不用考虑桌面平台的其它软件的兼容问题。 <br>　　 <br>　　运行在Client适合于要求快速反应和没有联网的情况。在Server端的逻辑，用户的一个再小的请求，也需要信息从Client到Server绕一圈。反应的速度必然慢。再说，网络的覆盖程度也不是说达到了100％。 <br>　　 <br>　　对于各个层来说，又是怎么样的呢？ <br>　　 <br>　　基础架构层：一般都是在Server啦，不过有时候也会把数据复制到合适的高性能桌面机，但这是就要考虑同步的问题了。 <br>　　 <br>　　表示层在何处运行取决于用户界面的设计。一个Windows界面只能在Client运行。而一个Web界面就是在Server运行。也有特别的例子，在桌面机上运行web server的，例如X Server。但这种情况少的多。 <br>　　 <br>　　在例1中，没有更多的选择了，只能选在Server端。因此你的每一个bit都会绕一个大圈子。为了提高效率，尽量使用一些纯html脚本。 <br>　　 <br>　　人们选用Windows界面的原因主要就是需要执行一些非常复杂的任务，需要一个合适的应用程序，而web GUI则无法胜任。这就是例2的做法。不过，人们应该会渐渐适应web GUI，而web GUI的功能也会越来越强大。 <br>　　 <br>　　剩下的是领域逻辑。你可以全部放在Server，也可以全部放在Client，或是两边都放。 <br>　　 <br>　　如果是在Client端，你可以考虑全部逻辑都放在Client端，这样至少保证所有的逻辑都在一个地方。而把web server移至Client，是可以解决没有联网的问题，但对反应时间不会有多大的帮助。你还是可以把逻辑和表示层分离开来。当然，你需要额外的升级和维护的工作。 <br>　　 <br>　　在Client和Server端都具有逻辑并不是一个好的处理办法。但是对于那些仅有一些领域逻辑的情况是适用的。有一个小窍门，把那些和系统的其它部分没有联系的逻辑封装起来。 领域逻辑的接口 <br>　　 <br>　　你的Server上有一些领域逻辑，要和Client通信，你应该有什么样的接口呢？要么是一个http接口，要么是一个OO接口。 <br>　　 <br>　　http接口适用于web browser，就是说你要选择一个html的表示层。最近的新技术就是web service，通过基于http、特别是XML进行通信。XML有几个好处：通信量大，结构好，仅需一次的回路。这样远程调用的的开销就小了。同时，XML还是一个标准，支持平台异构。XML又是基于文本的，能够通过防火墙。 <br>　　 <br>　　虽然XML有那么多的好处，不过一个OO的接口还是有它的价值的。hhtp的接口不明显，不容易看清楚数据是如何处理的。而OO的接口的方法带有变量和名字，容易看出处理的过程。当然，它无法通过防火墙，但可以提供安全和事务之类的控制。 <br>　　 <br>　　最好的还是取二者所长。OO接口在下，http接口在上。但这样做就会使得实现机制非常的复杂。 <br>　　 <br>　　Part 3 组织web Server <br>　　 <br>　　很多使用html方式的人，并不能真正理解这种方式的优点。我们有各种各样好用的工具，但是却搞到让程序难以维护。 <br>　　 <br>　　在web server上组织程序的方式大致可以分为两种：脚本和server page。 <br>　　 <br>　　脚本方式就是一个程序，用函数和方法来处理http调用。例如CGI脚本和java servlet。它和普通的程序并没有什么两样。它从web页面上获得html string形态的数据，有时候还要做一些表达式匹配，这正是perl能够成为CGI脚本的常用语言的原因。而java servelet则是把这种分析留给程序员，但它允许程序员通过关键字接口来访问信息，这样就会少一些表达式的判断。这种格式的web server输出是另一种html string，称为response，可以通过流数据来操作。 <br>　　 <br>　　糟糕的是流数据是非常麻烦的，因此就导致了server page的产生，例如PHP，ASP，JSP。 <br>　　 <br>　　server page的方式适合回应（response）的处理比较简单的情况。例如&#8220;显示歌曲的明细&#8221;，但是你的决策取决于输入的时候，就会比较杂乱。例如&#8220;通俗和摇滚的显示格式不同&#8221;。 <br>　　 <br>　　脚步擅长于处理用户交互，server page擅长于处理格式化回应信息。所以很自然的就会采用脚本处理请求的交互，使用server page处理回应的格式化。这其实就是著名的MVC（Model View Controller）模式中的view/controller的处理。 <br>　　 <br>　　应用Model View Controller模式首要的一点就是模型要和web服务完全分离开来。使用Transaction Script或Domain Model模式来封装处理流程。 <br>　　 <br>　　接下来，我们就把剩余的模式归入两类模式中：属于Controller的模式，以及属于View的模式。 <br>　　 <br>　　View模式 <br>　　 <br>　　View这边有三种模式：Transform View，Template View和Two Step View。Transform View和Template View的处理只有一步，将领域数据转换为html。Two Step View要经过两步的处理，第一步把领域数据转换为逻辑表示形式，第二步把逻辑表示转换为html。 <br>　　 <br>　　两步处理的好处是可以将逻辑集中于一处，如果只有一步，变化发生时，你就需要修改每一个屏幕。但这需要你有一个很好的逻辑屏幕结构。如果一个web应用有很多的前端用户时，两步处理就特别的好用。例如航空订票系统。使用不同的第二步处理，就可以获得不同的逻辑屏幕。 <br>　　 <br>　　使用单步方法有两个可选的模式：Template View，Transform View。Template View其时就是把代码嵌入到html页面中，就像现在的server page技术，如ASP，PHP，JSP。这种模式灵活，强大，但显得杂乱无章。如果你能够把逻辑程序逻辑在页面结构之外进行很好的组织，这种模式还是有它的优点的。 <br>　　 <br>　　Transform View使用翻译方式。例如XSLT。如果你的领域数据是用XML处理的，那这种模式就特别的好用。 <br>　　 <br>　　Controller模式 <br>　　 <br>　　Controller有两种模式。一般我们会根据动作来决定一项控制。动作可能是一个按钮或链接。所这种模式就是Action Controller模式。 <br>　　 <br>　　Front Controller更进一步，它把http请求的处理和处理逻辑分离开来。一般是只有一个web handle来处理所有的请求。你的所有的http请求的处理都由一个对象来负责。你改变动作结构的影响就会降到最小。</font></p>
            </div>
            </span></td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/jesson2005/aggbug/115544.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jesson2005/" target="_blank">张金鹏</a> 2007-05-06 12:43 <a href="http://www.blogjava.net/jesson2005/articles/115544.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>当前流行的J2EE WEB应用架构分析</title><link>http://www.blogjava.net/jesson2005/articles/115543.html</link><dc:creator>张金鹏</dc:creator><author>张金鹏</author><pubDate>Sun, 06 May 2007 04:42:00 GMT</pubDate><guid>http://www.blogjava.net/jesson2005/articles/115543.html</guid><wfw:comment>http://www.blogjava.net/jesson2005/comments/115543.html</wfw:comment><comments>http://www.blogjava.net/jesson2005/articles/115543.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jesson2005/comments/commentRss/115543.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jesson2005/services/trackbacks/115543.html</trackback:ping><description><![CDATA[<table cellSpacing=0 cellPadding=0 width="98%" align=center border=0>
    <tbody>
        <tr>
            <td align=middle colSpan=2 height=40>
            <h1>当前流行的J2EE WEB应用架构分析</h1>
            </td>
        </tr>
        <tr align=middle>
            <td colSpan=2 height=40>
            <script type=text/javascript><!--
            google_ad_client = "pub-8263014661871932";
            google_ad_width = 468;
            google_ad_height = 60;
            google_ad_format = "468x60_as";
            google_ad_type = "text_image";
            //2007-02-14: 新闻内容页面上面
            google_ad_channel = "8423241514";
            google_color_border = "FFFFFF";
            google_color_bg = "FFFFFF";
            google_color_link = "333333";
            google_color_text = "333333";
            google_color_url = "003366";
            //--></script>
            <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript>
            </script>
            </td>
        </tr>
        <tr>
            <td colSpan=2 height=40></td>
        </tr>
        <tr>
            <td colSpan=2><span class=STYLE2>
            <div id=article><font face=Verdana>
            <p><font face=Verdana>1. 架构概述<br>J2EE体系包括java server pages(JSP) ,java SERVLET, enterprise bean，WEB service等技术。这些技术的出现给电子商务时代的WEB应用程序的开发提供了一个非常有竞争力的选择。怎样把这些技术组合起来形成一个适应项目需要的稳定架构是项目开发过程中一个非常重要的步骤。完成这个步骤可以形成一个主要里程碑基线。形成这个基线有很多好处：</font></p>
            <p><font face=Verdana>各种因数初步确定 <br>为了形成架构基线，架构设计师要对平台（体系）中的技术进行筛选，各种利弊的权衡。往往架构设计师在这个过程中要阅读大量的技术资料，听取项目组成员的建议，考虑领域专家的需求，考虑赞助商成本（包括开发成本和运行维护成本）限额。一旦架构设计经过评审，这些因数初步地就有了在整个项目过程中的对项目起多大作用的定位。</font></p>
            <p><font face=Verdana>定向技术培训<br>一旦架构师设计的架构得到了批准形成了基线，项目开发和运行所采用的技术基本确定下来了。众多的项目经理都会对预备项目组成员的技术功底感到担心；他们需要培训部门提供培训，但就架构师面对的技术海洋，项目经理根本就提不出明确的技术培训需求。怎不能够对体系中所有技术都进行培训吧！有了架构里程碑基线，项目经理能确定这个项目开发会采用什么技术，这是提出培训需求应该是最精确的。不过在实际项目开发中，技术培训可以在基线确定之前与架构设计并发进行。&nbsp; </font></p>
            <p><font face=Verdana>角色分工<br>有了一个好的架构蓝图，我们就能准确划分工作。如网页设计，JSP 标签处理类设计，SERVLET 设计，session bean设计，还有各种实现。这些任务在架构蓝图上都可以清晰地标出位置，使得项目组成员能很好地定位自己的任务。一个好的架构蓝图同时也能规范化任务，能很好地把任务划分为几类，在同一类中的任务的工作量和性质相同或相似。这样工作量估计起来有一个非常好的基础。&nbsp; </font></p>
            <p><font face=Verdana>运行维护<br>前面说过各个任务在架构图上都有比较好的定位。任何人能借助它很快地熟悉整个项目的运行情况，错误出现时能比较快速地定位错误点。另外，有了清晰的架构图，项目版本管理也有很好的版本树躯干。&nbsp; </font></p>
            <p><font face=Verdana>扩展性<br>架构犹如一颗参天大树的躯干，只要躯干根系牢，树干粗，长一些旁支，加一些树叶轻而易举无疑。同样，有一个稳定的经得起考验的架构，增加一两个业务组件是非常快速和容易的。&nbsp; </font></p>
            <p><font face=Verdana>大家都知道这些好处，一心想形成一个这样的J2EE应用程序架构（就像在windows平台中的MFC）。在这个路程中经历了两个大的阶段：</font></p>
            <p><font face=Verdana>1.1. 模型1 </font></p>
            <p><font face=Verdana>模型1其实不是一个什么稳定架构，甚至谈不上形成了架构。模型1的基础是JSP文件。它从HTTP的请求中提取参数，调用相应的业务逻辑，处理HTTP会话，最后生成HTTP文档。一系列这样的JSP文件形成一个完整的模型1应用，当然可能会有其他辅助类或文件。早期的ASP 和 PHP 技术就属于这个情况。</font></p>
            <p><font face=Verdana>总的看来，这个模型的好处是简单，但是它把业务逻辑和表现混在一块，对大应用来说，这个缺点是令人容忍不了的。</font></p>
            <p><font face=Verdana>1.2. 模型2<br>在经过一番实践，并广泛借鉴和总结经验教训之后，J2EE应用程序终于迎来了MVC（模型-视图-控制）模式。MVC模式并不是J2EE行业人士标新立异的，所以前面我谈到广发借鉴。MVC的核心就是做到三层甚至多层的松散耦合。这对基于组件的，所覆盖的技术不断膨胀的J2EE体系来说真是福音和救星。 </font></p>
            <p><font face=Verdana>它在浏览器（本文对客户代理都称浏览器）和JSP或SERVLET之间插入一个控制组件。这个控制组件集中了处理浏览器发过来的HTTP请求的分发逻辑，也就是说，它会根据HTTP请求的URL,输入参数，和目前应用的内部状态，把请求分发给相应的WEB 层的JSP 或SERVLET。另外它也负责选择下一个视图（在J2EE中，JSP,SERVLET会生成回给浏览器的html从而形成视图）。集中的控制组件也有利于安全验证，日志纪录，有时也封装请求数据给下面的WEB tier层。这一套逻辑的实现形成了一个像MFC的应用框架，</font></p>
            <p><font face=Verdana>1.3. 多层应用&nbsp; </font></p>
            <p><font face=Verdana>Client tier客户层 <br>一般为浏览器或其他应用。客户层普遍地支持HTTP协议，也称客户代理。</font></p>
            <p><font face=Verdana>WEB tier WEB应用层<br>在J2EE中，这一层由WEB 容器运行，它包括JSP, SERVLET等WEB部件。&nbsp; </font></p>
            <p><font face=Verdana>EJB tier 企业组件层<br>企业组件层由EJB容器运行，支持EJB, JMS, JTA 等服务和技术。&nbsp; </font></p>
            <p><font face=Verdana>EIS tier 企业信息系统层<br>企业信息系统包含企业内传统信息系统如财务，CRM等，特点是有数据库系统的支持。</font></p>
            <p><font face=Verdana>应用框架目前主要集中在WEB层，旨在规范这一层软件的开发。其实企业组件层也可以实现这个模型，但目前主要以设计模式的形式存在。而且有些框架可以扩充，有了企业组件层组件的参与，框架会显得更紧凑，更自然，效率会更高</font></p>
            <p><font face=Verdana>2. 候选方案<br>目前，实现模型2的框架也在不断的涌现，下面列出比较有名的框架。</font></p>
            <p><font face=Verdana>2.1. Apache Struts <br>Struts是一个免费的开源的WEB层的应用框架，apache软件基金致力于struts的开发。Struts具是高可配置的性，和有一个不断增长的特性列表。一个前端控制组件，一系列动作类，动作映射，处理XML的实用工具类，服务器端java bean 的自动填充，支持验证的WEB 表单，国际化支持，生成HTML，实现表现逻辑和模版组成了struts的灵魂。</font></p>
            <p><font face=Verdana>2.1.1. Struts和MVC<br>模型2的目的和MVC的目的是一样的，所以模型2基本可以和MVC等同起来。下图体现了Struts的运作机理：</font></p>
            <p><font face=Verdana>2.1.1.1. 控制<br>如图所示，它的主要部件是一个通用的控制组件。这个控制组件提供了处理所有发送到Struts 的HTTP请求的入口点。它截取和分发这些请求到相应的动作类（这些动作类都是Action类的子类）。另外控制组件也负责用相应的请求参数填充 From bean,并传给动作类。动作类实现核心商业逻辑，它可以通过访问java bean 或调用EJB。最后动作类把控制权传给后续的JSP 文件，后者生成视图。所有这些控制逻辑利用一个叫struts-config.xml文件来配置。</font></p>
            <p><font face=Verdana>2.1.1.2. 模型<br>模型以一个或几个java bean的形式存在。这些bean分为三种：</font></p>
            <p><font face=Verdana>Form beans(表单Beans)<br>它保存了HTTP post请求传来的数据，在Struts里，所有的Form beans都是 ActionFrom 类的子类。&nbsp; </font></p>
            <p><font face=Verdana>业务逻辑beans <br>专门用来处理业务逻辑。</font></p>
            <p><font face=Verdana>系统状态beans <br>它保存了跨越多个HTTP 请求的单个客户的会话信息，还有系统状态。&nbsp; </font></p>
            <p><font face=Verdana>2.1.1.3. 视图<br>控制组件续传HTTP请求给实现了视图的JSP文件。JSP能访问beans 并生成结果文档反馈到客户。Struts提供JSP 标签库： Html，Bean，Logic，Template等来达到这个目的，并有利于分开表现逻辑和程序逻辑。</font></p>
            <p><font face=Verdana>2.1.2. Struts的细节分析</font></p>
            <p><font face=Verdana>2.1.2.1. 视图-控制-模型<br>用户发出一个*.do的HTTP请求，控制组件接收到这个请求后，查找针对这个请求的动作映射，再检查是否曾创建过相应的动作对象（action实例），如果没有则调用actionmapping生成一个动作对象，控制组件会保存这个动作对象供以后使用。接着调用actionmapping的方法得到actionForm对象。之后把actionForm作为参数传给动作对象的perform方法，这个方法结束之后会返回给控制组件一个 actionforward对象。控制组件接着从这个对象中获取下一个视图的路径和重定向属性。如果为重定向则调用HTTPSERVLETREPONSE的方法来显示下一个视图，否则相继调用requestdispatcher, SERVLETcontext的方法续传HTTP请求到下一个视图。</font></p>
            <p><font face=Verdana>当动作对象运行perform方法时，可能出现错误信息。动作对象可以保存这些错误信息到一个error对象中，接着调用自身的saveerrors方法把这个错误保存到request对象的属性中。接着动作对象调用actionmapping对象的getInput方法从动作映射中获取input参数，也就是产生输入的视图，并以这个input为参数生成一个actionforward对象返回。这个input参数的JSP中一般有HTTP:errors定制标签读取这些错误信息并显示在页面上。</font></p>
            <p><font face=Verdana>2.1.2.2. 模型到视图</font></p>
            <p><font face=Verdana>模型到视图指视图在显示之前装载系统数据到视图的过程。系统数据一般为模型内java bean的信息。示意图表现了由控制组件forward过来的有html:form定制标签的JSP 的处理逻辑。</font></p>
            <p><font face=Verdana>html:form定制标签处理对象从application scope（通过查询SERVLETCONTEXT对象的属性来实现）获取先前由控制组件actionSERVLET放在那里的动作映射等对象，由html:form 的action属性查得actionform名字、类型和范围等信息，在相应的范围内查找actionform，如果有则利用它的信息填充html form表单[实际填充动作在嵌套的html:text等定制标签的处理对象中]。否则在相应范围内创建一个actionform 对象。</font></p>
            <p><font face=Verdana>2.1.3. 优缺点</font></p>
            <p><font face=Verdana>优点<br>一些开发商开始采用并推广这个框架<br>作为开源项目，有很多先进的实现思想<br>对大型的应用支持的较好<br>有集中的网页导航定义</font></p>
            <p><font face=Verdana>缺点<br>不是业届标准<br>对开发工具的支持不够<br>复杂的taglib，需要比较长的时间来掌握<br>html form 和 actionform的搭配比较封闭，但这也是它的精华所在。</font></p>
            <p><font face=Verdana>修改建议<br>把actionform属性的设置器和访问器修改成读取或生成xml文档的方法，然后 html form和actionform之间用xml文档进行数据交换，使之松散耦合，适应数据结构易变化的应用。</font></p>
            <p><font face=Verdana>2.2. JATO<br>JATO应用程序框架是iPlanet 应用程序框架的旧名。它是一个成熟的、强大的，基于J2EE标准的面向于开发WEB应用程序的应用框架。结合了显示字段、应用程序事件、组件层次和以页面为中心的开发方法、以及MVC和服务到工作者service-to-workers的设计模式等概念。JATO可适用于中、大、超大规模的WEB应用。但是它也不是一个企业层的应用框架，也就是说它不会直接提供创建EJB, WEB services等企业层组件的方法，但用它可以构造出访问企业层组件的客户应用。</font></p>
            <p><font face=Verdana>这个框架功能主要有三部分组成：<br>iPlanet应用框架核心；<br>iPlanet应用框架组件；<br>iPlanet应用框架扩展。</font></p>
            <p><font face=Verdana>应用框架核心定义了基本接口、对象协议、简单组件，以及iPlanet应用框架程序的最小核心。包括视图简单组件、模型简单组件、请求分发组件和可重用命令对象。iPlanet应用框架组件利用框架核心定义的基本接口、协议和组件向开发者提供高层的重用组件，这些组件既有与特定视觉效果无关的水平组件，同时也有适应特定实用环境、提高可用性而特意提供的垂直型组件。框架扩展实现了用框架相容的方法访问非J2EE环境的方法。通常情况下，扩展被框架应用程序用来无缝访问J2EE容器特定功能。JATO平台栈图很清楚地表达了这个情况</font></p>
            <p><font face=Verdana>JATO最大的威力在：对于快速开发用户，你能利用框架组件和扩展提高生产率，对于要求更大灵活性的用户，你能实现框架核心提供的接口来保持应用的框架兼容性。</font></p>
            <p><font face=Verdana>此图表示实现一个JATO应用程序，可以简单地实现控制组件module1Servlet，视图组件ListCustomersViewBean和模型组件CustomersModuleImpl，以及一个给客户代理显示界面的ListCustomers.jsp文件。并清楚地表明这些组件与JATO框架组件的继承关系。</font></p>
            <p><font face=Verdana>JATO标签库提供了VIEW对象与JSP文件的接口。库中标签处理程序负责实现VIEW对象和JSP产生地客户端文档的信息同步和交换。这个图清楚地表达了这种对应关系</font></p>
            <p><font face=Verdana>2.2.1. MVC分析<br>前端控制组件接收用户发来的任何请求，这个可在WEB.xml中指定请求分发组件负责视图管理和导航，和前端控制组件封装在ApplicationSERVLETBase一起实现。应用程序开发者需要为每一个子系统（人力资源，财务，CRM等）实现一个此类的继承。</font></p>
            <p><font face=Verdana>请求分发组件分发请求给工作者，工作者实现了command接口。应用开发者可以实现这个接口。JATO提供了一个缺省实现：DefaultRequestHandingCommand，这个实现会把请求传给视图组件的特定事件。</font></p>
            <p><font face=Verdana>组合视图是指视图组件在显示给用户时的层次关系：根视图是一个ViewBean类的对象字段是一个DisplayField类的对象，容器视图是一个ContainerView类的对象。</font></p>
            <p><font face=Verdana>2.2.2. 优缺点分析</font></p>
            <p><font face=Verdana>优点：<br>这种框架的适应范围大，即提供了底层接口，也有立即可用的组件<br>具有与客户端RAD开发工具相似的开发概念如页为中心（等同于VB的FORM），事件处理等.<br>对大型的应用支持较好</font></p>
            <p><font face=Verdana>缺点：&nbsp; <br>不是业届标准 <br>目前还没有开发工具的支持（然JATO已经为工具支持做好了准备）<br>没有定义网页导航，开发者在视图中自己指定具体的导航URL</font></p>
            <p><font face=Verdana>修改建议<br>把众多的VIEW/MODEL对应修改成xml文档传递数据，加上集中的网页导航定义 </font></p>
            <p><font face=Verdana>2.3. JSF(JavaServer Faces)<br>JSF是一个包括SUN在内的专家组正在定义的开发WEB应用用户界面的框架，JSF 技术包括：<br>一组API，它实现UI了组件，管理组件的状态，处理事件，输入校验，定义页面导航，支持国际化和访问；<br>一个JSP定制标签库实现与JSP的接口。 <br>JSF非常简单，是一个定义良好的编程模型。利用这个技术，开发者通过在页面内组合可重用的UI组件，在把这些组件和应用的数据源相连，路由客户产生的事件到服务器端的事件处理器进行编程。JSP处理了所有幕后的复杂工作，使得开发者把关注重点放在应用代码上。</font></p>
            <p><font face=Verdana>2.3.1. STRUTS、JATO和JSF比较 <br>它们之间有部分重叠，但重点不一样。<br>STRUTS和JATO都提供了一个MVC式的应用模型，而JSF只在用户界面上提供编程接口。这意味着前两者涉及的范围比后者广。JSF可以成为前两者在UI开发的部分。<br>JSF的规范的发布版将在 2002年底发布，实现可能要比这个时间晚些。另外将会有工具支持这个框架的应用开发。&nbsp; </font></p>
            <p><font face=Verdana>2.4. WAF</font></p>
            <p><font face=Verdana>WAF是WEB APPLICATION FRAMWORK的简称，是SUN蓝皮书例子程序中提出的应用框架。它实现了 MVC和其他良好的设计模式。</font></p>
            <p><font face=Verdana>2.4.1. 细节分析</font></p>
            <p><font face=Verdana>2.4.2. 视图-控制-模型 </font></p>
            <p><font face=Verdana>如图所示，开发人员编写的两个xml配置文件定义了WAF的运作参数。Screendefinition.xml定义了一系列的屏幕(screen)。Mapping.xml则定义了某个动作之后应该显示的屏幕，但没有指定屏幕到哪里拿数据。</font></p>
            <p><font face=Verdana>用户发出一个HTTP请求（*.screen），由TemplateSERVLET屏幕前端控制组件接收，它提取请求信息，设置request对象CurrentScreen属性，再把请求发到模版JSP。模版JSP收到请求后，JSP中的Template标签察看这个当前屏幕，并从屏幕定义文件（Screendefinition.xml）中获取这个屏幕的具体参数，再生成html返回给客户。</font></p>
            <p><font face=Verdana>假设返回给客户的html中包括了html表单，用户在输入一定数据之后提交，发出一个HTTP请求（*.do）。这个请求被MainSERVLET接收，它提取请求信息，察看动作映射文件（mapping.xml），设置处理这个请求的动作对象(HTTPAction对象)，交给requestprosessor对象处理。Requestprosessor对象调用动作对象完成任务，如果需要进一步处理，requestprosessor对象会调用WEBclientcontroler对象的事件处理机制。MainSERVLET在处理完请求之后，从屏幕流管理对象那里得到下一个屏幕，并把请求传给这个屏幕的JSP文件。</font></p>
            <p><font face=Verdana>值得一提的是WEBclientcontroler事件处理机制最终把HTTP请求的数据传到了EJBAction对象那里处理。这样HTTPAction对象和EJBAction对象形成了两级处理机制，前一级与request对象紧密相关，把数据封装起来形成一个Event对象，再传给了EJBAction对象，后者与Request对象无关。这个方式可以形成一个session级别的数据处理机制。下图显示了这个方法。HTTPAction1对象处理一个请求，并把数据放到一个状态SessionBean内，HTTPAction2也如此，当HTTPAction3接收到HTTP请求之后，把控制传给EJBAction, 后者获取状态SessionBean数据，处理请求，成功后清控状态SessionBean的内容。这个机制非常适应多个输入页面才能满足一个业务的输入数据的情况（比如购物车）。</font></p>
            <p><font face=Verdana>2.4.3. 优缺点分析</font></p>
            <p><font face=Verdana>优点<br>屏幕导航定义明确<br>为框架的扩展提供了一个空间&nbsp; </font></p>
            <p><font face=Verdana>缺点<br>源码比较乱，稳定性和可靠性没人验证。<br>只是一个框架躯干，没有正式的model层，视图的概念不强<br>没有模型到视图的定义 </font></p>
            <p><font face=Verdana>修改意见<br>只有一个框架躯干，正为实现自己的应用框架提供了灵活性。没有僵化的视图概念，提供了在网页输入到模型的扩充接口，比如插入XML数据交换。</font></p>
            </font></div>
            </span></td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/jesson2005/aggbug/115543.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jesson2005/" target="_blank">张金鹏</a> 2007-05-06 12:42 <a href="http://www.blogjava.net/jesson2005/articles/115543.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2EE中软件基础结构的瓶颈</title><link>http://www.blogjava.net/jesson2005/articles/115542.html</link><dc:creator>张金鹏</dc:creator><author>张金鹏</author><pubDate>Sun, 06 May 2007 04:41:00 GMT</pubDate><guid>http://www.blogjava.net/jesson2005/articles/115542.html</guid><wfw:comment>http://www.blogjava.net/jesson2005/comments/115542.html</wfw:comment><comments>http://www.blogjava.net/jesson2005/articles/115542.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jesson2005/comments/commentRss/115542.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jesson2005/services/trackbacks/115542.html</trackback:ping><description><![CDATA[<table cellSpacing=0 cellPadding=0 width="98%" align=center border=0>
    <tbody>
        <tr>
            <td align=middle colSpan=2 height=40>
            <h1>J2EE中软件基础结构的瓶颈</h1>
            </td>
        </tr>
        <tr align=middle>
            <td colSpan=2 height=40>
            <script type=text/javascript><!--
            google_ad_client = "pub-8263014661871932";
            google_ad_width = 468;
            google_ad_height = 60;
            google_ad_format = "468x60_as";
            google_ad_type = "text_image";
            //2007-02-14: 新闻内容页面上面
            google_ad_channel = "8423241514";
            google_color_border = "FFFFFF";
            google_color_bg = "FFFFFF";
            google_color_link = "333333";
            google_color_text = "333333";
            google_color_url = "003366";
            //--></script>
            <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript>
            </script>
            </td>
        </tr>
        <tr>
            <td colSpan=2 height=40>&nbsp;</td>
        </tr>
        <tr>
            <td colSpan=2><span class=STYLE2>
            <div id=article>可扩展性是系统中的一个非常重要的非功能性需求。但系统中可能有多个瓶颈会阻碍系统的扩展性。在这篇文章中，我们尝试分析软件基础结构成为瓶颈的案例，而不考虑硬件资源上的限制（如CPU、磁盘空间、网络速度等）。下面我们将探讨一下这个问题。<br><br>下面是一些整篇文章中用到的一些术语：<br>&#183;吞吐量：系统支持的每秒能够处理的事务个数。<br>&#183;服务请求：每个事务中特定硬件的使用率，等于硬件使用率除以吞吐量。<br>&#183;硬件资源：指处理器、内存、磁盘和网络。<br>&#183;软件资源：指WEB线程、执行线程、BEAN池及数据库连接池等。<br>&#183;预计时间：用户预计两次并发提交请求之间的时间。<br>&#183;短时间法则：一个验证测试及确信测试环境不是瓶颈的法则。<br>&#183;响应时间：用户等待他提交的请求返回响应的时间。<br><br><strong><span style="FONT-SIZE: 16px">理论基础</span></strong><br><br>任何J2EE应用通常都有下面几个层次，如图1：<br>1、硬件基础结构资源（处理器、内存、磁盘和网络）<br>2、软件基础结构资源（JVM,WEB服务器、应用服务器、数据库服务器）<br>3、软件应用（J2EE应用）<br><br><br>
            <div align=center><img src="http://www.mldn.cn/UserFiles/2007-1/31/2007131143621350.gif" border=0></div>
            <br>Figure 1. Snapshot of a J2EE system<br><br>这儿有两个可能性导致瓶颈：硬件成为主要瓶颈或者软件成为主要瓶颈。在第一种情况，硬件资源不足够而软件资源很充分，如图2。随着负载的增加，硬件资源成为瓶颈，而软件可以继续扩展。减轻这个瓶颈的方案通常是扩大或者增加硬件。<br><br><br>
            <div align=center><img src="http://www.mldn.cn/UserFiles/2007-1/31/2007131143621290.gif" border=0></div>
            <br><br>Figure 2. The hardware pipe becomes a bottleneck<br><br><br>在第二种情况，硬件资源是足够的而软件资源相对有限。随着负载的增加，软件资源成为瓶颈，如图3。减轻这种瓶颈的方案通常是使用软件群集或优化软件。<br><br><br>
            <div align=center><img src="http://www.mldn.cn/UserFiles/2007-1/31/2007131143622149.gif" border=0></div>
            <br><br>Figure 3. Software pipe becomes a bottleneck<br><br><strong><span style="FONT-SIZE: 16px">应用服务器如何工作？</span></strong><br><br>来考虑一下应用服务器的内部机制。应用服务器的基本功能包括事务管理、数据持久、对象池、SOCKET处理和请求处理。这些功能的流程如图4。有各种组件来处理这些功能。这些组件需要同步应用服务器中的线程来维护数据的一致性并操作数据。虽然这种同步对应用服务器的功能正确性是必须而且有用的，但是也成为高负载的限制，即使有足够的硬件资源。<br><br><br>
            <div align=center><img src="http://www.mldn.cn/UserFiles/2007-1/31/2007131143622912.gif" border=0></div>
            <br><br>Figure 4. Internals of an application server<br><br><strong><span style="FONT-SIZE: 16px">实验</span></strong><br><br>为了理解瓶颈的状况，我们在基于Windows/Intel平台用流行的J2EE应用服务器来测试一下JAVA PETSTORE应用。一些测试用例如PetStore应用的浏览和购买周期来测试扩展性。我们确信整个测试环境（包括操作系统、JVM、应用服务器和应用自身）已经尽可能优化了，而且J2EE应用没有任何瓶颈或同步问题。我们使用了多用户负载测试并观察了响应时间、吞吐量、资源利用率等指标。<br><br>环境如下：<br>1、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;J2EE PetStore应用<br>2、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;J2EE应用服务器<br>3、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sun JVM 1.3<br>4、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Windows 2000高级服务器<br>5、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Intel Dell PowerEdge 8450 (8Intel至强800MHz处理器, 4GB RAM) <br>6、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;100Mbps Cisco dedicated network<br>7、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;负载测试工具WebLoad<br><br><br>
            <div align=center><a href="http://www.mldn.cn/UserFiles/2007-1/31/2007131143622786.gif" target=_blank><img height=166 src="http://www.mldn.cn/UserFiles/2007-1/31/2007131143622786.gif" width=520 border=0></a></div>
            <br><br><br><br><br><br>在这个测试中我们看到即使有足够的硬件资源，应用服务器的实例个数限制了扩展的能力。在这里软件资源（如执行线程、BEAN池大小、数据库池和其他应用服务器参数）优化后即使这些资源不足也不会影响系统的扩展。下面我们来研究一下减轻这种问题的方案。<br>注：Sun J2EE PetStore可以被更多地优化来改善性能和可扩展性。<br><br><br><strong><span style="FONT-SIZE: 16px">解决方案</span></strong><br><br><strong>同一机器上的群集</strong><br><br>当吞吐量满载了应用服务器的一个实例时，需要增加一个实例来减轻这种问题。这个方案如图5。<br><br><br>
            <div align=center><img src="http://www.mldn.cn/UserFiles/2007-1/31/2007131143622134.gif" border=0></div>
            <br><br>Figure 5. Instance clusters on the same hardware box<br><br>当前机器的CPU使用率只有40%因而有足够空间来增加一个实例。我们可以发现在增加了实例后，吞吐量也增加了50%，如表2<br><br><br>
            <div align=center><a href="http://www.mldn.cn/UserFiles/2007-1/31/2007131143622421.gif" target=_blank><img height=190 src="http://www.mldn.cn/UserFiles/2007-1/31/2007131143622421.gif" width=520 border=0></a></div>
            <br><br><br><strong>在不同机器的群集</strong><br>当吞吐量满载了应用服务器的一个实例时，机器的CPU使用率只有40%。因为8CPU的机器未完全利用，所以我们测试一下更低配置的机器。现在我们使用两个4CPU的机器，如图6。<br><br><br>
            <div align=center><img src="http://www.mldn.cn/UserFiles/2007-1/31/2007131143622107.gif" border=0></div>
            <br><br>Figure 6. Instance clusters on different hardware boxes<br><br><br>我们发现4CPU机器的CPU使用率已达到80%，再增加实例也没有什么用处了。因此我们又增加一台4CPU的机器来运行应用的实例。在增加机器后，吞吐量几乎翻了一倍。在这里我们确信数据库服务器不会成为瓶颈。<br><br>注：在上面的两台机器的测试中，负载平衡是通过一种不增加应用服务器实例功能负载的方式来处理的。但是在实际的生产环境中很难做到。<br><br>因为我们观察到8CPU的机器被没有被完全利用，所以我们使用4CPU的机器重新测试了一遍。测试的结果可以在下表中看到，分别对应配置1和2。4CPU的配置几乎被完全利用了，这意味着使用4CPU的配置比8CPU的配置更实际，因为前者花费更少。<br><br><br>
            <div align=center><a href="http://www.mldn.cn/UserFiles/2007-1/31/2007131143622694.gif" target=_blank><img height=270 src="http://www.mldn.cn/UserFiles/2007-1/31/2007131143622694.gif" width=520 border=0></a></div>
            <br><br><br><strong><span style="FONT-SIZE: 16px">小结</span></strong><br><br>这些实验指出了软件基础结构如应用服务器实例可能成为瓶颈，并给出了一些解决方案来减轻这种问题（包括在相同或不同机器上的群集）。这个问题需要在J2EE应用的负载计划或大小确定时优先考虑，因为这直接影响到应用的扩展性。这种想法很重要，下面我通过一个情景对话来表达。<br><br>项目经理：你的意思是应用服务器（代表软件基础结构）会成为系统的瓶颈。<br>性能架构师：是的<br>项目经理：那为什么这种情况不是经常发生。<br>性能架构师：是的，因为有时候瓶颈首先发生在硬件或应用本身。这时候应用服务器还没有使用到所有的扩展性。<br>项目经理：这是事实。那么解决这种瓶颈的方法就是使用群集。如果有足够的硬件资源就在同一台机器上跑群集否则在多台机器中配置。<br>性能架构师：是的。这也是在这篇文章中所得到的。</div>
            </span></td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/jesson2005/aggbug/115542.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jesson2005/" target="_blank">张金鹏</a> 2007-05-06 12:41 <a href="http://www.blogjava.net/jesson2005/articles/115542.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于RBAC模型的权限管理系统的设计和实现2</title><link>http://www.blogjava.net/jesson2005/articles/114004.html</link><dc:creator>张金鹏</dc:creator><author>张金鹏</author><pubDate>Fri, 27 Apr 2007 02:07:00 GMT</pubDate><guid>http://www.blogjava.net/jesson2005/articles/114004.html</guid><wfw:comment>http://www.blogjava.net/jesson2005/comments/114004.html</wfw:comment><comments>http://www.blogjava.net/jesson2005/articles/114004.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jesson2005/comments/commentRss/114004.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jesson2005/services/trackbacks/114004.html</trackback:ping><description><![CDATA[<span>&nbsp;
<p align=center><strong><span>基于</span></strong><strong><span>RBAC</span></strong><strong><span>模型的权限管理系统的设计和实现</span></strong><strong><span>
<p>&#160;</p>
</span></strong>
<p>&#160;</p>
<p align=center><font size=3><span>裴辉东</span><span> </span><span>梁云风</span><span>
<p>&#160;</p>
</span></font>
<p>&#160;</p>
<p align=center><font size=3><span>（<span>1. 山东省烟台海颐软件股份有限公司；2山东省烟台东方电子信息产业股份有限公司</span></span><span>）</span><span>
<p>&#160;</p>
</span></font>
<p>&#160;</p>
<p align=center><span>
<p><font size=3>&nbsp;</font></p>
</span>
<p>&#160;</p>
<p><strong><span>摘要：</span></strong><span>提出了基于<span>RBAC模型的权限管理</span></span><span>系统的</span><span>设计和实现方案。介绍了采用的<span>J2EE架构的多层体系结构设计，阐述了基于角色的访问控制RBAC模型的设计思想</span></span><span>，并讨论了权限管理系统的核心面向对象设计模型，以及权限访问、权限控制和权限存储机制等关键技术。</span><span>
<p>&#160;</p>
</span>
<p>&#160;</p>
<p><strong><span>关键词：</span></strong><span>权限管</span><span>理系统；角色；访问控制；<span>RBAC模型；J2EE；LDAP
<p>&#160;</p>
</span></span>
<p>&#160;</p>
<p><span>
<p>&nbsp;</p>
</span>
<p>&#160;</p>
<p><strong><span>0 </span></strong><strong><span>引言</span></strong><strong><span>
<p>&#160;</p>
</span></strong>
<p>&#160;</p>
<p><span>管理信息系统是一个复杂的人机交互系统，其中每个具体环节都可能受到安全威胁。构建强健的权限管理系统，保证管理信息系统的安全性是十分重要的。权限管理系统是管理信息系统中可代码重用性最高的模块之一。任何多用户的系统都不可避免的涉及到相同的权限需求，都需要解决实体鉴别、数据保密性、数据完整性、防抵赖和访问控制等安全服务</span><span>(据ISO7498-2)</span><span>。例如，访问控制服务要求系统根据操作者已经设定的操作权限，控制操作者可以访问哪些资源，以及确定对资源如何进行操作。</span><span>
<p>&#160;</p>
</span>
<p>&#160;</p>
<p align=left><span>目前，权限管理系统也是重复开发率最高的模块之一。在企业中，不同的应用系统都拥有一套独立的权限管理系统。每套权限管理系统只满足自身系统的权限管理需要，无论在数据存储、权限访问和权限控制机制等方面都可能不一样，这种不一致性存在如下弊端：</span><span>
<p>&#160;</p>
</span>
<p>&#160;</p>
<p align=left><span>a.</span><span>系统管理员需要维护多套权限管理系统，重复劳动。</span><span>
<p>&#160;</p>
</span>
<p>&#160;</p>
<p align=left><span><font face="Times New Roman">b.</font></span><span>用户管理、组织机构等数据重复维护，数据一致性、完整性得不到保证。</span><span>
<p>&#160;</p>
</span>
<p>&#160;</p>
<p align=left><span><font face="Times New Roman">c.</font></span><span>由于权限管理系统的设计不同，概念解释不同，采用的技术有差异，权限管理系统之间的集成存在问题，实现单点登录难度十分大，也给企业构建企业门户带来困难。</span><span>
<p>&#160;</p>
</span>
<p>&#160;</p>
<p align=left><span>采用统一的安全管理设计思想，规范化设计和先进的技术架构体系，构建一个通用的、完善的、安全的、易于管理的、有良好的可移植性和扩展性的权限管理系统，使得权限管理系统真正成为权限控制的核心，在维护系统安全方面发挥重要的作用，是十分必要的。</span><span>
<p>&#160;</p>
</span>
<p>&#160;</p>
<p align=left><span>本文介绍一种基于角色的访问控制<span>RBAC（Role-Based policies Access Control）模型的权限管理系统的设计和实现，系统采用基于J2EE架构技术实现。并以讨论了应用系统如何进行</span></span><span>权限的访问和控制</span><span>。<span>
<p>&#160;</p>
</span></span>
<p>&#160;</p>
<p><strong><span>
<p>&nbsp;</p>
</span></strong>
<p>&#160;</p>
<p><strong><span>1 </span></strong><strong><span>采用</span></strong><strong><span>J2EE</span></strong><strong><span>架构设计</span></strong><strong><span>
<p>&#160;</p>
</span></strong>
<p>&#160;</p>
<p align=left><span>采用<span>J2EE企业平台架构构建权限管理系统。J2EE架构集成了先进的软件体系架构思想，具有采用多层分布式应用模型、基于组件并能重用组件、统一完全模型和灵活的事务处理控制等特点。
<p>&#160;</p>
</span></span>
<p>&#160;</p>
<p align=left><span>系统逻辑上分为四层：客户层、<span>Web层、业务层和资源层。
<p>&#160;</p>
</span></span>
<p>&#160;</p>
<p align=left><span>a. 客户层主要负责人机交互。可以使系统管理员通过Web浏览器访问，也可以提供不同业务系统的API、Web Service调用。
<p>&#160;</p>
</span>
<p>&#160;</p>
<p align=left><span>b. Web层封装了用来提供通过Web访问本系统的客户端的表示层逻辑的服务。
<p>&#160;</p>
</span>
<p>&#160;</p>
<p align=left><span>c. 业务层提供业务服务，包括业务数据和业务逻辑，集中了系统业务处理。主要的业务管理模块包括组织机构管理、用户管理、资源管理、权限管理和访问控制几个部分。
<p>&#160;</p>
</span>
<p>&#160;</p>
<p align=left><span>d. 资源层主要负责数据的存储、组织和管理等。资源层提供了两种实现方式：大型关系型数据库（如ORACLE）和LDAP（Light Directory Access Protocol，轻量级目录访问协议）目录服务器（如微软的活动目录）。
<p>&#160;</p>
</span>
<p>&#160;</p>
<p><strong><span>2 RBAC</span></strong><strong><span>模型</span></strong><strong><span>
<p>&#160;</p>
</span></strong>
<p>&#160;</p>
<p align=left><span>访问控制是针对越权使用资源的防御措施。基本目标是为了限制访问主体（用户、进程、服务等）对访问客体（文件、系统等）的访问权限，从而使计算机系统在合法范围内使用；决定用户能做什么，也决定代表一定用户利益的程序能做什么<sup><span>[1]</span></sup>。<span>
<p>&#160;</p>
</span></span>
<p>&#160;</p>
<p align=left><span>企业环境中的访问控制策略一般有三种：自主型访问控制方法、强制型访问控制方法和基于角色的访问控制方法（<span>RBAC）。其中，自主式太弱，强制式太强，二者工作量大，不便于管理<sup>[1]</sup>。基于角色的访问控制方法</span></span><span>是目前公认的解决大型企业的统一资源访问控制的有效方法。其显著的两大特征是：</span><span>1.减</span><span>小授权管理的复杂性，降低管理开销</span><span>；<span>2.灵活地支</span></span><span>持企业的安全策略，并对企业的变化有很大的伸缩性。</span><span>
<p>&#160;</p>
</span>
<p>&#160;</p>
<p align=left><span>NIST（The National Institute of Standards and Technology，美国国家标准与技术研究院）标准RBAC模型由4个部件模型组成，这4个部件模型分别是基本模型RBAC0（Core RBAC）、角色分级模型RBAC1（Hierarchal RBAC）、角色限制模型RBAC2（Constraint RBAC）和统一模型RBAC3（Combines RBAC）<sup>[1]</sup>。RBAC0模型如图1所示。</span></p>
<span>
<p align=left><span>a. RBAC0定义了能构成一个RBAC控制系统的最小的元素集合。在RBAC之中,包含用户users(USERS)、角色roles(ROLES)、目标objects(OBS)、操作operations(OPS)、许可权permissions(PRMS)五个基本数据元素，权限被赋予角色,而不是用户，当一个角色被指定给一个用户时，此用户就拥有了该角色所包含的权限。会话sessions是用户与激活的角色集合之间的映射。RBAC0与传统访问控制的差别在于增加一层间接性带来了灵活性，RBAC1、RBAC2、RBAC3都是先后在RBAC0上的扩展。
<p>&#160;</p>
</span>
<p>&#160;</p>
<p align=left><span>b. RBAC1引入角色间的继承关系，角色间的继承关系可分为一般继承关系和受限继承关系。一般继承关系仅要求角色继承关系是一个绝对偏序关系，允许角色间的多继承。而受限继承关系则进一步要求角色继承关系是一个树结构。
<p>&#160;</p>
</span>
<p>&#160;</p>
<p align=left><span>c. RBAC2模型中添加了责任分离关系。RBAC2的约束规定了权限被赋予角色时,或角色被赋予用户时,以及当用户在某一时刻激活一个角色时所应遵循的强制性规则。责任分离包括静态责任分离和动态责任分离。约束与用户-角色-权限关系一起决定了RBAC2模型中用户的访问许可。
<p>&#160;</p>
</span>
<p>&#160;</p>
<p align=left><span>d. RBAC3包含了RBAC1和RBAC2，既提供了角色间的继承关系，又提供了责任分离关系。
<p>&#160;</p>
</span>
<p>&#160;</p>
<p><strong><span>3</span></strong><strong><span>核心对象模型设计</span></strong><strong><span>
<p>&#160;</p>
</span></strong>
<p>&#160;</p>
<p align=left><span>根据</span><span>RBAC模型的权限设计思想，建立权限管理系统的核心对象模型。如图2所示。
<p>&#160;</p>
</span>
<p>&#160;</p>
<p><wrapblock><shapetype id=_x0000_t75 stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke>
<formulas>
<f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f>
</formulas>
<path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path>
<lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id=_x0000_s1026 type="#_x0000_t75"><imagedata blacklevel="-11796f" gain="234057f" o:title="wen1" src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image001.png"></imagedata><wrap type="topAndBottom"></wrap></shape></wrapblock><br clear=all><span>对象模型中包含的基本元素主要有：用户（<span>Users）、用户组（Group）、角色（Role）、目标（Objects）、</span></span><span>访问模式</span><span>（<span>Access Mode）、操作（Operator）。主要的关系有：分配角色权限PA（Permission Assignment）、分配用户角色UA（Users Assignmen描述如下：</span></span><span>
<p>&#160;</p>
</span>
<p>&#160;</p>
<p>
<p align=left><strong><span>a .控制对象：</span></strong><span>是系统所要保护的资源（<span>Resource），可</span></span><span>以被访问的对象</span><span>。</span><span>资源的定义需要注</span><span>意以下两个问题：<span>
<p>&#160;</p>
</span></span>
<p>&#160;</p>
<p align=left><span>1.资源具有层次关系和包含关系</span><span>。例如，网页是资源，网页上的按钮、文本框等对象也是资源，是网页节点的子节点，如可以访问按钮，则必须能够访问页面。</span><span>
<p>&#160;</p>
</span>
<p>&#160;</p>
<p align=left><span>2.</span><span>这里提及的资源概念是指资源的类别</span><span>（<span>Resource Class），不是某个特定资源的实例（Resource Instance）。</span></span><span>资源的类别和资源的实例的区分，以及资源的粒度的细分，有利于确定权限管理系统和应用系统之间的管理边界，权限管理系统需要对于资源的类别进行权限管理，而应用系统需要对特定资源的实例进行权限管理。两者的区分主要是基于以下两点考虑：</span><span>
<p>&#160;</p>
</span>
<p>&#160;</p>
<p align=left><span>一方面，资源实例的权限常具有资源的相关性。即根据资源实例和访问资源的主体之间的关联关系，才可能进行资源的实例权限判断。</span><span>
<p>&#160;</p>
</span>
<p>&#160;</p>
<p align=left><span>例如，在管理信息系统中，需要按照营业区域划分不同部门的客户，</span><span>A区和B区</span><span>都具有修改客户资料这一受控的资源，这里&#8220;客户档案资料&#8221;是属于资源的类别的范畴。如果规</span><span>定<span>A区只能修改A区</span></span><span>管理的客户资料，就必须要区分出资料的归属，这里的</span><span>资源是属于资源实例的范畴</span><span>。客户档案（资源）本身应该有其使用者的信息（客户资料可能就含有营业区域这一属性），才能区分特定资源的实例操作，可以修改属于自己管辖的信息内容。</span><span>
<p>&#160;</p>
</span>
<p>&#160;</p>
<p align=left><span>另一方面，资源的实例权限常具有相当大的业务逻辑相关性。对不同的业务逻辑，常常意味着完全不同的权限判定原则和策略。</span><span>
<p>&#160;</p>
</span>
<p>&#160;</p>
<p align=left><strong><span>b.权限：</span></strong><span>对受保护的资源操作的访问许可</span><span>(Access Permission)</span><span>，是绑定在特定的资源实例上的。对应地，访问策略</span><span>（<span>Access Strategy）和资源</span></span><span>类别</span><span>相关，不同的资源</span><span>类别</span><span>可能采用不同的访问模式（<span>Access Mode）。例如，页面具有能打开、不能打开的</span></span><span>访问模式，按钮具有可用、不可用的访问模式，文本编辑框具有可编辑、不可编辑的访问模式。同一资源的访问策略可能存在排斥和包含关系。例如，某个数据集的可修改访问模式就包含了可查询访问模式。</span><span>
<p>&#160;</p>
</span>
<p>&#160;</p>
<p align=left><strong><span>c.用户：</span></strong><span>是</span><span>权限的拥有者或主体。用户和权限实现分离，通过授权管理进行绑定。</span><span>
<p>&#160;</p>
</span>
<p>&#160;</p>
<p align=left><strong><span>d.用户组：</span></strong><span>一组用户的集合。在业务逻辑的判断中，可以实现基于个人身份或组的身份进行判断。系统弱化了用户组的概念，主要实现用户（个人的身份）的方式。</span><span>
<p>&#160;</p>
</span>
<p>&#160;</p>
<p align=left><strong><span>e.角色：</span></strong><span>权限分配的单位与载体。角色通过继承关系支持分级的权限实现。例如，科长角色同时具有科长角色、科内不同业务人员角色。</span><span>
<p>&#160;</p>
</span>
<p>&#160;</p>
<p align=left><strong><span>f.操作：</span></strong><span>完成资源的类别和访问策略之间的绑定。</span><span>
<p>&#160;</p>
</span>
<p>&#160;</p>
<p align=left><strong><span>g.分配角色权限PA：</span></strong><span>实现操作和角色之间的关联关系映射。<span>
<p>&#160;</p>
</span></span>
<p>&#160;</p>
<p align=left><strong><span>h.分配用户角色UA：</span></strong><span>实现用户和角色之间的关联关系映射。<strong><span>
<p>&#160;</p>
</span></strong></span>
<p>&#160;</p>
<p align=left><span>该对象模型最终将访问控制模型转化为访问矩阵形式。访问矩阵中的行对应于用户，列对应于操作，每个矩阵元素规定了相应的角色，对应于相应的目标被准予的访问许可、实施行为。按访问矩阵中的行看，是访问能力表<span>CL(Access Capabilities)的内容；按访问矩阵中的列看，是访问控制表ACL（Access Control Lists）的内容。<strong>
<p>&#160;</p>
</strong></span></span>
<p>&#160;</p>
<p><strong><span>4 </span></strong><strong><span>权限访问机制</span></strong><strong><span>
<p>&#160;</p>
</span></strong>
<p>&#160;</p>
<p align=left><span>权限管理系统端：提供集中管理权限的服务，负责提供用户的鉴别、用户信息、组织结构信息<span>,以及权限</span></span><span>关系表</span><span>的计算。如图<span>3所示。
<p>&#160;</p>
</span></span>
<p>&#160;</p>
<p align=center><wrapblock><shapetype id=_x0000_t75 stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke>
<formulas>
<f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f>
</formulas>
<path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path>
<lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id=_x0000_s1026 type="#_x0000_t75"><imagedata o:title="wen1" src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image001.png"></imagedata><wrap type="topAndBottom"></wrap></shape></wrapblock><br clear=all><span>
<p>&#160;</p>
</span>
<p>&#160;</p>
<p align=center><span>图<span>3 权限的访问示意图
<p>&#160;</p>
</span></span>
<p>&#160;</p>
<p align=center><span>Fig.3 Privilege invoke
<p>&#160;</p>
</span>
<p>&#160;</p>
<p align=left><span>系统根据用户，角色、操作、</span><span>访问</span><span>策略和控制对象之间的关联关系，同时考虑权限的正负向授予，计算出用户的最小权限。在</span><span>业务逻辑层采用</span><span>Session Bean实现此服务，也可以发布成Web Service。采用代理Proxy模式，集中控制来自应用系统的所要访问的权限计算服务，并返回权限关系表，即二元组{ObjectId，OperatorId}。
<p>&#160;</p>
</span>
<p>&#160;</p>
<p align=left><span>应用系统端：可以通过访问能力表<span>CL和访问控制表ACL两种可选的访问方式访问权限管理系统。</span></span><span>以基于</span><span><font face="Times New Roman">J2EE</font></span><span>框架的应用系统为例，说明访问过程</span><span>：<span>
<p>&#160;</p>
</span></span>
<p>&#160;</p>
<p><span>a.首先采用基于表单的验证，利用Servlet方式集中处理登录请求<sup>[2]</sup>。考虑到需要鉴别的实体是用户，采用基于ACL访问方式。用户登录时调用权限管理系统的用户鉴别服务，如果验证成功，调用权限计算服务，并返回权限关系表，以HashMap的方式存放到登录用户的全局Session中；如果没有全局的Session或者过期，则被导向到登录页面，重新获取权限。
<p>&#160;</p>
</span>
<p>&#160;</p>
<p><span>b.直接URL资源采用基于CL访问方式进行的访问控制。如果用户直接输入URL地址访问页面，有两种方法控制访问：1.通过权限标签读取CL进行控制；2.采取Filter模式，进行权限控制，如果没有权限，则重定向到登录页面。
<p>&#160;</p>
</span>
<p>&#160;</p>
<p><strong><span>5 </span></strong><strong><span>权限控制机制</span></strong><strong><span>
<p>&#160;</p>
</span></strong>
<p>&#160;</p>
<p><span>权限所要控制的资源类别是根据应用系统的需要而定义的，具有的语义和控制规则也是应用系统提供的，对于权限管理系统来说是透明的，权限将不同应用系统的资源和操作统一对待。应用系统调用权限管理系统所获得的权限关系表，也是需要应用系统来解释的。按此设计，权限管理系统的通用性较强，权限的控制机制则由应用系统负责处理。<span>
<p>&#160;</p>
</span></span>
<p>&#160;</p>
<p><span>由于应用系统的权限控制与特定的技术环境有关，以基于</span><span>J2EE架</span><span>构的应用系统为例来说明，系统</span><span>主要的展示组件是<span>JSP页面，</span></span><span>采用标记库和权限控制组件共同来实现。</span><span>
<p>&#160;</p>
</span>
<p>&#160;</p>
<p><span>a. 权限标识：利用标签来标识不同级别资源，页面权限标签将标识页面对象。
<p>&#160;</p>
</span>
<p>&#160;</p>
<p><span>b. 权限注册：遍历JSP页面上的权限控制标签，读取JSP的控制权限。通过权限注册组件将JSP页面上的权限控制对象以及规则注册到权限管理信息系统中。
<p>&#160;</p>
</span>
<p>&#160;</p>
<p><span>c. 权限控制：应用系统用户登录系统时，从权限管理系统获得权限关系表之后，一方面，权限标签控制页面展示；另一方面，利用权限控制组件在业务逻辑中进行相应的权限</span><span>控制</span><span>，</span><span>尤其是和业务逻辑紧密联系的控制对象实例的权限控制。</span><span>
<p>&#160;</p>
</span>
<p>&#160;</p>
<p><strong><span>6 </span></strong><strong><span>权限存储机制</span></strong><strong><span>
<p>&#160;</p>
</span></strong>
<p>&#160;</p>
<p align=left><span>权限管理系统采用了两种可选的存储机制：<span>LDAP（Lightweight Directory Access Protocol）目录服务数据库和关系型数据库。存储用户信息、组织结构、角色、操作、访问模式等信息。
<p>&#160;</p>
</span></span>
<p>&#160;</p>
<p align=left><span>其中，目录服务系统基于<span>LDAP标准，具有广泛的数据整合和共享能力。元目录（Meta-Directory）功能允许快速、简洁的与企业现存基础结构进行集成，解决基于传统RDBMS等用户数据库与LDAP用户数据库的同步问题。</span></span><span>
<p>&#160;</p>
</span>
<p>&#160;</p>
<p><strong><span>7 </span></strong><strong><span>结语</span></strong><strong><span>
<p>&#160;</p>
</span></strong>
<p>&#160;</p>
<p><span>本文论述了</span><span>一种基于<span>RBAC模型的权限管理系统的</span></span><span>实现技术方案。该</span><span>权限管理系统</span><span>已成功应用于系统的设计和开发实践，与应用系统具有很好的集成。实践表明，采用</span><span>基于<span>RBAC模型的权限具有以下优势：权限分配</span></span><span>直观、容易理解，便于使用；扩展性好，支持岗位、权限多变的需求；分级权限适合分层的组织结构形式；重用性强。</span><span>
<p>&#160;</p>
</span></span></span>
<img src ="http://www.blogjava.net/jesson2005/aggbug/114004.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jesson2005/" target="_blank">张金鹏</a> 2007-04-27 10:07 <a href="http://www.blogjava.net/jesson2005/articles/114004.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于RBAC模型的权限管理系统的设计和实现 </title><link>http://www.blogjava.net/jesson2005/articles/114001.html</link><dc:creator>张金鹏</dc:creator><author>张金鹏</author><pubDate>Fri, 27 Apr 2007 02:06:00 GMT</pubDate><guid>http://www.blogjava.net/jesson2005/articles/114001.html</guid><wfw:comment>http://www.blogjava.net/jesson2005/comments/114001.html</wfw:comment><comments>http://www.blogjava.net/jesson2005/articles/114001.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jesson2005/comments/commentRss/114001.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jesson2005/services/trackbacks/114001.html</trackback:ping><description><![CDATA[<div style="MARGIN-TOP: 1px; MARGIN-LEFT: 15px">&nbsp;</div>
<div style="MARGIN-TOP: 10px; MARGIN-LEFT: 15px; OVERFLOW: auto">
<table width="100%">
    <tbody>
        <tr>
            <td>
            <div class="sysBr500 text" id=articleText4c3494b2010008td align=left><font face=Arial color=#000000 size=2><strong><span><br>0</span></strong> <strong><span>引言</span></strong> <br 255, 255);?><span 255, 255);?>管理信息系统是一个复杂的人机交互系统，其中每个具体环节都可能受到安全威胁。构建强健的<span>权限管理系统</span>，保证管理信息系统的安全性是十分重要的。<span>权限管理系统</span>是管理信息系统中可代码重用性最高的模块之一。任何多用户的系统都不可避免的涉及到相同的权限需求，都需要解决实体鉴别、数据保密性、数据完整性、防抵赖和访问控制等安全服务(据ISO7498-2)。例如，访问控制服务要求系统根据操作者已经设定的操作权限，控制操作者可以访问哪些资源，以及确定对资源如何进行操作。</span><span 255, 255);?> </span><br 255, 255);?></font><font face=Arial color=#000000 size=2 255, 255);?><span>目前，<span style="COLOR: black">权限管理系统</span>也是重复开发率最高的模块之一。在企业中，不同的应用系统都拥有一套独立的<span>权限管理系统</span>。每套<span>权限管理系统</span>只满足自身系统的权限管理需要，无论在数据存储、权限访问和权限控制机制等方面都可能不一样，这种不一致性存在如下弊端：</span></font><font face=Arial color=#000000 size=2 255, 255);?> <br></font><font face=Arial color=#000000 size=2 255, 255);?><span>a.</span><span>系统管理员需要维护多套<span style="COLOR: black">权限管理系统</span>，重复劳动。</span></font><font face=Arial color=#000000 size=2 255, 255);?> <br></font><font face=Arial color=#000000 size=2 255, 255);?><span>b.</span><span>用户管理、组织机构等数据重复维护，数据一致性、完整性得不到保证。</span></font><font face=Arial color=#000000 size=2 255, 255);?> <br></font><font face=Arial color=#000000 size=2 255, 255);?><span>c.</span><span>由于<span style="COLOR: black">权限管理系统</span>的设计不同，概念解释不同，采用的技术有差异，<span>权限管理系统</span>之间的集成存在问题，实现单点登录难度十分大，也给企业构建企业门户带来困难。</span></font><font face=Arial color=#000000 size=2 255, 255);?> <br></font><font face=Arial color=#000000 size=2 255, 255);?><span>采用统一的安全管理设计思想，规范化设计和先进的技术架构体系，构建一个通用的、完善的、安全的、易于管理的、有良好的可移植性和扩展性的<span style="COLOR: black">权限管理系统</span>，使得<span>权限管理系统</span>真正成为权限控制的核心，在维护系统安全方面发挥重要的作用，是十分必要的。</span></font><font face=Arial color=#000000 size=2 255, 255);?> <br></font><font face=Arial color=#000000 size=2 255, 255);?><span>本文介绍一种基于角色的访问控制RBAC（Role-Based policies Access Control）模型的<span style="COLOR: black">权限管理系统</span>的设计和实现，系统采用基于J2EE架构技术实现。并以讨论了应用系统如何进行</span><span>权限的访问和控制</span><span>。</span></font><font face=Arial color=#000000 size=2 255, 255);?> <br></font><font face=Arial color=#000000 size=2 255, 255);?>&nbsp;</font><font face=Arial color=#000000 size=2 255, 255);?> <br></font><font face=Arial color=#000000 size=2 255, 255);?><strong><span>1</span></strong> <strong><span>采用</span></strong><strong><span>J2EE</span></strong><strong><span>架构设计</span></strong></font><font face=Arial color=#000000 size=2 255, 255);?> <br></font><font face=Arial color=#000000 size=2><span><span style="BACKGROUND-COLOR: rgb(255,255,255)">采用J2EE企业平台架构构建</span><span 255, 255);?>权限管理系统</span>。J2EE架构集成了先进的软件体系架构思想，具有采用多层分布式应用模型、基于组件并能重用组件、统一完全模型和灵活的事务处理控制等特点。</span></font><font face=Arial color=#000000 size=2> <br><span>系统逻辑上分为四层：客户层、Web层、业务层和资源层。</span> <br><span>a. 客户层主要负责人机交互。可以使系统管理员通过Web浏览器访问，也可以提供不同业务系统的API、Web Service调用。</span> <br><span>b. Web层封装了用来提供通过Web访问本系统的客户端的表示层逻辑的服务。</span> <br><span>c. 业务层提供业务服务，包括业务数据和业务逻辑，集中了系统业务处理。主要的业务管理模块包括组织机构管理、用户管理、资源管理、权限管理和访问控制几个部分。</span> <br><span>d. 资源层主要负责数据的存储、组织和管理等。资源层提供了两种实现方式：大型关系型数据库（如ORACLE）和LDAP（Light Directory Access Protocol，轻量级目录访问协议）目录服务器（如微软的活动目录）。</span> <br><strong><span>2 RBAC</span></strong><strong><span>模型</span></strong> <br><span>访问控制是针对越权使用资源的防御措施。基本目标是为了限制访问主体（用户、进程、服务等）对访问客体（文件、系统等）的访问权限，从而使计算机系统在合法范围内使用；决定用户能做什么，也决定代表一定用户利益的程序能做什么<sup>[1]</sup>。</span> <br><span>企业环境中的访问控制策略一般有三种：自主型访问控制方法、强制型访问控制方法和基于角色的访问控制方法（RBAC）。其中，自主式太弱，强制式太强，二者工作量大，不便于管理<sup>[1]</sup>。基于角色的访问控制方法</span><span>是目前公认的解决大型企业的统一资源访问控制的有效方法。其显著的两大特征是：</span><span>1.减</span><span>小授权管理的复杂性，降低管理开销</span><span>；2.灵活地支</span><span>持企业的安全策略，并对企业的变化有很大的伸缩性。</span> <br><span>NIST（The National Institute of Standards and Technology，美国国家标准与技术研究院）标准RBAC模型由4个部件模型组成，这4个部件模型分别是基本模型RBAC0（Core RBAC）、角色分级模型RBAC1（Hierarchal RBAC）、角色限制模型RBAC2（Constraint RBAC）和统一模型RBAC3（Combines RBAC）<sup>[1]</sup>。RBAC0模型如图1所示。</span> <br><span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 'Times New Roman'" xml:lang="EN-US">&nbsp; <span lang=EN-US xml:lang="EN-US" Times New Roman?;?><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sunlen/1.JPG"></span></span></span> <br><span>图1 RBAC0</span><span>模型</span> <br>&nbsp; <br><span>a. RBAC0定义了能构成一个RBAC控制系统的最小的元素集合。在RBAC之中,包含用户users(USERS)、角色roles(ROLES)、目标 objects(OBS)、操作operations(OPS)、许可权permissions(PRMS)五个基本数据元素，权限被赋予角色,而不是用 户，当一个角色被指定给一个用户时，此用户就拥有了该角色所包含的权限。会话sessions是用户与激活的角色集合之间的映射。RBAC0与传统访问控 制的差别在于增加一层间接性带来了灵活性，RBAC1、RBAC2、RBAC3都是先后在RBAC0上的扩展。</span> <br><span>b. RBAC1引入角色间的继承关系，角色间的继承关系可分为一般继承关系和受限继承关系。一般继承关系仅要求角色继承关系是一个绝对偏序关系，允许角色间的多继承。而受限继承关系则进一步要求角色继承关系是一个树结构。</span> <br><span>c. RBAC2模型中添加了责任分离关系。RBAC2的约束规定了权限被赋予角色时,或角色被赋予用户时,以及当用户在某一时刻激活一个角色时所应遵循的强制 性规则。责任分离包括静态责任分离和动态责任分离。约束与用户-角色-权限关系一起决定了RBAC2模型中用户的访问许可。</span> <br><span>d. RBAC3包含了RBAC1和RBAC2，既提供了角色间的继承关系，又提供了责任分离关系。</span> <br><strong><span>3</span></strong><strong><span>核心对象模型设计</span></strong> <br><span>根据</span><span>RBAC模型的权限设计思想，建立<span style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,255)">权限管理系统</span>的核心对象模型。如图2所示。</span> <br><br><span>对象模型中包含的基本元素主要有：用户（Users）、用户组（Group）、角色（Role）、目标（Objects）、</span><span>访问模式</span><span>（Access Mode）、操作（Operator）。主要的关系有：分配角色权限PA（Permission Assignment）、分配用户角色UA（Users Assignmen描述如下：</span> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sunlen/2.JPG"> <br><span>图2</span> <span><span style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,255)">权限管理系统</span>核心类图</span></font> </div>
            </td>
        </tr>
    </tbody>
</table>
</div>
<img src ="http://www.blogjava.net/jesson2005/aggbug/114001.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jesson2005/" target="_blank">张金鹏</a> 2007-04-27 10:06 <a href="http://www.blogjava.net/jesson2005/articles/114001.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>xinag 学习java的30个目标 </title><link>http://www.blogjava.net/jesson2005/articles/113526.html</link><dc:creator>张金鹏</dc:creator><author>张金鹏</author><pubDate>Wed, 25 Apr 2007 06:21:00 GMT</pubDate><guid>http://www.blogjava.net/jesson2005/articles/113526.html</guid><wfw:comment>http://www.blogjava.net/jesson2005/comments/113526.html</wfw:comment><comments>http://www.blogjava.net/jesson2005/articles/113526.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jesson2005/comments/commentRss/113526.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jesson2005/services/trackbacks/113526.html</trackback:ping><description><![CDATA[<blockquote>1.你需要精通面向对象分析与设计(OOA/OOD)、涉及模式(GOF，J2EEDP)以及综合模式。你应该十分了解UML，尤其是class，object，interaction以及statediagrams。<br><br>　　2.你需要学习JAVA语言的基础知识以及它的核心类库(collections，serialization，streams，networking， multithreading，reflection，event，handling，NIO，localization，以及其他)。<br><br>　　3.你应该了解JVM，classloaders，classreflect，以及垃圾回收的基本工作机制等。你应该有能力反编译一个类文件并且明白一些基本的汇编指令。<br><br>　　4.如果你将要写客户端程序，你需要学习WEB的小应用程序(applet)，必需掌握GUI设计的思想和方法，以及桌面程序的SWING，AWT， SWT。你还应该对UI部件的JAVABEAN组件模式有所了解。JAVABEANS也被应用在JSP中以把业务逻辑从表现层中分离出来。<br><br>　　5.你需要学习java数据库技术，如JDBCAPI并且会使用至少一种persistence/ORM构架，例如Hibernate，JDO， CocoBase，TopLink，InsideLiberator(国产JDO红工厂软件)或者iBatis。<br><br>　　6.你还应该了解对象关系的阻抗失配的含义，以及它是如何影响业务对象的与关系型数据库的交互，和它的运行结果，还需要掌握不同的数据库产品运用，比如:oracle，mysql，mssqlserver。<br><br>　　7.你需要学习JAVA的沙盒安全模式(classloaders，bytecodeverification，managers，policyandpermissions，<br>codesigning， digitalsignatures，cryptography，certification，Kerberos，以及其他)还有不同的安全/认证 API，例如JAAS(JavaAuthenticationandAuthorizationService)，JCE (JavaCryptographyExtension)，JSSE(JavaSecureSocketExtension)，以及JGSS (JavaGeneralSecurityService)。<br><br>　　8.你需要学习Servlets，JSP，以及JSTL(StandardTagLibraries)和可以选择的第三方TagLibraries。<br><br>　　9.你需要熟悉主流的网页框架，例如JSF，Struts，Tapestry，Cocoon，WebWork，以及他们下面的涉及模式，如MVC/MODEL2。<br><br>　　10.你需要学习如何使用及管理WEB服务器，例如tomcat，resin，Jrun，并且知道如何在其基础上扩展和维护WEB程序。<br><br>　11.你需要学习分布式对象以及远程API，例如RMI和RMI/IIOP。 <br>　　12.你需要掌握各种流行中间件技术标准和与java结合实现，比如Tuxedo、CROBA，当然也包括javaEE本身。<br><br>　　13.你需要学习最少一种的XMLAPI，例如JAXP(JavaAPIforXMLProcessing)，JDOM(JavaforXMLDocumentObjectModel)，DOM4J，或JAXR(JavaAPIforXMLRegistries)。<br><br>　　14.你应该学习如何利用JAVAAPI和工具来构建WebService。例如JAX-RPC(JavaAPIforXML/RPC)，SAAJ (SOAPwithAttachmentsAPIforJava)，JAXB(JavaArchitectureforXMLBinding)，JAXM(JavaAPIforXMLMessaging)， JAXR(JavaAPIforXMLRegistries)，或者JWSDP(JavaWebServicesDeveloperPack)。<br><br>　　15.你需要学习一门轻量级应用程序框架，例如Spring，PicoContainer，Avalon，以及它们的IoC/DI风格(setter，constructor，interfaceinjection)。<br><br>　　16.你需要熟悉不同的J2EE技术，例如JNDI(JavaNamingandDirectoryInterface)，JMS (JavaMessageService)，JTA/JTS(JavaTransactionAPI/JavaTransactionService)，JMX (JavaManagementeXtensions)，以及JavaMail。<br><br>　　17.你需要学习企业级JavaBeans(EJB)以及它们的不同组件模式：Stateless/StatefulSessionBeans，EntityBeans(包含Bean- ManagedPersistence[BMP]或者Container-ManagedPersistence[CMP]和它的EJB-QL)，或者 Message-DrivenBeans(MDB)。<br><br>　　18.你需要学习如何管理与配置一个J2EE应用程序服务器，如WebLogic，JBoss等，并且利用它的附加服务，例如簇类，连接池以及分布式处理支援。你还需要了解如何在它上面封装和配置应用程序并且能够监控、调整它的性能。<br><br>　　19.你需要熟悉面向方面的程序设计以及面向属性的程序设计(这两个都被很容易混淆的缩写为AOP)，以及他们的主流JAVA规格和执行。例如AspectJ和AspectWerkz。<br><br>　　20.你需要熟悉对不同有用的API和frame work等来为你服务。例如Log4J(logging/tracing)，Quartz (scheduling)，JGroups(networkgroupcommunication)，JCache(distributedcaching)， Lucene(full-textsearch)，JakartaCommons等等。<br><br>21.如果你将要对接或者正和旧的系统或者本地平台，你需要学习JNI (JavaNativeInterface) and JCA (JavaConnectorArchitecture)。<br><br>　　22.你需要熟悉JINI技术以及与它相关的分布式系统，比如掌握CROBA。<br><br>　　23.你需要JavaCommunityProcess(JCP)以及他的不同JavaSpecificationRequests(JSRs)，例如Portlets(168)，JOLAP(69)，DataMiningAPI(73)，等等。<br><br>　　24.你应该熟练掌握一种JAVAIDE例如sunOne，netBeans，IntelliJIDEA或者Eclipse。(有些人更喜欢VI或EMACS来编写文件。随便你用什么了：)<br><br>　　25.JAVA(精确的说是有些配置)是冗长的，它需要很多的人工代码(例如EJB)，所以你需要熟悉代码生成工具，例如XDoclet。<br><br>　　26.你需要熟悉一种单元测试体系(JNunit)，并且学习不同的生成、部署工具(Ant，Maven)。<br><br>　　27.你需要熟悉一些在JAVA开发中经常用到的软件工程过程。例如RUP(RationalUnifiedProcess)andAgilemethodologies。<br><br>　　28.你需要能够深入了解加熟练操作和配置不同的操作系统，比如GNU/linux，sunsolaris，macOS等，做为跨平台软件的开发者。<br><br>　　29.你还需要紧跟java发展的步伐，比如现在可以深入的学习javaME，以及各种java新规范，技术的运用，如新起的web富客户端技术。<br><br>　　30.你必需要对opensource有所了解，因为至少java的很多技术直接是靠开源来驱动发展的，如java3D技术。</blockquote>
<img src ="http://www.blogjava.net/jesson2005/aggbug/113526.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jesson2005/" target="_blank">张金鹏</a> 2007-04-25 14:21 <a href="http://www.blogjava.net/jesson2005/articles/113526.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>