﻿<?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-cyantide</title><link>http://www.blogjava.net/cyantide/</link><description /><language>zh-cn</language><lastBuildDate>Mon, 13 Apr 2026 08:56:12 GMT</lastBuildDate><pubDate>Mon, 13 Apr 2026 08:56:12 GMT</pubDate><ttl>60</ttl><item><title>java  读取文件</title><link>http://www.blogjava.net/cyantide/archive/2012/02/09/369660.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Thu, 09 Feb 2012 04:54:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2012/02/09/369660.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/369660.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2012/02/09/369660.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/369660.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/369660.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;String&nbsp;openWinAdvleftJS=Util.getPropertiesVal("picInfoPath");</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;openWinAdvleftJS&nbsp;=&nbsp;"E:\\\u9996\u4FE1\\\u8D22\u653F\u5C40\\other\\\u5F39\u51FA\u6846\\\u7EFC\u5408\u529E\u516C\u5E73\u53F0\\advleft.js";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(openWinAdvleftJS);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;sb&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;StringBuffer();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStreamReader&nbsp;fr&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fr&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;InputStreamReader(<span style="color: #0000FF; ">new</span>&nbsp;FileInputStream(openWinAdvleftJS),"gb2312");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;ch&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;((ch&nbsp;=&nbsp;fr.read())&nbsp;!=&nbsp;-1)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append((<span style="color: #0000FF; ">char</span>)ch);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(IOException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">finally</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(fr&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fr.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(IOException&nbsp;e1)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(sb.toString());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("////");</div><img src ="http://www.blogjava.net/cyantide/aggbug/369660.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2012-02-09 12:54 <a href="http://www.blogjava.net/cyantide/archive/2012/02/09/369660.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>dhtmlxtree相关资料  (转帖)</title><link>http://www.blogjava.net/cyantide/archive/2010/08/17/329123.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Tue, 17 Aug 2010 09:17:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2010/08/17/329123.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/329123.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2010/08/17/329123.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/329123.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/329123.html</trackback:ping><description><![CDATA[经常有需要显示分层的数据结构，使用dhtmlxTree (DHTML 延展的树状结构)可以在浏览器轻易解决这类需求。它是应用Java语言树状结构菜单组件，予许在商业应用程序或网站页面，建立导引的使用者接口(树状结构 菜单)，这种应用架构，可以在在线进行信息的管理与整合，使用者能容易地找到他们需要的信息。<br />
<br />
当然，在使用过程中还是发现一点点问题。下面是我整理的一些里面常用函数的说明（只有简单的说明，如果要看详细的说明，自己查看原函数去）：<br />
<br />
构造函数<br />
dhtmlXTreeObject(htmlObject, width, height, rootId)//rootId 虚拟根节点，在界面上不会显示，一般取值0<br />
<br />
replace IMG tag with background images - solve problem with IE image caching , not works for IE6 SP1<br />
enableIEImageFix(mode)<br />
析构函数<br />
destructor()<br />
实现继承<br />
clone()<br />
节点构造函数<br />
dhtmlXTreeItemObject(itemId,itemText,parentObject,treeObject,actionHandler,mode)// mode - do not show images<br />
从xml字符串加载树<br />
loadXMLString(xmlString,afterCall)//afterCall - function which will be called after xml loading<br />
从xml文件加载树<br />
loadXML(file,afterCall)<br />
新建子节点，前三个参数为必须的<br />
insertNewItem(parentId,itemId,itemText,itemActionHandler,image1,image2,image3,optionStr,childs)<br />
insertNewChild(parentId,itemId,itemText,itemActionHandler,image1,image2,image3,optionStr,childs)<br />
<br />
节点展开与收缩：[1-close 2-open]<br />
_HideShow(itemObject,mode)<br />
获取节点状态：0 - 没有子节点, -1 - 节点合拢, 1 - 节点展开<br />
_getOpenState(node)<br />
getOpenState(itemId)<br />
获取选中的节点Id<br />
getSelectedItemId()<br />
选中节点<br />
_selectItem(node,e)<br />
获取节点的index<br />
getIndexById(itemId)<br />
设置鼠标右键点击事件<br />
setOnRightClickHandler(func)<br />
设置鼠标点击事件<br />
setOnClickHandler(func)<br />
设置节点状态改变事件<br />
setOnSelectStateChange(func)<br />
设置允许动态加载xml文件（异步加载）<br />
setXMLAutoLoading(filePath)<br />
设置checkbox点击事件<br />
setOnCheckHandler(func)<br />
设置节点展开/合拢事件<br />
setOnOpenHandler(func)<br />
设置节点开始展/合拢开事件<br />
setOnOpenStartHandler(func)<br />
设置节点展开/合拢结束事件<br />
setOnOpenEndHandler(func)<br />
设置节点双击事件<br />
setOnDblClickHandler(func)<br />
展开节点及下面所有子节点<br />
_xopenAll(node)<br />
//增加了不传递itemId的判断（1494）<br />
openAllItems(itemId)//不传递itemId参数则合拢根节点<br />
根据id获取节点<br />
_globalIdStorageFind(itemId)<br />
合拢节点及其下所有子节点<br />
_xcloseAll(node)<br />
//修改了原来逻辑的一个错误（1521）<br />
closeAllItems(itemId)//不传递itemId参数则合拢根节点<br />
为节点增加用户自定义的数据<br />
//修正一个错误（1548）<br />
setUserData(itemId,name,value)<br />
获取用户自定义的数据<br />
getUserData(itemId,name)<br />
获取节点颜色<br />
getItemColor(itemId)<br />
设置节点颜色<br />
setItemColor(itemId,defaultColor,selectedColor)<br />
获取节点名称--(with HTML formatting, if any)<br />
getItemText(itemId)<br />
获取父节点id<br />
getParentId(itemId)<br />
更改节点id<br />
changeItemId(itemId,newItemId)<br />
标记被剪切的节点<br />
doCut()<br />
粘贴被剪切的节点到新的父节点下<br />
doPaste(itemId)<br />
清空被剪切的节点<br />
clearCut()<br />
移动节点<br />
_moveNode(itemObject,targetObject)<br />
允许三种状态的复选框（全选、不选、部分选中）<br />
enableThreeStateCheckboxes(mode)// 1 - on, 0 - off;<br />
设置鼠标悬浮事件<br />
setOnMouseInHandler(func)<br />
设置鼠标移走事件<br />
setOnMouseOutHandler(func)<br />
设置是否允许显示树图片<br />
enableTreeImages=function(mode)//1 - on, 0 - off<br />
设置是否允许固定模式(对于显示复选框的界面美观一些，但没有水平滚动条)<br />
enableFixedMode(mode)// - 1 - on, 0 - off<br />
是否显示复选框<br />
enableCheckBoxes(mode, hidden)//mode 0/1 hidden 0/1<br />
设置节点图片<br />
setStdImages(image1,image2,image3)//a0 - image for node without childrens a1 - image for closed node a2 - image for opened node<br />
设置是否显示树线<br />
enableTreeLines(mode)<br />
设置图片<br />
setImageArrays(arrayName,image1,image2,image3,image4,image5)//image1 - line crossed image image2 - image with top line image3 - image with bottom line image4 - image without line image5 - single root image<br />
展开当前节点（一节）<br />
_openItem(node)<br />
openItem(itemId)<br />
合拢当前节点（一节）<br />
closeItem(itemId)<br />
获取节点的层节数<br />
getLevel(itemId)<br />
设置节点是否允许被合拢<br />
setItemCloseable(itemId,flag)//flag 0/1<br />
对于展开节点返回子节点数量，对于未加载子节点的节点（异步加载）返回true<br />
hasChildren(itemId)<br />
获取节点下的子节点数<br />
_getLeafCount(itemNode)<br />
设置节点名称<br />
setItemText(itemId,newLabel,newTooltip)<br />
获取节点tip<br />
getItemTooltip(itemId)<br />
刷新节点<br />
refreshItem(itemId)<br />
设置节点图片<br />
setItemImage2(itemId, image1,image2,image3)//image1 - node without childrens image image2 - closed node image image3 - open node image<br />
设置节点图片<br />
setItemImage(itemId,image1,image2)//image1 - node without childrens image or closed node image (if image2 specified)&nbsp; image2 - open node image (optional)<br />
获取节点下所有子节点id以逗号分割<br />
getSubItems(itemId)<br />
getAllSubItems(itemId)<br />
获取节点的所有子节点<br />
_getAllScraggyItems(node)<br />
获取选中节点的名称--(with HTML formatting, if any)<br />
getSelectedItemText()<br />
设置节点的选中状态<br />
setCheck(itemId,state)//state - checkbox state (0/1/unsure)<br />
设置节点及所有子节点的选中状态<br />
setSubChecked(itemId,state)<br />
获取节点的选中状态 return: node state (0 - unchecked,1 - checked, 2 - third state)<br />
isItemChecked(itemId)<br />
删除节点的所有子节点<br />
deleteChildItems(itemId)<br />
删除节点<br />
deleteItem(itemId,selectParent) //selectParent - If true parent of deleted item get selection, else no selected items leaving in tree.<br />
在节点下创建一个节点，前三个参数是必须的<br />
insertNewNext(itemId,newItemId,itemText,itemActionHandler,image1,image2,image3,optionStr,childs)<br />
根据index获取节点下子节点的id<br />
getChildItemIdByIndex(itemId,index)//itemId 节点id<br />
设置拖动事件<br />
setDragHandler(func)<br />
设置是否允许拖拽<br />
//mode - enabled/disabled [ can be true/false/temporary_disabled - last value mean that tree can be D-n-D can be switched to true later ]<br />
//rmode - enabled/disabled drag and drop on super root<br />
enableDragAndDrop(mode,rmode)<br />
设置是否允许IE缓存<br />
preventIECashing=function(mode)//mode - enable/disable random seed ( disabled by default )<br />
设置是否允许选中节点名称高亮显示<br />
enableHighlighting(mode)//mode - 1 - on, 0 - off<br />
是否允许图片可点击和拖拽(clickable and dragable)<br />
enableActiveImages(mode)// mode - 1 - on, 0 - off<br />
设置节点获得焦点<br />
focusItem(itemId)<br />
获取所有无子节点的节点id<br />
getAllChildless()<br />
getAllLeafs()<br />
获取所有有子节点的节点id<br />
getAllItemsWithKids（）<br />
获取所有被选中节点id，不包括第三中状态的节点（部分选中的节点）<br />
getAllChecked()<br />
获取所有被选中节点id，包括第三中状态的节点（部分选中的节点）<br />
getAllCheckedBranches()<br />
获取节点下所有未选中的节点id，不传递itemId表示从根节点开始查找<br />
getAllUnchecked(itemId)<br />
获取所有部分选中的节点id（因部分子节点选中而被选中的节点）<br />
getAllPartiallyChecked()<br />
设置节点样式<br />
setItemStyle(itemId,style_string)<br />
设置是否允许拖拽图片<br />
enableImageDrag(mode)<br />
set function called when tree item draged over another item<br />
setOnDragIn(func)<br />
设置拖拽是是否允许自动滚动<br />
enableDragAndDropScrolling(mode)<br />
<br />
<br />
补充说明：加载树时，必须确保所有节点的id不重复，否则控件会为重复id自动生成一个随机数（原id+"_"+当前日期）。<br />
增加了一个dhtmlXTreeExtend.js对原类进行扩展，增加了getAllCheckedLeaf()，getAllUcCheckedLeaf()两个函数<br />
修改了1个bug：<br />
1 增加没有选中节点时执行展开/收缩选定节点时报没有parentId的bug<br />
dhtmlXTreeObject.prototype.setSubChecked=function(itemId,state){<br />
&nbsp;&nbsp; if(itemId)<br />
&nbsp;{<br />
&nbsp; var sNode=this._globalIdStorageFind(itemId);<br />
&nbsp; this._setSubChecked(state,sNode);<br />
&nbsp; this._correctCheckStates(sNode.parentObject);<br />
&nbsp;}<br />
}<br />
<br />
<br />
1 增加了未传递itemId参数时默认从根节点展开<br />
dhtmlXTreeObject.prototype.openAllItems=function(itemId)<br />
&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (itemId==window.undefined) itemId=this.rootId;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var temp=this._globalIdStorageFind(itemId);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!temp) return 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this._xopenAll(temp);<br />
&nbsp;&nbsp; };
<img src ="http://www.blogjava.net/cyantide/aggbug/329123.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2010-08-17 17:17 <a href="http://www.blogjava.net/cyantide/archive/2010/08/17/329123.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2 和 fckeditor 整合</title><link>http://www.blogjava.net/cyantide/archive/2010/06/28/324671.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Mon, 28 Jun 2010 06:32:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2010/06/28/324671.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/324671.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2010/06/28/324671.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/324671.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/324671.html</trackback:ping><description><![CDATA[1. 需重新编写filter,继承StrutsPrepareAndExecuteFilter<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.io.IOException;<br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.servlet.FilterChain;<br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.servlet.ServletException;<br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.servlet.ServletRequest;<br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.servlet.ServletResponse;<br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.servlet.http.HttpServletRequest;<br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter;<br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;StrutsAndFckFilter&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;StrutsPrepareAndExecuteFilter&nbsp;{<br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;doFilter(ServletRequest&nbsp;request,&nbsp;ServletResponse&nbsp;response,<br />
</span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FilterChain&nbsp;chain)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;IOException,&nbsp;ServletException&nbsp;{<br />
</span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletRequest&nbsp;httpRequest</span><span style="color: #000000;">=</span><span style="color: #000000;">(HttpServletRequest)request;<br />
</span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #000000;">"</span><span style="color: #000000;">/fckeditor/editor/filemanager/connectors</span><span style="color: #000000;">"</span><span style="color: #000000;">.equals(httpRequest.getServletPath())){<br />
</span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chain.doFilter(request,&nbsp;response);<br />
</span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff;">else</span><span style="color: #000000;">{<br />
</span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">.doFilter(request,&nbsp;response,&nbsp;chain);<br />
</span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">25</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">26</span>&nbsp;<span style="color: #000000;">}<br />
</span><span style="color: #008080;">27</span>&nbsp;</div>
2. 在classes目录添加 fckeditor.properties 文件<br />
&nbsp;&nbsp; 内容为 connector.userActionImpl=net.fckeditor.requestcycle.impl.EnabledUserAction<br />
<br />
3. 修改web.xml<br />
&nbsp;&nbsp; <br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #0000ff;">&lt;</span><span style="color: #800000;">filter</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">filter-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">struts2</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">filter-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">filter-class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">com.capinfo.cms.common.filter.StrutsAndFckFilter</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">filter-class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">filter</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #0000ff;">&lt;</span><span style="color: #800000;">servlet</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">servlet-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">ConnectorServlet</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">servlet-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">servlet-class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; net.fckeditor.connector.ConnectorServlet<br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">servlet-class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">load-on-startup</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">1</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">load-on-startup</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">11</span> <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">servlet</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">13</span> <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">servlet-mapping</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">servlet-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">ConnectorServlet</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">servlet-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;Do&nbsp;not&nbsp;wrap&nbsp;this&nbsp;line&nbsp;otherwise&nbsp;Glassfish&nbsp;will&nbsp;fail&nbsp;to&nbsp;load&nbsp;this&nbsp;file&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">url-pattern</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">/fckeditor/editor/filemanager/connectors/*</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">url-pattern</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">17</span> <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">servlet-mapping</span><span style="color: #0000ff;">&gt;</span></div>
综上所述之后,整合完毕<br />
<br />
<img src ="http://www.blogjava.net/cyantide/aggbug/324671.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2010-06-28 14:32 <a href="http://www.blogjava.net/cyantide/archive/2010/06/28/324671.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle10 树形 子节点查询 语句</title><link>http://www.blogjava.net/cyantide/archive/2010/05/19/321389.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Wed, 19 May 2010 08:49:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2010/05/19/321389.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/321389.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2010/05/19/321389.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/321389.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/321389.html</trackback:ping><description><![CDATA[<strong>select</strong> t1.id <strong>from</strong> unitinfotable t1 <strong>start with</strong> t1.id= 1004 <strong>CONNECT BY PRIOR</strong> t1.id=t1.unitinfoid<br />
<br />
查询1004节点下的所有子节点<br />
<br />
<img src ="http://www.blogjava.net/cyantide/aggbug/321389.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2010-05-19 16:49 <a href="http://www.blogjava.net/cyantide/archive/2010/05/19/321389.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SiteMesh页面布局组件 转载</title><link>http://www.blogjava.net/cyantide/archive/2010/05/18/321276.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Tue, 18 May 2010 07:05:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2010/05/18/321276.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/321276.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2010/05/18/321276.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/321276.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/321276.html</trackback:ping><description><![CDATA[<span><span lang="EN-US"><span> </span>SiteMesh</span><span>是一个用来在<span lang="EN-US">JSP</span>中实现页面布局和装饰（<span lang="EN-US">layout and decoration</span>）的框架组件，能够帮助网站开发人员较容易实现页面中动态内容和静态装饰外观的分离。提供了一种在网站中更有效的组织页面布局的方式。</span></span>
<p class="MsoPlainText" style="margin: 0cm 0cm 0pt;"><span><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>SiteMesh</span><span>设计思想是，用户发送<span lang="EN-US">request</span>至服务器，服务器根据此<span lang="EN-US">request</span>生成动态数据，生成网页，准备返回给客户端。就在返回前，<span lang="EN-US">SiteMesh</span>进行拦截，对此网页进行解析，将<span lang="EN-US">title</span>、<span lang="EN-US">body</span>等部分拆解出来，套上模板后，再返回给客户端。由于<span lang="EN-US">SiteMesh</span>在返回客户端的最后一步工作，此时的网页已经具备了标准的<span lang="EN-US">html</span>网页格式，因此<span lang="EN-US">SiteMesh</span>只需解析标准的<span lang="EN-US">html</span>网页，无需考虑各个<span lang="EN-US">Web</span>应用是应用了<span lang="EN-US">JSP</span>、<span lang="EN-US">ASP</span>，还是<span lang="EN-US">Velocity</span>技术，相当灵活。</span></span></p>
<p class="MsoPlainText" style="margin: 0cm 0cm 0pt;"><span><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>SiteMesh</span><span>使用了<span lang="EN-US">Decorator</span>的设计模式。</span></span></p>
<p class="MsoPlainText" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span>&nbsp;</span></span></p>
<p class="MsoPlainText" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span><span>本文为大家展示一个简单的<span lang="EN-US">SiteMesh</span>例子。</span></span></p>
<p class="MsoPlainText" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>首先创建一个<span lang="EN-US">web</span>工程<span lang="EN-US">.</span>名字就叫做<span lang="EN-US">SitemeshSample.</span>将<span lang="EN-US">sitemesh-2.3.jar,</span></span><span lang="EN-US"><span style="font-size: small;"> </span></span><span lang="EN-US">commons-collections.jar</span><span>放到<span lang="EN-US">lib</span>目录下。</span></span></p>
<p class="MsoPlainText" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left;" align="left"><span><span>在<span lang="EN-US">web.xml</span>中加入如下片段<span lang="EN-US">:</span></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>&lt;filter&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;filter-name&gt;sitemesh&lt;/filter-name&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;filter-class&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>com.opensymphony.module.sitemesh.filter.PageFilter</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/filter-class&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>&lt;/filter&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>&lt;filter-mapping&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;filter-name&gt;sitemesh&lt;/filter-name&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;url-pattern&gt;/*&lt;/url-pattern&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>&lt;/filter-mapping&gt;</span></p>
<p class="MsoPlainText" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: teal;"><span>这里定义了一个过滤器</span></span><span lang="EN-US">.</span><span style="font-size: 10pt; color: teal;"><span>所有的请求都交由</span></span><span lang="EN-US">sitemesh</span><span><span style="font-size: 10pt; color: teal;">来处理</span></span></p>
<p class="MsoPlainText" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoPlainText" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>在<span lang="EN-US">WEB-INF</span>下创建一个<span lang="EN-US">decorators.xml</span>文件<span lang="EN-US">,</span>内容如下<span lang="EN-US">:</span></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>&lt;?xml version="1.0" encoding="UTF-8"?&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>&lt;decorators defaultdir="/decorators"&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp; </span>&lt;decorator name="main" page="main.jsp"&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp; </span>&lt;pattern&gt;/*&lt;/pattern&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp; </span>&lt;/decorator&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>&lt;/decorators&gt;</span></p>
<p class="MsoPlainText" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span></span><span><span style="font-size: 10pt; color: teal;">这是定义了模板页，也就是所有页面在返回给客户端之前，先在这里加上装饰，套上模板。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US">defaultdir</span><span lang="EN-US">=</span><span lang="EN-US">"/decorators"</span><span>说明了模板页的路径。</span><span lang="EN-US">&lt;</span><span lang="EN-US">decorator </span><span lang="EN-US">name</span><span lang="EN-US">=</span><span lang="EN-US">"main" </span><span lang="EN-US">page</span><span lang="EN-US">=</span><span lang="EN-US">"main.jsp"</span><span lang="EN-US">&gt;</span><span>模板页的名称。</span><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US">&lt;</span><span lang="EN-US">pattern</span><span lang="EN-US">&gt;</span><span lang="EN-US">/*</span><span lang="EN-US">&lt;/</span><span lang="EN-US">pattern</span><span lang="EN-US">&gt;</span><span>表示对所有的</span><span lang="EN-US">response</span><span>进行处理</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span></span><span>在</span><span lang="EN-US">web</span><span>下面建一个文件夹取名</span><span lang="EN-US">decorators.</span><span>在</span><span lang="EN-US">decoratots</span><span>下面创建上面定义的模板页面</span><span lang="EN-US">main.jsp,</span><span>内容如下</span><span lang="EN-US">:</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US">&lt;%@ </span><span lang="EN-US">page </span><span lang="EN-US">language</span><span lang="EN-US">=</span><span lang="EN-US">"java" </span><span lang="EN-US">import</span><span lang="EN-US">=</span><span lang="EN-US">"java.util.*" </span><span lang="EN-US">pageEncoding</span><span lang="EN-US">=</span><span lang="EN-US">"UTF-8"</span><span lang="EN-US">%&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US">&lt;%@ </span><span lang="EN-US">taglib </span><span lang="EN-US">uri</span><span lang="EN-US">=</span><span lang="EN-US">"http://www.opensymphony.com/sitemesh/decorator" </span><span lang="EN-US">prefix</span><span lang="EN-US">=</span><span lang="EN-US">"decorator"</span><span lang="EN-US">%&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US">&lt;!</span><span lang="EN-US">DOCTYPE </span><span lang="EN-US">HTML </span><span lang="EN-US">PUBLIC </span><span lang="EN-US">"-//W3C//DTD HTML 4.01 Transitional//EN"</span><span lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US">&lt;</span><span lang="EN-US">html</span><span lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US">&lt;</span><span lang="EN-US">head</span><span lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US">&lt;</span><span lang="EN-US">title</span><span lang="EN-US">&gt;&lt;</span><span lang="EN-US">decorator:title </span><span lang="EN-US">/&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US">&lt;/</span><span lang="EN-US">title</span><span lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US">&lt;</span><span lang="EN-US">body</span><span lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US">&lt;</span><span lang="EN-US">p</span><span lang="EN-US">&gt;</span><span lang="EN-US">Add head decorator...</span><span lang="EN-US">&lt;/</span><span lang="EN-US">p</span><span lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US">&lt;</span><span lang="EN-US">decorator:body </span><span lang="EN-US">/&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US">&lt;</span><span lang="EN-US">p</span><span lang="EN-US">&gt;</span><span lang="EN-US">Add foot decorator...</span><span lang="EN-US">&lt;/</span><span lang="EN-US">p</span><span lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US">&lt;/</span><span lang="EN-US">body</span><span lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US">&lt;/</span><span lang="EN-US">html</span><span lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span>说明</span><span lang="EN-US">:</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US">&lt;%@ </span><span lang="EN-US">taglib </span><span lang="EN-US">uri</span><span lang="EN-US">=</span><span lang="EN-US">"http://www.opensymphony.com/sitemesh/decorator" </span><span lang="EN-US">prefix</span><span lang="EN-US">=</span><span lang="EN-US">"decorator"</span><span lang="EN-US">%&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span>此处为</span><span lang="EN-US">decorator</span><span>标签的声明。因为我们下面要使用到它</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US">&lt;</span><span lang="EN-US">decorator:title </span><span lang="EN-US">/&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span>把请求的原始页面的</span><span lang="EN-US">title</span><span>内容插入到</span><span lang="EN-US">&lt;title&gt;&lt;/title&gt;,</span><span>比如我们要请求</span><span lang="EN-US">index.jsp</span><span>页面的时候。会把</span><span lang="EN-US">index.jsp</span><span>中的</span><span lang="EN-US">title</span><span>的内容放入到这里</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US">&lt;</span><span lang="EN-US">decorator:body </span><span lang="EN-US">/&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span>把请求的原始页面的</span><span lang="EN-US">body</span><span>内容插入到</span><span lang="EN-US">&lt;body&gt;&lt;/body&gt;,</span><span>发现没有我们在这句的前面加上了</span><span lang="EN-US">&lt;</span><span lang="EN-US">p</span><span lang="EN-US">&gt;</span><span lang="EN-US">Add head decorator...</span><span lang="EN-US">&lt;/</span><span lang="EN-US">p</span><span lang="EN-US">&gt;</span><span>和</span><span lang="EN-US">&lt;</span><span lang="EN-US">p</span><span lang="EN-US">&gt;</span><span lang="EN-US">Add foot decorator...</span><span lang="EN-US">&lt;/</span><span lang="EN-US">p</span><span lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span>相当于给我们请求的页面的</span><span lang="EN-US">body</span><span>内容加上了头部和尾部</span><span lang="EN-US">.</span><span>实现了模板功能。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span>在</span><span lang="EN-US">WEB-INF</span><span>下创建我们要请求访问的页面</span><span lang="EN-US">index.jsp</span><span>，内容如下</span><span lang="EN-US">:</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US">&lt;%@ </span><span lang="EN-US">page </span><span lang="EN-US">language</span><span lang="EN-US">=</span><span lang="EN-US">"java" </span><span lang="EN-US">import</span><span lang="EN-US">=</span><span lang="EN-US">"java.util.*" </span><span lang="EN-US">pageEncoding</span><span lang="EN-US">=</span><span lang="EN-US">"UTF-8"</span><span lang="EN-US">%&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US">&lt;!</span><span lang="EN-US">DOCTYPE </span><span lang="EN-US">HTML </span><span lang="EN-US">PUBLIC </span><span lang="EN-US">"-//W3C//DTD HTML 4.01 Transitional//EN"</span><span lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US">&lt;</span><span lang="EN-US">html</span><span lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US">&lt;</span><span lang="EN-US">head</span><span lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US">&lt;</span><span lang="EN-US">title</span><span lang="EN-US">&gt;</span><span lang="EN-US">SiteMesh Sample Site</span><span lang="EN-US">&lt;/</span><span lang="EN-US">title</span><span lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US">&lt;/</span><span lang="EN-US">head</span><span lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US">&lt;</span><span lang="EN-US">body</span><span lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Welcome to the SiteMesh sample...</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US">&lt;/</span><span lang="EN-US">body</span><span lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US">&lt;/</span><span lang="EN-US">html</span><span lang="EN-US">&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span>把</span><span lang="EN-US">web</span><span>工程部署到</span><span lang="EN-US">tomcat</span><span>容器中。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span>输入</span><span lang="EN-US"><a href="http://localhost:8080/SitemeshSample/index.jsp"><span>http://localhost:8080/</span><span>SitemeshSample/index.jsp</span></a></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span>页面效果如下：</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US">Add head decorator...</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US">Welcome to the SiteMesh sample... </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span lang="EN-US">Add foot decorator...</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span>不难发现，我们</span><span lang="EN-US">index.jsp</span><span>中只有</span><span lang="EN-US">Welcome to the SiteMesh sample... </span><span>一句。但是在返回给我们之前套上了</span><span lang="EN-US">main.jsp</span><span>模板页。在它的前面和后面分别加上了一句话。通过</span><span lang="EN-US">Sitemesh</span><span>我们可以很容易实现页面中动态内容和静态装饰外观的分离。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><em><span lang="EN-US">&nbsp;</span></em></p>
<img src ="http://www.blogjava.net/cyantide/aggbug/321276.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2010-05-18 15:05 <a href="http://www.blogjava.net/cyantide/archive/2010/05/18/321276.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java vm xms xmx查看</title><link>http://www.blogjava.net/cyantide/archive/2010/03/19/315982.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Fri, 19 Mar 2010 15:24:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2010/03/19/315982.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/315982.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2010/03/19/315982.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/315982.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/315982.html</trackback:ping><description><![CDATA[&lt;%@ page language="java" contentType="text/html; charset=UTF-8"%&gt;<br />
&lt;html&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&lt;%= "TotalMemory :::: " + (Runtime.getRuntime().totalMemory()/(1024*1024) + "M") %&gt;&nbsp; <br />
&nbsp;&nbsp; &lt;%="Max Memory :::: " + (Runtime.getRuntime().maxMemory()/(1024*1024) + "M")%&gt;&nbsp; <br />
&nbsp;&nbsp; &lt;%="Free Memory :::: " + (Runtime.getRuntime().freeMemory()/(1024*1024) + "M")%&gt;&nbsp;&nbsp;&nbsp; <br />
&lt;/html&gt;<br />
<br />
<br />
<br />
cmd<br />
&nbsp;&nbsp; java -Xmx1024M -Xms1024M -version
<img src ="http://www.blogjava.net/cyantide/aggbug/315982.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2010-03-19 23:24 <a href="http://www.blogjava.net/cyantide/archive/2010/03/19/315982.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>centos5 安装pidgin 报gst_registry_fork_set_enabled错误</title><link>http://www.blogjava.net/cyantide/archive/2010/03/15/315431.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Mon, 15 Mar 2010 02:17:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2010/03/15/315431.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/315431.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2010/03/15/315431.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/315431.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/315431.html</trackback:ping><description><![CDATA[更新gstreamer<br />
命令：yum update gstreamer*
<img src ="http://www.blogjava.net/cyantide/aggbug/315431.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2010-03-15 10:17 <a href="http://www.blogjava.net/cyantide/archive/2010/03/15/315431.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux php 编译安装 configure参数</title><link>http://www.blogjava.net/cyantide/archive/2010/03/11/315189.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Thu, 11 Mar 2010 08:45:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2010/03/11/315189.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/315189.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2010/03/11/315189.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/315189.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/315189.html</trackback:ping><description><![CDATA[configure:<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">.</span><span style="color: #000000;">/</span><span style="color: #000000;">configure&nbsp;</span><span style="color: #000000;">--</span><span style="color: #000000;">prefix</span><span style="color: #000000;">=/</span><span style="color: #000000;">opt</span><span style="color: #000000;">/</span><span style="color: #000000;">php&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">with</span><span style="color: #000000;">-</span><span style="color: #000000;">apxs2</span><span style="color: #000000;">=/</span><span style="color: #000000;">usr</span><span style="color: #000000;">/</span><span style="color: #000000;">sbin</span><span style="color: #000000;">/</span><span style="color: #000000;">apxs&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">with</span><span style="color: #000000;">-</span><span style="color: #000000;">mysql</span><span style="color: #000000;">=/</span><span style="color: #000000;">usr</span><span style="color: #000000;">/</span><span style="color: #000000;">include</span><span style="color: #000000;">/</span><span style="color: #000000;">mysql&nbsp;</span><span style="color: #000000;">--</span><span style="color: #000000;">with</span><span style="color: #000000;">-</span><span style="color: #000000;">gd</span><span style="color: #000000;">=/</span><span style="color: #000000;">usr</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">--</span><span style="color: #000000;">with</span><span style="color: #000000;">-</span><span style="color: #000000;">jpeg</span><span style="color: #000000;">-</span><span style="color: #000000;">dir</span><span style="color: #000000;">=/</span><span style="color: #000000;">usr</span><span style="color: #000000;">/</span><span style="color: #000000;">lib&nbsp;</span><span style="color: #000000;">--</span><span style="color: #000000;">with</span><span style="color: #000000;">-</span><span style="color: #000000;">png</span><span style="color: #000000;">-</span><span style="color: #000000;">dir</span><span style="color: #000000;">=/</span><span style="color: #000000;">usr</span><span style="color: #000000;">/</span><span style="color: #000000;">lib&nbsp;</span><span style="color: #000000;">--</span><span style="color: #000000;">with</span><span style="color: #000000;">-</span><span style="color: #000000;">zlib</span><span style="color: #000000;">-</span><span style="color: #000000;">dir</span><span style="color: #000000;">=/</span><span style="color: #000000;">usr</span><span style="color: #000000;">/</span><span style="color: #000000;">lib&nbsp;</span><span style="color: #000000;">--</span><span style="color: #000000;">with</span><span style="color: #000000;">-</span><span style="color: #000000;">freetype</span><span style="color: #000000;">-</span><span style="color: #000000;">dir</span><span style="color: #000000;">=/</span><span style="color: #000000;">usr</span><span style="color: #000000;">/</span><span style="color: #000000;">lib</span></div>
<img src ="http://www.blogjava.net/cyantide/aggbug/315189.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2010-03-11 16:45 <a href="http://www.blogjava.net/cyantide/archive/2010/03/11/315189.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>软件 开发 万般变化</title><link>http://www.blogjava.net/cyantide/archive/2010/02/20/313457.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Sat, 20 Feb 2010 06:46:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2010/02/20/313457.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/313457.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2010/02/20/313457.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/313457.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/313457.html</trackback:ping><description><![CDATA[<p><img alt="" src="http://www.blogjava.net/images/blogjava_net/cyantide/123.jpg" border="0" /></p>
<img src ="http://www.blogjava.net/cyantide/aggbug/313457.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2010-02-20 14:46 <a href="http://www.blogjava.net/cyantide/archive/2010/02/20/313457.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>页面调用ocx控件时，客户端无法打开的解决办法</title><link>http://www.blogjava.net/cyantide/archive/2010/01/06/308446.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Wed, 06 Jan 2010 07:08:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2010/01/06/308446.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/308446.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2010/01/06/308446.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/308446.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/308446.html</trackback:ping><description><![CDATA[<p><br />
</p>
<p>调用ocx的网页在本地Ie可以打开,但把网页放到服务器上就不行了</p>
<p>解决：在客户端设置服务器网址为受信任的站点，在将受信任的站点的安全级别设置为最低。</p>
<img src ="http://www.blogjava.net/cyantide/aggbug/308446.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2010-01-06 15:08 <a href="http://www.blogjava.net/cyantide/archive/2010/01/06/308446.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>apache2 php5 配置</title><link>http://www.blogjava.net/cyantide/archive/2009/12/10/305463.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Thu, 10 Dec 2009 10:08:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2009/12/10/305463.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/305463.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2009/12/10/305463.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/305463.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/305463.html</trackback:ping><description><![CDATA[httpd.conf 文件：<br />
末尾加<br />
LoadModule php5_module "d:/php/php5apache2_2.dll"<br />
AddType application/x-httpd-php .php<br />
AddType application/x-httpd-php .htm<br />
# ScriptAlias /php/ "d:/php/"<br />
# AddType application/x-httpd-php .php<br />
# Action application/x-httpd-php "/php/php-cgi.exe"<br />
<br />
&nbsp;DirectoryIndex index.html 后添加 index.php<br />
<br />
php inf<br />
<meta content="Word.Document" name="ProgId" />
<meta content="Microsoft Word 12" name="Generator" />
<meta content="Microsoft Word 12" name="Originator" />
<link href="file:///D:%5CDOCUME%7E1%5CCHENHA%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" rel="File-List" />
<link href="file:///D:%5CDOCUME%7E1%5CCHENHA%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" rel="themeData" />
<link href="file:///D:%5CDOCUME%7E1%5CCHENHA%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" rel="colorSchemeMapping" /><!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:TrackMoves/>
<w:TrackFormatting/>
<w:PunctuationKerning/>
<w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
<w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
<w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>EN-US</w:LidThemeOther>
<w:LidThemeAsian>ZH-CN</w:LidThemeAsian>
<w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
<w:Compatibility>
<w:SpaceForUL/>
<w:BalanceSingleByteDoubleByteWidth/>
<w:DoNotLeaveBackslashAlone/>
<w:ULTrailSpace/>
<w:DoNotExpandShiftReturn/>
<w:AdjustLineHeightInTable/>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:DontVertAlignCellWithSp/>
<w:DontBreakConstrainedForcedTables/>
<w:DontVertAlignInTxbx/>
<w:Word11KerningPairs/>
<w:CachedColBalance/>
<w:UseFELayout/>
</w:Compatibility>
<w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
<m:mathPr>
<m:mathFont m:val="Cambria Math" />
<m:brkBin m:val="before" />
<m:brkBinSub m:val="--" />
<m:smallFrac m:val="off" />
<m:dispDef/>
<m:lMargin m:val="0" />
<m:rMargin m:val="0" />
<m:defJc m:val="centerGroup" />
<m:wrapIndent m:val="1440" />
<m:intLim m:val="subSup" />
<m:naryLim m:val="undOvr" />
</m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles deflockedstate="false" defunhidewhenused="true" defsemihidden="true" defqformat="false" defpriority="99" latentstylecount="267">
<w:LsdException locked="false" priority="0" semihidden="false" unhidewhenused="false" qformat="true" name="Normal" />
<w:LsdException locked="false" priority="9" semihidden="false" unhidewhenused="false" qformat="true" name="heading 1" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 2" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 3" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 4" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 5" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 6" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 7" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 8" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 9" />
<w:LsdException locked="false" priority="39" name="toc 1" />
<w:LsdException locked="false" priority="39" name="toc 2" />
<w:LsdException locked="false" priority="39" name="toc 3" />
<w:LsdException locked="false" priority="39" name="toc 4" />
<w:LsdException locked="false" priority="39" name="toc 5" />
<w:LsdException locked="false" priority="39" name="toc 6" />
<w:LsdException locked="false" priority="39" name="toc 7" />
<w:LsdException locked="false" priority="39" name="toc 8" />
<w:LsdException locked="false" priority="39" name="toc 9" />
<w:LsdException locked="false" priority="35" qformat="true" name="caption" />
<w:LsdException locked="false" priority="10" semihidden="false" unhidewhenused="false" qformat="true" name="Title" />
<w:LsdException locked="false" priority="1" name="Default Paragraph Font" />
<w:LsdException locked="false" priority="11" semihidden="false" unhidewhenused="false" qformat="true" name="Subtitle" />
<w:LsdException locked="false" priority="22" semihidden="false" unhidewhenused="false" qformat="true" name="Strong" />
<w:LsdException locked="false" priority="20" semihidden="false" unhidewhenused="false" qformat="true" name="Emphasis" />
<w:LsdException locked="false" priority="59" semihidden="false" unhidewhenused="false" name="Table Grid" />
<w:LsdException locked="false" unhidewhenused="false" name="Placeholder Text" />
<w:LsdException locked="false" priority="1" semihidden="false" unhidewhenused="false" qformat="true" name="No Spacing" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 1" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 1" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 1" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 1" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 1" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 1" />
<w:LsdException locked="false" unhidewhenused="false" name="Revision" />
<w:LsdException locked="false" priority="34" semihidden="false" unhidewhenused="false" qformat="true" name="List Paragraph" />
<w:LsdException locked="false" priority="29" semihidden="false" unhidewhenused="false" qformat="true" name="Quote" />
<w:LsdException locked="false" priority="30" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Quote" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 1" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 1" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 1" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 1" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 1" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 1" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 1" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 1" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 2" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 2" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 2" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 2" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 2" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 2" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 2" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 2" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 2" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 2" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 2" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 2" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 2" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 2" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 3" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 3" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 3" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 3" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 3" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 3" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 3" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 3" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 3" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 3" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 3" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 3" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 3" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 3" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 4" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 4" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 4" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 4" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 4" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 4" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 4" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 4" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 4" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 4" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 4" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 4" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 4" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 4" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 5" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 5" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 5" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 5" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 5" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 5" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 5" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 5" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 5" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 5" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 5" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 5" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 5" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 5" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 6" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 6" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 6" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 6" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 6" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 6" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 6" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 6" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 6" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 6" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 6" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 6" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 6" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 6" />
<w:LsdException locked="false" priority="19" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Emphasis" />
<w:LsdException locked="false" priority="21" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Emphasis" />
<w:LsdException locked="false" priority="31" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Reference" />
<w:LsdException locked="false" priority="32" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Reference" />
<w:LsdException locked="false" priority="33" semihidden="false" unhidewhenused="false" qformat="true" name="Book Title" />
<w:LsdException locked="false" priority="37" name="Bibliography" />
<w:LsdException locked="false" priority="39" qformat="true" name="TOC Heading" />
</w:LatentStyles>
</xml><![endif]-->
<style>
<!-- /* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-alt:SimSun;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
@font-face
{font-family:"Cambria Math";
panose-1:0 0 0 0 0 0 0 0 0 0;
mso-font-charset:1;
mso-generic-font-family:roman;
mso-font-format:other;
mso-font-pitch:variable;
mso-font-signature:0 0 0 0 0 0;}
@font-face
{font-family:"\@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-unhide:no;
mso-style-qformat:yes;
mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
mso-pagination:none;
font-size:10.5pt;
mso-bidi-font-size:12.0pt;
font-family:"Times New Roman","serif";
mso-fareast-font-family:宋体;
mso-font-kerning:1.0pt;}
.MsoChpDefault
{mso-style-type:export-only;
mso-default-props:yes;
font-size:10.0pt;
mso-ansi-font-size:10.0pt;
mso-bidi-font-size:10.0pt;
mso-ascii-font-family:"Times New Roman";
mso-fareast-font-family:宋体;
mso-hansi-font-family:"Times New Roman";
mso-font-kerning:0pt;}
/* Page Definitions */
@page
{mso-page-border-surround-header:no;
mso-page-border-surround-footer:no;}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
mso-header-margin:36.0pt;
mso-footer-margin:36.0pt;
mso-paper-source:0;}
div.Section1
{page:Section1;}
-->
</style>
<!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-qformat:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:宋体;
mso-fareast-theme-font:minor-fareast;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;
mso-font-kerning:1.0pt;}
</style>
<![endif]--><span lang="EN-US" style="font-size: 12pt; font-family: 宋体">1</span><span style="font-size: 12pt; font-family: 宋体">、将<span lang="EN-US">php.ini-recommended</span>文件重命名为<span lang="EN-US">php.ini</span>并将其剪到系统所在目录下<span lang="EN-US">(</span><span lang="EN-US">XP</span>的<span lang="EN-US">Windows</span>目录下<span lang="EN-US">),<br />
2</span>、将<span lang="EN-US">extension_dir </span>改为<span lang="EN-US">php/ext</span>所在目录，如<span lang="EN-US"> "d:\php\ext"</span>；<span lang="EN-US"><br />
3</span>、将<span lang="EN-US">doc_root </span>改为第一步中的同样目录，如<span lang="EN-US"> "E:\Program Files\Apache Software Foundation\Apache2.2\htdocs"</span>；<span lang="EN-US"><br />
4</span>、找到<span lang="EN-US"> ;session.save_path = "/tmp" ,</span>将<span lang="EN-US">';'</span>去掉<span lang="EN-US">,</span>设置你保存<span lang="EN-US">session</span>的目录，如<span lang="EN-US">session.save_path = "D:/php/session_temp"</span>；<span lang="EN-US"><br />
5</span>、然后把下面几句前面的分号去掉<span lang="EN-US">,</span>以更好支持<span lang="EN-US">Mysql and PHPmyadmin <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; extension=php_mbstring.dll<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; extension=php_gd2.dll<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; extension=php_mysql.dll<br />
6、将相应的dll拷贝至window目录下<br />
<!--[if !supportLineBreakNewLine]--><br />
<!--[endif]--></span></span><br />
<br />
<img src ="http://www.blogjava.net/cyantide/aggbug/305463.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2009-12-10 18:08 <a href="http://www.blogjava.net/cyantide/archive/2009/12/10/305463.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts 2中的OGNL (转帖)</title><link>http://www.blogjava.net/cyantide/archive/2009/11/03/300845.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Tue, 03 Nov 2009 02:16:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2009/11/03/300845.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/300845.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2009/11/03/300845.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/300845.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/300845.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Struts 2中的OGNL 本人是一个EL（Expression Language，以下译为表达式语言）的支持者。因为我对&lt;% %&gt;写法极为反感，忘记了在那本书上看到的一句话——&#8220;使用标志（Tag）的一个目的就是避免在JSP页面中出现过多的&lt;%%&gt;的语句，使页面与后台代码分离。&#8221;表达式语言主要有以下几大好处：    避免(MyTyp...&nbsp;&nbsp;<a href='http://www.blogjava.net/cyantide/archive/2009/11/03/300845.html'>阅读全文</a><img src ="http://www.blogjava.net/cyantide/aggbug/300845.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2009-11-03 10:16 <a href="http://www.blogjava.net/cyantide/archive/2009/11/03/300845.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jquery boxy 使用 转载</title><link>http://www.blogjava.net/cyantide/archive/2009/10/13/298030.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Tue, 13 Oct 2009 02:20:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2009/10/13/298030.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/298030.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2009/10/13/298030.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/298030.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/298030.html</trackback:ping><description><![CDATA[<p>弹出对话框：<br />
<br />
<br />
alert对话框<br />
Boxy.alert("内容",动作);<br />
$('#ask-actuator').click(function() {<br />
&nbsp;<wbr>&nbsp;<wbr>Boxy.alert("Alert! Alert!", function() { alert("Alert closed!"); });<br />
&nbsp;<wbr>&nbsp;<wbr>return false;<br />
&nbsp;<wbr>&nbsp;<wbr>});<br />
<br />
<br />
确认对话框<br />
Boxy.confirm("内容",动作,{参数});<br />
$('#ask-actuator').click(function() {<br />
&nbsp;<wbr>&nbsp;<wbr>Boxy.confirm("Please confirm?", function() { alert("Confirmed!"); });<br />
&nbsp;<wbr>&nbsp;<wbr>return false;<br />
&nbsp;<wbr>&nbsp;<wbr>});<br />
<br />
<br />
//弹出询问框<br />
Boxy.ask("内容", {"按钮值1":"按钮1", "按钮值":"按钮2"}, "动作", {参数});<br />
&nbsp;<wbr>&nbsp;<wbr>$('#ask-actuator').click(function() {<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>Boxy.ask("这里是询问内容?", ["按钮1", "按钮2", "按钮3"], function(val) {<br />
&nbsp;<wbr>&nbsp;<wbr>if(val=="按钮3"){<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>alert('哈哈，被你选了');<br />
&nbsp;<wbr>&nbsp;<wbr>}else{<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>alert("您选择了按钮"+val);<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>}<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>}, {title: "这里是标题"});<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>return false;<br />
&nbsp;<wbr>&nbsp;<wbr>});<br />
$('#ask-actuator').click(function() {<br />
&nbsp;<wbr>&nbsp;<wbr>Boxy.ask("这里是询问内容?",<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>{"1":"按钮1", "2":"按钮2"},&nbsp;<wbr>&nbsp;<wbr>//"1代表值"&nbsp;<wbr>&nbsp;<wbr>"按钮1"代表名称<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>function(val) { alert(val); },<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>{title: "这里是标题"}<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>);<br />
&nbsp;<wbr>&nbsp;<wbr>return false;<br />
});<br />
<br />
自定义弹出对话框<br />
$('#cs').click(function() {<br />
&nbsp;<wbr>&nbsp;<wbr><br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>new Boxy("&lt;div&gt;&lt;a href='#' onclick='Boxy.get(this).hide();'&gt;这里是内容&lt;/a&gt;"+<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>"&lt;a href='#' onclick='Boxy.get(this).tween(400, 400);return false;'&gt;变大&lt;/a&gt;&lt;/div&gt;",<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>{<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>title:"你好",&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>//标题<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>closeText:"[关闭]",&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>//关闭文字<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>modal:true,&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>//背景是否变暗<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>fixed:true,&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>//窗口是否固定<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>cache:true,&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>//是否被遮挡<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>draggable:true,&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>//这个设定窗口是否可以拖动，要定义title才有效，设定了modal就无效<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>center:true,&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>//弹出对话框是否居中<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>x:50,<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>y:50,&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>//设定窗口位置值为％多少，设定此后center会被覆盖<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>afterDrop:function(){},&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>//关闭对话框后执行的｛IE下面关闭不了,原因不明｝<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>afterShow:function(){},&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>//打开对话框后执行的<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>afterHide:function(){}&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>//隐藏对话框后执行的<br />
<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>});<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>return false;<br />
});<br />
</p>
<img src ="http://www.blogjava.net/cyantide/aggbug/298030.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2009-10-13 10:20 <a href="http://www.blogjava.net/cyantide/archive/2009/10/13/298030.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate 锁 转帖</title><link>http://www.blogjava.net/cyantide/archive/2009/10/09/297510.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Fri, 09 Oct 2009 02:30:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2009/10/09/297510.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/297510.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2009/10/09/297510.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/297510.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/297510.html</trackback:ping><description><![CDATA[hibernate锁机制包括悲观锁和乐观锁<br />
<br />
1.悲观锁：<br />
<br />
它指的是对数据被外界修改持保守态度。假定任何时刻存取数据时，都可能有另一个客户也正在存取同一笔数据，为了保持数据被操作的一致性，于是对数据采取了<a style="width: 20px; height: 20px; text-indent: 20px; background-repeat: no-repeat; background-image: url(/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif);" name="baidusnap1"></a><strong style="color: black; background-color: #a0ffff;">数据库</strong>层次的<a style="width: 20px; height: 20px; text-indent: 20px; background-repeat: no-repeat; background-image: url(/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif);" name="baidusnap0"></a><strong style="color: black; background-color: #ffff66;">锁定</strong>状态，依靠<strong style="color: black; background-color: #a0ffff;">数据库</strong>提供的锁机制来实现。<br />
<br />
基于jdbc实现的<strong style="color: black; background-color: #a0ffff;">数据库</strong>加锁如下：<br />
<br />
select * from account where name="Erica" for update.在更新的过程中，<strong style="color: black; background-color: #a0ffff;">数据库</strong>处于加锁状态，任何其他的针对本条数据的操作都将被延迟。本次事务提交后<a style="width: 20px; height: 20px; text-indent: 20px; background-repeat: no-repeat; background-image: url(/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif);" name="baidusnap3"></a><strong style="color: black; background-color: #ff9999;">解锁</strong>。<br />
<br />
而hibernate悲观锁的具体实现如下：<br />
<br />
String sql="查询语句";<br />
Query query=session.createQuery(sql);<br />
query.setLockMode("对象"，LockModel.UPGRADE);<br />
<br />
说到这里，就提到了hiernate的加锁模式：<br />
<br />
LockMode.NONE ： 无锁机制。<br />
LockMode.WRITE ：Hibernate在Insert和Update记录的时候会自动获取。<br />
LockMode.READ ： Hibernate在读取记录的时候会自动获取。<br />
<br />
这三种加锁模式是供hibernate内部使用的，与<strong style="color: black; background-color: #a0ffff;">数据库</strong>加锁无关<br />
<br />
LockMode.UPGRADE：利用<strong style="color: black; background-color: #a0ffff;">数据库</strong>的for update字句加锁。<br />
<br />
在这里我们要注意的是：只有在查询开始之前（也就是hiernate生成sql语句之前）加锁，才会真正通过<strong style="color: black; background-color: #a0ffff;">数据库</strong>的锁机制加锁处理。否则，数据已经通过不包含for updata子句的sql语句加载进来，所谓的<strong style="color: black; background-color: #a0ffff;">数据库</strong>加锁也就无从谈起。<br />
<br />
但是，从系统的性能上来考虑，对于单机或小系统而言，这并不成问题，然而如果是在网络上的系统，同时间会有许多联机，假设有数以百计或上千甚至更多的并发访问出现，我们该怎么办？如果等到<strong style="color: black; background-color: #a0ffff;">数据库</strong><strong style="color: black; background-color: #ff9999;">解锁</strong>我们再进行下面的操作，我们浪费的资源是多少？--这也就导致了乐观锁的产生。<br />
<br />
2.乐观锁：<br />
<br />
乐观<strong style="color: black; background-color: #ffff66;">锁定</strong>（optimistic locking）则乐观的认为资料的存取很少发生同时存取的问题，因而不作<strong style="color: black; background-color: #a0ffff;">数据库</strong>层次上的<strong style="color: black; background-color: #ffff66;">锁定</strong>，为了维护正确的数据，乐观<strong style="color: black; background-color: #ffff66;">锁定</strong>采用应用程序上的逻辑实现版本控制的方法。<br />
<br />
例如若有两个客户端，A客户先读取了账户余额100元，之后B客户也读取了账户余额100元的数据，A客户提取了50元，对<strong style="color: black; background-color: #a0ffff;">数据库</strong>作了变更，此时<strong style="color: black; background-color: #a0ffff;">数据库</strong>中的余额为50元，B客户也要提取30元，根据其所取得的资料，100-30将为70余额，若此时再对<strong style="color: black; background-color: #a0ffff;">数据库</strong>进行变更，最后的余额就会不正确。<br />
<br />
在不实行悲观<strong style="color: black; background-color: #ffff66;">锁定</strong>策略的情况下，数据不一致的情况一但发生，有几个解决的方法，一种是先更新为主，一种是后更新的为主，比较复杂的就是检查发生变动的数据来实现，或是检查所有属性来实现乐观<strong style="color: black; background-color: #ffff66;">锁定</strong>。<br />
<br />
Hibernate 中透过版本号检查来实现后更新为主，这也是Hibernate所推荐的方式，在<strong style="color: black; background-color: #a0ffff;">数据库</strong>中加入一个VERSON栏记录，在读取数据时连同版本号一同读取，并在更新数据时递增版本号，然后比对版本号与<strong style="color: black; background-color: #a0ffff;">数据库</strong>中的版本号，如果大于<strong style="color: black; background-color: #a0ffff;">数据库</strong>中的版本号则予以更新，否则就回报错误。<br />
<br />
以刚才的例子，A客户读取账户余额1000元，并连带读取版本号为5的话，B客户此时也读取账号余额1000元，版本号也为5，A客户在领款后账户余额为500，此时将版本号加1，版本号目前为6，而<strong style="color: black; background-color: #a0ffff;">数据库</strong>中版本号为5，所以予以更新，更新<strong style="color: black; background-color: #a0ffff;">数据库</strong>后，<strong style="color: black; background-color: #a0ffff;">数据库</strong>此时余额为500，版本号为6，B客户领款后要变更<strong style="color: black; background-color: #a0ffff;">数据库</strong>，其版本号为5，但是<strong style="color: black; background-color: #a0ffff;">数据库</strong>的版本号为6，此时不予更新，B客户数据重新读取<strong style="color: black; background-color: #a0ffff;">数据库</strong>中新的数据并重新进行业务流程才变更<strong style="color: black; background-color: #a0ffff;">数据库</strong>。<br />
<br />
以Hibernate实现版本号控制<strong style="color: black; background-color: #ffff66;">锁定</strong>的话，我们的对象中增加一个version属性，例如：<br />
<br />
<p class="code">&lt;public&nbsp;class&nbsp;Account&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;int&nbsp;version;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;....<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setVersion(int&nbsp;version)&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.version&nbsp;=&nbsp;version;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;getVersion()&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;version;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;....<br />
<br />
}<br />
</p>
<br />
而在映像文件中，我们使用optimistic-lock属性设定version控制，&lt;id&gt;属性栏之后增加一个&lt;version&gt;标签，如下：<br />
<br />
<p class="code">&lt;hibernate-mapping&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;class&nbsp;name="onlyfun.caterpillar.Account"&nbsp;talble="ACCOUNT"<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;optimistic-lock="version"&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;id...../&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;version&nbsp;name="version"&nbsp;column="VERSION"/&gt;<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;....<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/class&gt;<br />
<br />
&lt;/hibernate-mapping&gt;<br />
</p>
<br />
设定好版本控制之后，在上例中如果B 客户试图更新数据，将会引发StableObjectStateException例外，我们可以捕捉这个例外，在处理中重新读取<strong style="color: black; background-color: #a0ffff;">数据库</strong>中的数据，同时将 B客户目前的数据与<strong style="color: black; background-color: #a0ffff;">数据库</strong>中的数据秀出来，让B客户有机会比对不一致的数据，以决定要变更的部份，或者您可以设计程式自动读取新的资料，并重复扣款业务流程，直到数据可以更新为止，这一切可以在背景执行，而不用让您的客户知道。<br />
<br />
但是乐观锁也有不能解决的问题存在：上面已经提到过乐观锁机制的实现往往基于系统中的数据存储逻辑，在我们的系统中实现，来自外部系统的用户余额更新不受我们系统的控制，有可能造成非法数据被更新至<strong style="color: black; background-color: #a0ffff;">数据库</strong>。因此我们在做电子商务的时候，一定要小心的注意这项存在的问题，采用比较合理的逻辑验证，避免数据执行错误。<br />
<br />
也可以在使用Session的load()或是lock()时指定<strong style="color: black; background-color: #ffff66;">锁定</strong>模式以进行<strong style="color: black; background-color: #ffff66;">锁定</strong>。<br />
<br />
如果<strong style="color: black; background-color: #a0ffff;">数据库</strong>不支持所指定的<strong style="color: black; background-color: #ffff66;">锁定</strong>模式，Hibernate会选择一个合适的<strong style="color: black; background-color: #ffff66;">锁定</strong>替换，而不是丢出一个例外。
<img src ="http://www.blogjava.net/cyantide/aggbug/297510.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2009-10-09 10:30 <a href="http://www.blogjava.net/cyantide/archive/2009/10/09/297510.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate 锁机制 转帖</title><link>http://www.blogjava.net/cyantide/archive/2009/10/09/297509.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Fri, 09 Oct 2009 02:29:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2009/10/09/297509.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/297509.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2009/10/09/297509.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/297509.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/297509.html</trackback:ping><description><![CDATA[前几天看到GOING MM关于<a class="postTitle2" href="../../goingmm/archive/2005/11/28/21642.html" id="viewpost1_TitleUrl">Hibernate Transaction</a> 的描述,这里顺便转载一篇hiberntae中锁机制的文章:<br />
<br />
&nbsp;&nbsp;
悲观锁定&nbsp;假定任何时刻存取数据时，都可能有另一个客户也正在存取同一笔数据，因而对数据采取了数据库层次的锁定状态，在锁定的时间内其它的客户不能对资
料进行存取，对于单机或小系统而言，这并不成问题，然而如果是在网络上的系统，同时间会有许多联机，如果每一次读取数据都造成锁定，其后继的存取就必须等
待，这将造成效能上的问题，造成后继使用者的长时间等待。<span lang="EN-US"><br />
乐观锁定（optimistic locking）则乐观的认为资料的存取很少发生同时存取的问题，因而不作数据库层次上的锁定，为了维护正确的数据，乐观锁定使用应用程序上的逻辑实现版本控制的解决。<br />
例如若有两个客户端，A客户先读取了账户余额1000元，之后B客户也读取了账户余额1000元的数据，A客户提取了500元，对数据库作了变更，此时
数据库中的余额为500元，B客户也要提取300元，根据其所取得的资料，1000-300将为700余额，若此时再对数据库进行变更，最后的余额就会不
正确。<br />
在不实行悲观锁定策略的情况下，数据不一致的情况一但发生，有几个解决的方法，一种是先更新为主，一种是后更新的为主，比较复杂的就是检查发生变动的数据来实现，或是检查所有属性来实现乐观锁定。<br />
Hibernate中透过版本号检查来实现后更新为主，这也是Hibernate所推荐的方式，在数据库中加入一个VERSON栏记录，在读取数据时连
同版本号一同读取，并在更新数据时递增版本号，然后比对版本号与数据库中的版本号，如果大于数据库中的版本号则予以更新，否则就回报错误。<br />
以刚
才的例子，A客户读取账户余额1000元，并连带读取版本号为5的话，B客户此时也读取账号余额1000元，版本号也为5，A客户在领款后账户余额
为500，此时将版本号加1，版本号目前为6，而数据库中版本号为5，所以予以更新，更新数据库后，数据库此时余额为500，版本号为6，B客户领款后要
变更数据库，其版本号为5，但是数据库的版本号为6，此时不予更新，B客户数据重新读取数据库中新的数据并重新进行业务流程才变更数据库。<br />
以Hibernate实现版本号控制锁定的话，我们的对象中增加一个version属性，例如：</span><span style="font-family: 宋体; font-size: 12pt;"> <span lang="EN-US"><o:p></o:p></span></span>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US">public class Account {<o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>private&nbsp;int version;<o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>....<o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>public void setVersion(int version) {<o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>this.version = version;<o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>}<o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>public&nbsp;int getVersion() {<o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return version;<o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>}<o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>....<o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US">}<o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US"><br />
而在映像文件中，我们使用optimistic-lock属性设定version控制，&lt;id&gt;属性栏之后增加一个&lt;version&gt;标签，例如： <o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US">&lt;hibernate-mapping&gt;<o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>&lt;class name="onlyfun.caterpillar.Account" talble="ACCOUNT"<o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>optimistic-lock="version"&gt;<o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;id...../&gt;<o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;version name="version" column="VERSION"/&gt;<o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>....<o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>&lt;/class&gt;<o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US">&lt;/hibernate-mapping&gt;<o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US"><br />
</span><span style="font-family: 宋体; font-size: 12pt;">　设定好版本控制之后，在上例中如果<span lang="EN-US">B
客户试图更新数据，将会引发StableObjectStateException例外，我们可以捕捉这个例外，在处理中重新读取数据库中的数据，同时将
B客户目前的数据与数据库中的数据秀出来，让B客户有机会比对不一致的数据，以决定要变更的部份，或者您可以设计程
式自动读取新的资料，并重复扣款业务流程，直到数据可以更新为止，这一切可以在背景执行，而不用让您的客户知道。<br />
</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-family: 宋体; font-size: 12pt;"><span lang="EN-US"><br />
&nbsp; 悲观锁定</span></span><span style="font-family: 宋体; font-size: 12pt;">在多个客户端可能读取同一笔数据或同时更新一笔数据的情况下，必须要有访问控制的手段，防止同一个数据被修改而造成混乱，最简单的手段就是对数据进行锁定，在自己进行数据读取或更新等动作时，锁定其它客户端不能对同一笔数据进行任何的动作。<span lang="EN-US"><br />
悲观锁定（Pessimistic Locking）一如其名称所示，悲观的认定每次资料存取时，其它的客户端也会存取同一笔数据，因此对该笔数据进行锁定，直到自己操作完成后解除锁定。</span></span><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US"><br />
</span><span style="font-family: 宋体; font-size: 12pt;">　悲观锁定通常透过系统或数据库本身的功能来实现，依赖系统或数据库本身提供的锁定机制，<span lang="EN-US">Hibernate即是如此，我们可以利用Query或Criteria的setLockMode()方法来设定要锁定的表或列（row）及其锁定模式，锁定模式有以下的几个：</span></span><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>
<ul type="disc">
    <li class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US">LockMode.WRITE：在insert或update时进行锁定，Hibernate会在save()方法时自动获得锁定。<o:p></o:p></span>
    </li>
    <li class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US">LockMode.UPGRADE：利用SELECT &#8230; FOR UPDATE进行锁定。<o:p></o:p></span>
    </li>
    <li class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US">LockMode.UPGRADE_NOWAIT：利用SELECT &#8230; FOR UPDATE NOWAIT进行锁定，在Oracle环境下使用。<o:p></o:p></span>
    </li>
    <li class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US">LockMode.READ：在读取记录时Hibernate会自动获得锁定。<o:p></o:p></span>
    </li>
    <li class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;"><span style="font-family: 宋体; font-size: 12pt;" lang="EN-US">LockMode.NONE：没有锁定。<o:p></o:p></span></li>
</ul>
<span style="font-family: 宋体; font-size: 12pt;">　也可以在使用<span lang="EN-US">Session的load()或是lock()时指定锁定模式以进行锁定。<br />
如果数据库不支持所指定的锁定模式，Hibernate会选择一个合适的锁定替换，而不是丢出一个例外（Hibernate参考手册10.6）。</span></span>
<img src ="http://www.blogjava.net/cyantide/aggbug/297509.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2009-10-09 10:29 <a href="http://www.blogjava.net/cyantide/archive/2009/10/09/297509.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2 ognl用法</title><link>http://www.blogjava.net/cyantide/archive/2009/09/24/296246.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Thu, 24 Sep 2009 02:24:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2009/09/24/296246.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/296246.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2009/09/24/296246.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/296246.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/296246.html</trackback:ping><description><![CDATA[#、%和$符号在OGNL表达式中经常出现，而这三种符号也是开发者不容易掌握和理解的部分。在这里笔者简单介绍它们的相应用途。<br />
<br />
1．#符号的用途一般有三种。<br />
&nbsp;&nbsp;
1)访问非根对象属性，例如示例中的#session.msg表达式，由于Struts
2中值栈被视为根对象，所以访问其他非根对象时，需要加#前缀。实际上，#相当于ActionContext.
getContext()；#session.msg表达式相当于ActionContext.getContext().getSession().
getAttribute(&#8221;msg&#8221;) 。<br />
&nbsp;&nbsp;&nbsp;&nbsp;2)用于过滤和投影（projecting）集合，如示例中的persons.{?#this.age&gt;20}。<br />
&nbsp;&nbsp;&nbsp;&nbsp;3)用来构造Map，例如示例中的#{'foo1':'bar1','foo2':'bar2'}。<br />
<br />
2．%符号<br />
%符号的用途是在标志的属性为字符串类型时，计算OGNL表达式的值。如下面的代码所示：<br />
构造Map<br />
&lt;s:set name="foobar" value="#{'foo1':'bar','foo2':'bar2'}" /&gt;<br />
<br />
&lt;p&gt;The value of key "foo1" is &lt;s:property value="#foobar['foo1']" /&gt;&lt;/p&gt;<br />
<br />
&lt;p&gt;不使用％：&lt;s:url value="#foobar['foo1']" /&gt;&lt;/p&gt;<br />
<br />
&lt;p&gt;使用％：&lt;s:url value="%{#foobar['foo1']}" /&gt;&lt;/p&gt;<br />
<br />
3．$符号<br />
$符号主要有两个方面的用途。<br />
<br />
&nbsp;&nbsp; 在国际化资源文件中，引用OGNL表达式，例如国际化资源文件中的代码：reg.agerange=国际化资源信息：年龄必须在${min}同${max}之间。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;在Struts 2框架的配置文件中引用OGNL表达式，例如下面的代码片断所示：<br />
&lt;validators&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;field name=&#8221;intb&#8221;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;field-validator type=&#8221;int&#8221;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param name=&#8221;min&#8221;&gt;10&lt;/param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param name=&#8221;max&#8221;&gt;100&lt;/param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;message&gt;BAction-test校验：数字必须为${min}为${max}之间！&lt;/message&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/field-validator&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/field&gt;<br />
&lt;/validators&gt;
<img src ="http://www.blogjava.net/cyantide/aggbug/296246.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2009-09-24 10:24 <a href="http://www.blogjava.net/cyantide/archive/2009/09/24/296246.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql 字符串 连接</title><link>http://www.blogjava.net/cyantide/archive/2009/09/24/296231.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Thu, 24 Sep 2009 01:26:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2009/09/24/296231.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/296231.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2009/09/24/296231.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/296231.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/296231.html</trackback:ping><description><![CDATA[不能用'+'号,要使用CONCAT( )函数
<img src ="http://www.blogjava.net/cyantide/aggbug/296231.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2009-09-24 09:26 <a href="http://www.blogjava.net/cyantide/archive/2009/09/24/296231.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PowerDesigner 去除sql语句中表和字段的引号,和将Comment(注释)及Name(名称)内容互相COPY的VBS代码 (转帖)</title><link>http://www.blogjava.net/cyantide/archive/2009/09/21/295866.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Mon, 21 Sep 2009 07:04:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2009/09/21/295866.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/295866.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2009/09/21/295866.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/295866.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/295866.html</trackback:ping><description><![CDATA[<p><font face="Verdana"><br />
在PowerDesiger中，在physical data model 中找到菜单中的Database下的Edit current DBMS中,选择Script-&gt;Sql-&gt;Format，有一项CaseSensitivityUsingQuote，它的comment为&#8220;Determines if the case sensitivity for identifiers is managed using double quotes&#8221;，表示是否适用双引号来规定标识符的大小写，可以看到右边的values默认值为&#8220;YES&#8221;,改为&#8220;No&#8221;，点击【应用】按钮。<br />
&nbsp;&nbsp; 这样再生成sql语句时，表和字段名上是没有引号了。<br />
</font></p>
<p><font face="Verdana">在用PowerDesigner时.常常在NAME或Comment中写中文在Code中写英文.Name只会显示给我们看,Code会使用在代码中.但Comment中的文字会保存到数据库TABLE的Description中,有时候我们写好了Name再写一次Comment很麻烦.以下两段代码就可以解决这个问题.<br />
代码一:将Name中的字符COPY至Comment中</font></p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><font face="Verdana"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008000;">'</span><span style="color: #008000;">******************************************************************************&nbsp;</span><span style="color: #008000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />'</span><span style="color: #008000;">*&nbsp;&nbsp;&nbsp;File:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name2comment.vbs&nbsp;</span><span style="color: #008000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />'</span><span style="color: #008000;">*&nbsp;&nbsp;&nbsp;Purpose:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Database&nbsp;&nbsp;&nbsp;generation&nbsp;&nbsp;&nbsp;cannot&nbsp;&nbsp;&nbsp;use&nbsp;&nbsp;&nbsp;object&nbsp;&nbsp;&nbsp;names&nbsp;&nbsp;&nbsp;anymore&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />'</span><span style="color: #008000;">&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;in&nbsp;&nbsp;&nbsp;version&nbsp;&nbsp;&nbsp;7&nbsp;&nbsp;&nbsp;and&nbsp;&nbsp;&nbsp;above.&nbsp;</span><span style="color: #008000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />'</span><span style="color: #008000;">&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;It&nbsp;&nbsp;&nbsp;always&nbsp;&nbsp;&nbsp;uses&nbsp;&nbsp;&nbsp;the&nbsp;&nbsp;&nbsp;object&nbsp;&nbsp;&nbsp;codes.&nbsp;</span><span style="color: #008000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />'</span><span style="color: #008000;">&nbsp;</span><span style="color: #008000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />'</span><span style="color: #008000;">&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;In&nbsp;&nbsp;&nbsp;case&nbsp;&nbsp;&nbsp;the&nbsp;&nbsp;&nbsp;object&nbsp;&nbsp;&nbsp;codes&nbsp;&nbsp;&nbsp;are&nbsp;&nbsp;&nbsp;not&nbsp;&nbsp;&nbsp;aligned&nbsp;&nbsp;&nbsp;with&nbsp;&nbsp;&nbsp;your&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />'</span><span style="color: #008000;">&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;object&nbsp;&nbsp;&nbsp;names&nbsp;&nbsp;&nbsp;in&nbsp;&nbsp;&nbsp;your&nbsp;&nbsp;&nbsp;model,&nbsp;&nbsp;&nbsp;this&nbsp;&nbsp;&nbsp;script&nbsp;&nbsp;&nbsp;will&nbsp;&nbsp;&nbsp;copy&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />'</span><span style="color: #008000;">&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;the&nbsp;&nbsp;&nbsp;object&nbsp;&nbsp;&nbsp;Name&nbsp;&nbsp;&nbsp;onto&nbsp;&nbsp;&nbsp;the&nbsp;&nbsp;&nbsp;object&nbsp;&nbsp;&nbsp;Comment&nbsp;&nbsp;&nbsp;for&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />'</span><span style="color: #008000;">&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;the&nbsp;&nbsp;&nbsp;Tables&nbsp;&nbsp;&nbsp;and&nbsp;&nbsp;&nbsp;Columns.&nbsp;</span><span style="color: #008000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />'</span><span style="color: #008000;">&nbsp;</span><span style="color: #008000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />'</span><span style="color: #008000;">*&nbsp;&nbsp;&nbsp;Title:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />'</span><span style="color: #008000;">*&nbsp;&nbsp;&nbsp;Version:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.0&nbsp;</span><span style="color: #008000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />'</span><span style="color: #008000;">*&nbsp;&nbsp;&nbsp;Company:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sybase&nbsp;&nbsp;&nbsp;Inc.&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />'</span><span style="color: #008000;">******************************************************************************&nbsp;</span><span style="color: #008000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">Option</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">Explicit</span><span style="color: #000000;">&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />ValidationMode&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">True</span><span style="color: #000000;">&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />InteractiveMode&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;im_Batch&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">Dim</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;mdl&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">'</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;the&nbsp;&nbsp;&nbsp;current&nbsp;&nbsp;&nbsp;model&nbsp;</span><span style="color: #008000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008000;">'</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;get&nbsp;&nbsp;&nbsp;the&nbsp;&nbsp;&nbsp;current&nbsp;&nbsp;&nbsp;active&nbsp;&nbsp;&nbsp;model&nbsp;</span><span style="color: #008000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">Set</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;mdl&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;ActiveModel&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">If</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;(mdl&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">Is</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">Nothing</span><span style="color: #000000;">)&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">Then</span><span style="color: #000000;">&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">MsgBox</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">There&nbsp;&nbsp;&nbsp;is&nbsp;&nbsp;&nbsp;no&nbsp;&nbsp;&nbsp;current&nbsp;&nbsp;&nbsp;Model&nbsp;</span><span style="color: #800000;">"</span><span style="color: #000000;">&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">ElseIf</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">Not</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;mdl.IsKindOf(PdPDM.cls_Model)&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">Then</span><span style="color: #000000;">&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">MsgBox</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">The&nbsp;&nbsp;&nbsp;current&nbsp;&nbsp;&nbsp;model&nbsp;&nbsp;&nbsp;is&nbsp;&nbsp;&nbsp;not&nbsp;&nbsp;&nbsp;an&nbsp;&nbsp;&nbsp;Physical&nbsp;&nbsp;&nbsp;Data&nbsp;&nbsp;&nbsp;model.&nbsp;</span><span style="color: #800000;">"</span><span style="color: #000000;">&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">Else</span><span style="color: #000000;">&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ProcessFolder&nbsp;&nbsp;&nbsp;mdl&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">End</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">If</span><span style="color: #000000;">&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008000;">'</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;This&nbsp;&nbsp;&nbsp;routine&nbsp;&nbsp;&nbsp;copy&nbsp;&nbsp;&nbsp;name&nbsp;&nbsp;&nbsp;into&nbsp;&nbsp;&nbsp;comment&nbsp;&nbsp;&nbsp;for&nbsp;&nbsp;&nbsp;each&nbsp;&nbsp;&nbsp;table,&nbsp;&nbsp;&nbsp;each&nbsp;&nbsp;&nbsp;column&nbsp;&nbsp;&nbsp;and&nbsp;&nbsp;&nbsp;each&nbsp;&nbsp;&nbsp;view&nbsp;</span><span style="color: #008000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />'</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;of&nbsp;&nbsp;&nbsp;the&nbsp;&nbsp;&nbsp;current&nbsp;&nbsp;&nbsp;folder&nbsp;</span><span style="color: #008000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">Private</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">sub</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;ProcessFolder(folder)&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">Dim</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;Tab&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">'</span><span style="color: #008000;">running&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table&nbsp;</span><span style="color: #008000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">each</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;Tab&nbsp;&nbsp;&nbsp;in&nbsp;&nbsp;&nbsp;folder.tables&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">not</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;tab.isShortcut&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">then</span><span style="color: #000000;">&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tab.comment&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;tab.name&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">Dim</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;col&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">'</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;running&nbsp;&nbsp;&nbsp;column&nbsp;</span><span style="color: #008000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">each</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;col&nbsp;&nbsp;&nbsp;in&nbsp;&nbsp;&nbsp;tab.columns&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;col.comment</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;col.name&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">next</span><span style="color: #000000;">&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">end</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">next</span><span style="color: #000000;">&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">Dim</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;view&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">'</span><span style="color: #008000;">running&nbsp;&nbsp;&nbsp;view&nbsp;</span><span style="color: #008000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">each</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;view&nbsp;&nbsp;&nbsp;in&nbsp;&nbsp;&nbsp;folder.Views&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">not</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;view.isShortcut&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">then</span><span style="color: #000000;">&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.comment&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;view.name&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">end</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">next</span><span style="color: #000000;">&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">'</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;go&nbsp;&nbsp;&nbsp;into&nbsp;&nbsp;&nbsp;the&nbsp;&nbsp;&nbsp;sub-packages&nbsp;</span><span style="color: #008000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">Dim</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;f&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">'</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;running&nbsp;&nbsp;&nbsp;folder&nbsp;</span><span style="color: #008000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">For</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">Each</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;f&nbsp;&nbsp;&nbsp;In&nbsp;&nbsp;&nbsp;folder.Packages&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">not</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;f.IsShortcut&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">then</span><span style="color: #000000;">&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ProcessFolder&nbsp;&nbsp;&nbsp;f&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">end</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">Next</span><span style="color: #000000;">&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">end</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">sub</span><span style="color: #000000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span></font></div>
<p><font face="Verdana">代码二:将Comment中的字符COPY至Name中</font></p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><font face="Verdana"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff;">Option</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">Explicit</span><span style="color: #000000;">&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />ValidationMode&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">True</span><span style="color: #000000;">&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />InteractiveMode&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;im_Batch&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">Dim</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;mdl&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">'</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;the&nbsp;&nbsp;&nbsp;current&nbsp;&nbsp;&nbsp;model&nbsp;</span><span style="color: #008000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008000;">'</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;get&nbsp;&nbsp;&nbsp;the&nbsp;&nbsp;&nbsp;current&nbsp;&nbsp;&nbsp;active&nbsp;&nbsp;&nbsp;model&nbsp;</span><span style="color: #008000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">Set</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;mdl&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;ActiveModel&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">If</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;(mdl&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">Is</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">Nothing</span><span style="color: #000000;">)&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">Then</span><span style="color: #000000;">&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">MsgBox</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">There&nbsp;&nbsp;&nbsp;is&nbsp;&nbsp;&nbsp;no&nbsp;&nbsp;&nbsp;current&nbsp;&nbsp;&nbsp;Model&nbsp;</span><span style="color: #800000;">"</span><span style="color: #000000;">&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">ElseIf</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">Not</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;mdl.IsKindOf(PdPDM.cls_Model)&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">Then</span><span style="color: #000000;">&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">MsgBox</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">The&nbsp;&nbsp;&nbsp;current&nbsp;&nbsp;&nbsp;model&nbsp;&nbsp;&nbsp;is&nbsp;&nbsp;&nbsp;not&nbsp;&nbsp;&nbsp;an&nbsp;&nbsp;&nbsp;Physical&nbsp;&nbsp;&nbsp;Data&nbsp;&nbsp;&nbsp;model.&nbsp;</span><span style="color: #800000;">"</span><span style="color: #000000;">&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">Else</span><span style="color: #000000;">&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ProcessFolder&nbsp;&nbsp;&nbsp;mdl&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">End</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">If</span><span style="color: #000000;">&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">Private</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">sub</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;ProcessFolder(folder)&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">On</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">Error</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">Resume</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">Next</span><span style="color: #000000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">Dim</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;Tab&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">'</span><span style="color: #008000;">running&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table&nbsp;</span><span style="color: #008000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">each</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;Tab&nbsp;&nbsp;&nbsp;in&nbsp;&nbsp;&nbsp;folder.tables&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">not</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;tab.isShortcut&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">then</span><span style="color: #000000;">&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tab.name&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;tab.comment<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">Dim</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;col&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">'</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;running&nbsp;&nbsp;&nbsp;column&nbsp;</span><span style="color: #008000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">each</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;col&nbsp;&nbsp;&nbsp;in&nbsp;&nbsp;&nbsp;tab.columns&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;col.comment</span><span style="color: #000000;">=</span><span style="color: #800000;">""</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">then</span><span style="color: #000000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;col.name</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;col.comment&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">end</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">next</span><span style="color: #000000;">&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">end</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">next</span><span style="color: #000000;">&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">Dim</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;view&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">'</span><span style="color: #008000;">running&nbsp;&nbsp;&nbsp;view&nbsp;</span><span style="color: #008000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">each</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;view&nbsp;&nbsp;&nbsp;in&nbsp;&nbsp;&nbsp;folder.Views&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">not</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;view.isShortcut&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">then</span><span style="color: #000000;">&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.name&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;view.comment&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">end</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">next</span><span style="color: #000000;">&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">'</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;go&nbsp;&nbsp;&nbsp;into&nbsp;&nbsp;&nbsp;the&nbsp;&nbsp;&nbsp;sub-packages&nbsp;</span><span style="color: #008000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">Dim</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;f&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">'</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;running&nbsp;&nbsp;&nbsp;folder&nbsp;</span><span style="color: #008000;"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">For</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">Each</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;f&nbsp;&nbsp;&nbsp;In&nbsp;&nbsp;&nbsp;folder.Packages&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">not</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;f.IsShortcut&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">then</span><span style="color: #000000;">&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ProcessFolder&nbsp;&nbsp;&nbsp;f&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">end</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">Next</span><span style="color: #000000;">&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff;">end</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">sub</span></font></div>
<font face="Verdana"></font>
<img src ="http://www.blogjava.net/cyantide/aggbug/295866.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2009-09-21 15:04 <a href="http://www.blogjava.net/cyantide/archive/2009/09/21/295866.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring Bean作用域介绍(转帖)</title><link>http://www.blogjava.net/cyantide/archive/2009/09/14/294980.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Mon, 14 Sep 2009 02:30:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2009/09/14/294980.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/294980.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2009/09/14/294980.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/294980.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/294980.html</trackback:ping><description><![CDATA[<br />
<br />
singleton：SpringIoc容器只会创建该Bean的唯一实例，所有的请求和引用都只使用这个实例
<br />
Property:&nbsp; 每次请求都创建一个实例
<br />
request:&nbsp;&nbsp;&nbsp;
在一次Http请求中，容器会返回该Bean的同一个实例，而对于不同的用户请求，会返回不同的实例。需要注意的是，该作用域仅在基于Web的
Spring ApplicationContext情形下有效，以下的session和global Session也是如此
<br />
session：同上，唯一的区别是请求的作用域变为了session
<br />
global session：全局的HttpSession中，容器会返回该bean的同一个实例，典型为在是使用portlet context的时候有效（这个概念本人也不懂）
<br />
<br />
注意：如果要用到request，session，global session时需要配置
<br />
<br />
servlet2.4及以上：
<br />
在web.xml中添加：
<br />
&lt;listener&gt;
<br />
&nbsp;&nbsp;&nbsp; &lt;listener-class&gt;org.springframework.web.context.scope.RequestContextListener /&gt;
<br />
&lt;/listener&gt;
<br />
<br />
servlet2.4以下：
<br />
需要配置一个过滤器
<br />
&lt;filter&gt;
<br />
&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;XXXX&lt;/filter-name&gt;
<br />
&nbsp;&nbsp;&nbsp; &lt;filter-class&gt;org.springframework.web.filter.RequestContextFilter&lt;/filter-class&gt;
<br />
&lt;filter-mapping&gt;
<br />
&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;XXXX&lt;/filter-name&gt;
<br />
&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
<br />
&lt;/filter-mapping&gt;
<br />
<br />
另外，从2.0开始，可以自己定义作用域，但需要实现scope，并重写get和remove方法
<br />
<br />
特别要引起注意的是：
<br />
&nbsp;&nbsp;
一般情况下前面两种作用域是够用的，但如果有这样一种情况：singleton类型的bean引用一个prototype的bean时会出现问题，因为
singleton只初始化一次，但prototype每请求一次都会有一个新的对象，但prototype类型的bean是singleton类型
bean的一个属性，理所当然不可能有新prototpye的bean产生，与我们的要求不符
<br />
<br />
解决方法：
<br />
1.放弃Ioc，这与设计初衷不符，并代码间会有耦合
<br />
2，Lookup方法注入，推荐
<br />
<br />
但在用Lookup方法注入时也需要注意一点：需要在引用的Bean中定一个一个抽象地返回被引用对象的方法
<br />
<br />
package com.huyong.lookup;
<br />
<br />
import java.util.Calendar;
<br />
<br />
/**
<br />
* @author HuYong Email:yate7571@hotmail.com
<br />
*/
<br />
public class CurrentTime {
<br />
private Calendar now = Calendar.getInstance();
<br />
<br />
public void printCurrentTime() {
<br />
System.out.println("Current Time:" + now.getTime());
<br />
}
<br />
<br />
}
<br />
<br />
<br />
package com.huyong.lookup;
<br />
<br />
/**
<br />
* @author HuYong Email:yate7571@hotmail.com
<br />
*/
<br />
public abstract class LookupBean {
<br />
private CurrentTime currentTime;
<br />
<br />
public CurrentTime getCurrentTime() {
<br />
return currentTime;
<br />
}
<br />
<br />
public void setCurrentTime(CurrentTime currentTime) {
<br />
this.currentTime = currentTime;
<br />
<br />
}
<br />
public abstract CurrentTime createCurrentTime();
<br />
<br />
}
<br />
<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
<br />
&lt;beans xmlns="http://www.springframework.org/schema/beans"
<br />
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<br />
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"&gt;
<br />
<br />
&lt;bean id="currentTime" class="com.huyong.lookup.CurrentTime"
<br />
scope="prototype"&gt;
<br />
&lt;/bean&gt;
<br />
&lt;bean id="lookupBean" class="com.huyong.lookup.LookupBean"
<br />
scope="singleton"&gt;
<br />
&lt;lookup-method name="createCurrentTime" bean="currentTime" /&gt;
<br />
&lt;property name="currentTime" ref="currentTime"&gt;&lt;/property&gt;
<br />
&lt;/bean&gt;
<br />
<br />
&lt;/beans&gt;
<br />
<br />
<br />
Main Test：
<br />
package com.huyong.lookup;
<br />
<br />
import org.springframework.beans.factory.BeanFactory;
<br />
import org.springframework.beans.factory.xml.XmlBeanFactory;
<br />
import org.springframework.core.io.ClassPathResource;
<br />
<br />
/**
<br />
* @author HuYong Email:yate7571@hotmail.com
<br />
*/
<br />
public class LookupMain {
<br />
<br />
/**
<br />
* @param args
<br />
* @throws Exception
<br />
*/
<br />
public static void main(String[] args) throws Exception {
<br />
ClassPathResource resource = new ClassPathResource(
<br />
"applicationContext.xml");
<br />
BeanFactory factory = new XmlBeanFactory(resource);
<br />
<br />
LookupBean lookupBean = (LookupBean) factory.getBean("lookupBean");
<br />
System.out.println("----------first time---------");
<br />
System.out.println("getCurrentTime:");
<br />
lookupBean.getCurrentTime().printCurrentTime();
<br />
System.out.println("createCurrentTime:");
<br />
lookupBean.createCurrentTime().printCurrentTime();
<br />
<br />
Thread.sleep(12345);
<br />
<br />
System.out.println("---------second time---------");
<br />
System.out.println("getCurrentTime:");
<br />
LookupBean lookupBean02 = (LookupBean) factory.getBean("lookupBean");
<br />
lookupBean02.getCurrentTime().printCurrentTime();
<br />
System.out.println("createCurrentTime:");
<br />
lookupBean02.createCurrentTime().printCurrentTime();
<br />
<br />
}
<br />
<br />
}
<img src ="http://www.blogjava.net/cyantide/aggbug/294980.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2009-09-14 10:30 <a href="http://www.blogjava.net/cyantide/archive/2009/09/14/294980.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java面试题</title><link>http://www.blogjava.net/cyantide/archive/2009/01/13/251063.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Tue, 13 Jan 2009 01:41:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2009/01/13/251063.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/251063.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2009/01/13/251063.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/251063.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/251063.html</trackback:ping><description><![CDATA[<p><font style="background-color: #cce8cf">第一，谈谈final, finally, finalize的区别。 </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">　final 用于声明属性，方法和类，分别表示属性不可变，方法不可覆盖，类不可继承。finally是异常处理语句结构的一部分，表示总是执行。finalize是 Object类的一个方法，在垃圾收集器执行的时候会调用被回收对象的此方法，可以覆盖此方法提供垃圾收集时的其他资源回收，例如关闭文件等。 </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">第二，Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类，是否可以implements(实现)interface(接口)? </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">　可以继承其他类或完成其他接口，在swing编程中常用此方式。　 </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">第三，Static Nested Class 和 Inner Class的不同，说得越多越好(面试题有的很笼统)。 </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">　Static Nested Class是被声明为静态（static）的内部类，它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化。　　 </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">第四，&amp;和&amp;&amp;的区别。 </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">　&amp;是位运算符，表示按位与运算，&amp;&amp;是逻辑运算符，表示逻辑与（and）.　　 </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">第五，HashMap和Hashtable的区别。 </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">　HashMap是Hashtable的轻量级实现（非线程安全的实现），他们都完成了Map接口，主要区别在于HashMap允许空（null）键值（key）,由于非线程安全，效率上可能高于Hashtable.　　 </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">第六，Collection 和 Collections的区别。 </font></p>
<p><font style="background-color: #cce8cf">　　 </font></p>
<p><font style="background-color: #cce8cf">　Collection是集合类的上级接口，继承与他的接口主要有Set 和List.Collections是针对集合类的一个帮助类，他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。　　 </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">第七，什么时候用assert。 </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">　1.4新增关键字（语法），用于测试boolean表达式状态，可用于调试程序。使用方法 assert ，表示如果表达式为真（true）,则下面的语句执行，否则抛出AssertionError。另外的使用方式assert &lt; boolean表达式&gt;:，表示如果表达式为真，后面的表达式忽略，否则后面表达式的值用于AssertionError的构建参数。注意编译时要增加-source 1.4 参数，否则报错。]运行时要增加 &#8211;ea参数，否则assert行被忽略　　 </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">第八，GC是什么? 为什么要有GC? </font></p>
<p><font style="background-color: #cce8cf">　　 </font></p>
<p><font style="background-color: #cce8cf">　GC是垃圾收集的意思（Gabage Collection）,内存处理是编程人员容易出现问题的地方，忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃，Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的，Java语言没有提供释放已分配内存的显示操作方法。 　　 </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">第九，String s = new String("xyz");创建了几个String Object? </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">　两个　　 </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">第十，Math.round(11.5)等於多少? Math.round(-11.5)等於多少? </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">　Math.round(11.5)==12Math.round(-11.5)==-11round方法返回与参数最接近的长整数，参数加1/2后求其floor.　　 </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">第十一，short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">　short s1 = 1; s1 = s1 + 1; （s1+1运算结果是int型，需要强制转换类型）short s1 = 1; s1 += 1;（可以正确编译）　　 </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">第十二，sleep() 和 wait() 有什么区别? </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">　sleep是线程类（Thread）的方法，导致此线程暂停执行指定时间，给执行机会给其他线程，但是监控状态依然保持，到时后会自动恢复。调用 sleep不会释放对象锁。wait是Object类的方法，对此对象调用wait方法导致本线程放弃对象锁，进入等待此对象的等待锁定池，只有针对此对象发出notify方法（或notifyAll）后本线程才进入对象锁定池准备获得对象锁进入运行状态。　　 </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">第十三，Java有没有goto? </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">　没有　　很十三的问题，如果哪个面试的问到这个问题，我劝你还是别进这家公司。 </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">第十四，数组有没有length()这个方法? String有没有length()这个方法？ </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">　数组没有length()这个方法，有length的属性。 </font></p>
<p><font style="background-color: #cce8cf">　String有有length()这个方法。 </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">第十五，Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型? </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">　方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现， 重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数，我们说该方法被重写 (Overriding)。子类的对象使用这个方法时，将调用子类中的定义，对它而言，父类中的定义如同被&#8220;屏蔽&#8221;了。如果在一个类中定义了多个同名的方法，它们或有不同的参数个数或有不同的参数类型，则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。 </font></p>
<p><font style="background-color: #cce8cf">第十六，Set里的元素是不能重复的，那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别? </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">　Set里的元素是不能重复的，那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。 </font></p>
<p><font style="background-color: #cce8cf">equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖，为的是当两个分离的对象的内容和类型相配的话，返回真值。 </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">第十七，给我一个你最常见到的runtime exception。 </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">参考如下： </font></p>
<p><font style="background-color: #cce8cf">ArithmeticException, </font></p>
<p><font style="background-color: #cce8cf">ArrayStoreException, </font></p>
<p><font style="background-color: #cce8cf">BufferOverflowException, </font></p>
<p><font style="background-color: #cce8cf">BufferUnderflowException, </font></p>
<p><font style="background-color: #cce8cf">CannotRedoException, </font></p>
<p><font style="background-color: #cce8cf">CannotUndoException, </font></p>
<p><font style="background-color: #cce8cf">ClassCastException, </font></p>
<p><font style="background-color: #cce8cf">CMMException, </font></p>
<p><font style="background-color: #cce8cf">ConcurrentModificationException, </font></p>
<p><font style="background-color: #cce8cf">DOMException, </font></p>
<p><font style="background-color: #cce8cf">EmptyStackException, </font></p>
<p><font style="background-color: #cce8cf">IllegalArgumentException, </font></p>
<p><font style="background-color: #cce8cf">IllegalMonitorStateException, </font></p>
<p><font style="background-color: #cce8cf">IllegalPathStateException, </font></p>
<p><font style="background-color: #cce8cf">IllegalStateException, </font></p>
<p><font style="background-color: #cce8cf">ImagingOpException, </font></p>
<p><font style="background-color: #cce8cf">IndexOutOfBoundsException, </font></p>
<p><font style="background-color: #cce8cf">MissingResourceException, </font></p>
<p><font style="background-color: #cce8cf">NegativeArraySizeException, </font></p>
<p><font style="background-color: #cce8cf">NoSuchElementException, </font></p>
<p><font style="background-color: #cce8cf">NullPointerException, </font></p>
<p><font style="background-color: #cce8cf">ProfileDataException, </font></p>
<p><font style="background-color: #cce8cf">ProviderException, </font></p>
<p><font style="background-color: #cce8cf">RasterFormatException, </font></p>
<p><font style="background-color: #cce8cf">SecurityException, </font></p>
<p><font style="background-color: #cce8cf">SystemException, </font></p>
<p><font style="background-color: #cce8cf">UndeclaredThrowableException, </font></p>
<p><font style="background-color: #cce8cf">UnmodifiableSetException, </font></p>
<p><font style="background-color: #cce8cf">UnsupportedOperationException </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">第十八，error和exception有什么区别? </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">　error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。 </font></p>
<p><font style="background-color: #cce8cf">　exception 表示一种设计或实现问题。也就是说，它表示如果程序运行正常，从不会发生的情况。 </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">第十九，List, Set, Map是否继承自Collection接口? </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">List，Set是 </font></p>
<p><font style="background-color: #cce8cf">Map不是 </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">第二十，abstract class和interface有什么区别? </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">　声明方法的存在而不去实现它的类被叫做抽象类（abstract class），它用于要创建一个体现某些基本行为的类，并为该类声明方法，但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量，其类型是一个抽象类，并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现，否则它们也是抽象类为。取而代之，在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。 </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">　接口（interface）是抽象类的变体。在接口中，所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的，没有一个 有程序体。接口只可以定义static final成员变量。接口的实现与子类相似，除了该实现类不能从接口定义中继承行为。当类实现特殊接口时，它定义（即将程序体给予）所有这种接口的方法。然后，它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类，它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换，instanceof 运算符可以用来决定某对象的类是否实现了接口。 </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">第二十一，abstract的method是否可同时是static,是否可同时是native，是否可同时是synchronized? </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">都不能 </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">第二十二，接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)? </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">　接口可以继承接口。抽象类可以实现(implements)接口，抽象类是否可继承实体类，但前提是实体类必须有明确的构造函数。 </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">第二十三，启动一个线程是用run()还是start()? </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">　启动一个线程是调用start()方法，使线程所代表的虚拟处理机处于可运行状态，这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。 </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">第二十四，构造器Constructor是否可被override? </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">　构造器Constructor不能被继承，因此不能重写Overriding，但可以被重载Overloading。 </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">第二十五，是否可以继承String类? </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">　String类是final类故不可以继承。 </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">第二十六，当一个线程进入一个对象的一个synchronized方法后，其它线程是否可进入此对象的其它方法? </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">　不能，一个对象的一个synchronized方法只能由一个线程访问。 </font></p>
<p><font style="background-color: #cce8cf">第二十七，try {}里有一个return语句，那么紧跟在这个try后的finally {}里的code会不会被执行，什么时候被执行，在return前还是后? </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">会执行，在return前执行。 </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">第二十八，编程题: 用最有效率的方法算出2乘以8等於几? </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">有C背景的程序员特别喜欢问这种问题。 </font></p>
<p><font style="background-color: #cce8cf">2 &lt; &lt; 3 </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">第二十九，两个对象值相同(x.equals(y) == true)，但却可有不同的hash code，这句话对不对? </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">不对，有相同的hash code。 </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">第三十，当一个对象被当作参数传递到一个方法后，此方法可改变这个对象的属性，并可返回变化后的结果，那么这里到底是值传递还是引用传递? </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">　是值传递。Java 编程语言只由值传递参数。当一个对象实例作为一个参数被传递到方法中时，参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变，但对象的引用是永远不会改变的。 </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">第三十一，swtich是否能作用在byte上，是否能作用在long上，是否能作用在String上? </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">　switch（expr1）中，expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。 </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">第三十二，编程题: 写一个Singleton出来。 </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">&nbsp;&nbsp;&nbsp; Singleton模式主要作用是保证在Java应用程序中，一个类Class只有一个实例存在。 </font></p>
<p><font style="background-color: #cce8cf">一般Singleton模式通常有几种种形式: </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">　第一种形式: 定义一个类，它的构造函数为private的，它有一个static的private的该类变量，在类初始化时实例话，通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。 </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">public class Singleton { </font></p>
<p><font style="background-color: #cce8cf">　　private Singleton(){} </font></p>
<p><font style="background-color: #cce8cf">　　//在自己内部定义自己一个实例，是不是很奇怪？ </font></p>
<p><font style="background-color: #cce8cf">　　//注意这是private 只供内部调用 </font></p>
<p><font style="background-color: #cce8cf">　　private static Singleton instance = new Singleton(); </font></p>
<p><font style="background-color: #cce8cf">　　//这里提供了一个供外部访问本class的静态方法，可以直接访问　　 </font></p>
<p><font style="background-color: #cce8cf">　　public static Singleton getInstance() { </font></p>
<p><font style="background-color: #cce8cf">　　　　return instance; 　　 </font></p>
<p><font style="background-color: #cce8cf">　　 } </font></p>
<p><font style="background-color: #cce8cf">}&nbsp; </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">第二种形式: </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">public class Singleton { </font></p>
<p><font style="background-color: #cce8cf">　　private static Singleton instance = null; </font></p>
<p><font style="background-color: #cce8cf">　　public static synchronized Singleton getInstance() { </font></p>
<p><font style="background-color: #cce8cf">　　//这个方法比上面有所改进，不用每次都进行生成对象，只是第一次　　　 　 </font></p>
<p><font style="background-color: #cce8cf">　　//使用时生成实例，提高了效率！ </font></p>
<p><font style="background-color: #cce8cf">　　if (instance==null) </font></p>
<p><font style="background-color: #cce8cf">　　　　instance＝new Singleton(); </font></p>
<p><font style="background-color: #cce8cf">return instance; 　　} </font></p>
<p><font style="background-color: #cce8cf">}&nbsp; </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">其他形式: </font></p>
<p><font style="background-color: #cce8cf">定义一个类，它的构造函数为private的，所有方法为static的。 </font></p>
<p><font style="background-color: #cce8cf">一般认为第一种形式要更加安全些 </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<font style="background-color: #cce8cf">
<p><br />
其中也存在一些问题，下面补充一下．希望大家继续补充 </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　 </p>
<p>1.最好介绍一下final修饰变量的情形（分开说明基本类型变量和引用类型变量）。 </p>
<p>2.不知道如何描述比较好，匿名内部类本身是一个实现了特定接口或继承了其他类的类。 </p>
<p>3.非静态类不能有static的方法。参考一下java collections framework的代码，还能说出很多东西来。 </p>
<p>4.&amp;既是位运算符，也是逻辑操作符。 </p>
<p>&amp;和&amp;&amp;都是逻辑运算符，它们的区别是，&amp;&amp;进行短路计算。 </p>
<p>6.可以补充一下，参考文档。 </p>
<p>11.说一下具体的原因可能更好。 </p>
<p>13.java有goto这个keyword，不过还没有使用。 </p>
<p>15.overload和多态没有任何关系。多态是面向对象的基本特征，是和继承、overriding相关的。原来以为把overload当作多态的一种是从C++来的，后来翻了基本c++的经典的书,也强调多态只是和继承,虚函数,overriding相关,所以不知道这个错误思想从哪来的了. </p>
<p>16.public interface Set &lt;E&gt;extends Collection &lt;E&gt;一个不包含重复元素的 collection。更确切地讲，set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2，并且最多包含一个 null 元素。正如其名称所暗示的，此接口模仿了数学上的 set 抽象。 </p>
<p>看文档就是了. </p>
<p>22."抽象类是否可继承实体类，但前提是实体类必须有明确的构造函数。"什么意思?谁规定的? </p>
<p>27.这个比较复杂,例如 </p>
<p>&nbsp;</p>
<p>public class Main { </p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; public static void main(String[] args) { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(test()); </p>
<p>&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; public static boolean test() { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean b = false; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try { </p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return b = 4 &gt; 3; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } finally { </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(b); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //return false; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp; }&nbsp; </p>
<p>} </p>
<p>这个例子中可以看出,return后面的表达式已经计算了,感觉return语句这里被挂起了,如果finally中没有return,这个return就返回. </p>
<p>如果finally也有return,那么就是finally中的return返回了. </p>
<p>29.碰上不守规矩的程序员谁也没办法. </p>
<p>&nbsp;</p>
<p>31.还有枚举呢 </p>
<p>32.注释有问题.</font></p>
<img src ="http://www.blogjava.net/cyantide/aggbug/251063.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2009-01-13 09:41 <a href="http://www.blogjava.net/cyantide/archive/2009/01/13/251063.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>eclipse 自动补全快捷键 修改</title><link>http://www.blogjava.net/cyantide/archive/2009/01/11/250874.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Sun, 11 Jan 2009 10:37:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2009/01/11/250874.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/250874.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2009/01/11/250874.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/250874.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/250874.html</trackback:ping><description><![CDATA[<font style="background-color: #cce8cf">prefenerce--general--keys中为content &nbsp; assist增加快捷键CTRL+Space </font>
<img src ="http://www.blogjava.net/cyantide/aggbug/250874.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2009-01-11 18:37 <a href="http://www.blogjava.net/cyantide/archive/2009/01/11/250874.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>查找被占用端口</title><link>http://www.blogjava.net/cyantide/archive/2009/01/10/250832.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Sat, 10 Jan 2009 14:01:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2009/01/10/250832.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/250832.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2009/01/10/250832.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/250832.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/250832.html</trackback:ping><description><![CDATA[<span style="color: red; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">一、开始</span><span lang="EN-US" style="color: red; font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">-&gt;</span><span style="color: red; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">运行</span><span lang="EN-US" style="color: red; font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">-&gt;cmd</span><span style="color: red; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">，输入</span><span lang="EN-US" style="color: red; font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">netstat -o -an</span><span style="color: red; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">；</span><span lang="EN-US" style="color: red; font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><br />
</span><span style="color: red; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">二、打开</span><span lang="EN-US" style="color: red; font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">windows</span><span style="color: red; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">任务管理器，</span><span style="color: red; font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"> </span><span style="color: red; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">查看</span><span lang="EN-US" style="color: red; font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">-&gt;</span><span style="color: red; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">选择列</span><span style="color: red; font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"> </span><span style="color: red; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">勾选</span><span lang="EN-US" style="color: red; font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">pid</span><span style="color: red; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">；</span><span lang="EN-US" style="color: red; font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><br />
</span><span style="color: red; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">三、找到那个进程占用了</span><span lang="EN-US" style="color: red; font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">80</span><span style="color: red; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">端口的</span><span lang="EN-US" style="color: red; font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">pid</span><span style="color: red; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">，解决之。</span>
<img src ="http://www.blogjava.net/cyantide/aggbug/250832.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2009-01-10 22:01 <a href="http://www.blogjava.net/cyantide/archive/2009/01/10/250832.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JPCAP简介(转)</title><link>http://www.blogjava.net/cyantide/archive/2009/01/09/250757.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Fri, 09 Jan 2009 15:45:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2009/01/09/250757.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/250757.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2009/01/09/250757.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/250757.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/250757.html</trackback:ping><description><![CDATA[<p>一．JPCAP简介</p>
<p>　　众所周知，Java语言虽然在TCP/UDP传输方面给予了良好的定义，但对于网络层以下的控制，却是无能为力的。JPCAP扩展包弥补了这一点。</p>
<p>　　JPCAP实际上并非一个真正去实现对数据链路层的控制，而是一个中间件，JPCAP调用wincap/libpcap，而给JAVA语言提供一个公共的接口，从而实现了平台无关性。在官方网站上声明，JPCAP支持FreeBSD 3.x, Linux RedHat 6.1, Fedora Core 4, Solaris, and Microsoft windows 2000/XP等系统。</p>
<p>　　二．JPCAP机制</p>
<p>　　JPCAP的整个结构大体上跟wincap/libpcap是很相像的，例如NetworkInterface类对应wincap的typedef strUCt _ADAPTERADAPTER，getDeviceList()对应pcap_findalldevs()等等。 JPCAP有16个类，下面就其中最重要的4个类做说明。</p>
<p>　　1．NetworkInterface</p>
<p>　　该类的每一个实例代表一个网络设备，一般就是网卡。这个类只有一些数据成员，除了继续自java.lang.Object的基本方法以外，没有定义其它方法。</p>
<p><br />
数据成员<br />
&nbsp;<br />
NetworkInterfaceAddress[]<br />
&nbsp;<br />
java.lang.String<br />
&nbsp;datalink_description.<br />
数据链路层的描述。描述所在的局域网是什么网。例如，以太网（Ethernet）、无线LAN网（wireless LAN）、令牌环网(token ring)等等。<br />
&nbsp;<br />
java.lang.String<br />
&nbsp;datalink_name <br />
该网络设备所对应数据链路层的名称。具体来说，例如Ethernet10M、100M、1000M等等。<br />
&nbsp;<br />
java.lang.String<br />
&nbsp;description<br />
网卡是XXXX牌子XXXX型号之类的描述。例如我的网卡描述：Realtek RTL8169/8110 Family Gigabit Ethernet NIC <br />
&nbsp;<br />
boolean<br />
&nbsp;Loopback<br />
标志这个设备是否loopback设备。<br />
&nbsp;<br />
byte[]<br />
&nbsp;mac_address<br />
网卡的MAC地址，6个字节。<br />
&nbsp;<br />
java.lang.String<br />
&nbsp;Name<br />
这个设备的名称。例如我的网卡名称：\Device\NPF_{3CE5FDA5-E15D-4F87-B217-255BCB351CD5}<br />
&nbsp;</p>
<p>　　2．JpcapCaptor</p>
<p>　　该类提供了一系列静态方法实现一些基本的功能。该类一个实例代表建立了一个与指定设备的链接，可以通过该类的实例来控制设备，例如设定网卡模式、设定过滤要害字等等。</p>
<p><br />
数据成员<br />
&nbsp;<br />
int<br />
&nbsp;<br />
dropped_packets</p>
<p>抛弃的包的数目。<br />
&nbsp;<br />
protected int<br />
&nbsp;<br />
ID</p>
<p>这个数据成员在官方文档中并没有做任何说明，查看JPCAP源代码可以发现这个ID实际上在其JNI的C代码部分传进来的，这类本身并没有做出定义，所以是供其内部使用的。实际上在对JpcapCator实例的使用中也没有办法调用此数据成员。<br />
&nbsp;<br />
protected staticboolean[]<br />
&nbsp;<br />
instanciatedFlag</p>
<p>同样在官方文档中没有做任何说明，估计其为供内部使用。<br />
&nbsp;<br />
protected staticint<br />
&nbsp;<br />
MAX_NUMBER_OF_INSTANCE</p>
<p>同样在官方文档中没有做任何说明，估计其为供内部使用。<br />
&nbsp;<br />
int<br />
&nbsp;<br />
received_packets<br />
收到的包的数目<br />
&nbsp;</p>
<p>方法成员<br />
&nbsp;<br />
staticNetworkInterface[]<br />
&nbsp;<br />
getDeviceList() <br />
返回一个网络设备列表。<br />
&nbsp;<br />
staticJpcapCaptor<br />
&nbsp;<br />
openDevice(NetworkInterface interface, intsnaplen, booleanpromisc, intto_ms) <br />
创建一个与指定设备的连接并返回该连接。注重，以上两个方法都是静态方法。</p>
<p>Interface：要打开连接的设备的实例；</p>
<p>Snaplen：这个是比较轻易搞混的一个参数。其实这个参数不是限制只能捕捉多少数据包，而是限制每一次收到一个数据包，只提取该数据包中前多少字节；</p>
<p>Promisc：设置是否混杂模式。处于混杂模式将接收所有数据包，若之后又调用了包过滤函数setFilter()将不起任何作用；</p>
<p>To_ms：这个参数主要用于processPacket()方法，指定超时的时间；<br />
&nbsp;<br />
void<br />
&nbsp;<br />
Close()<br />
关闭调用该方法的设备的连接，相对于openDivece()打开连接。<br />
&nbsp;<br />
JpcapSender<br />
&nbsp;<br />
getJpcapSenderInstance() <br />
该返回一个JpcapSender实例，JpcapSender类是专门用于控制设备的发送数据包的功能的类。<br />
&nbsp;<br />
Packet<br />
&nbsp;<br />
getPacket() <br />
捕捉并返回一个数据包。这是JpcapCaptor实例中四种捕捉包的方法之一。<br />
&nbsp;<br />
int<br />
&nbsp;<br />
loopPacket(intcount, PacketReceiver handler) <br />
捕捉指定数目的数据包，并交由实现了PacketReceiver接口的类的实例处理，并返回捕捉到的数据包数目。假如count参数设为－1，那么无限循环地捕捉数据。</p>
<p>这个方法不受超时的影响。还记得openDivice()中的to_ms参数么？那个参数对这个方法没有影响，假如没有捕捉到指定数目数据包，那么这个方法将一直阻塞等待。<br />
PacketReceiver中只有一个抽象方法void receive(Packet p)。<br />
&nbsp;<br />
int<br />
&nbsp;<br />
processPacket(intcount, PacketReceiver handler) <br />
跟loopPacket()功能一样，唯一的区别是这个方法受超时的影响，超过指定时间自动返回捕捉到数据包的数目。<br />
&nbsp;<br />
int<br />
&nbsp;<br />
dispatchPacket(intcount, PacketReceiverhandler)<br />
跟processPacket()功能一样，区别是这个方法可以处于&#8220;non-blocking&#8221;模式工作，在这种模式下dispatchPacket()可能立即返回，即使没有捕捉到任何数据包。<br />
&nbsp;<br />
void<br />
&nbsp;<br />
setFilter(java.lang.Stringcondition, booleanoptimize) <br />
.condition：设定要提取的包的要害字。</p>
<p>Optimize：这个参数在说明文档以及源代码中都没有说明，只是说这个参数假如为真，那么过滤器将处于优化模式。<br />
&nbsp;<br />
void<br />
&nbsp;<br />
setNonBlockingMode(booleannonblocking)</p>
<p>假如值为&#8220;true&#8221;，那么设定为&#8220;non-blocking&#8221;模式。<br />
&nbsp;<br />
void<br />
&nbsp;<br />
breakLoop()</p>
<p>当调用processPacket()和loopPacket()后，再调用这个方法可以强制让processPacket()和loopPacket()停止。<br />
&nbsp;</p>
<p>　　3．JpcapSender</p>
<p>　　该类专门用于控制数据包的发送。</p>
<p><br />
方法成员<br />
&nbsp;<br />
void<br />
&nbsp;<br />
close() <br />
强制关闭这个连接。<br />
&nbsp;<br />
staticJpcapSender<br />
&nbsp;<br />
openRawSocket()</p>
<p>这个方法返回的JpcapSender实例发送数据包时将自动填写数据链路层头部分。<br />
&nbsp;<br />
void<br />
&nbsp;<br />
sendPacket(Packet packet) <br />
JpcapSender最重要的功能，发送数据包。需要注重的是，假如调用这个方法的实例是由JpcapCaptor的getJpcapSenderInstance()得到的话，需要自己设定数据链路层的头，而假如是由上面的openRawSocket()得到的话，那么无需也不能设置，数据链路层的头部将由系统自动生成。<br />
&nbsp;</p>
<p>　　4．Packet</p>
<p>　　这个是所有其它数据包类的父类。Jpcap所支持的数据包有：<br />
ARPPacket、DatalinkPacket、EthernetPacket、ICMPPacket、IPPacket、TCPPacket、UDPPacket</p>
<p>　　三．使用JPCAP实现监听</p>
<p>　　1．监听原理　</p>
<p>　　在具体说用JPCAP实现网络监听实现前，先简单介绍下监听的原理。</p>
<p>　　局域网监听利用的是所谓的&#8220;ARP欺骗&#8221;技术。在以前曾经一段阶段，局域网的布局是使用总线式（或集线式）结构，要到达监听只需要将网卡设定为混杂模式即可，但现在的局域网络普遍采用的是交换式网络，所以单纯靠混杂模式来达到监听的方法已经不可行了。所以为了达到监听的目的，我们需要&#8220;欺骗&#8221;路由器、&#8220;欺骗&#8221;交换机，即&#8220;ARP欺骗&#8221;技术。</p>
<p>　　假设本机为A，监听目标为B。</p>
<p>　　首先，伪造一个ARP REPLY包，数据链路层头及ARP内容部分的源MAC地址填入A的MAC地址，而源IP部分填入网关IP，目的地址填入B的MAC、IP，然后将这个包发送给B，而B接收到这个伪造的ARP REPLY包后，由于源IP为网关IP，于是在它的ARP缓存表里刷新了一项，将（网关IP，网关MAC）刷新成（网关IP，A的MAC）。而B要访问外部的网都需要经过网关，这时候这些要经过网关的包就通通流到A的机器上来了。</p>
<p>　　接着，再伪造一个ARP REPLY包，数据链路层头及ARP内容部分的源MAC地址填入A的MAC地址，而源IP部分填入B的IP，目的地址填入网关MAC、IP，然后将这个包发给网关，网关接收到这个伪造的ARP REPLY包后，由于源IP为B的IP，于是在它的ARP缓存表里刷新了一项，将（B的IP，B的MAC）刷新成（B的IP，A的MAC）。这时候外部传给B的数据包经过网关时，就通通转发给A。</p>
<p>　　这样还只是拦截了B的数据包而已，B并不能上网——解决方法是将接收到的包，除了目的地址部分稍做修改，其它原封不动的再转发出去，这样就达到了监听的目的——在B不知不觉中浏览了B所有的对外数据包。</p>
<p>　　ARP数据包解析</p>
<p>　　单元：Byte</p>
<p><br />
Ethernet头部<br />
&nbsp;<br />
ARP数据部分<br />
&nbsp;</p>
<p>6<br />
&nbsp;<br />
6<br />
&nbsp;<br />
2<br />
&nbsp;<br />
2<br />
&nbsp;<br />
2<br />
&nbsp;<br />
2<br />
&nbsp;<br />
2<br />
&nbsp;<br />
4<br />
&nbsp;<br />
6<br />
&nbsp;<br />
4<br />
&nbsp;<br />
6<br />
&nbsp;</p>
<p>目标MAC地址<br />
&nbsp;<br />
源地MAC地址<br />
&nbsp;<br />
类型号0x0800:ip</p>
<p>0x0806:ARP<br />
&nbsp;<br />
局域网类型</p>
<p>以太网0x0001<br />
&nbsp;<br />
网络协议类型</p>
<p>IP网络0x0800<br />
&nbsp;<br />
MAC/IP地址长度，恒为0x06/04<br />
&nbsp;<br />
ARP包类型</p>
<p>REPLY</p>
<p>0x0002<br />
&nbsp;<br />
ARP目标IP地址<br />
&nbsp;<br />
ARP目标MAC 地址<br />
&nbsp;<br />
ARP源IP地址<br />
&nbsp;<br />
ARP源MAC地址<br />
&nbsp;</p>
<p>　　2．用JPCAP实现监听</p>
<p>　　就如上面说的，为了实现监听，我们必须做四件事：</p>
<p>　　A．发送ARP包修改B的ARP缓存表；</p>
<p>　　B．发送ARP包修改路由ARP缓存表；</p>
<p>　　C．转发B发过来的数据包；</p>
<p>　　D．转发路由发过来的数据包；</p>
<p>　　下面我们给个小小的例子说明怎样实现。</p>
<p>　　我们假定运行这个程序的机器A只有一个网卡，只接一个网络，所在局域网为Ethernet，并且假定已经通过某种方式获得B和网关的MAC地址（例如ARP解析获得）。我们修改了B和网关的ARP表，并对他们的包进行了转发。</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_22_3884_Open_Image" onclick="this.style.display='none'; Codehighlighter1_22_3884_Open_Text.style.display='none'; Codehighlighter1_22_3884_Closed_Image.style.display='inline'; Codehighlighter1_22_3884_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_22_3884_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_22_3884_Closed_Text.style.display='none'; Codehighlighter1_22_3884_Open_Image.style.display='inline'; Codehighlighter1_22_3884_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;changeARP</span><span id="Codehighlighter1_22_3884_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_22_3884_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;NetworkInterface[]&nbsp;devices;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">设备列表</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;NetworkInterface&nbsp;device;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">要使用的设备</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;JpcapCaptor&nbsp;jpcap;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">与设备的连接</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;JpcapSender&nbsp;sender;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">用于发送的实例</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;targetMAC,&nbsp;gateMAC;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">B的MAC地址，网关的MAC地址</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;String&nbsp;targetIp,&nbsp;String&nbsp;gateIp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">B的IP地址，网关的IP地址</span><span style="color: #008000"><br />
<img id="Codehighlighter1_308_648_Open_Image" onclick="this.style.display='none'; Codehighlighter1_308_648_Open_Text.style.display='none'; Codehighlighter1_308_648_Closed_Image.style.display='inline'; Codehighlighter1_308_648_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_308_648_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_308_648_Closed_Text.style.display='none'; Codehighlighter1_308_648_Open_Image.style.display='inline'; Codehighlighter1_308_648_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　</span><span id="Codehighlighter1_308_648_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_308_648_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　*初始化设备<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　*&nbsp;JpcapCaptor.getDeviceList()得到设备可能会有两个，其中一个必定是&#8220;Generic&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　*dialup&nbsp;adapter&#8221;，这是windows系统的虚拟网卡，并非真正的硬件设备。<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　*注重：在这里有一个小小的BUG，假如JpcapCaptor.getDeviceList()之前有类似JFrame&nbsp;jf=new<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　*JFame（）这类的语句会影响得到设备个数，只会得到真正的硬件设备，而不会出现虚拟网卡。<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　*虚拟网卡只有MAC地址而没有IP地址，而且假如出现虚拟网卡，那么实际网卡的MAC将分<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　*配给虚拟网卡，也就是说在程序中调用device.&nbsp;mac_address时得到的是00&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;00。<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />　</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_708_952_Open_Image" onclick="this.style.display='none'; Codehighlighter1_708_952_Open_Text.style.display='none'; Codehighlighter1_708_952_Closed_Image.style.display='inline'; Codehighlighter1_708_952_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_708_952_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_708_952_Closed_Text.style.display='none'; Codehighlighter1_708_952_Open_Image.style.display='inline'; Codehighlighter1_708_952_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />　</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;NetworkInterface&nbsp;getDevice()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;IOException&nbsp;</span><span id="Codehighlighter1_708_952_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_708_952_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　devices&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;JpcapCaptor.getDeviceList();&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">获得设备列表</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　device&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;devices[</span><span style="color: #000000">0</span><span style="color: #000000">];</span><span style="color: #008000">//</span><span style="color: #008000">只有一个设备</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　jpcap&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;JpcapCaptor.openDevice(device,&nbsp;</span><span style="color: #000000">2000</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">10000</span><span style="color: #000000">);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">打开与设备的连接</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　jpcap.setFilter(&#8220;ip&#8221;,</span><span style="color: #0000ff">true</span><span style="color: #000000">);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">只监听B的IP数据包</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　sender&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;captor.getJpcapSenderInstance();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />　}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_955_1113_Open_Image" onclick="this.style.display='none'; Codehighlighter1_955_1113_Open_Text.style.display='none'; Codehighlighter1_955_1113_Closed_Image.style.display='inline'; Codehighlighter1_955_1113_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_955_1113_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_955_1113_Closed_Text.style.display='none'; Codehighlighter1_955_1113_Open_Image.style.display='inline'; Codehighlighter1_955_1113_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />　</span><span id="Codehighlighter1_955_1113_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_955_1113_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　*修改B和网关的ARP表。因为网关会定时发数据包刷新自己和B的缓存表，所以必须每隔一<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　*段时间就发一次包重新更改B和网关的ARP表。<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　*@参数&nbsp;targetMAC&nbsp;B的MAC地址，可通过ARP解析得到；<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　*@参数&nbsp;targetIp&nbsp;B的IP地址；<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　*@参数&nbsp;gateMAC&nbsp;网关的MAC地址；<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />　</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;changeARP(</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;targetMAC,&nbsp;String&nbsp;targetIp,</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;gateMAC,&nbsp;String&nbsp;gateIp)<br />
<img id="Codehighlighter1_1249_3884_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1249_3884_Open_Text.style.display='none'; Codehighlighter1_1249_3884_Closed_Image.style.display='inline'; Codehighlighter1_1249_3884_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1249_3884_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1249_3884_Closed_Text.style.display='none'; Codehighlighter1_1249_3884_Open_Image.style.display='inline'; Codehighlighter1_1249_3884_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />　</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;UnknownHostException,InterruptedException&nbsp;</span><span id="Codehighlighter1_1249_3884_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1249_3884_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　</span><span style="color: #0000ff">this</span><span style="color: #000000">.&nbsp;targetMAC&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;targetMAC;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　</span><span style="color: #0000ff">this</span><span style="color: #000000">.&nbsp;targetIp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;targetIp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　</span><span style="color: #0000ff">this</span><span style="color: #000000">.&nbsp;gateMAC&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;gateMAC;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　</span><span style="color: #0000ff">this</span><span style="color: #000000">.&nbsp;gateIp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;gateIp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　getDevice();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　arpTarget&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ARPPacket();&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">修改B的ARP表的ARP包</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　arpTarget.hardtype&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ARPPacket.HARDTYPE_ETHER;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">选择以太网类型(Ethernet)</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　arpTarget.prototype&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ARPPacket.PROTOTYPE_IP;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">选择IP网络协议类型</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　arpTarget.operation&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ARPPacket.ARP_REPLY;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">选择REPLY类型</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　arpTarget.hlen&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">6</span><span style="color: #000000">;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">MAC地址长度固定6个字节</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　arpTarget.plen&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000">;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">IP地址长度固定4个字节</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　arpTarget.sender_hardaddr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;device.mac_address;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">A的MAC地址</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　arpTarget.sender_protoaddr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;InetAddress.getByName(gateIp).getAddress();&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">网关IP</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　arpTarget.target_hardaddr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;targetMAC;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">B的MAC地址</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　arpTarget.target_protoaddr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;InetAddress.getByName(targetIp).getAddress();&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">B的IP</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　EthernetPacket&nbsp;ethToTarget&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;EthernetPacket();&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">创建一个以太网头</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　ethToTarget.frametype&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;EthernetPacket.ETHERTYPE_ARP;</span><span style="color: #008000">//</span><span style="color: #008000">选择以太包类型</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　ethToTarget.src_mac&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;device.mac_address;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">A的MAC地址</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　ethToTarget.dst_mac&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;targetMAC;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">B的MAC地址</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　arpTarget.datalink&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ethToTarget;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">将以太头添加到ARP包前</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　arpGate&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ARPPacket();&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">修改网关ARP表的包</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　arpGate.hardtype&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ARPPacket.HARDTYPE_ETHER;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">跟以上相似，不再重复注析</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　arpGate.prototype&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ARPPacket.PROTOTYPE_IP;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　arpGate.operation&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ARPPacket.ARP_REPLY;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　arpGate.hlen&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">6</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　arpGate.plen&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　arpGate.sender_hardaddr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;device.mac_address;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　arpGate.sender_protoaddr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;InetAddress.getByName(targetIp).getAddress();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　arpGate.target_hardaddr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;gateMAC;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　arpGate.target_protoaddr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;InetAddress.getByName(gateIp).getAddress();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　EthernetPacket&nbsp;ethToGate&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;EthernetPacket();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　ethToGate.frametype&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;EthernetPacket.ETHERTYPE_ARP;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　ethToGate.src_mac&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;device.mac_address;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　ethToGate.dst_mac&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;gateMAC;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　arpGate.datalink&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ethToGate;<br />
<img id="Codehighlighter1_2955_3884_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2955_3884_Open_Text.style.display='none'; Codehighlighter1_2955_3884_Closed_Image.style.display='inline'; Codehighlighter1_2955_3884_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_2955_3884_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2955_3884_Closed_Text.style.display='none'; Codehighlighter1_2955_3884_Open_Image.style.display='inline'; Codehighlighter1_2955_3884_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />　　thread</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Thread(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Runnable()</span><span id="Codehighlighter1_2955_3884_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_2955_3884_Open_Text"><span style="color: #000000">{&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">创建一个进程控制发包速度</span><span style="color: #008000"><br />
<img id="Codehighlighter1_2992_3140_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2992_3140_Open_Text.style.display='none'; Codehighlighter1_2992_3140_Closed_Image.style.display='inline'; Codehighlighter1_2992_3140_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_2992_3140_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2992_3140_Closed_Text.style.display='none'; Codehighlighter1_2992_3140_Open_Image.style.display='inline'; Codehighlighter1_2992_3140_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;run()&nbsp;</span><span id="Codehighlighter1_2992_3140_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_2992_3140_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_3010_3104_Open_Image" onclick="this.style.display='none'; Codehighlighter1_3010_3104_Open_Text.style.display='none'; Codehighlighter1_3010_3104_Closed_Image.style.display='inline'; Codehighlighter1_3010_3104_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_3010_3104_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_3010_3104_Closed_Text.style.display='none'; Codehighlighter1_3010_3104_Open_Image.style.display='inline'; Codehighlighter1_3010_3104_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />　　　</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">true</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_3010_3104_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_3010_3104_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　　　sender.sendPacket(arpTarget);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　　　sender.sendPacket(arpGate);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　　　Thread.sleep(</span><span style="color: #000000">500</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />　　　}</span></span><span style="color: #000000">).start();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　　recP();&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">接收数据包并转发</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" /></span><span style="color: #000000">　　}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_3144_3213_Open_Image" onclick="this.style.display='none'; Codehighlighter1_3144_3213_Open_Text.style.display='none'; Codehighlighter1_3144_3213_Closed_Image.style.display='inline'; Codehighlighter1_3144_3213_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_3144_3213_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_3144_3213_Closed_Text.style.display='none'; Codehighlighter1_3144_3213_Open_Image.style.display='inline'; Codehighlighter1_3144_3213_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />　　</span><span id="Codehighlighter1_3144_3213_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_3144_3213_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　*修改包的以太头，转发数据包<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　*参数&nbsp;packet&nbsp;收到的数据包<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　*参数&nbsp;changeMAC&nbsp;要转发出去的目标<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />　　</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_3268_3574_Open_Image" onclick="this.style.display='none'; Codehighlighter1_3268_3574_Open_Text.style.display='none'; Codehighlighter1_3268_3574_Closed_Image.style.display='inline'; Codehighlighter1_3268_3574_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_3268_3574_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_3268_3574_Closed_Text.style.display='none'; Codehighlighter1_3268_3574_Open_Image.style.display='inline'; Codehighlighter1_3268_3574_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />　　</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;send(Packet&nbsp;packet,&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;changeMAC)&nbsp;</span><span id="Codehighlighter1_3268_3574_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_3268_3574_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　　EthernetPacket&nbsp;eth;<br />
<img id="Codehighlighter1_3344_3570_Open_Image" onclick="this.style.display='none'; Codehighlighter1_3344_3570_Open_Text.style.display='none'; Codehighlighter1_3344_3570_Closed_Image.style.display='inline'; Codehighlighter1_3344_3570_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_3344_3570_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_3344_3570_Closed_Text.style.display='none'; Codehighlighter1_3344_3570_Open_Image.style.display='inline'; Codehighlighter1_3344_3570_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />　　　</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(packet.datalink&nbsp;</span><span style="color: #0000ff">instanceof</span><span style="color: #000000">&nbsp;EthernetPacket)&nbsp;</span><span id="Codehighlighter1_3344_3570_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_3344_3570_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　　　eth&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(EthernetPacket)&nbsp;packet.datalink;<br />
<img id="Codehighlighter1_3422_3534_Open_Image" onclick="this.style.display='none'; Codehighlighter1_3422_3534_Open_Text.style.display='none'; Codehighlighter1_3422_3534_Closed_Image.style.display='inline'; Codehighlighter1_3422_3534_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_3422_3534_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_3422_3534_Closed_Text.style.display='none'; Codehighlighter1_3422_3534_Open_Image.style.display='inline'; Codehighlighter1_3422_3534_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />　　　　</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">6</span><span style="color: #000000">;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_3422_3534_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_3422_3534_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　　　　eth.dst_mac[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;changeMAC[i];&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">修改包以太头，改变包的目标</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">　　　　　eth.src_mac[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;device.mac_address[i];&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">源发送者为A</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" /></span><span style="color: #000000">　　　　}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　　　sender.sendPacket(packet);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />　　　}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />　　}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_3578_3601_Open_Image" onclick="this.style.display='none'; Codehighlighter1_3578_3601_Open_Text.style.display='none'; Codehighlighter1_3578_3601_Closed_Image.style.display='inline'; Codehighlighter1_3578_3601_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_3578_3601_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_3578_3601_Closed_Text.style.display='none'; Codehighlighter1_3578_3601_Open_Image.style.display='inline'; Codehighlighter1_3578_3601_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />　　</span><span id="Codehighlighter1_3578_3601_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_3578_3601_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　*打印接受到的数据包并转发<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />　　</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_3623_3881_Open_Image" onclick="this.style.display='none'; Codehighlighter1_3623_3881_Open_Text.style.display='none'; Codehighlighter1_3623_3881_Closed_Image.style.display='inline'; Codehighlighter1_3623_3881_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_3623_3881_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_3623_3881_Closed_Text.style.display='none'; Codehighlighter1_3623_3881_Open_Image.style.display='inline'; Codehighlighter1_3623_3881_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />　　</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;recP()</span><span id="Codehighlighter1_3623_3881_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_3623_3881_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　　IPPacket&nbsp;ipPacket&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img id="Codehighlighter1_3668_3877_Open_Image" onclick="this.style.display='none'; Codehighlighter1_3668_3877_Open_Text.style.display='none'; Codehighlighter1_3668_3877_Closed_Image.style.display='inline'; Codehighlighter1_3668_3877_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_3668_3877_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_3668_3877_Closed_Text.style.display='none'; Codehighlighter1_3668_3877_Open_Image.style.display='inline'; Codehighlighter1_3668_3877_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />　　　</span><span style="color: #0000ff">while</span><span style="color: #000000">(</span><span style="color: #0000ff">true</span><span style="color: #000000">)</span><span id="Codehighlighter1_3668_3877_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_3668_3877_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　　　ipPacket&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;（IPPacket）jpcap.getPacket();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　　　System.out.println(ipPacket);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　　　</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(ipPacket.src_ip.getHostAddress().equals(targetIp))<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　　　　send(packet,&nbsp;gateMAC);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　　　</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　　　　send(packet,&nbsp;targetMAC);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />　　　}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />　　}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span></div>
<p></span></span></span></p>
<p>　　注重：这个例子只是为了说明问题，并没有考虑到程序的健壮性，所以并不一定能在任何一台机器任何一个系统上运行。<br />
</p>
<img src ="http://www.blogjava.net/cyantide/aggbug/250757.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2009-01-09 23:45 <a href="http://www.blogjava.net/cyantide/archive/2009/01/09/250757.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>页面滚动特效:MARQUEE标记(转贴)</title><link>http://www.blogjava.net/cyantide/archive/2009/01/08/250468.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Thu, 08 Jan 2009 04:18:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2009/01/08/250468.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/250468.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2009/01/08/250468.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/250468.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/250468.html</trackback:ping><description><![CDATA[&lt;MARQUEE ALIGN="&#8230;"&nbsp; &nbsp;&nbsp;&nbsp;<br />
<font face="宋体"><font style="font-size: 9pt">　　</font></font><font face="Verdana"><font style="font-size: 9pt">behavior="&#8230;"&nbsp;&nbsp;<br />
</font></font><font face="宋体"><font style="font-size: 9pt">　　</font></font><font face="Verdana"><font style="font-size: 9pt">BGCOLOR="&#8230;"&nbsp;&nbsp;<br />
</font></font><font face="宋体"><font style="font-size: 9pt">　　</font></font><font face="Verdana"><font style="font-size: 9pt">DIRECTION="&#8230;"&nbsp;&nbsp;<br />
</font></font><font face="宋体"><font style="font-size: 9pt">　　</font></font><font face="Verdana"><font style="font-size: 9pt">HEIGHT="&#8230;"&nbsp;&nbsp;<br />
</font></font><font face="宋体"><font style="font-size: 9pt">　　</font></font><font face="Verdana"><font style="font-size: 9pt">WIDTH="&#8230;"&nbsp;&nbsp;<br />
</font></font><font face="宋体"><font style="font-size: 9pt">　　</font></font><font face="Verdana"><font style="font-size: 9pt">HSPACE="&#8230;"&nbsp;&nbsp;<br />
</font></font><font face="宋体"><font style="font-size: 9pt">　　</font></font><font face="Verdana"><font style="font-size: 9pt">VSPACE="&#8230;"&nbsp;&nbsp;<br />
</font></font><font face="宋体"><font style="font-size: 9pt">　　</font></font><font face="Verdana"><font style="font-size: 9pt">LOOP="&#8230;"&nbsp;&nbsp;<br />
</font></font><font face="宋体"><font style="font-size: 9pt">　　</font></font><font face="Verdana"><font style="font-size: 9pt">SCROLLAMOUNT="&#8230;"&nbsp;&nbsp;<br />
</font></font><font face="宋体"><font style="font-size: 9pt">　　</font></font><font face="Verdana"><font style="font-size: 9pt">SCROLLDELAY="&#8230;"&nbsp;&nbsp;<br />
&gt;&#8230;&lt;/MARQUEE&gt;&nbsp;&nbsp;<br />
<br />
align:&nbsp; &nbsp; </font></font><font face="宋体"><font style="font-size: 9pt">对齐方式</font></font><font face="Verdana"><font style="font-size: 9pt"> LEFT</font></font><font face="宋体"><font style="font-size: 9pt">，</font></font><font face="Verdana"><font style="font-size: 9pt">CENTER</font></font><font face="宋体"><font style="font-size: 9pt">，</font></font><font face="Verdana"><font style="font-size: 9pt">RIGHT</font></font><font face="宋体"><font style="font-size: 9pt">，</font></font><font face="Verdana"><font style="font-size: 9pt">TOP</font></font><font face="宋体"><font style="font-size: 9pt">，</font></font><font face="Verdana"><font style="font-size: 9pt">BOTTOM (</font></font><font face="宋体"><font style="font-size: 9pt">不用多说了</font></font><font face="Verdana"><font style="font-size: 9pt">)<br />
behavior:&nbsp; &nbsp; </font></font><font face="宋体"><font style="font-size: 9pt">用于设定滚动的方式，主要由三种方式：</font></font><font face="Verdana"><font style="font-size: 9pt"><br />
behavior="scroll":&nbsp; &nbsp; </font></font><font face="宋体"><font style="font-size: 9pt">表示由一端滚动到另一端；</font></font><font face="Verdana"><font style="font-size: 9pt"><br />
behavior="slide":&nbsp; &nbsp; </font></font><font face="宋体"><font style="font-size: 9pt">表示由一端快速滑动到另一端，且不再重复；</font></font><font face="Verdana"><font style="font-size: 9pt"><br />
behavior="alternate" :&nbsp; &nbsp; </font></font><font face="宋体"><font style="font-size: 9pt">默认值</font></font><font face="Verdana"><font style="font-size: 9pt">——</font></font><font face="宋体"><font style="font-size: 9pt">表示在两端之间来回滚动。</font></font><font face="Verdana"><font style="font-size: 9pt"></font></font><br />
<font face="Verdana"><font style="font-size: 9pt">direction:&nbsp; &nbsp; left(</font></font><font face="宋体"><font style="font-size: 9pt">默认值</font></font><font face="Verdana"><font style="font-size: 9pt">) </font></font><font face="宋体"><font style="font-size: 9pt">左</font></font><font face="Verdana"><font style="font-size: 9pt">; right </font></font><font face="宋体"><font style="font-size: 9pt">右</font></font><font face="Verdana"><font style="font-size: 9pt">;up </font></font><font face="宋体"><font style="font-size: 9pt">上</font></font><font face="Verdana"><font style="font-size: 9pt">;down </font></font><font face="宋体"><font style="font-size: 9pt">下</font></font><font face="Verdana"><font style="font-size: 9pt">;<br />
bgcolor:&nbsp; &nbsp; </font></font><font face="宋体"><font style="font-size: 9pt">背景颜色</font></font><font face="Verdana"><font style="font-size: 9pt"><br />
height:&nbsp; &nbsp; </font></font><font face="宋体"><font style="font-size: 9pt">高度</font></font><font face="Verdana"><font style="font-size: 9pt"><br />
weight:&nbsp; &nbsp; </font></font><font face="宋体"><font style="font-size: 9pt">宽度</font></font><font face="Verdana"><font style="font-size: 9pt"><br />
Hspace/vspace:&nbsp; &nbsp; </font></font><font face="宋体"><font style="font-size: 9pt">分别用于设定滚动字幕的左右边框和上下边框的宽度。作用大概和</font></font><font face="Verdana"><font style="font-size: 9pt">css</font></font><font face="宋体"><font style="font-size: 9pt">中的</font></font><font face="Verdana"><font style="font-size: 9pt">margin</font></font><font face="宋体"><font style="font-size: 9pt">差不多</font></font><font face="Verdana"><font style="font-size: 9pt"><br />
scrollamount:&nbsp; &nbsp; </font></font><font face="宋体"><font style="font-size: 9pt">用于设定每个连续滚动文本后面的间隔，该间隔用像素表示，以上是官方说法</font></font><font face="Verdana"><font style="font-size: 9pt">,</font></font><font face="宋体"><font style="font-size: 9pt">其实就是滚动的速度，值不能太大</font></font><font face="Verdana"><font style="font-size: 9pt">,</font></font><font face="宋体"><font style="font-size: 9pt">要不从视觉角度来说</font></font><font face="Verdana"><font style="font-size: 9pt">,</font></font><font face="宋体"><font style="font-size: 9pt">是没反应的</font></font><font face="Verdana"><font style="font-size: 9pt">.</font></font><font face="宋体"><font style="font-size: 9pt">值越大速度越快，反之越慢。</font></font><font face="Verdana"><font style="font-size: 9pt"><br />
scrolldelay:&nbsp; &nbsp; </font></font><font face="宋体"><font style="font-size: 9pt">延迟时间</font></font><font face="Verdana"><font style="font-size: 9pt"><br />
loop:&nbsp; &nbsp; </font></font><font face="宋体"><font style="font-size: 9pt">这个属性大家也很熟悉，循环次数；</font></font><font face="Verdana"><font style="font-size: 9pt">loop=-1</font></font><font face="宋体"><font style="font-size: 9pt">的时候一直重复循环（默认值）</font></font><font face="Verdana"><font style="font-size: 9pt"></font></font><br />
<font face="Verdana"><font style="font-size: 9pt"></font></font><br />
<font face="宋体"><font style="font-size: 9pt">好，现在我们再来接触一些</font></font><font face="Verdana"><font style="font-size: 9pt">Dcode</font></font><font face="宋体"><font style="font-size: 9pt">的一些知识。</font></font><br />
<font face="宋体"><font style="font-size: 9pt">首先是两个鼠标事件</font></font><font face="Verdana"><font style="font-size: 9pt"><br />
<br />
onmouseover:&nbsp; &nbsp; </font></font><font face="宋体"><font style="font-size: 9pt">鼠标触发事件</font></font><font face="Verdana"><font style="font-size: 9pt">---</font></font><font face="宋体"><font style="font-size: 9pt">当用户将鼠标指针移动到对象内时触发</font></font><font face="Verdana"><font style="font-size: 9pt"><br />
onmouseout:&nbsp; &nbsp; </font></font><font face="宋体"><font style="font-size: 9pt">鼠标滑出事件</font></font><font face="Verdana"><font style="font-size: 9pt">---</font></font><font face="宋体"><font style="font-size: 9pt">当用户将鼠标指针移出对象边界时触发</font></font><br />
<font face="宋体"><font style="font-size: 9pt">这里要用到的是</font></font><font face="Verdana"><font style="font-size: 9pt"> this.start() </font></font><font face="宋体"><font style="font-size: 9pt">与</font></font><font face="Verdana"><font style="font-size: 9pt">this.stop()<br />
FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"&gt;意思就是鼠标移到</font></font><font face="Verdana"><font style="font-size: 9pt">marquee</font></font><font face="宋体"><font style="font-size: 9pt">的内容上的时候停止循环，鼠标移开</font></font><font face="Verdana"><font style="font-size: 9pt">marquee </font></font><font face="宋体"><font style="font-size: 9pt">又开始移动。</font></font><font face="Verdana"><font style="font-size: 9pt"></font></font><br />
<font face="宋体"><font style="font-size: 9pt">继续</font></font><font face="Verdana"><font style="font-size: 9pt"><br />
innercode:&nbsp; &nbsp; </font></font><font face="宋体"><font style="font-size: 9pt">设置或获取位于对象起始和结束标签内的</font></font><font face="Verdana"><font style="font-size: 9pt"> code<br />
innerText:&nbsp; &nbsp; </font></font><font face="宋体"><font style="font-size: 9pt">设置或获取位于对象起始和结束标签内的文本</font></font><font face="Verdana"><font style="font-size: 9pt"><br />
scrollLeft:&nbsp; &nbsp; </font></font><font face="宋体"><font style="font-size: 9pt">设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离</font></font><font face="Verdana"><font style="font-size: 9pt"><br />
scrollTop:&nbsp; &nbsp; </font></font><font face="宋体"><font style="font-size: 9pt">设置或获取位于对象最顶端和窗口中可见内容的最顶端之间的距离。</font></font><font face="Verdana"><font style="font-size: 9pt">PS:</font></font><font face="宋体"><font style="font-size: 9pt">大家不要想当然的以为有</font></font><font face="Verdana"><font style="font-size: 9pt">scrollRigh</font></font><font face="宋体"><font style="font-size: 9pt">和</font></font><font face="Verdana"><font style="font-size: 9pt">scrollDown </font></font><font face="宋体"><font style="font-size: 9pt">：）</font></font><font face="Verdana"><font style="font-size: 9pt"><br />
scrollDelay:&nbsp; &nbsp; </font></font><font face="宋体"><font style="font-size: 9pt">设置或获取字幕滚动的速度，要创建垂直滚动的字幕，请将其</font></font><font face="Verdana"><font style="font-size: 9pt"> scrollLeft </font></font><font face="宋体"><font style="font-size: 9pt">属性设定为</font></font><font face="Verdana"><font style="font-size: 9pt">0</font></font><font face="宋体"><font style="font-size: 9pt">，要创建水平滚动的字幕，请将其</font></font><font face="Verdana"><font style="font-size: 9pt"> scrollTop </font></font><font face="宋体"><font style="font-size: 9pt">属性设定为</font></font><font face="Verdana"><font style="font-size: 9pt"> 0</font></font><font face="宋体"><font style="font-size: 9pt">，这将覆盖任何脚本设置</font></font><font face="Verdana"><font style="font-size: 9pt"><br />
scrollHeight:&nbsp; &nbsp; </font></font><font face="宋体"><font style="font-size: 9pt">获取对象的滚动高度</font></font><font face="Verdana"><font style="font-size: 9pt"><br />
scrollAmount:&nbsp; &nbsp; </font></font><font face="宋体"><font style="font-size: 9pt">设置或获取介于每个字幕绘制序列之间的文本滚动像素数</font></font><font face="Verdana"><font style="font-size: 9pt"> <br />
offsetTop:&nbsp; &nbsp; </font></font><font face="宋体"><font style="font-size: 9pt">获取对象相对于版面或由</font></font><font face="Verdana"><font style="font-size: 9pt"> offsetTop </font></font><font face="宋体"><font style="font-size: 9pt">属性指定的父坐标的计算顶端位置</font></font><font face="Verdana"><font style="font-size: 9pt"><br />
offsetLeft:&nbsp; &nbsp; </font></font><font face="宋体"><font style="font-size: 9pt">获取对象相对于版面或由</font></font><font face="Verdana"><font style="font-size: 9pt"> offsetParent </font></font><font face="宋体"><font style="font-size: 9pt">属性指定的父坐标的计算左侧位置</font></font><font face="Verdana"><font style="font-size: 9pt"><br />
offsetHeight:&nbsp; &nbsp; </font></font><font face="宋体"><font style="font-size: 9pt">获取对象相对于版面或由父坐标</font></font><font face="Verdana"><font style="font-size: 9pt"> offsetParent </font></font><font face="宋体"><font style="font-size: 9pt">属性指定的父坐标的高度。</font></font><font face="Verdana"><font style="font-size: 9pt"> <br />
setInterval:&nbsp; &nbsp; </font></font><font face="宋体"><font style="font-size: 9pt">交互时间。它从载入后</font></font><font face="Verdana"><font style="font-size: 9pt">,</font></font><font face="宋体"><font style="font-size: 9pt">每隔指定的时间就执行一次表达式</font></font><font face="Verdana"><font style="font-size: 9pt"> <br />
clearInterval:&nbsp; &nbsp; </font></font><font face="宋体"><font style="font-size: 9pt">使用</font></font><font face="Verdana"><font style="font-size: 9pt"> setInterval </font></font><font face="宋体"><font style="font-size: 9pt">方法取消先前开始的间隔事件。</font></font>
<img src ="http://www.blogjava.net/cyantide/aggbug/250468.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2009-01-08 12:18 <a href="http://www.blogjava.net/cyantide/archive/2009/01/08/250468.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle函数集锦(转帖)</title><link>http://www.blogjava.net/cyantide/archive/2008/12/17/246895.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Wed, 17 Dec 2008 08:19:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2008/12/17/246895.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/246895.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2008/12/17/246895.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/246895.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/246895.html</trackback:ping><description><![CDATA[<p>SQL中的单记录函数 <br />
1.ASCII <br />
返回与指定的字符对应的十进制数; <br />
SQL&gt; select ascii(&#8217;A&#8217;) A,ascii(&#8217;a&#8217;) a,ascii(&#8217;0&#8217;) zero,ascii(&#8217; &#8217;) space from dual; <br />
A A ZERO SPACE <br />
--------- --------- --------- --------- <br />
65 97 48 32 </p>
<p>2.CHR <br />
给出整数,返回对应的字符; <br />
SQL&gt; select chr(54740) zhao,chr(65) chr65 from dual; <br />
ZH C <br />
-- - <br />
赵 A <br />
3.CONCAT <br />
连接两个字符串; <br />
SQL&gt; select concat(&#8217;010-&#8217;,&#8217;88888888&#8217;)||&#8217;转23&#8217; 高乾竞电话 from dual; <br />
高乾竞电话 <br />
---------------- <br />
010-88888888转23 <br />
4.INITCAP <br />
返回字符串并将字符串的第一个字母变为大写; <br />
SQL&gt; select initcap(&#8217;smith&#8217;) upp from dual; <br />
UPP <br />
----- <br />
Smith </p>
<p>5.INSTR(C1,C2,I,J) <br />
在一个字符串中搜索指定的字符,返回发现指定的字符的位置; <br />
C1 被搜索的字符串 <br />
C2 希望搜索的字符串 <br />
I 搜索的开始位置,默认为1 <br />
J 出现的位置,默认为1 <br />
SQL&gt; select instr(&#8217;oracle traning&#8217;,&#8217;ra&#8217;,1,2) instring from dual; <br />
INSTRING <br />
--------- <br />
9 </p>
<p>6.LENGTH <br />
返回字符串的长度; <br />
SQL&gt; select name,length(name),addr,length(addr),sal,length(to_char(sal)) from gao.nchar_tst; <br />
NAME LENGTH(NAME) ADDR LENGTH(ADDR) SAL LENGTH(TO_CHAR(SAL)) <br />
------ ------------ ---------------- ------------ --------- -------------------- <br />
高乾竞 3 北京市海锭区 6 9999.99 7 </p>
<p>7.LOWER <br />
返回字符串,并将所有的字符小写 <br />
SQL&gt; select lower(&#8217;AaBbCcDd&#8217;)AaBbCcDd from dual; <br />
AABBCCDD <br />
-------- <br />
aabbccdd </p>
<p>8.UPPER <br />
返回字符串,并将所有的字符大写 <br />
SQL&gt; select upper(&#8217;AaBbCcDd&#8217;) upper from dual; <br />
UPPER <br />
-------- <br />
AABBCCDD </p>
<p>9.RPAD和LPAD(粘贴字符) <br />
RPAD 在列的右边粘贴字符 <br />
LPAD 在列的左边粘贴字符 <br />
SQL&gt; select lpad(rpad(&#8217;gao&#8217;,10,&#8217;*&#8217;),17,&#8217;*&#8217;)from dual; <br />
LPAD(RPAD(&#8217;GAO&#8217;,1 <br />
----------------- <br />
*******gao******* <br />
不够字符则用*来填满 </p>
<p>10.LTRIM和RTRIM <br />
LTRIM 删除左边出现的字符串 <br />
RTRIM 删除右边出现的字符串 <br />
SQL&gt; select ltrim(rtrim(&#8217; gao qian jing &#8217;,&#8217; &#8217;),&#8217; &#8217;) from dual; <br />
LTRIM(RTRIM(&#8217; <br />
------------- <br />
gao qian jing </p>
<p>11.SUBSTR(string,start,count) <br />
取子字符串,从start开始,取count个 <br />
SQL&gt; select substr(&#8217;13088888888&#8217;,3,8) from dual; <br />
SUBSTR(&#8217; <br />
-------- <br />
08888888 </p>
<p>12.REPLACE(&#8217;string&#8217;,&#8217;s1&#8217;,&#8217;s2&#8217;) <br />
string 希望被替换的字符或变量 <br />
s1 被替换的字符串 <br />
s2 要替换的字符串 <br />
SQL&gt; select replace(&#8217;he love you&#8217;,&#8217;he&#8217;,&#8217;i&#8217;) from dual; <br />
REPLACE(&#8217;H <br />
---------- <br />
i love you </p>
<p>13.SOUNDEX <br />
返回一个与给定的字符串读音相同的字符串 <br />
SQL&gt; create table table1(xm varchar(8)); <br />
SQL&gt; insert into table1 values(&#8217;weather&#8217;); <br />
SQL&gt; insert into table1 values(&#8217;wether&#8217;); <br />
SQL&gt; insert into table1 values(&#8217;gao&#8217;); <br />
SQL&gt; select xm from table1 where soundex(xm)=soundex(&#8217;weather&#8217;); <br />
XM <br />
-------- <br />
weather <br />
wether </p>
<p>14.TRIM(&#8217;s&#8217; from &#8217;string&#8217;) <br />
LEADING 剪掉前面的字符 <br />
TRAILING 剪掉后面的字符 <br />
如果不指定,默认为空格符 <br />
15.ABS <br />
返回指定值的绝对值 <br />
SQL&gt; select abs(100),abs(-100) from dual; <br />
ABS(100) ABS(-100) <br />
--------- --------- <br />
100 100 </p>
<p>16.ACOS <br />
给出反余弦的值 <br />
SQL&gt; select acos(-1) from dual; <br />
ACOS(-1) <br />
--------- <br />
3.1415927 </p>
<p>17.ASIN <br />
给出反正弦的值 <br />
SQL&gt; select asin(0.5) from dual; <br />
ASIN(0.5) <br />
--------- <br />
.52359878 </p>
<p>18.ATAN <br />
返回一个数字的反正切值 <br />
SQL&gt; select atan(1) from dual; <br />
ATAN(1) <br />
--------- <br />
.78539816 </p>
<p>19.CEIL <br />
返回大于或等于给出数字的最小整数 <br />
SQL&gt; select ceil(3.1415927) from dual; <br />
CEIL(3.1415927) <br />
--------------- <br />
4 </p>
<p>20.COS <br />
返回一个给定数字的余弦 <br />
SQL&gt; select cos(-3.1415927) from dual; <br />
COS(-3.1415927) <br />
--------------- <br />
-1<br />
21.COSH <br />
返回一个数字反余弦值 <br />
SQL&gt; select cosh(20) from dual; <br />
COSH(20) <br />
--------- <br />
242582598 </p>
<p>22.EXP <br />
返回一个数字e的n次方根 <br />
SQL&gt; select exp(2),exp(1) from dual; <br />
EXP(2) EXP(1) <br />
--------- --------- <br />
7.3890561 2.7182818 </p>
<p>23.FLOOR <br />
对给定的数字取整数 <br />
SQL&gt; select floor(2345.67) from dual; <br />
FLOOR(2345.67) <br />
-------------- <br />
2345 </p>
<p>24.LN <br />
返回一个数字的对数值 <br />
SQL&gt; select ln(1),ln(2),ln(2.7182818) from dual; <br />
LN(1) LN(2) LN(2.7182818) <br />
--------- --------- ------------- <br />
0 .69314718 .99999999 </p>
<p>25.LOG(n1,n2) <br />
返回一个以n1为底n2的对数 <br />
SQL&gt; select log(2,1),log(2,4) from dual; <br />
LOG(2,1) LOG(2,4) <br />
--------- --------- <br />
0 2 </p>
<p>26.MOD(n1,n2) <br />
返回一个n1除以n2的余数 <br />
SQL&gt; select mod(10,3),mod(3,3),mod(2,3) from dual; <br />
MOD(10,3) MOD(3,3) MOD(2,3) <br />
--------- --------- --------- <br />
1 0 2 </p>
<p>27.POWER <br />
返回n1的n2次方根 <br />
SQL&gt; select power(2,10),power(3,3) from dual; <br />
POWER(2,10) POWER(3,3) <br />
----------- ---------- <br />
1024 27 </p>
<p>28.ROUND和TRUNC <br />
按照指定的精度进行舍入 <br />
SQL&gt; select round(55.5),round(-55.4),trunc(55.5),trunc(-55.5) from dual; <br />
ROUND(55.5) ROUND(-55.4) TRUNC(55.5) TRUNC(-55.5) <br />
----------- ------------ ----------- ------------ <br />
56 -55 55 -55 </p>
<p>29.SIGN <br />
取数字n的符号,大于0返回1,小于0返回-1,等于0返回0 <br />
SQL&gt; select sign(123),sign(-100),sign(0) from dual; <br />
SIGN(123) SIGN(-100) SIGN(0) <br />
--------- ---------- --------- <br />
1 -1 0 </p>
<p>30.SIN <br />
返回一个数字的正弦值 <br />
SQL&gt; select sin(1.57079) from dual; <br />
SIN(1.57079) <br />
------------ <br />
1 </p>
<p>31.SIGH <br />
返回双曲正弦的值 <br />
SQL&gt; select sin(20),sinh(20) from dual; <br />
SIN(20) SINH(20) <br />
--------- --------- <br />
.91294525 242582598 </p>
<p>32.SQRT <br />
返回数字n的根 <br />
SQL&gt; select sqrt(64),sqrt(10) from dual; <br />
SQRT(64) SQRT(10) <br />
--------- --------- <br />
8 3.1622777 </p>
<p>33.TAN <br />
返回数字的正切值 <br />
SQL&gt; select tan(20),tan(10) from dual; <br />
TAN(20) TAN(10) <br />
--------- --------- <br />
2.2371609 .64836083 </p>
<p>34.TANH <br />
返回数字n的双曲正切值 <br />
SQL&gt; select tanh(20),tan(20) from dual; <br />
TANH(20) TAN(20) <br />
--------- --------- <br />
1 2.2371609 </p>
<p>35.TRUNC <br />
按照指定的精度截取一个数 <br />
SQL&gt; select trunc(124.1666,-2) trunc1,trunc(124.16666,2) from dual; <br />
TRUNC1 TRUNC(124.16666,2) <br />
--------- ------------------ <br />
100 124.16 </p>
<p>36.ADD_MONTHS <br />
增加或减去月份 <br />
SQL&gt; select to_char(add_months(to_date(&#8217;199912&#8217;,&#8217;yyyymm&#8217;),2),&#8217;yyyymm&#8217;) from dual; <br />
TO_CHA <br />
------ <br />
200002 <br />
SQL&gt; select to_char(add_months(to_date(&#8217;199912&#8217;,&#8217;yyyymm&#8217;),-2),&#8217;yyyymm&#8217;) from dual; <br />
TO_CHA <br />
------ <br />
199910 </p>
<p>37.LAST_DAY <br />
返回日期的最后一天 <br />
SQL&gt; select to_char(sysdate,&#8217;yyyy.mm.dd&#8217;),to_char((sysdate)+1,&#8217;yyyy.mm.dd&#8217;) from dual; <br />
TO_CHAR(SY TO_CHAR((S <br />
---------- ---------- <br />
2004.05.09 2004.05.10 <br />
SQL&gt; select last_day(sysdate) from dual; <br />
LAST_DAY(S <br />
---------- <br />
31-5月 -04 </p>
<p>38.MONTHS_BETWEEN(date2,date1) <br />
给出date2-date1的月份 <br />
SQL&gt; select months_between(&#8217;19-12月-1999&#8217;,&#8217;19-3月-1999&#8217;) mon_between from dual; <br />
MON_BETWEEN <br />
----------- <br />
9 <br />
SQL&gt;selectmonths_between(to_date(&#8217;2000.05.20&#8217;,&#8217;yyyy.mm.dd&#8217;),to_date(&#8217;2005.05.20&#8217;,&#8217;yyyy.mm.dd&#8217;)) mon_betw from dual; <br />
MON_BETW <br />
--------- <br />
-60 </p>
<p>39.NEW_TIME(date,&#8217;this&#8217;,&#8217;that&#8217;) <br />
给出在this时区=other时区的日期和时间 <br />
SQL&gt; select to_char(sysdate,&#8217;yyyy.mm.dd hh24:mi:ss&#8217;) bj_time,to_char(new_time <br />
2 (sysdate,&#8217;PDT&#8217;,&#8217;GMT&#8217;),&#8217;yyyy.mm.dd hh24:mi:ss&#8217;) los_angles from dual; <br />
BJ_TIME LOS_ANGLES <br />
------------------- ------------------- <br />
2004.05.09 11:05:32 2004.05.09 18:05:32 </p>
<p>40.NEXT_DAY(date,&#8217;day&#8217;) <br />
给出日期date和星期x之后计算下一个星期的日期 <br />
SQL&gt; select next_day(&#8217;18-5月-2001&#8217;,&#8217;星期五&#8217;) next_day from dual; <br />
NEXT_DAY <br />
---------- <br />
25-5月 -01<br />
41.SYSDATE <br />
用来得到系统的当前日期 <br />
SQL&gt; select to_char(sysdate,&#8217;dd-mm-yyyy day&#8217;) from dual; <br />
TO_CHAR(SYSDATE,&#8217; <br />
----------------- <br />
09-05-2004 星期日 <br />
trunc(date,fmt)按照给出的要求将日期截断,如果fmt=&#8217;mi&#8217;表示保留分,截断秒 <br />
SQL&gt; select to_char(trunc(sysdate,&#8217;hh&#8217;),&#8217;yyyy.mm.dd hh24:mi:ss&#8217;) hh, <br />
2 to_char(trunc(sysdate,&#8217;mi&#8217;),&#8217;yyyy.mm.dd hh24:mi:ss&#8217;) hhmm from dual; <br />
HH HHMM <br />
------------------- ------------------- <br />
2004.05.09 11:00:00 2004.05.09 11:17:00 </p>
<p>42.CHARTOROWID <br />
将字符数据类型转换为ROWID类型 <br />
SQL&gt; select rowid,rowidtochar(rowid),ename from scott.emp; <br />
ROWID ROWIDTOCHAR(ROWID) ENAME <br />
------------------ ------------------ ---------- <br />
AAAAfKAACAAAAEqAAA AAAAfKAACAAAAEqAAA SMITH <br />
AAAAfKAACAAAAEqAAB AAAAfKAACAAAAEqAAB ALLEN <br />
AAAAfKAACAAAAEqAAC AAAAfKAACAAAAEqAAC WARD <br />
AAAAfKAACAAAAEqAAD AAAAfKAACAAAAEqAAD JONES </p>
<p>43.CONVERT(c,dset,sset) <br />
将源字符串 sset从一个语言字符集转换到另一个目的dset字符集 <br />
SQL&gt; select convert(&#8217;strutz&#8217;,&#8217;we8hp&#8217;,&#8217;f7dec&#8217;) "conversion" from dual; <br />
conver <br />
------ <br />
strutz </p>
<p>44.HEXTORAW <br />
将一个十六进制构成的字符串转换为二进制 </p>
<p>45.RAWTOHEXT <br />
将一个二进制构成的字符串转换为十六进制 </p>
<p>46.ROWIDTOCHAR <br />
将ROWID数据类型转换为字符类型 </p>
<p>47.TO_CHAR(date,&#8217;format&#8217;) <br />
SQL&gt; select to_char(sysdate,&#8217;yyyy/mm/dd hh24:mi:ss&#8217;) from dual; <br />
TO_CHAR(SYSDATE,&#8217;YY <br />
------------------- <br />
2004/05/09 21:14:41 </p>
<p>48.TO_DATE(string,&#8217;format&#8217;) <br />
将字符串转化为ORACLE中的一个日期 </p>
<p>49.TO_MULTI_BYTE <br />
将字符串中的单字节字符转化为多字节字符 <br />
SQL&gt; select to_multi_byte(&#8217;高&#8217;) from dual; <br />
TO <br />
-- <br />
高 </p>
<p>50.TO_NUMBER <br />
将给出的字符转换为数字 <br />
SQL&gt; select to_number(&#8217;1999&#8217;) year from dual; <br />
YEAR <br />
--------- <br />
1999 </p>
<p>51.BFILENAME(dir,file) <br />
指定一个外部二进制文件 <br />
SQL&gt;insert into file_tb1 values(bfilename(&#8217;lob_dir1&#8217;,&#8217;image1.gif&#8217;)); </p>
<p>52.CONVERT(&#8217;x&#8217;,&#8217;desc&#8217;,&#8217;source&#8217;) <br />
将x字段或变量的源source转换为desc <br />
SQL&gt; select sid,serial#,username,decode(command, <br />
2 0,&#8217;none&#8217;, <br />
3 2,&#8217;insert&#8217;, <br />
4 3, <br />
5 &#8217;select&#8217;, <br />
6 6,&#8217;update&#8217;, <br />
7 7,&#8217;delete&#8217;, <br />
8 8,&#8217;drop&#8217;, <br />
9 &#8217;other&#8217;) cmd from v$session where type!=&#8217;background&#8217;; <br />
SID SERIAL# USERNAME CMD <br />
--------- --------- ------------------------------ ------ <br />
1 1 none <br />
2 1 none <br />
3 1 none <br />
4 1 none <br />
5 1 none <br />
6 1 none <br />
7 1275 none <br />
8 1275 none <br />
9 20 GAO select <br />
10 40 GAO none </p>
<p>53.DUMP(s,fmt,start,length) <br />
DUMP函数以fmt指定的内部数字格式返回一个VARCHAR2类型的值 <br />
SQL&gt; col global_name for a30 <br />
SQL&gt; col dump_string for a50 <br />
SQL&gt; set lin 200 <br />
SQL&gt; select global_name,dump(global_name,1017,8,5) dump_string from global_name; <br />
GLOBAL_NAME DUMP_STRING <br />
------------------------------ -------------------------------------------------- <br />
ORACLE.WORLD Typ=1 Len=12 CharacterSet=ZHS16GBK: W,O,R,L,D </p>
<p>54.EMPTY_BLOB()和EMPTY_CLOB() <br />
这两个函数都是用来对大数据类型字段进行初始化操作的函数 </p>
<p>55.GREATEST <br />
返回一组表达式中的最大值,即比较字符的编码大小. <br />
SQL&gt; select greatest(&#8217;AA&#8217;,&#8217;AB&#8217;,&#8217;AC&#8217;) from dual; <br />
GR <br />
-- <br />
AC <br />
SQL&gt; select greatest(&#8217;啊&#8217;,&#8217;安&#8217;,&#8217;天&#8217;) from dual; <br />
GR <br />
-- <br />
天 </p>
<p>56.LEAST <br />
返回一组表达式中的最小值 <br />
SQL&gt; select least(&#8217;啊&#8217;,&#8217;安&#8217;,&#8217;天&#8217;) from dual; <br />
LE <br />
-- <br />
啊 </p>
<p>57.UID <br />
返回标识当前用户的唯一整数 <br />
SQL&gt; show user <br />
USER 为"GAO" <br />
SQL&gt; select username,user_id from dba_users where user_id=uid; <br />
USERNAME USER_ID <br />
------------------------------ --------- <br />
GAO 25 </p>
<p>58.USER <br />
返回当前用户的名字 <br />
SQL&gt; select user from dual; <br />
USER <br />
------------------------------ <br />
GAO </p>
<p>59.USEREVN <br />
返回当前用户环境的信息,opt可以是: <br />
ENTRYID,SESSIONID,TERMINAL,ISDBA,LABLE,LANGUAGE,CLIENT_INFO,LANG,VSIZE <br />
ISDBA 查看当前用户是否是DBA如果是则返回true <br />
SQL&gt; select userenv(&#8217;isdba&#8217;) from dual; <br />
USEREN <br />
------ <br />
FALSE <br />
SQL&gt; select userenv(&#8217;isdba&#8217;) from dual; <br />
USEREN <br />
------ <br />
TRUE <br />
SESSION <br />
返回会话标志 <br />
SQL&gt; select userenv(&#8217;sessionid&#8217;) from dual; <br />
USERENV(&#8217;SESSIONID&#8217;) <br />
-------------------- <br />
152 <br />
ENTRYID <br />
返回会话人口标志 <br />
SQL&gt; select userenv(&#8217;entryid&#8217;) from dual; <br />
USERENV(&#8217;ENTRYID&#8217;) <br />
------------------ <br />
0 <br />
INSTANCE <br />
返回当前INSTANCE的标志 <br />
SQL&gt; select userenv(&#8217;instance&#8217;) from dual; <br />
USERENV(&#8217;INSTANCE&#8217;) <br />
------------------- <br />
1 <br />
LANGUAGE <br />
返回当前环境变量 <br />
SQL&gt; select userenv(&#8217;language&#8217;) from dual; <br />
USERENV(&#8217;LANGUAGE&#8217;) <br />
---------------------------------------------------- <br />
SIMPLIFIED CHINESE_CHINA.ZHS16GBK <br />
LANG <br />
返回当前环境的语言的缩写 <br />
SQL&gt; select userenv(&#8217;lang&#8217;) from dual; <br />
USERENV(&#8217;LANG&#8217;) <br />
---------------------------------------------------- <br />
ZHS <br />
TERMINAL <br />
返回用户的终端或机器的标志 <br />
SQL&gt; select userenv(&#8217;terminal&#8217;) from dual; <br />
USERENV(&#8217;TERMINA <br />
---------------- <br />
GAO <br />
VSIZE(X) <br />
返回X的大小(字节)数 <br />
SQL&gt; select vsize(user),user from dual; <br />
VSIZE(USER) USER <br />
----------- ------------------------------ <br />
6 SYSTEM</p>
<p><br />
60.AVG(DISTINCT|ALL) <br />
all表示对所有的值求平均值,distinct只对不同的值求平均值 <br />
SQLWKS&gt; create table table3(xm varchar(8),sal number(7,2)); <br />
语句已处理。 <br />
SQLWKS&gt; insert into table3 values(&#8217;gao&#8217;,1111.11); <br />
SQLWKS&gt; insert into table3 values(&#8217;gao&#8217;,1111.11); <br />
SQLWKS&gt; insert into table3 values(&#8217;zhu&#8217;,5555.55); <br />
SQLWKS&gt; commit; <br />
SQL&gt; select avg(distinct sal) from gao.table3; <br />
AVG(DISTINCTSAL) <br />
---------------- <br />
3333.33 <br />
SQL&gt; select avg(all sal) from gao.table3; <br />
AVG(ALLSAL) <br />
----------- <br />
2592.59 </p>
<p>61.MAX(DISTINCT|ALL) <br />
求最大值,ALL表示对所有的值求最大值,DISTINCT表示对不同的值求最大值,相同的只取一次 <br />
SQL&gt; select max(distinct sal) from scott.emp; <br />
MAX(DISTINCTSAL) <br />
---------------- <br />
5000 </p>
<p>62.MIN(DISTINCT|ALL) <br />
求最小值,ALL表示对所有的值求最小值,DISTINCT表示对不同的值求最小值,相同的只取一次 <br />
SQL&gt; select min(all sal) from gao.table3; <br />
MIN(ALLSAL) <br />
----------- <br />
1111.11 </p>
<p>63.STDDEV(distinct|all) <br />
求标准差,ALL表示对所有的值求标准差,DISTINCT表示只对不同的值求标准差 <br />
SQL&gt; select stddev(sal) from scott.emp; <br />
STDDEV(SAL) <br />
----------- <br />
1182.5032 <br />
SQL&gt; select stddev(distinct sal) from scott.emp; <br />
STDDEV(DISTINCTSAL) <br />
------------------- <br />
1229.951 </p>
<p>64.VARIANCE(DISTINCT|ALL) <br />
求协方差 <br />
SQL&gt; select variance(sal) from scott.emp; <br />
VARIANCE(SAL) <br />
------------- <br />
1398313.9 </p>
<p>65.GROUP BY <br />
主要用来对一组数进行统计 <br />
SQL&gt; select deptno,count(*),sum(sal) from scott.emp group by deptno; <br />
DEPTNO COUNT(*) SUM(SAL) <br />
--------- --------- --------- <br />
10 3 8750 <br />
20 5 10875 <br />
30 6 9400 </p>
<p>66.HAVING <br />
对分组统计再加限制条件 <br />
SQL&gt; select deptno,count(*),sum(sal) from scott.emp group by deptno having count(*)&gt;=5; <br />
DEPTNO COUNT(*) SUM(SAL) <br />
--------- --------- --------- <br />
20 5 10875 <br />
30 6 9400 <br />
SQL&gt; select deptno,count(*),sum(sal) from scott.emp having count(*)&gt;=5 group by deptno ; <br />
DEPTNO COUNT(*) SUM(SAL) <br />
--------- --------- --------- <br />
20 5 10875 <br />
30 6 9400 </p>
<p>67.ORDER BY <br />
用于对查询到的结果进行排序输出 <br />
SQL&gt; select deptno,ename,sal from scott.emp order by deptno,sal desc; <br />
DEPTNO ENAME SAL <br />
--------- ---------- --------- <br />
10 KING 5000 <br />
10 CLARK 2450 <br />
10 MILLER 1300 <br />
20 SCOTT 3000 <br />
20 FORD 3000 <br />
20 JONES 2975 <br />
20 ADAMS 1100 <br />
20 SMITH 800 <br />
30 BLAKE 2850 <br />
30 ALLEN 1600 <br />
30 TURNER 1500 <br />
30 WARD 1250 <br />
30 MARTIN 1250 <br />
30 JAMES 950 <br />
</p>
 <img src ="http://www.blogjava.net/cyantide/aggbug/246895.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2008-12-17 16:19 <a href="http://www.blogjava.net/cyantide/archive/2008/12/17/246895.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>远程镜像与备份SVN服务器(转载)</title><link>http://www.blogjava.net/cyantide/archive/2008/12/14/246198.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Sun, 14 Dec 2008 01:31:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2008/12/14/246198.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/246198.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2008/12/14/246198.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/246198.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/246198.html</trackback:ping><description><![CDATA[<h2>远程镜像与备份SVN服务器</h2>
<div class="t_msgfont" id="postmessage_17661">
<p align="left"><font face="宋体 "><font style="font-size: 18pt">如需转载，请注明出处：</font></font><a href="http://bbs.iusesvn.com/thread-3068-1-1.html" target="_blank"><font face="宋体 "><font style="font-size: 18pt">http://bbs.iusesvn.com/thread-3068-1-1.html</font></font></a><br />
<font face="宋体 "><font style="font-size: 10pt">此文讲述</font></font><font style="font-size: 10pt">SVN</font><font face="宋体 "><font style="font-size: 10pt">如何镜像<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E6%9C%8D%E5%8A%A1%E5%99%A8">服务器</span>，注意是单向镜像。众所周知，</font></font><font style="font-size: 10pt">SVN</font><font face="宋体 "><font style="font-size: 10pt">有自已的镜像<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E5%91%BD%E4%BB%A4">命令</span></font></font><font style="font-size: 10pt">svnsync(svn1.4</font><font face="宋体 "><font style="font-size: 10pt">以及以上版本特性</font></font><font style="font-size: 10pt">),</font><font face="宋体 "><font style="font-size: 10pt">但是部署与维护确是繁琐至极，令人望而却步。我们来看一个简单的</font></font><font style="font-size: 10pt">svnsync</font><font face="宋体 "><font style="font-size: 10pt">例子：</font></font><br />
<font face="宋体 "><font style="font-size: 10pt">主</font></font><font style="font-size: 10pt">SVN</font><font face="宋体 "><font style="font-size: 10pt"><span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E6%9C%8D%E5%8A%A1">服务</span>器：</font></font><font style="font-size: 10pt"> <a href="http://mastersvn/project1" target="_blank">http://mastersvn/project1</a></font><font style="font-size: 10pt"><br />
<font color="black">svnsync</font></font><font face="宋体 "><font style="font-size: 10pt">镜像</font></font><font style="font-size: 10pt">SVN</font><font face="宋体 "><font style="font-size: 10pt">服务器上的部署：</font></font><font style="font-size: 10pt"><a href="http://backupsvn/project1" target="_blank">http://backupsvn/project1</a></font></p>
<p align="left"><font face="宋体 "><font style="font-size: 10pt">第一步：建立<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E4%BB%93%E5%BA%93">仓库</span></font></font><font style="font-size: 10pt"><br />
<font color="black">cd /<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=home">home</span>/svn</font><br />
<font color="black">svn<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=admin">admin</span> create &#8211;fs-type fsfs /home/svn/project1</font><br />
<font color="black">ch<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=mod">mod</span> 777 &#8211;R project1</font><br />
</font><font face="宋体 "><font style="font-size: 10pt">第二步：镜像初始化</font></font><font style="font-size: 10pt"><br />
<font color="black">svnsync init <a href="http://backupsvn/project1" target="_blank">http://backupsvn/project1</a></font></font><font style="font-size: 10pt"><font color="black"> <a href="http://mastersvn/project1" target="_blank">http://mastersvn/project1</a></font><br />
</font><font face="宋体 "><font style="font-size: 10pt">第三步：更改配置<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E6%96%87%E4%BB%B6">文件</span></font></font><font style="font-size: 10pt"><br />
<font color="black">cd /home/svn/project1/hooks</font><br />
<font color="black">cp pre-revprop-change.tmpl pre-revprop-change</font></font></p>
<p align="left"><font style="font-size: 10pt">vi pre-revprop-change<br />
</font><font face="宋体 "><font style="font-size: 10pt">注销所有语句，在语句前加入</font></font><font style="font-size: 10pt">#</font><font face="宋体 "><font style="font-size: 10pt">即可，退出保存</font></font><br />
<font face="宋体 "><font style="font-size: 10pt">第四步：同步</font></font><font style="font-size: 10pt"><br />
<font color="black">svnsync sync http://backupsvn/project1 --username username --password password</font><br />
</font><font face="宋体 "><font style="font-size: 10pt">已提交版本</font></font><font style="font-size: 10pt"> 9</font><font face="宋体 "><font style="font-size: 10pt">。</font></font><br />
<font face="宋体 "><font style="font-size: 10pt">复制版本</font></font><font style="font-size: 10pt"> 9 </font><font face="宋体 "><font style="font-size: 10pt">的<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E5%B1%9E%E6%80%A7">属性</span>。</font></font><br />
<font face="宋体 "><font style="font-size: 10pt">已提交版本</font></font><font style="font-size: 10pt"> 10</font><font face="宋体 "><font style="font-size: 10pt">。</font></font><br />
<font face="宋体 "><font style="font-size: 10pt">复制版本</font></font><font style="font-size: 10pt"> 10 </font><font face="宋体 "><font style="font-size: 10pt">的属性</font></font><font style="font-size: 10pt"><br />
<font color="black">&#8230;&#8230;&#8230;&#8230;&#8230;</font><br />
</font><font face="宋体 "><font style="font-size: 10pt">但是在实际运用中，经常会发生</font></font><font style="font-size: 10pt">SVN</font><font face="宋体 "><font style="font-size: 10pt">库被</font></font><font style="font-size: 10pt">lock</font><font face="宋体 "><font style="font-size: 10pt">的情况</font></font><font style="font-size: 10pt"><br />
<font color="black">svnsync: Couldn't get lock on destination repos after 10 attempts</font><br />
</font><font face="宋体 "><font style="font-size: 10pt">这不得不让我们感觉头痛地手动使用改命令解锁</font></font><font style="font-size: 10pt"><br />
<font color="black">svn propdel svn:sync-lock --revprop -r0 http://backupsvn/project1</font><br />
</font><font face="宋体 "><font style="font-size: 10pt">写到这里，大家不由对</font></font><font style="font-size: 10pt">svnsync</font><font face="宋体 "><font style="font-size: 10pt">有了个初步的认识了吧，就一个字，烦！！！而且同步速度很慢！！！</font></font><font style="font-size: 10pt"><br />
<font color="black">----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------</font><br />
</font><font face="宋体 "><font style="font-size: 10pt">接下来是此文的重点部分：</font></font><font style="font-size: 10pt"><br />
<font color="black">SVN</font></font><font face="宋体 "><font style="font-size: 10pt">新的镜像备份方案：</font></font><font style="font-size: 10pt">ssh + rsync + crontab(</font><font face="宋体 "><font style="font-size: 10pt">任务计划</font></font><font style="font-size: 10pt">))</font><br />
<strong><font face="宋体 "><font style="font-size: 10pt">什么是</font></font></strong><strong><font style="font-size: 10pt">SSH?</font></strong><font style="font-size: 10pt"><br />
<font color="black">SSH </font></font><font face="宋体 "><font style="font-size: 10pt">是更灵活、更安全的</font></font><font style="font-size: 10pt"> telnet </font><font face="宋体 "><font style="font-size: 10pt">和</font></font><font style="font-size: 10pt"> rlogin </font><font face="宋体 "><font style="font-size: 10pt">替代品。它在<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E5%BC%80%E5%8F%91">开发</span><span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E9%A1%B9%E7%9B%AE">项目</span>中得到广泛使用，以提供<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E8%AE%BF%E9%97%AE">访问</span>控制和安全的数据传输。</font></font><br />
<strong><font face="宋体 "><font style="font-size: 10pt">什么是</font></font></strong><strong><font style="font-size: 10pt">rysnc?</font></strong><font style="font-size: 10pt"><br />
<font color="black">rsync</font></font><font face="宋体 "><font style="font-size: 10pt">是类</font></font><font style="font-size: 10pt">unix</font><font face="宋体 "><font style="font-size: 10pt"><span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E7%B3%BB%E7%BB%9F">系统</span>下的数据镜像备份<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E5%B7%A5%E5%85%B7">工具</span>，从<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E8%BD%AF%E4%BB%B6">软件</span>的命名上就可以看出来了</font></font><font style="font-size: 10pt">——remote sync</font><font face="宋体 "><font style="font-size: 10pt">。它的特性如下：</font></font><br />
<font face="宋体 "><font style="font-size: 10pt">可以镜像保存整个<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E7%9B%AE%E5%BD%95">目录</span>树和文件系统。</font></font><br />
<font face="宋体 "><font style="font-size: 10pt">可以很容易做到保持原来文件的<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E6%9D%83%E9%99%90">权限</span>、时间、软硬链接等等。</font></font><br />
<font face="宋体 "><font style="font-size: 10pt">无须特殊权限即可安装。</font></font><br />
<font face="宋体 "><font style="font-size: 10pt">优化的流程，文件传输效率高。</font></font><br />
<font face="宋体 "><font style="font-size: 10pt">可以使用</font></font><font style="font-size: 10pt">rcp</font><font face="宋体 "><font style="font-size: 10pt">、</font></font><font style="font-size: 10pt">ssh</font><font face="宋体 "><font style="font-size: 10pt">等方式来传输文件，当然也可以通过直接的</font></font><font style="font-size: 10pt">socket</font><font face="宋体 "><font style="font-size: 10pt">连接。</font></font><br />
<font face="宋体 "><font style="font-size: 10pt">支持匿名传输，以方便进行网站镜象。</font></font><br />
<strong><font face="宋体 "><font style="font-size: 10pt">什么是</font></font></strong><strong><font style="font-size: 10pt">crontab?</font></strong><font style="font-size: 10pt"><br />
<font color="black">Crontab</font></font><font face="宋体 "><font style="font-size: 10pt">是</font></font><font style="font-size: 10pt">Linux</font><font face="宋体 "><font style="font-size: 10pt"><span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F">操作系统</span>下的一个命令，可以用来根据时间、日期、月份、星期的组合来调度对重复任务的执行的守护进程。</font></font><font style="font-size: 10pt">(</font><font face="宋体 "><font style="font-size: 10pt">类似</font></font><font style="font-size: 10pt"><span class="t_tag" onclick="tagshow(event)" href="tag.php?name=windows">windows</span></font><font face="宋体 "><font style="font-size: 10pt">下的任务计划</font></font><font style="font-size: 10pt">)</font><br />
<strong><font face="宋体 "><font style="font-size: 10pt">方案拓扑图：（请看附件）</font></font></strong><br />
<strong><font face="宋体 "><font style="font-size: 10pt">主</font></font></strong><strong><font style="font-size: 10pt">SVN</font></strong><strong><font face="宋体 "><font style="font-size: 10pt">服务器<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E7%8E%AF%E5%A2%83">环境</span>：</font></font></strong><font style="font-size: 10pt"><br />
<font color="black">SVN</font></font><font face="宋体 "><font style="font-size: 10pt">仓库根目录：</font></font><font style="font-size: 10pt"> /home/svn (project1,project2,project3</font><font face="宋体 "><font style="font-size: 10pt">三个仓库</font></font><font style="font-size: 10pt">)</font><font style="font-size: 10pt"><br />
<font color="black">SVN</font></font><font face="宋体 "><font style="font-size: 10pt">服务器</font></font><font style="font-size: 10pt">IP</font><font face="宋体 "><font style="font-size: 10pt">：</font></font><font style="font-size: 10pt"> 192.168.100.80</font><br />
<strong><font face="宋体 "><font style="font-size: 10pt">镜像</font></font></strong><strong><font style="font-size: 10pt">SVN</font></strong><strong><font face="宋体 "><font style="font-size: 10pt">服务器环境：</font></font></strong><font style="font-size: 10pt"><br />
<font color="black">SVN</font></font><font face="宋体 "><font style="font-size: 10pt">仓库根目录：</font></font><font style="font-size: 10pt">/home/svn </font><font face="宋体 "><font style="font-size: 10pt">（无仓库，无需建立，镜像时会直接复制过来并保持文件属性）</font></font><font style="font-size: 10pt"><br />
<font color="black">SVN</font></font><font face="宋体 "><font style="font-size: 10pt">服务器</font></font><font style="font-size: 10pt">IP</font><font face="宋体 "><font style="font-size: 10pt">：</font></font><font style="font-size: 10pt"> 192.168.100.81</font><font style="font-size: 10pt"><br />
<br />
<strong><font color="blue">#</font></strong></font><strong><font face="宋体 "><font style="font-size: 10pt">主</font></font></strong><strong><font style="font-size: 10pt">SVN</font></strong><strong><font face="宋体 "><font style="font-size: 10pt">服务器安装部分：</font></font></strong><br />
<font face="宋体 "><font style="font-size: 10pt">（</font></font><font style="font-size: 10pt">1</font><font face="宋体 "><font style="font-size: 10pt">）</font></font><br />
<font style="font-size: 10pt">SVN</font><font face="宋体 "><font style="font-size: 10pt">安装部分（略）</font></font><br />
<font face="宋体 "><font style="font-size: 10pt">（</font></font><font style="font-size: 10pt">2</font><font face="宋体 "><font style="font-size: 10pt">）</font></font><br />
<font face="宋体 "><font style="font-size: 10pt">安装</font></font><font style="font-size: 10pt">rsync</font><font face="宋体 "><font style="font-size: 10pt">部分</font></font><font style="font-size: 10pt"><br />
<font color="black">rpm -qa | grep rsync (</font></font><font face="宋体 "><font style="font-size: 10pt">所有系统是否有安装过</font></font><font style="font-size: 10pt">rsync)</font><font style="font-size: 10pt"><br />
<font color="black">rpm -e rsyncxxx (</font></font><font face="宋体 "><font style="font-size: 10pt"><span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E5%88%A0%E9%99%A4">删除</span>以前安装过的</font></font><font style="font-size: 10pt">rsync)</font><font style="font-size: 10pt"><br />
<font color="black">wget </font></font><a href="http://samba.anu.edu.au/ftp/rsync/rsync-3.0.4.tar.gz" target="_blank"><font style="font-size: 10pt">http://samba.anu.edu.au/ftp/rsync/rsync-3.0.4.tar.gz</font></a><font style="font-size: 10pt"> (</font><font face="宋体 "><font style="font-size: 10pt"><span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E4%B8%8B%E8%BD%BD">下载</span></font></font><font style="font-size: 10pt">rsync</font><font face="宋体 "><font style="font-size: 10pt"><span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E6%BA%90%E7%A0%81">源码</span>安装包</font></font><font style="font-size: 10pt">)</font><font style="font-size: 10pt"><br />
<font color="black">tar zxvf rsync-3.0.4.tar.gz (</font></font><font face="宋体 "><font style="font-size: 10pt">解压</font></font><font style="font-size: 10pt">)</font><font style="font-size: 10pt"><br />
<font color="black">cd rsync-3.0.4</font><br />
<font color="black">./install.sh (</font></font><font face="宋体 "><font style="font-size: 10pt">安装</font></font><font style="font-size: 10pt">)</font><br />
<font face="宋体 "><font style="font-size: 10pt">接下来我们就可以输入</font></font><font style="font-size: 10pt">rsync --version</font><font face="宋体 "><font style="font-size: 10pt">命令来测试下是否安装成功了。</font></font><font style="font-size: 10pt"><br />
<font color="black">rsync<br />
version 3.0.3<br />
protocol version 30</font><br />
<font color="black">Copyright (C) 1996-2008 by Andrew Tridgell, Wayne Davison, and others.</font><br />
<font color="black">Web site: </font></font><a href="http://rsync.samba.org/" target="_blank"><font style="font-size: 10pt">http://rsync.samba.org/</font></a><font style="font-size: 10pt"><br />
<font color="black">Capabilities:<br />
64-bit files, 64-bit inums, 32-bit timestamps, 64-bit long ints,<br />
socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace,<br />
append, ACLs, xattrs, iconv, no symtimes</font><br />
<font color="black">rsync comes with ABSOLUTELY NO WARRANTY.<br />
This is free software, and you</font><br />
<font color="black">are welcome to redistribute it under certain conditions.<br />
See the GNU</font><br />
<font color="black">General Public Licence for details.</font><br />
<font color="black">(3) </font></font><font face="宋体 "><font style="font-size: 10pt">开启</font></font><font style="font-size: 10pt">rsync</font><font face="宋体 "><font style="font-size: 10pt">服务器端</font></font><font style="font-size: 10pt"><br />
/<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=usr">usr</span>/local/bin/rsync --daemon (</font><font face="宋体 "><font style="font-size: 10pt">开启</font></font><font style="font-size: 10pt">rsync</font><font face="宋体 "><font style="font-size: 10pt">服务</font></font><font style="font-size: 10pt">)</font><font style="font-size: 10pt"><br />
vi /etc/rc.d/rc.local<br />
</font><font face="宋体 "><font style="font-size: 10pt">在末尾加入</font></font><font style="font-size: 10pt">/usr/local/bin/rsync --daemon (</font><font face="宋体 "><font style="font-size: 10pt">目的是让服务器每次重启后都能<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E8%87%AA%E5%8A%A8">自动</span>运行此进程</font></font><font style="font-size: 10pt">)</font><font style="font-size: 10pt"><br />
<br />
<strong><font color="blue">#</font></strong></font><strong><font face="宋体 "><font style="font-size: 10pt">镜像</font></font></strong><strong><font style="font-size: 10pt">SVN</font></strong><strong><font face="宋体 "><font style="font-size: 10pt">服务器安装部分：</font></font></strong><br />
<font face="宋体 "><font style="font-size: 10pt">（</font></font><font style="font-size: 10pt">1</font><font face="宋体 "><font style="font-size: 10pt">）</font></font><font style="font-size: 10pt">SVN</font><font face="宋体 "><font style="font-size: 10pt">安装部分（略）</font></font><br />
<font face="宋体 "><font style="font-size: 10pt">（</font></font><font style="font-size: 10pt">2</font><font face="宋体 "><font style="font-size: 10pt">）</font></font><font face="宋体 "><font style="font-size: 10pt">安装</font></font><font style="font-size: 10pt">rsync</font><font face="宋体 "><font style="font-size: 10pt">部分</font></font><font style="font-size: 10pt"><br />
<font color="black">rpm -qa | grep rsync (</font></font><font face="宋体 "><font style="font-size: 10pt">所有系统是否有安装过</font></font><font style="font-size: 10pt">rsync)</font><font style="font-size: 10pt"><br />
<font color="black">rpm -e rsyncxxx (</font></font><font face="宋体 "><font style="font-size: 10pt">删除以前安装过的</font></font><font style="font-size: 10pt">rsync)</font><font style="font-size: 10pt"><br />
<font color="black">wget </font></font><a href="http://samba.anu.edu.au/ftp/rsync/rsync-3.0.4.tar.gz" target="_blank"><font style="font-size: 10pt">http://samba.anu.edu.au/ftp/rsync/rsync-3.0.4.tar.gz</font></a><font style="font-size: 10pt"> (</font><font face="宋体 "><font style="font-size: 10pt">下载</font></font><font style="font-size: 10pt">rsync</font><font face="宋体 "><font style="font-size: 10pt">源码安装包</font></font><font style="font-size: 10pt">)</font><font style="font-size: 10pt"><br />
<font color="black">tar zxvf rsync-3.0.4.tar.gz (</font></font><font face="宋体 "><font style="font-size: 10pt">解压</font></font><font style="font-size: 10pt">)</font><font style="font-size: 10pt"><br />
<font color="black">cd rsync-3.0.4</font><br />
<font color="black">./install.sh (</font></font><font face="宋体 "><font style="font-size: 10pt">安装</font></font><font style="font-size: 10pt">)</font><br />
<font face="宋体 "><font style="font-size: 10pt">接下来我们就可以输入</font></font><font style="font-size: 10pt">rsync --version</font><font face="宋体 "><font style="font-size: 10pt">命令来测试下是否安装成功了。</font></font><br />
<font face="宋体 "><font style="font-size: 10pt">接下来我们的配置就完成了，让我们用命里那个测试下。</font></font><br />
<strong><font face="宋体 "><font style="font-size: 10pt">同步命令：</font></font></strong><font style="font-size: 10pt"><br />
<font color="black">rsync -vzrtopgu --progress --delete </font></font><a href="mailto:root@192.168.100.80"><font style="font-size: 10pt">root@192.168.100.80</font></a><font style="font-size: 10pt">:/home/svn /home/</font><br />
<font face="宋体 "><font style="font-size: 10pt">输入<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E7%94%A8%E6%88%B7">用户</span>名</font></font><font style="font-size: 10pt">root</font><br />
<font face="宋体 "><font style="font-size: 10pt">输入</font></font><font style="font-size: 10pt">root</font><font face="宋体 "><font style="font-size: 10pt">的<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E5%AF%86%E7%A0%81">密码</span>。</font></font><font style="font-size: 10pt"><br />
<font color="black"><br />
65309 100%<br />
224.57kB/s<br />
0:00:00 (xfer#507, to-<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=check">check</span>=2187/23106)</font><br />
<font color="black">svn/project1/db/revs/202</font><br />
<font color="black"><br />
29655 100%<br />
99.86kB/s<br />
0:00:00 (xfer#508, to-check=2186/23106)</font><br />
<font color="black">svn/project1/db/revs/203</font><br />
<font color="black"><br />
7242 100%<br />
23.19kB/s<br />
0:00:00 (xfer#509, to-check=2185/23106)</font><br />
<font color="black">sent 15928 bytes<br />
received 521860019 bytes<br />
4404016.43 bytes/sec</font><br />
<font color="black">total size is 12240235825<br />
speedup is 23.45</font><br />
</font><font face="宋体 "><font style="font-size: 10pt">传输完成，这次镜像过程就结束了。</font></font><br />
<font face="宋体 "><font style="font-size: 10pt">让我们看看所使用的参数：</font></font><font style="font-size: 10pt"><br />
<font color="black">v </font></font><font face="宋体 "><font style="font-size: 10pt">复杂的输出信息</font></font><font style="font-size: 10pt"><br />
<font color="black">z </font></font><font face="宋体 "><font style="font-size: 10pt">压缩模式</font></font><font style="font-size: 10pt">, </font><font face="宋体 "><font style="font-size: 10pt">当资料在传送到目的端进行档案压缩</font></font><font style="font-size: 10pt">.</font><font style="font-size: 10pt"><br />
<font color="black">r </font></font><font face="宋体 "><font style="font-size: 10pt">复制所有下面的资料</font></font><font style="font-size: 10pt">(</font><font face="宋体 "><font style="font-size: 10pt">透过</font></font><font style="font-size: 10pt">)</font><font style="font-size: 10pt"><br />
<font color="black">t </font></font><font face="宋体 "><font style="font-size: 10pt">保留时间点</font></font><font style="font-size: 10pt"><br />
<font color="black">o </font></font><font face="宋体 "><font style="font-size: 10pt">保留档案所有者</font></font><font style="font-size: 10pt">(root only)</font><font style="font-size: 10pt"><br />
<font color="black">p</font></font><font face="宋体 "><font style="font-size: 10pt">保留档案权限</font></font><font style="font-size: 10pt"><br />
<font color="black">g </font></font><font face="宋体 "><font style="font-size: 10pt">保留档案群组</font></font><font style="font-size: 10pt"><br />
<font color="black">u</font></font><font face="宋体 "><font style="font-size: 10pt">更新修改过的文件</font></font><font style="font-size: 10pt"><br />
<font color="black">--progress </font></font><font face="宋体 "><font style="font-size: 10pt">显示传送的进度</font></font><font style="font-size: 10pt"><br />
<font color="black">--delete </font></font><font face="宋体 "><font style="font-size: 10pt">删除传送断已经不存在</font></font><font style="font-size: 10pt">,</font><font face="宋体 "><font style="font-size: 10pt">而目的端存在的档案</font></font><font style="font-size: 10pt"><br />
<br />
<font color="black">root@192.168.100.80:/home/svn /home/</font><br />
</font><font face="宋体 "><font style="font-size: 10pt">用</font></font><font style="font-size: 10pt">root</font><font face="宋体 "><font style="font-size: 10pt">用户访问</font></font><font style="font-size: 10pt">192.168.100.80</font><font face="宋体 "><font style="font-size: 10pt">的</font></font><font style="font-size: 10pt">/home/svn</font><font face="宋体 "><font style="font-size: 10pt">目录，然后同步到本机的</font></font><font style="font-size: 10pt">/home/</font><font face="宋体 "><font style="font-size: 10pt">目录下，注意<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E6%A0%BC%E5%BC%8F">格式</span>，那么镜像</font></font><font style="font-size: 10pt">SVN</font><font face="宋体 "><font style="font-size: 10pt">服务器就会把主</font></font><font style="font-size: 10pt">SVN</font><font face="宋体 "><font style="font-size: 10pt">服务器上的</font></font><font style="font-size: 10pt">/home</font><font face="宋体 "><font style="font-size: 10pt">目录的</font></font><font style="font-size: 10pt">svn</font><font face="宋体 "><font style="font-size: 10pt">文件夹整个复制到镜像</font></font><font style="font-size: 10pt">SVN</font><font face="宋体 "><font style="font-size: 10pt">服务器上的</font></font><font style="font-size: 10pt">/home</font><font face="宋体 "><font style="font-size: 10pt">下，并保存原属性不变。</font></font><font style="font-size: 10pt"><br />
<br />
<font color="black">###</font></font><font face="宋体 "><font style="font-size: 10pt">注意</font></font><font style="font-size: 10pt">:</font><font face="宋体 "><font style="font-size: 10pt">为什么使用</font></font><font style="font-size: 10pt">root</font><font face="宋体 "><font style="font-size: 10pt">的用户呢，因为可以确保保证同步过来的文件可以保证档案的具体属性，这是我们比较关心的问题，但是</font></font><font style="font-size: 10pt">root</font><font face="宋体 "><font style="font-size: 10pt">的用户拥有的权限太大了，每次都需要输入</font></font><font style="font-size: 10pt">root</font><font face="宋体 "><font style="font-size: 10pt">的密码，一方面这是非常危险的，一方面比较繁琐。</font></font><br />
<font face="宋体 "><font style="font-size: 10pt">那么我们首先想到的不需要输入<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E7%94%A8%E6%88%B7%E5%90%8D">用户名</span>和密码就可以镜像和传输文件，那么必须让两台</font></font><font style="font-size: 10pt">SVN</font><font face="宋体 "><font style="font-size: 10pt">服务器互相信任</font></font><font style="font-size: 10pt">,</font><font face="宋体 "><font style="font-size: 10pt">那么我们需要采用</font></font><font style="font-size: 10pt">ssh</font><font face="宋体 "><font style="font-size: 10pt">私钥和公钥加密技术。</font></font><br />
<strong><font face="宋体 "><font style="font-size: 10pt">主</font></font></strong><strong><font style="font-size: 10pt">SVN</font></strong><strong><font face="宋体 "><font style="font-size: 10pt">服务器：</font></font></strong><font style="font-size: 10pt"><br />
<font color="black">ssh-keygen &#8211;d</font><br />
<font color="black">Enter file in which to save the key (/home/root/.ssh/id_dsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/root/.ssh/id_dsa.Your public key has been saved in /home/root/.ssh/id_dsa.pub.The key fingerprint is:32:21:e1:3b:7d:6e:de:4b:39:da:af:38:fe:90:40:61 </font></font><a href="mailto:root@svnserver.com"><font style="font-size: 10pt">root@<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=svnserve">svnserve</span>r.com</font></a><font style="font-size: 10pt"><br />
<br />
<font color="black">cd .ssh</font><br />
<font color="black">id_dsa ------------ </font></font><font face="宋体 "><font style="font-size: 10pt">私钥文件</font></font></p>
<p align="left"><font style="font-size: 10pt">id_dsa.pub ------------ </font><font face="宋体 "><font style="font-size: 10pt">公钥文件</font></font><br />
<font style="font-size: 10pt"><br />
<font color="black">cp id_dsa.pub authorized_keys2 (</font></font><font face="宋体 "><font style="font-size: 10pt">复制一个可以被</font></font><font style="font-size: 10pt">root</font><font face="宋体 "><font style="font-size: 10pt">识别和读取的公钥文件</font></font><font style="font-size: 10pt">)</font><font style="font-size: 10pt"><br />
<font color="black">chmod 600 authorized_keys2 (</font></font><font face="宋体 "><font style="font-size: 10pt">因安全因为给予</font></font><font style="font-size: 10pt">600</font><font face="宋体 "><font style="font-size: 10pt">权限</font></font><font style="font-size: 10pt">)</font><font style="font-size: 10pt"><br />
<font color="black">cp id_dsa.pub svn<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=server">server</span>.pub (</font></font><font face="宋体 "><font style="font-size: 10pt">再做一份公钥的副本</font></font><font style="font-size: 10pt">)</font><br />
<font face="宋体 "><font style="font-size: 10pt">想办法把这个公钥的副本移动到镜像</font></font><font style="font-size: 10pt">SVN</font><font face="宋体 "><font style="font-size: 10pt">服务器上面。</font></font><font style="font-size: 10pt"><br />
<font color="black">cat mirrorsvnserver.pub &gt;&gt; authorized_keys2 (</font></font><font color="black"><font face="宋体 "><font style="font-size: 10.5pt"><font size="3">把复制过来的镜像</font></font></font></font><font style="font-size: 10pt">SVN</font><font color="black"><font face="宋体 "><font style="font-size: 10.5pt"><font size="3">服务器上的公钥导入到主</font></font></font></font><font style="font-size: 10pt">SVN</font><font color="black"><font face="宋体 "><font style="font-size: 10.5pt"><font size="3">服务器的公钥文件里</font></font></font></font><font style="font-size: 10pt">)</font><br />
<strong><font face="宋体 "><font style="font-size: 10pt">镜像</font></font></strong><strong><font style="font-size: 10pt">SVN</font></strong><strong><font face="宋体 "><font style="font-size: 10pt">服务器：</font></font></strong><font style="font-size: 10pt"><br />
<font color="black">ssh-keygen &#8211;d</font><br />
<font color="black">Enter file in which to save the key (/home/root/.ssh/id_dsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/root/.ssh/id_dsa.Your public key has been saved in /home/root/.ssh/id_dsa.pub.The key fingerprint is:32:21:e1:3b:7d:6e:de:4b:39:da:af:38:fe:90:40:61 </font></font><a href="mailto:root@mirrorsvnserver.com"><font style="font-size: 10pt">root@mirrorsvnserver.com</font></a><font style="font-size: 10pt"><br />
<br />
<font color="black">cd .ssh</font><br />
<font color="black">id_dsa ------------ </font></font><font face="宋体 "><font style="font-size: 10pt">私钥文件</font></font></p>
<p align="left"><font style="font-size: 10pt">id_dsa.pub ------------ </font><font face="宋体 "><font style="font-size: 10pt">公钥文件</font></font><br />
<font style="font-size: 10pt"><br />
<font color="black">cp id_dsa.pub authorized_keys2 (</font></font><font face="宋体 "><font style="font-size: 10pt">复制一个可以被</font></font><font style="font-size: 10pt">root</font><font face="宋体 "><font style="font-size: 10pt">识别和读取的公钥文件</font></font><font style="font-size: 10pt">)</font><font style="font-size: 10pt"><br />
<font color="black">chmod 600 authorized_keys2 (</font></font><font face="宋体 "><font style="font-size: 10pt">因安全因为给予</font></font><font style="font-size: 10pt">600</font><font face="宋体 "><font style="font-size: 10pt">权限</font></font><font style="font-size: 10pt">)</font><font style="font-size: 10pt"><br />
<font color="black">cp id_dsa.pub mirrorsvnserver.pub (</font></font><font face="宋体 "><font style="font-size: 10pt">再做一份公钥的副本</font></font><font style="font-size: 10pt">)</font><br />
<font face="宋体 "><font style="font-size: 10pt">想办法把这个公钥的副本移动到主</font></font><font style="font-size: 10pt">SVN</font><font face="宋体 "><font style="font-size: 10pt">服务器上面。</font></font><font style="font-size: 10pt"><br />
<font color="black">cat svnserver.pub &gt;&gt; authorized_keys2 (</font></font><font color="black"><font face="宋体 "><font style="font-size: 10.5pt"><font size="3">把复制过来的主</font></font></font></font><font style="font-size: 10pt">SVN</font><font color="black"><font face="宋体 "><font style="font-size: 10.5pt"><font size="3">服务器上的公钥导入到镜像</font></font></font></font><font style="font-size: 10pt">SVN</font><font color="black"><font face="宋体 "><font style="font-size: 10.5pt"><font size="3">服务器的公钥文件里</font></font></font></font><font style="font-size: 10pt">)</font><br />
<font color="black"><font face="宋体 "><font style="font-size: 10.5pt"><font size="3">让我们里验证公钥文件中的内容：</font></font></font></font><font style="font-size: 10pt"><br />
<font color="black">cat /root/.ssh/authorized_keys2</font><br />
<font color="black">ssh-dss AAAAB3NzaC1kc3MAAACBAL9iAG+VZkXunZ5KzTivat1deDAQFKdrGY5P2rxRI+QeKClNgfukUNwQmU+a5FqfNsLKlWhGbIfFI1k00Zkc7nwMdG2dtcnWw7oUqPCGizMcoPLXXQhfOPaFoOkB5UPWNkgJobBPZBjJ7nhKZxzzMiujhOVYLvGNDEWI8x3NAAAAFQCqqtJaMgVyMgDexUKbHIBXsSghYIB5U82gTyGb2c4z4AsmQ5M0ds3YHHVLPHRUEn7DspzlNZ7fYWhKzQYWlhPJftuYTrYIEzuXx8Hl8kg7hCEl4hArAgMMcEtmuQ+3x5SkEht3077qUPdC/YzSk7cFNwQlt6nOeYELCIwhs1CXWQXi9E/XSlqepd+gSlAAhVzWc0MgAAAIAy4qWyaB6DT+XWtq23jrFrYeejJyFBVkNVUbEd3GNTHvwKTYuBa7nlh562g5r0riIrHW+a7WGd6U32RVLnqqIwddcHml4kXnondo0qjW4XijYI7jkHN9oAK5mNWnSCYAnot1nra3QXlh9472/l7kTmznumjsDDjAIa7OFY9w== </font></font><a href="mailto:root@svnserver.com"><font style="font-size: 10pt">root@svnserver.com</font></a><font style="font-size: 10pt"><br />
<font color="black">ssh-dss AAAAB3NzaC1kc3MAAACBAPI3YFCQNBof9xA/Fi1S0U4jmliAg/TaWHnx9suaYb5Xc31jW3+axbNURIBnK7cA53q+qBME1DdddSBOq+I0oUpfjAXkOUl/ACRbSRqA1VOaKdI2AOH9tw4jSK0xSqYjj+ReuUnuVMSTOJTQzt1n6YsLj/kjAAAAFQCHE5NqPCIlr5xVFYOZmGysI+CtKQAAAIAb/gjP0f3Ifx0H2A3XzH9fG4YENLd+gz0l07Mq356+IBuPSYxi4JldxZ7j1OkH9j+7+t8AOSyqNqiOzKXpimo0NLjVsEkpn9RXFmzfHHwRholmauDKIbGLvJlTL0ZkjqH3w0plGmVC6YyxOpM4w7XklIvtq3rDZQE4O247yxgAAAIEA2rd2htKfO9I7F+rBxVgszeGrwCfP5gf8sdz32LDd+E4JxzI/b79Tn1ylILb0vGZhRCbFhoLnDIUMR3Lrr5FqGlTf8O2gsvproA5pLqUpgrkhR/7siycplOddftt553yBJNCBkq+E906AwQ72PNs2uLrbKHyVyD1akrD2/hfA= </font></font><a href="mailto:root@svnmirrorserver.com"><font style="font-size: 10pt">root@svnmirrorserver.com</font></a><br />
<font color="black"><font face="宋体 "><font style="font-size: 10.5pt"><font size="3">这样我们的两台</font></font></font></font><font style="font-size: 10pt">SVN</font><font color="black"><font face="宋体 "><font style="font-size: 10.5pt"><font size="3">服务器就得到信任了。</font></font></font></font><br />
<font color="black"><font face="宋体 "><font style="font-size: 10.5pt"><font size="3">让我们再次执行同步命令：</font></font></font></font><font style="font-size: 10pt"><br />
<font color="black">rsync -vzrtopgu --progress --delete </font></font><a href="mailto:root@192.168.100.80"><font style="font-size: 10pt">root@192.168.100.80</font></a><font style="font-size: 10pt">:/home/svn /home/</font><br />
<font face="宋体 "><font style="font-size: 10pt">发现了什么？</font></font><br />
<font face="宋体 "><font style="font-size: 10pt">已经不需要输入用户名和密码了。</font></font><br />
<strong><font face="宋体 "><font style="font-size: 10pt">最后我们需要设定人物计划了。</font></font></strong><font style="font-size: 10pt"><br />
<font color="black">crontab &#8211;e</font><br />
<font color="black">*/10 * * * * /usr/local/bin/rsync -vzrtopgu --progress --delete </font></font><a href="mailto:root@192.168.100.80"><font style="font-size: 10pt">root@192.168.100.80</font></a><font style="font-size: 10pt">:/home/svn /home/ &amp;</font><br />
<font face="宋体 "><font style="font-size: 10pt">退出保存。</font></font><br />
<font face="宋体 "><font style="font-size: 10pt">这个例子是每</font></font><font style="font-size: 10pt">10</font><font face="宋体 "><font style="font-size: 10pt">分钟同步一次</font></font><font style="font-size: 10pt">,</font><font face="宋体 "><font style="font-size: 10pt">当然我们也可以<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E8%AE%BE%E7%BD%AE">设置</span>我们想要的时间。</font></font><br />
<font face="宋体 "><font style="font-size: 10pt">另外一个例子：每小时同步一次</font></font><font style="font-size: 10pt"><br />
<font color="black">* */1 * * * /usr/local/bin/rsync -vzrtopgu --progress --delete </font></font><a href="mailto:root@192.168.100.80"><font style="font-size: 10pt">[email=root@192.168.100.80:/home/svn]root@192.168.100.80</font></a><font style="font-size: 10pt">:/home/svn /home/ &amp;</font><br />
<strong><font face="宋体 "><font style="font-size: 16pt">备注：</font></font></strong><strong><font style="font-size: 16pt"><br />
(1) </font></strong><strong><font face="宋体 "><font style="font-size: 16pt">所有同步都为增量备份，笔者不建议大家都采用增量备份对</font></font></strong><strong><font style="font-size: 16pt">SVN</font></strong><strong><font face="宋体 "><font style="font-size: 16pt">进行备份，这有可能导致</font></font></strong><strong><font style="font-size: 16pt">SVN</font></strong><strong><font face="宋体 "><font style="font-size: 16pt">库日后不可用，但笔者这里将尽有不下</font></font></strong><strong><font style="font-size: 16pt">50</font></strong><strong><font face="宋体 "><font style="font-size: 16pt">个</font></font></strong><strong><font style="font-size: 16pt">SVN</font></strong><strong><font face="宋体 "><font style="font-size: 16pt">库，同步几月都没发生任何问题，都能正常被使用。但是为了谨慎起见，希望大家再做一个定期全备份，建议每周一次。如有用户因此丢失，笔者将不负任何责任。</font></font></strong><strong><font style="font-size: 16pt"><br />
(2) </font></strong><strong><font face="宋体 "><font style="font-size: 16pt">此方法适应</font></font></strong><strong><font style="font-size: 16pt">Windows</font></strong><strong><font face="宋体 "><font style="font-size: 16pt">上使用，</font></font></strong><strong><font style="font-size: 16pt">rsync</font></strong><strong><font face="宋体 "><font style="font-size: 16pt">程序名称为</font></font></strong><strong><font style="font-size: 16pt">cwRsync</font></strong><font style="font-size: 16pt"></font></p>
<br />
<p align="left"><strong><font style="font-size: 16pt">(3) rsync</font></strong><strong><font face="宋体 "><font style="font-size: 16pt">有二种配置方式：一种是</font></font></strong><strong><font style="font-size: 16pt">ssh,scp,stock</font></strong><strong><font face="宋体 "><font style="font-size: 16pt">等协议直接传输，无需修改配置文件（笔者用法），第二种是修改</font></font></strong><strong><font style="font-size: 16pt">rsync</font></strong><strong><font face="宋体 "><font style="font-size: 16pt">配置文件，映射路径和指定密码（支持匿名）</font></font></strong><font style="font-size: 16pt"></font></p>
<br />
<p align="left"><strong><font style="font-size: 16pt">(4) ssh + rsync + crontab</font></strong><strong><font face="宋体 "><font style="font-size: 16pt">只是复制文件而已，无需依赖</font></font></strong><strong><font style="font-size: 16pt"><span class="t_tag" onclick="tagshow(event)" href="tag.php?name=apache">apache</span></font></strong><strong><font face="宋体 "><font style="font-size: 16pt">和</font></font></strong><strong><font style="font-size: 16pt"><span class="t_tag" onclick="tagshow(event)" href="tag.php?name=subversion">subversion</span></font></strong><strong><font face="宋体 "><font style="font-size: 16pt">程序</font></font></strong><font style="font-size: 16pt"></font></p>
<br />
<font face="Calibri "><font size="3"></font></font><br />
<font face="Calibri "><font size="3"></font></font><br />
<font face="Calibri "><font size="3">附件：</font></font><br />
rsync 所以试用参数列表:<br />
-h , --help 显示rsync<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E6%B1%82%E5%8A%A9">求助</span>资讯<br />
--version 顯示rsync版本<br />
-v , --verbose 复杂的输出信息<br />
-q , --quiet 安静模式，几乎没有讯息产生，<br />
常用在以cron执行rsync<br />
-I, --ignore-times 通常rsync为了加快速度会忽略同样档案大小且同样,同样存取时间点的档案<br />
可以通过此参数开关此快速检查.<br />
--size-only rsync<br />
只检查档案大小是否改变,不管时间存取点是否改变<br />
通常用在mirror, 且对方时间不太正确时<br />
-c, --checksum 在传送之前透过128bit的md4检查码来检查所有要传送的档案(会托满速度);<br />
-a, --archive archive mode 权限保存模式,相当于 -rlptgoD 参数.<br />
很快速的保存几乎所有的权限设定,除了硬式连接(透过-H设定).<br />
-r, --recursive 复制所有下面的资料(透过)<br />
-R, --relative 使用相对路径<br />
如: rsync foo/bar/foo.c remote:/tmp/ 在远端产生/tmp/foo.c档案<br />
rsync -R foo/bar/foo.c remote:/tmp/ 在远端产生/tmp/foo/bar/foo.c 档案<br />
-R, --relative 不使用相对路径<br />
-b, --backup 目的地端先前已经存在的档案在传输或删除前会被备份<br />
--backup-dir=DIR 设定备份的资料夹<br />
--suffix=SUFFIX 指定备份的档案名称字尾形式(预设为~)<br />
-K, --keep-dirlinks 接收方将连接到资料夹的档案视为资料夹处理<br />
-l, --links 复制所有的连接<br />
-H, --hard-links 保留硬式连结<br />
-p, --perms 保留档案权限<br />
-o, --owner 保留档案所有者(root only)<br />
-g, --group 保留档案群组<br />
-u &#8211;<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=update">update</span> 更新修改过的文件<br />
-D, --devices 保留device资讯(root only)<br />
-t, --times 保留时间点<br />
-n, --dry-run 不实际执行传送, 只显示将会有的传输动作<br />
-S, --sparse 尝试去处理稀疏的档案, 让这些档案在目的端占去较少的磁碟空间<br />
-W, --whole-file 复制所有的档案, 不额外作检查<br />
--no-whole-file 关闭 --whole-file 参数<br />
-x, --one-file-system 不要跨越档案系统分界(只在一个档案系统处理)<br />
-B, --block-size=SIZE 强制透过rsync程式去比对修复block-sizeforce<br />
-e --rsh=COMMAND 定义所试用的remote shell<br />
--rsync-path=PATH 定义rsync在远端<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E6%9C%BA%E5%99%A8">机器</span>存放资料的路径<br />
--existing 只对比更新目的端已经存在的档案<br />
--ignore-existing 忽略目的断已经存在的档案(也就是不更新)<br />
--delete 删除传送断已经不存在,而目的端存在的档案<br />
--delete-excluded 除了把传送端已经不存在, 而目的端存在的档案删除之外, 也删除 --exclude 参数所包含的档案<br />
--delete-after rsync预设会在档案传送前进行相关删除动作确保接收端有足够的档案空间,<br />
单可以透过 --delete-after 让删除动作在档案传送后在进行删除<br />
--ignore-<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=error">error</span>s 忽略任何错误即使是I/O error 也进行 --delete 删除动作<br />
--max-delete=NUM 定义rsync不要删除超过NUM个档案<br />
--partial rsync若遇到传输过程中断时, 会把那些已经传输的档案删除.<br />
在某种状况下保留那些部分传送的档案是令人高兴的;<br />
你可以透过 --partial 参数达到这个目的.<br />
--partial-dir=DIR 在 --partial 参数启动时, 你还是可以定义rsync把那些部分传送的档案<br />
写入定义的资料夹, 而非直接写入目的端,需要注意的是,<br />
此资料夹不应该被其他试用者可以写入.(如:/tmp)<br />
--force 当目的端资料夹被传送端非资料夹名称覆盖时, 强制rsync删除资料夹, 即使该资料夹不是空的.<br />
--numeric-ids 不将传送端档案的uid及gid值, 与目的端的使用者/群组进行配对,<br />
若传送端并没有uid及gid的对应名称(如:原帐号群组被删除的遗留档案),<br />
或目的端没有相对应的帐号/群组, 保留数字型式的uid/gid<br />
--timeout=TIMEOUT 设定I/O 超时的时间(秒). 超过这个秒数而没有资料传送, rsync将会结束. 预设为0,也就是没有定义超时时间<br />
-T, --temp-dir=DIR 定义rsync在接收端产生暂时性的复制档案时使用资料夹暂存，<br />
预设时直接在接收端资料夹直接产生暂存档案<br />
--compare-dest=DIR 定义rsync在目的端建立资料夹来比对传送过来的档案.<br />
--link-dest=DIR 与 --compare-dest 相同,但同时会针对无法改变的档案建立硬式连结.<br />
-z, --compress 压缩模式, 当资料在传送到目的端进行档案压缩.<br />
-P -P参数和 --partial --progress 相同.只是为了把参数简单化.<br />
-C, --<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=cvs">cvs</span>-exclude 排除那些通常不希望传送的档案, 定义的方式与CVS传送相同:<br />
RCS SCCS CVS CVS.adm RCSLOG cvslog.* tags TAGS .make.state<br />
.nse_depinfo *~ #* .#* ,* _$* *$ *.old *.bak *.BAK *.orig *.rej<br />
.del-* *.a *.olb *.o *.obj *.so *.<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=exe">exe</span> *.Z *.elc *.ln core .svn/<br />
符合以上条件的都会被忽略不传送.<br />
--exclude=PATTER 符合PATTERN(规则表示式)样式的档案不仅行传送<br />
--exclude-from=FILE 和 --exclude 参数相同, 不过是把不进行传送的档案事先写入某一档案.<br />
执行时, 透过此参数让rsync读取.<br />
(; #开头的行列或者空白会被rsync忽略)<br />
--include=PATTERN 定义rsync不要排除符合pattern样式的档案<br />
--include-from=FILE 和--include参数相同,只不过把要包含的档案写到某一档案.<br />
--files-from=FILE 把要传送的档案名称都精确的写入某一档案, 让rsync读取.<br />
如: rsync -a --files-from=/tmp/foo /usr remote:/backup<br />
-0 --from0 定义档案所要读取的档案时null字元结尾.<br />
--version 现四版本信息.<br />
--daemon 定义rsync以daemon型态执行<br />
--no-detach 当以daemon形态执行时,不要进行分裂且变成背景程序.<br />
--address=ADDRESS 定义所要连接(bind)的ip位置或者是host名称(daemon限定)<br />
--<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=conf">conf</span>ig=FILE 定义所要读取的设定档rsyncd.conf位置(daemon限定)<br />
预设值为 /usr/local/etc/rsyncd.conf<br />
--port=PORT 定义rsyncd(daemon)要旨行的port(预设为tcp 873)<br />
--blocking-io 使用blocking I/O连结远端的shell, 如rsh, remsh<br />
--no-blocking-io 使用non-blocking连结远端的shell, 如ssh(预设值)<br />
--stats 显示档案传送时的资讯状态<br />
--progress 显示传送的进度.(给档案传送时,怕无聊的人用的..)<br />
--log-format=FORMAT 定义log的格式(在rsyncd.conf设定)<br />
--password-file=FILE 从档案读取与远端rsync伺服务连结的密码<br />
--bwlimit=KBPS 定义传输频宽的大小(KBytes/秒)<br />
--write-batch=FILE 把记录资料写入一个档案(给其他相同环境且相同需求的机器试用)<br />
--read-batch=FILE 透过读取记录档案来进行传输.(档案由 --write-batch 参数产生)<br />
--checksum-seed=NUM 定义档案 checksum-seed 的大小(byte)<br />
-4 --ipv4 使用IPv4协定<br />
-6 --ipv6 使用IPv6协定<br />
</div>
<a href="http://bbs.iusesvn.com/thread-3068-1-1.html#zoom"><img onclick="zoom(this, 'attachments/day_080914/20080914_308264615507c8a7690f8r4QQ3WOg7xv.jpg')" alt="svnmirror.jpg" src="http://bbs.iusesvn.com/attachments/day_080914/20080914_308264615507c8a7690f8r4QQ3WOg7xv.jpg.thumb.jpg" /></a>
<img src ="http://www.blogjava.net/cyantide/aggbug/246198.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2008-12-14 09:31 <a href="http://www.blogjava.net/cyantide/archive/2008/12/14/246198.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>eclipse 快捷键</title><link>http://www.blogjava.net/cyantide/archive/2008/12/03/244225.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Wed, 03 Dec 2008 15:06:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2008/12/03/244225.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/244225.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2008/12/03/244225.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/244225.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/244225.html</trackback:ping><description><![CDATA[<p>&nbsp;1、Ctrl+M －－切换窗口的大小 <br />
2、Ctrl+Q －－跳到最后一次的编辑处 <br />
3、F2 －－当鼠标放在一个标记处出现Tooltip时候按F2则把鼠标移开时Tooltip还会显示即Show Tooltip Description。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; F3 －－跳到声明或定义的地方。&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;F5 －－单步调试进入函数内部。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; F6 －－单步调试不进入函数内部，如果装了金山词霸2006则要把&#8220;取词开关&#8221;的快捷键改成其他的。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; F7 －－由函数内部返回到调用处。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; F8 －－一直执行到下一个断点。 <br />
4、Ctrl+Pg~ －－对于XML文件是切换代码和图示窗口 <br />
5、Ctrl+Alt+I －－看Java文件中变量的相关信息 <br />
6、Ctrl+PgUp －－对于代码窗口是打开&#8220;Show List&#8221;下拉框，在此下拉框里显示有最近曾打开的文件 <br />
7、Ctrl+/ －－在代码窗口中是这种//~注释。 <br />
Ctrl+Shift+/ －－在代码窗口中是这种/*~*/注释，在JSP文件窗口中是〈!--~--〉。 <br />
8、Alt+Shift+O(或点击工具栏中的Toggle Mark Occurrences按钮) 当点击某个标记时可使本页面中其他地方的此标记黄色凸显，并且窗口的右边框会出现白色的方块，点击此方块会跳到此标记处。 <br />
9、右击窗口的左边框即加断点的地方选Show Line Numbers可以加行号。 <br />
10、Ctrl+I格式化激活的元素Format Active Elements。 <br />
Ctrl+Shift+F格式化文件Format Document。 <br />
11、Ctrl+S保存当前文件。 <br />
Ctrl+Shift+S保存所有未保存的文件。 <br />
12、Ctrl+Shift+M(先把光标放在需导入包的类名上) 作用是加Import语句。 <br />
Ctrl+Shift+O作用是缺少的Import语句被加入，多余的Import语句被删除。 <br />
13、Ctrl+Space提示键入内容即Content Assist，此时要将输入法中Chinese(Simplified)IME-Ime/Nonlme Toggle的快捷键（用于切换英文和其他文字）改成其他的。 <br />
Ctrl+Shift+Space提示信息即Context Information。 <br />
14、双击窗口的左边框可以加断点。 <br />
15、Ctrl+D删除当前行。 </p>
<p><br />
其它：<br />
Ctrl+1 快速修复(最经典的快捷键,就不用多说了) <br />
Ctrl+D: 删除当前行 <br />
Ctrl+Alt+&#8595; 复制当前行到下一行(复制增加) <br />
Ctrl+Alt+&#8593; 复制当前行到上一行(复制增加) </p>
<p>Alt+&#8595; 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了) <br />
Alt+&#8593; 当前行和上面一行交互位置(同上) <br />
Alt+&#8592; 前一个编辑的页面 <br />
Alt+&#8594; 下一个编辑的页面(当然是针对上面那条来说了) </p>
<p>Alt+Enter 显示当前选择资源(工程,or 文件 or文件)的属性 </p>
<p>Shift+Enter 在当前行的下一行插入空行(这时鼠标可以在当前行的任一位置,不一定是最后) <br />
Shift+Ctrl+Enter 在当前行插入空行(原理同上条) </p>
<p>Ctrl+Q 定位到最后编辑的地方 <br />
Ctrl+L 定位在某行 (对于程序超过100的人就有福音了) <br />
Ctrl+M 最大化当前的Edit或View (再按则反之) <br />
Ctrl+/ 注释当前行,再按则取消注释 <br />
Ctrl+O 快速显示 OutLine <br />
Ctrl+T 快速显示当前类的继承结构 <br />
Ctrl+W 关闭当前Editer <br />
Ctrl+K 参照选中的Word快速定位到下一个 <br />
Ctrl+E 快速显示当前Editer的下拉列表(如果当前页面没有显示的用黑体表示) </p>
<p>Ctrl+/(小键盘) 折叠当前类中的所有代码 </p>
<p>Ctrl+&#215;(小键盘) 展开当前类中的所有代码 </p>
<p>Ctrl+Space 代码助手完成一些代码的插入(但一般和输入法有冲突,可以修改输入法的热键,也可以暂用Alt+/来代替) </p>
<p>Ctrl+Shift+E 显示管理当前打开的所有的View的管理器(可以选择关闭,激活等操作) </p>
<p>Ctrl+J 正向增量查找(按下Ctrl+J后,你所输入的每个字母编辑器都提供快速匹配定位到某个单词,如果没有,则在stutes line中显示没有找到了,查一个单词时,特别实用,这个功能Idea两年前就有了) </p>
<p>Ctrl+Shift+J 反向增量查找(和上条相同,只不过是从后往前查) </p>
<p>Ctrl+Shift+F4 关闭所有打开的Editer </p>
<p>Ctrl+Shift+X 把当前选中的文本全部变味小写 </p>
<p>Ctrl+Shift+Y 把当前选中的文本全部变为小写 </p>
<p>Ctrl+Shift+F 格式化当前代码 </p>
<p>Ctrl+Shift+P 定位到对于的匹配符(譬如{}) (从前面定位后面时,光标要在匹配符里面,后面到前面,则反之) </p>
<p>下面的快捷键是重构里面常用的,本人就自己喜欢且常用的整理一下(注:一般重构的快捷键都是Alt+Shift开头的了) </p>
<p>Alt+Shift+R 重命名 (是我自己最爱用的一个了,尤其是变量和类的Rename,比手工方法能节省很多劳动力) </p>
<p>Alt+Shift+M 抽取方法 (这是重构里面最常用的方法之一了,尤其是对一大堆泥团代码有用) </p>
<p>Alt+Shift+C 修改函数结构(比较实用,有N个函数调用了这个方法,修改一次搞定) </p>
<p>Alt+Shift+L 抽取本地变量( 可以直接把一些魔法数字和字符串抽取成一个变量,尤其是多处调用的时候) </p>
<p>Alt+Shift+F 把Class中的local变量变为field变量 (比较实用的功能) </p>
<p>Alt+Shift+I 合并变量(可能这样说有点不妥Inline) <br />
Alt+Shift+V 移动函数和变量(不怎么常用) <br />
Alt+Shift+Z 重构的后悔药(Undo)<br />
</p>
<img src ="http://www.blogjava.net/cyantide/aggbug/244225.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2008-12-03 23:06 <a href="http://www.blogjava.net/cyantide/archive/2008/12/03/244225.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javascript列子学习（转帖）</title><link>http://www.blogjava.net/cyantide/archive/2008/12/03/244216.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Wed, 03 Dec 2008 14:00:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2008/12/03/244216.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/244216.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2008/12/03/244216.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/244216.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/244216.html</trackback:ping><description><![CDATA[一、验证类<br />
1、数字验证内<br />
1.1 整数<br />
1.2 大于0的整数 （用于传来的ID的验证)<br />
1.3 负整数的验证<br />
1.4 整数不能大于iMax<br />
1.5 整数不能小于iMin<br />
2、时间类<br />
2.1 短时间，形如 (13:04:06)<br />
2.2 短日期，形如 (2003-12-05)<br />
2.3 长时间，形如 (2003-12-05 13:04:06)<br />
2.4 只有年和月。形如(2003-05,或者2003-5)<br />
2.5 只有小时和分钟,形如(12:03)<br />
3、表单类<br />
3.1 所有的表单的值都不能为空<br />
3.2 多行文本框的值不能为空。<br />
3.3 多行文本框的值不能超过sMaxStrleng<br />
3.4 多行文本框的值不能少于sMixStrleng<br />
3.5 判断单选框是否选择。<br />
3.6 判断复选框是否选择.<br />
3.7 复选框的全选，多选，全不选，反选<br />
3.8 文件上传过程中判断文件类型<br />
4、字符类<br />
4.1 判断字符全部由a-Z或者是A-Z的字字母组成<br />
4.2 判断字符由字母和数字组成。<br />
4.3 判断字符由字母和数字，下划线,点号组成.且开头的只能是下划线和字母<br />
4.4 字符串替换函数.Replace();<br />
5、浏览器类<br />
5.1 判断浏览器的类型<br />
5.2 判断ie的版本<br />
5.3 判断客户端的分辨率
<p>6、结合类<br />
6.1 email的判断。<br />
6.2 手机号码的验证<br />
6.3 身份证的验证</p>
<p><br />
二、功能类</p>
<p>1、时间与相关控件类<br />
1.1 日历<br />
1.2 时间控件<br />
1.3 万年历<br />
1.4 显示动态显示时钟效果（文本，如OA中时间）<br />
1.5 显示动态显示时钟效果 (图像，像手表) <br />
2、表单类<br />
2.1 自动生成表单<br />
2.2 动态添加，修改，删除下拉框中的元素<br />
2.3 可以输入内容的下拉框<br />
2.4 多行文本框中只能输入iMax文字。如果多输入了，自动减少到iMax个文字（多用于短信发送)</p>
<p>3、打印类<br />
3.1 打印控件<br />
4、事件类<br />
4.1 屏蔽右键<br />
4.2 屏蔽所有功能键<br />
4.3 --&gt; 和&lt;-- F5 F11,F9,F1<br />
4.4 屏蔽组合键ctrl+N<br />
5、网页设计类<br />
5.1 连续滚动的文字，图片（注意是连续的，两段文字和图片中没有空白出现）<br />
5.2 html编辑控件类<br />
5.3 颜色选取框控件<br />
5.4 下拉菜单<br />
5.5 两层或多层次的下拉菜单<br />
5.6 仿IE菜单的按钮。（效果如rongshuxa.com的导航栏目)<br />
5.7 状态栏，title栏的动态效果（例子很多，可以研究一下）<br />
5.8 双击后，网页自动滚屏<br />
6、树型结构。<br />
6.1 asp+SQL版<br />
6.2 asp+xml+sql版<br />
6.3 java+sql或者java+sql+xml<br />
7、无边框效果的制作<br />
8、连动下拉框技术<br />
9、文本排序<br />
---------------------------------------------------------------------------------------</p>
<p>一、验证类<br />
1、数字验证内<br />
1.1 整数<br />
/^(-|\+)?\d+$/.test(str)<br />
1.2 大于0的整数 （用于传来的ID的验证)<br />
/^\d+$/.test(str)<br />
1.3 负整数的验证<br />
/^-\d+$/.test(str)<br />
2、时间类<br />
2.1 短时间，形如 (13:04:06)<br />
function isTime(str)<br />
{<br />
var a = str.match(/^(\d{1,2})(?(\d{1,2})\2(\d{1,2})$/);<br />
if (a == null) {alert('输入的参数不是时间格式'); return false;}<br />
if (a[1]&gt;24 || a[3]&gt;60 || a[4]&gt;60)<br />
{<br />
alert("时间格式不对");<br />
return false<br />
}<br />
return true;<br />
}<br />
2.2 短日期，形如 (2003-12-05)<br />
function strDateTime(str)<br />
{<br />
var r = str.match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/); <br />
if(r==null)return false; <br />
var d= new Date(r[1], r[3]-1, r[4]); <br />
return (d.getFullYear()==r[1]&amp;&amp;(d.getMonth()+1)==r[3]&amp;&amp;d.getDate()==r[4]);<br />
}<br />
2.3 长时间，形如 (2003-12-05 13:04:06)<br />
function strDateTime(str)<br />
{<br />
var reg = /^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2}) (\d{1,2})\d{1,2})\d{1,2})$/; <br />
var r = str.match(reg); <br />
if(r==null)return false; <br />
var d= new Date(r[1], r[3]-1,r[4],r[5],r[6],r[7]); <br />
return (d.getFullYear()==r[1]&amp;&amp;(d.getMonth()+1)==r[3]&amp;&amp;d.getDate()==r[4]&amp;&amp;d.getHours()==r[5]&amp;&amp;d.getMinutes()==r[6]&amp;&amp;d.getSeconds()==r[7]);<br />
}<br />
2.4 只有年和月。形如(2003-05,或者2003-5)<br />
2.5 只有小时和分钟,形如(12:03)<br />
3、表单类<br />
3.1 所有的表单的值都不能为空</p>
<p>3.2 多行文本框的值不能为空。<br />
3.3 多行文本框的值不能超过sMaxStrleng<br />
3.4 多行文本框的值不能少于sMixStrleng<br />
3.5 判断单选框是否选择。<br />
3.6 判断复选框是否选择.<br />
3.7 复选框的全选，多选，全不选，反选<br />
3.8 文件上传过程中判断文件类型<br />
4、字符类<br />
4.1 判断字符全部由a-Z或者是A-Z的字字母组成</p>
<p>4.2 判断字符由字母和数字组成。</p>
<p>4.3 判断字符由字母和数字，下划线,点号组成.且开头的只能是下划线和字母<br />
/^([a-zA-z_]{1})([\w]*)$/g.test(str)<br />
4.4 字符串替换函数.Replace();<br />
5、浏览器类<br />
5.1 判断浏览器的类型<br />
window.navigator.appName<br />
5.2 判断ie的版本<br />
window.navigator.appVersion<br />
5.3 判断客户端的分辨率<br />
window.screen.height; window.screen.width;</p>
<p>6、结合类<br />
6.1 email的判断。<br />
function ismail(mail)<br />
{<br />
return(new RegExp(/^\w+((-\w+)|(\.\w+))*\-AT-[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/).test(mail));<br />
}<br />
6.2 手机号码的验证<br />
6.3 身份证的验证<br />
function isIdCardNo(num)<br />
{<br />
if (isNaN(num)) {alert("输入的不是数字！"); return false;}<br />
var len = num.length, re; <br />
if (len == 15)<br />
re = new RegExp(/^(\d{6})()?(\d{2})(\d{2})(\d{2})(\d{3})$/);<br />
else if (len == 18)<br />
re = new RegExp(/^(\d{6})()?(\d{4})(\d{2})(\d{2})(\d{3})(\d)$/);<br />
else {alert("输入的数字位数不对！"); return false;}<br />
var a = num.match(re);<br />
if (a != null)<br />
{<br />
if (len==15)<br />
{<br />
var D = new Date("19"+a[3]+"/"+a[4]+"/"+a[5]);<br />
var B = D.getYear()==a[3]&amp;&amp;(D.getMonth()+1)==a[4]&amp;&amp;D.getDate()==a[5];<br />
}<br />
else<br />
{<br />
var D = new Date(a[3]+"/"+a[4]+"/"+a[5]);<br />
var B = D.getFullYear()==a[3]&amp;&amp;(D.getMonth()+1)==a[4]&amp;&amp;D.getDate()==a[5];<br />
}<br />
if (!B) {alert("输入的身份证号 "+ a[0] +" 里出生日期不对！"); return false;}<br />
}<br />
return true;<br />
}<br />
-------------------------------------------------------------------------------------</p>
<p>3.7 复选框的全选，多选，全不选，反选</p>
<p>全选</p>
<p><br />
全选</p>
<p>function checkAll(str)<br />
{<br />
var a = document.getElementsByName(str);<br />
var n = a.length;<br />
for (var i=0; ia[i].checked = window.event.srcElement.checked;<br />
}<br />
function checkItem(str)<br />
{<br />
var e = window.event.srcElement;<br />
var all = eval("document.hrong."+ str);<br />
if (e.checked)<br />
{<br />
var a = document.getElementsByName(e.name);<br />
all.checked = true;<br />
for (var i=0; i{<br />
if (!a[i].checked){ all.checked = false; break;}<br />
}<br />
}<br />
else all.checked = false;<br />
}</p>
<p><br />
3.8 文件上传过程中判断文件类型</p>
<p><br />
-------------------------------------------------------------------------------------<br />
１．身份证严格验证：</p>
<p>２．验证ＩＰ地址</p>
<p>function isip(s){<br />
var check=function(v){try{return (v&lt;=255 &amp;&amp; v&gt;=0)}catch(x){return false}};<br />
var re=s.split(".")<br />
return (re.length==4)?(check(re[0]) &amp;&amp; check(re[1]) &amp;&amp; check(re[2]) &amp;&amp; check(re[3])):false<br />
}</p>
<p>var s="202.197.78.129";<br />
alert(isip(s))</p>
<p>３．加sp1后还能用的无边框窗口！！</p>
<p><br />
/*--- Special Thanks For andot ---*/</p>
<p>/*<br />
This following code are designed and writen by Windy_sk <br />
You can use it freely, but u must held all the copyright items!<br />
/</p>
<p>/- Thanks For andot Again ---*/</p>
<p>var CW_width = 400;<br />
var CW_height = 300;<br />
var CW_top = 100;<br />
var CW_left = 100;<br />
var CW_url = "/";<br />
var New_CW = window.createPopup();<br />
var CW_Body = New_CW.document.body;<br />
var content = "";<br />
var CSStext = "margin:1px;color:black; border:2px outset;border-style:expression(onmouseout=onmouseup=function(){this.style.borderStyle='outset'}, onmousedown=function(){if(event.button!=2)this.style.borderStyle='inset'});background-color:buttonface;width:16px;height:14px;font-size:12px;line-height:11px;cursor:Default;";</p>
<p>//Build Window<br />
include.startDownload(CW_url, function(source){content=source});</p>
<p>function insert_content(){<br />
var temp = "";<br />
CW_Body.style.overflow = "hidden";<br />
CW_Body.style.backgroundColor = "white";<br />
CW_Body.style.border = "solid black 1px";<br />
content = content.replace(/]*)&gt;/g,"");<br />
temp += "";<br />
temp += "";<br />
temp += "Chromeless Window For IE6 SP1";<br />
temp += "";<br />
temp += "?";<br />
temp += "0";<br />
temp += "1";<br />
temp += "x";<br />
temp += "";<br />
temp += "";<br />
temp += content;<br />
temp += "</p>
<p>";<br />
temp += "";<br />
CW_Body.innerHTML = temp;<br />
}</p>
<p>setTimeout("insert_content()",1000);</p>
<p>var if_max = true;<br />
function show_CW(){<br />
window.moveTo(10000, 10000);<br />
if(if_max){<br />
New_CW.show(CW_top, CW_left, CW_width, CW_height);<br />
if(typeof(New_CW.document.all.include)!="#ff0000"){<br />
New_CW.document.all.include.style.width = CW_width;<br />
New_CW.document.all.Max.innerText = "1";<br />
}</p>
<p>}else{<br />
New_CW.show(0, 0, screen.width, screen.height);<br />
New_CW.document.all.include.style.width = screen.width;<br />
}<br />
}</p>
<p>window.onfocus = show_CW;<br />
window.onresize = show_CW;</p>
<p>// Move Window<br />
var drag_x,drag_y,draging=false</p>
<p>function drag_move(e){<br />
if (draging){<br />
New_CW.show(e.screenX-drag_x, e.screenY-drag_y, CW_width, CW_height);<br />
return false;<br />
}<br />
}</p>
<p>function drag_down(e){<br />
if(e.button==2)return;<br />
if(New_CW.document.body.offsetWidth==screen.width &amp;&amp; New_CW.document.body.offsetHeight==screen.height)return;<br />
drag_x=e.clientX;<br />
drag_y=e.clientY;<br />
draging=true;<br />
e.srcElement.setCapture();<br />
}</p>
<p>function drag_up(e){<br />
draging=false;<br />
e.srcElement.releaseCapture();<br />
if(New_CW.document.body.offsetWidth==screen.width &amp;&amp; New_CW.document.body.offsetHeight==screen.height) return;<br />
CW_top = e.screenX-drag_x;<br />
CW_left = e.screenY-drag_y;<br />
}</p>
<p><br />
&nbsp;<br />
电话号码的验证</p>
<p>要求：<br />
(1)电话号码由数字、"("、")"和"-"构成<br />
(2)电话号码为3到8位<br />
(3)如果电话号码中包含有区号，那么区号为三位或四位<br />
(4)区号用"("、")"或"-"和其他部分隔开<br />
(5)移动电话号码为11或12位，如果为12位,那么第一位为0<br />
(6)11位移动电话号码的第一位和第二位为"13"<br />
(7)12位移动电话号码的第二位和第三位为"13"<br />
根据这几条规则，可以与出以下正则表达式：<br />
(^[0-9]{3,4}\-[0-9]{3,8}$)|(^[0-9]{3,8}$)|(^\([0-9]{3,4}\)[0-9]{3,8}$)|(^0{0,1}13[0-9]{9}$)</p>
<p>function PhoneCheck(s) {<br />
var str=s;<br />
var reg=/(^[0-9]{3,4}\-[0-9]{3,8}$)|(^[0-9]{3,8}$)|(^\([0-9]{3,4}\)[0-9]{3,8}$)|(^0{0,1}13[0-9]{9}$)/<br />
alert(reg.test(str));<br />
}</p>
<p>--------------------------------------------------------------------------------------</p>
<p><br />
---------------------------------------------------------------------------------</p>
<p>//检验法人代码<br />
function isCorporationCode(s){<br />
var patrn=/^(\d){15}$/;<br />
if (!patrn.exec(s)) return false<br />
return true<br />
}</p>
<p>//校验登录名：只能输入5-20个以字母开头、可带数字、&#8220;_&#8221;、&#8220;.&#8221;的字串<br />
function isRegisterUserName(s)<br />
{<br />
var patrn=/^[a-zA-Z]{1}([a-zA-Z0-9._]){4,19}$/;<br />
if (!patrn.exec(s)) return false<br />
return true<br />
}<br />
//校验用户姓名：只能输入1-30个以字母开头的字串<br />
function isTrueName(s)<br />
{<br />
var patrn=/^[^`~!@#$%^&amp;*()+-=|\\\[\]\{\}:;\'\,.&lt;&gt;/? 0-9]{2,19}$/;<br />
if (!patrn.exec(s)) return false<br />
return true<br />
}</p>
<p>//校验密码：只能输入6-15个字母、数字<br />
function isPasswd(s)<br />
{<br />
var patrn=/^[a-zA-Z0-9]{6,15}$/;<br />
if (!patrn.exec(s)) return false<br />
return true<br />
}</p>
<p>//检验体重<br />
function isAvoirdupois(s)<br />
{<br />
var patrn=/^[1-9]{1}[0-9]{0,2}$/;<br />
var patrn2=/^[1-9]{1}$/;<br />
var intPart=s.indexOf('.');<br />
var decPart=s.lastIndexOf('.');<br />
if (intPart==-1 &amp;&amp; patrn.exec(s) &amp;&amp; eval(s)&gt;=2 &amp;&amp; eval(s)&lt;=200) return true<br />
if (intPart!=decPart || intPart==0 || intPart+2!=s.length) return false<br />
if (!patrn.exec(s.substring(0,intPart)) || !patrn2.exec(s.substring(decPart+1))) return false<br />
if (eval(s)&lt;2 || eval(s)&gt;200) return false<br />
return true<br />
}</p>
<p>//校验普通电话、传真号码：可以&#8220;+&#8221;开头，除数字外，可含有&#8220;-&#8221;<br />
function isTel(s)<br />
{<br />
var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/;<br />
if (!patrn.exec(s)) return false<br />
return true<br />
}</p>
<p>//校验手机号码：必须以数字开头，除数字外，可含有&#8220;-&#8221;<br />
function isMobile(s)<br />
{<br />
var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/;<br />
if (!patrn.exec(s)) return false<br />
return true<br />
}</p>
<p>//校验地区代码<br />
function isAreaCode(s)<br />
{<br />
var patrn=/^(\d){6}$/;<br />
if (!patrn.exec(s)) return false<br />
return true<br />
}</p>
<p>//校验邮政编码<br />
function isPostalCode(s)<br />
{<br />
var patrn=/^[1-9]{1}(\d){5}$/;<br />
if (!patrn.exec(s)) return false<br />
return true<br />
}</p>
<p>//校验搜索关键字<br />
function isSearch(s)<br />
{<br />
var patrn=/^[^`~!@#$%^&amp;*()+=|\\\[\]\{\}:;\'\,.&lt;&gt;/? ]{1}[^`~!@$%^&amp;()+=|\\\[\]\{\}:;\'\,.&lt;&gt;?]{0,19}$/;<br />
if (!patrn.exec(s)) return false<br />
return true<br />
}</p>
<p>//校验是否为ip地址<br />
function isIP(s)<br />
{<br />
var patrn=/^[0-9.]{1,20}$/;<br />
if (!patrn.exec(s)) return false<br />
return true<br />
}</p>
<p>//检验页码是否正确<br />
function isPage(s)<br />
{<br />
var patrn=/^[1-9]{1}[0-9]{0,2}$/;<br />
if (!patrn.exec(s)) return false<br />
return true<br />
}</p>
<p>//表单输入值错误提示<br />
function vErr(o,s){<br />
alert(s);<br />
if (o) o.focus();<br />
return false;<br />
}</p>
<p>//判断单选<br />
function chkRadio(o){<br />
for (i=0;iif (o[i].checked) return true;<br />
}<br />
return false;<br />
} <br />
//====================================表单类================================<br />
// 文件上传过程中判断文件类型<br />
/*</p>
<p>/</p>
<p>//表单的值不能为空<br />
function isNull(elem){<br />
//var pattern=/^\s+|\s+$/;<br />
if(elem.replace(/(^\s+|\s$)/g, "")==""){<br />
return false;<br />
}else{<br />
return true;<br />
}<br />
}<br />
//不能超过imax字符<br />
function imax(elem){<br />
if(elem.length&gt;imax){<br />
return false;<br />
}else{<br />
return true;<br />
}<br />
}<br />
//不能少于imix字符<br />
function imix(elem){<br />
if(elem.lengthreturn false;<br />
}else{<br />
return true;<br />
}<br />
}<br />
//输入为中文判断<br />
function isChinese(elem){<br />
var pattern=/[^\x00-\xff]/g;<br />
if(pattern.test(elem)){<br />
//包含中文<br />
return false;<br />
}else{<br />
//不包含中文<br />
return true;<br />
}<br />
}</p>
<p>/ *********************************************************************************************************************</p>
<p>.cMenu {<br />
FILTER: alpha(opacity=0);BACKGROUND-COLOR: #D6D3CE;BORDER-BOTTOM: #666666 2px solid; BORDER-LEFT: #E4E4E4 2px solid; BORDER-RIGHT: #666666 2px solid; BORDER-TOP: #E4E4E4 2px solid; COLOR: #000000; CURSOR: default; FONT-SIZE: 9pt; color:#000000;FONT-WEIGHT: normal; LINE-HEIGHT: 20px; POSITION: absolute; VISIBILITY: hidden; WIDTH: 110px<br />
}<br />
.menuitems {<br />
font-size:9pt;<br />
MARGIN: 2px;<br />
PADDING-BOTTOM: 0px;<br />
PADDING-LEFT: 15px;<br />
PADDING-RIGHT: 3px;<br />
PADDING-TOP: 0px;<br />
}</p>
<p>&lt;!--[if IE]&gt;<br />
onmouseover=highlightie5()&gt;</p>
<p>电话号码的验证</p>
<p>要求：<br />
(1)电话号码由数字、"("、")"和"-"构成<br />
(2)电话号码为3到8位<br />
(3)如果电话号码中包含有区号，那么区号为三位或四位<br />
(4)区号用"("、")"或"-"和其他部分隔开<br />
(5)移动电话号码为11或12位，如果为12位,那么第一位为0<br />
(6)11位移动电话号码的第一位和第二位为"13"<br />
(7)12位移动电话号码的第二位和第三位为"13"<br />
根据这几条规则，可以与出以下正则表达式：<br />
(^[0-9]{3,4}\-[0-9]{3,8}$)|(^[0-9]{3,8}$)|(^\([0-9]{3,4}\)[0-9]{3,8}$)|(^0{0,1}13[0-9]{9}$)</p>
<p><br />
&lt;script language="javascript"&gt;<br />
function PhoneCheck(s) {<br />
var str=s;<br />
var reg=/(^[0-9]{3,4}\-[0-9]{3,8}$)|(^[0-9]{3,8}$)|(^\([0-9]{3,4}\)[0-9]{3,8}$)|(^0{0,1}13[0-9]{9}$)/<br />
alert(reg.test(str));<br />
}<br />
&lt;/script&gt;<br />
&lt;input type=text name="iphone"&gt;<br />
&lt;input type=button onclick="PhoneCheck(document.all.iphone.value)" value="Check"&gt;<br />
----------------------------------------------------------------------------------------</p>
<p>&lt;%<br />
'********************************************<br />
'函数功能：正则表达式校验<br />
'参数patrn：要校验的类型<br />
' "User" - 用户名<br />
' "Truename" - 英文姓名<br />
' "Passwd" - 密码<br />
' "Tel" - 电话/传真<br />
' "Mobil" - 手机<br />
' "Date" - 日期（格式：yyyy-mm-dd）<br />
' "Email" - 电子邮件<br />
' "Postalcode" - 邮政编码<br />
' "Search" - 搜索关键字<br />
' "Int" - 整数<br />
'参数strng：要校验的字串<br />
'返回值：校验结果，正确返回true，错误返回false<br />
'********************************************<br />
Function IsVerify(patrn,strng)<br />
strng=Trim(strng)<br />
Select Case patrn<br />
Case "User" '用户名<br />
patrn="^[a-z]{1}([a-z0-9]|[._]){2,19}$"<br />
Case "Truename" '英文姓名<br />
patrn="^[a-zA-Z]{1,30}$"<br />
Case "Passwd" '密码<br />
patrn="^(\w){6,20}$"<br />
Case "Tel" '电话/传真<br />
patrn="^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$"<br />
Case "Mobil" '手机<br />
patrn="^(\d)+[-]?(\d){6,12}$"<br />
Case "Date" '日期（格式：yyyy-mm-dd）<br />
patrn="^[12]{1}(\d){3}[-][01]?(\d){1}[-][0123]?(\d){1}$"<br />
Case "Email" '电子邮件<br />
patrn="^((\w)|[-]|[.])+@(((\w)|[-])+[.])+[a-z]{2,4}$"<br />
Case "Postalcode" '邮政编码<br />
patrn="^[a-z0-9 ]{3,12}$"<br />
Case "Search" '搜索关键字<br />
patrn="^[^`~!@#$%^&amp;*()+=|\\\[\]\{\}:;\'\,.&lt;&gt;/?]{1}[^`~!@$%^&amp;()+=|\\\[\]\{\}:;\'\,.&lt;&gt;?]{0,19}$"<br />
Case "Int" '整数<br />
patrn="^[1-9]{1}[0-9]{0,6}$"<br />
Case "Array"<br />
patrn="^[0-9]{1}([0-9]|[\,]){0,150}$"<br />
End Select<br />
Dim regEx<br />
Dim Match<br />
Set regEx = New RegExp<br />
regEx.Pattern = patrn<br />
regEx.IgnoreCase = True<br />
regEx.Global = True<br />
Matches = regEx.test(strng)<br />
IsVerify = Matches<br />
Set regEx = Nothing<br />
End Function</p>
<p>'********************************************<br />
'函数功能：对输入框的特殊字串进行过滤保存<br />
'参数strPass：过滤前的字符串<br />
'返回值：过滤后的字符串<br />
'********************************************<br />
Function SQLencode(byVal strPass)<br />
strPass = Replace(strPass, "&amp;", "&amp;")<br />
strPass = Replace(strPass, "&lt;", "&lt;")<br />
strPass = Replace(strPass, "&gt;", "&gt;")<br />
strPass = Replace(strPass, """", """)<br />
strPass = Replace(strPass, "'", "'")<br />
strPass = Replace(strPass, " ", "　")<br />
strPass = Replace(strPass,chr(13)&amp;chr(10),"&lt;br/&gt;")<br />
SQLencode = strPass<br />
End Function</p>
<p>'********************************************<br />
'函数功能：对SQLencode函数过滤后的字符串进行还原<br />
'参数strPass：经过过滤后的字符串<br />
'返回值：还原的过滤前的字符串<br />
'********************************************<br />
Function SQLdecode(byVal strPass)<br />
If Not isNull(strPass) Then<br />
strPass = Replace(strPass, "&lt;", "&lt;")<br />
strPass = Replace(strPass, "&gt;", "&gt;")<br />
strPass = Replace(strPass, ""","""" )<br />
strPass = Replace(strPass, "'","'" )<br />
strPass = Replace(strPass,"&lt;br/&gt;",chr(13)&amp;chr(10))<br />
End If<br />
SQLdecode = strPass<br />
End Function</p>
<p>'********************************************<br />
'函数功能：生成随机密码（字符为数字与大小写字母集合）<br />
'参数length：密码长度<br />
'返回值：随机密码<br />
'********************************************<br />
Function random(length)<br />
Dim n,str<br />
rnds=""<br />
Randomize<br />
For i=1 To length<br />
n=Int(75*Rnd+48)<br />
If (n&gt;57 and n&lt;65) Or (n&gt;90 and n&lt;97) Then<br />
i=i-1<br />
Else<br />
rnds=rnds&amp;Chr(n)<br />
End If<br />
Next<br />
random=rnds<br />
End Function</p>
<p>'********************************************<br />
'函数功能：对密码进行加密/解密（最大长度为15位）<br />
'********************************************<br />
Function Encrypt(preString)<br />
Dim pwds,s<br />
pwds=""<br />
s=Left(preString,15)<br />
For i=1 To Len(s)<br />
seed=170-Asc(Mid(s,i,1))-i<br />
pwds=pwds &amp; Chr(seed)<br />
Next<br />
Encrypt=pwds<br />
End Function</p>
<p>'********************************************<br />
'函数功能：格式化当前时间字串<br />
'参数：无<br />
'返回值：返回当前时间的纯数字字符串方式的表示（例如：当前时间2001-10-3 2:34:6，返回字符串"20011003023406"）<br />
'********************************************<br />
Function TheDate()<br />
y=year(date())<br />
m=month(date())<br />
d=day(date())<br />
h=Hour(time())<br />
n=Minute(time())<br />
s=Second(time())<br />
If Len(m)=1 Then m="0"&amp;m<br />
If Len(d)=1 Then d="0"&amp;d<br />
If Len(h)=1 Then h="0"&amp;h<br />
If Len(n)=1 Then n="0"&amp;n<br />
If Len(s)=1 Then s="0"&amp;s<br />
thedate=y&amp;m&amp;d&amp;h&amp;n&amp;s<br />
End Function</p>
<p>'********************************************<br />
'函数功能：返回字符串的长度<br />
'参数：字符串<br />
'返回值：字符串长度<br />
'********************************************<br />
Function strLen(str)<br />
dim p_len<br />
p_len=0<br />
strlen=0<br />
if trim(str)&lt;&gt;"" then<br />
p_len=len(trim(str))<br />
for xx=1 to p_len<br />
if asc(mid(str,xx,1))&lt;0 then<br />
strlen=int(strlen) + 2<br />
else<br />
strlen=int(strlen) + 1<br />
end if<br />
next<br />
end if<br />
End Function</p>
<p>'********************************************<br />
'函数功能：发送邮件通知<br />
'参数：字符串<br />
'返回值：成功/失败<br />
'********************************************<br />
Function SendMail(ToAddress, Subject, Body)<br />
On Error Resume Next<br />
Set objMail = Server.CreateObject("JMail.Message")<br />
objMail.From = ADR_Email<br />
objMail.FromName = "ADR管理中心"<br />
objMail.Subject = Subject<br />
objMail.AddRecipient ToAddress<br />
objMail.Body = Body<br />
If objMail.Send("") Then<br />
SendMail = True<br />
Else<br />
SendMail = False<br />
End If<br />
If Err.Number&lt;&gt; 0 Then SendMail = False<br />
Set objMail = Nothing<br />
On Error Goto 0<br />
End Function<br />
%&gt;<br />
-----------------------------------------------------------------------------------</p>
<p>//检验法人代码<br />
function isCorporationCode(s){<br />
var patrn=/^(\d){15}$/;<br />
if (!patrn.exec(s)) return false<br />
return true<br />
}</p>
<p>//校验登录名：只能输入5-20个以字母开头、可带数字、&#8220;_&#8221;、&#8220;.&#8221;的字串<br />
function isRegisterUserName(s)<br />
{<br />
var patrn=/^[a-zA-Z]{1}([a-zA-Z0-9._]){4,19}$/;<br />
if (!patrn.exec(s)) return false<br />
return true<br />
}<br />
//校验用户姓名：只能输入1-30个以字母开头的字串<br />
function isTrueName(s)<br />
{<br />
var patrn=/^[^`~!@#$%^&amp;*()+-=|\\\[\]\{\}:;\'\,.&lt;&gt;/? 0-9]{2,19}$/;<br />
if (!patrn.exec(s)) return false<br />
return true<br />
}</p>
<p>//校验密码：只能输入6-15个字母、数字<br />
function isPasswd(s)<br />
{<br />
var patrn=/^[a-zA-Z0-9]{6,15}$/;<br />
if (!patrn.exec(s)) return false<br />
return true<br />
}</p>
<p>//检验体重<br />
function isAvoirdupois(s)<br />
{<br />
var patrn=/^[1-9]{1}[0-9]{0,2}$/;<br />
var patrn2=/^[1-9]{1}$/;<br />
var intPart=s.indexOf('.');<br />
var decPart=s.lastIndexOf('.');<br />
if (intPart==-1 &amp;&amp; patrn.exec(s) &amp;&amp; eval(s)&gt;=2 &amp;&amp; eval(s)&lt;=200) return true<br />
if (intPart!=decPart || intPart==0 || intPart+2!=s.length) return false<br />
if (!patrn.exec(s.substring(0,intPart)) || !patrn2.exec(s.substring(decPart+1))) return false<br />
if (eval(s)&lt;2 || eval(s)&gt;200) return false<br />
return true<br />
}</p>
<p>//校验普通电话、传真号码：可以&#8220;+&#8221;开头，除数字外，可含有&#8220;-&#8221;<br />
function isTel(s)<br />
{<br />
var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/;<br />
if (!patrn.exec(s)) return false<br />
return true<br />
}</p>
<p>//校验手机号码：必须以数字开头，除数字外，可含有&#8220;-&#8221;<br />
function isMobile(s)<br />
{<br />
var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/;<br />
if (!patrn.exec(s)) return false<br />
return true<br />
}</p>
<p>//校验地区代码<br />
function isAreaCode(s)<br />
{<br />
var patrn=/^(\d){6}$/;<br />
if (!patrn.exec(s)) return false<br />
return true<br />
}</p>
<p>//校验邮政编码<br />
function isPostalCode(s)<br />
{<br />
var patrn=/^[1-9]{1}(\d){5}$/;<br />
if (!patrn.exec(s)) return false<br />
return true<br />
}</p>
<p>//校验搜索关键字<br />
function isSearch(s)<br />
{<br />
var patrn=/^[^`~!@#$%^&amp;*()+=|\\\[\]\{\}:;\'\,.&lt;&gt;/? ]{1}[^`~!@$%^&amp;()+=|\\\[\]\{\}:;\'\,.&lt;&gt;?]{0,19}$/;<br />
if (!patrn.exec(s)) return false<br />
return true<br />
}</p>
<p>//校验是否为ip地址<br />
function isIP(s)<br />
{<br />
var patrn=/^[0-9.]{1,20}$/;<br />
if (!patrn.exec(s)) return false<br />
return true<br />
}</p>
<p>//检验页码是否正确<br />
function isPage(s)<br />
{<br />
var patrn=/^[1-9]{1}[0-9]{0,2}$/;<br />
if (!patrn.exec(s)) return false<br />
return true<br />
}</p>
<p>//表单输入值错误提示<br />
function vErr(o,s){<br />
alert(s);<br />
if (o) o.focus();<br />
return false;<br />
}</p>
//判断单选<br />
function chkRadio(o){<br />
for (i=0;i&lt;o.length;i++){<br />
if (o[i].checked) return true;<br />
}<br />
return false;<br />
} <br />
 <img src ="http://www.blogjava.net/cyantide/aggbug/244216.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2008-12-03 22:00 <a href="http://www.blogjava.net/cyantide/archive/2008/12/03/244216.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2的struts.properties 配置(转帖)</title><link>http://www.blogjava.net/cyantide/archive/2008/12/03/244214.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Wed, 03 Dec 2008 13:57:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2008/12/03/244214.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/244214.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2008/12/03/244214.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/244214.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/244214.html</trackback:ping><description><![CDATA[<div>
<p>struts.action.extension<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;URL&nbsp;extension&nbsp;to&nbsp;use&nbsp;to&nbsp;determine&nbsp;if&nbsp;the&nbsp;request&nbsp;is&nbsp;meant&nbsp;for&nbsp;a&nbsp;Struts&nbsp;action&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用URL扩展名来确定是否这个请求是被用作Struts&nbsp;action，其实也就是设置&nbsp;action的后缀，例如login.do的'do'字。<br />
<br />
struts.configuration<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;org.apache.struts2.config.Configuration&nbsp;implementation&nbsp;class<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.apache.struts2.config.Configuration接口名<br />
<br />
struts.configuration.files<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;list&nbsp;of&nbsp;configuration&nbsp;files&nbsp;automatically&nbsp;loaded&nbsp;by&nbsp;Struts&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struts自动加载的一个配置文件列表<br />
<br />
struts.configuration.xml.reload<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Whether&nbsp;to&nbsp;reload&nbsp;the&nbsp;XML&nbsp;configuration&nbsp;or&nbsp;not<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否加载xml配置(true,false)<br />
<br />
struts.continuations.package<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;package&nbsp;containing&nbsp;actions&nbsp;that&nbsp;use&nbsp;Rife&nbsp;continuations<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;含有actions的完整连续的package名称<br />
<br />
struts.custom.i18n.resources<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Location&nbsp;of&nbsp;additional&nbsp;localization&nbsp;properties&nbsp;files&nbsp;to&nbsp;load&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;加载附加的国际化属性文件（不包含.properties后缀）<br />
<br />
struts.custom.properties<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Location&nbsp;of&nbsp;additional&nbsp;configuration&nbsp;properties&nbsp;files&nbsp;to&nbsp;load<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;加载附加的配置文件的位置<br />
<br />
<br />
struts.devMode<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Whether&nbsp;Struts&nbsp;is&nbsp;in&nbsp;development&nbsp;mode&nbsp;or&nbsp;not<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否为struts开发模式<br />
<br />
struts.dispatcher.parametersWorkaround<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Whether&nbsp;to&nbsp;use&nbsp;a&nbsp;Servlet&nbsp;request&nbsp;parameter&nbsp;workaround&nbsp;necessary&nbsp;for&nbsp;some&nbsp;versions&nbsp;of&nbsp;WebLogic<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;（某些版本的weblogic专用）是否使用一个servlet请求参数工作区（PARAMETERSWORKAROUND）<br />
<br />
struts.enable.DynamicMethodInvocation<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Allows&nbsp;one&nbsp;to&nbsp;disable&nbsp;dynamic&nbsp;method&nbsp;invocation&nbsp;from&nbsp;the&nbsp;URL<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;允许动态方法调用<br />
<br />
struts.freemarker.manager.classname<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;org.apache.struts2.views.freemarker.FreemarkerManager&nbsp;implementation&nbsp;class&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.apache.struts2.views.freemarker.FreemarkerManager接口名<br />
<br />
struts.i18n.encoding<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;encoding&nbsp;to&nbsp;use&nbsp;for&nbsp;localization&nbsp;messages<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;国际化信息内码<br />
<br />
struts.i18n.reload<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Whether&nbsp;the&nbsp;localization&nbsp;messages&nbsp;should&nbsp;automatically&nbsp;be&nbsp;reloaded<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否国际化信息自动加载&nbsp;<br />
<br />
struts.locale<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;default&nbsp;locale&nbsp;for&nbsp;the&nbsp;Struts&nbsp;application<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;默认的国际化地区信息<br />
<br />
struts.mapper.class<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;org.apache.struts2.dispatcher.mapper.ActionMapper&nbsp;implementation&nbsp;class<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.apache.struts2.dispatcher.mapper.ActionMapper接口<br />
<br />
struts.multipart.maxSize<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;maximize&nbsp;size&nbsp;of&nbsp;a&nbsp;multipart&nbsp;request&nbsp;(file&nbsp;upload)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;multipart请求信息的最大尺寸（文件上传用）&nbsp;<br />
<br />
struts.multipart.parser<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;org.apache.struts2.dispatcher.multipart.MultiPartRequest&nbsp;parser&nbsp;implementation&nbsp;for&nbsp;a&nbsp;multipart&nbsp;request&nbsp;(file&nbsp;upload)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;专为multipart请求信息使用的org.apache.struts2.dispatcher.multipart.MultiPartRequest解析器接口（文件上传用）<br />
<br />
<br />
struts.multipart.saveDir<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;directory&nbsp;to&nbsp;use&nbsp;for&nbsp;storing&nbsp;uploaded&nbsp;files&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;设置存储上传文件的目录夹<br />
<br />
struts.objectFactory<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;com.opensymphony.xwork2.ObjectFactory&nbsp;implementation&nbsp;class<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;com.opensymphony.xwork2.ObjectFactory接口（spring）<br />
<br />
struts.objectFactory.spring.autoWire<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Whether&nbsp;Spring&nbsp;should&nbsp;autoWire&nbsp;or&nbsp;not<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否自动绑定Spring<br />
<br />
struts.objectFactory.spring.useClassCache<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Whether&nbsp;Spring&nbsp;should&nbsp;use&nbsp;its&nbsp;class&nbsp;cache&nbsp;or&nbsp;not<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否spring应该使用自身的cache&nbsp;<br />
<br />
struts.objectTypeDeterminer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;com.opensymphony.xwork2.util.ObjectTypeDeterminer&nbsp;implementation&nbsp;class<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;com.opensymphony.xwork2.util.ObjectTypeDeterminer接口<br />
<br />
struts.serve.static.browserCache<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;static&nbsp;content&nbsp;served&nbsp;by&nbsp;the&nbsp;Struts&nbsp;filter&nbsp;should&nbsp;set&nbsp;browser&nbsp;caching&nbsp;header&nbsp;properties&nbsp;or&nbsp;not&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否struts过滤器中提供的静态内容应该被浏览器缓存在头部属性中<br />
<br />
struts.serve.static<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Whether&nbsp;the&nbsp;Struts&nbsp;filter&nbsp;should&nbsp;serve&nbsp;static&nbsp;content&nbsp;or&nbsp;not&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否struts过滤器应该提供静态内容<br />
<br />
struts.tag.altSyntax<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Whether&nbsp;to&nbsp;use&nbsp;the&nbsp;alterative&nbsp;syntax&nbsp;for&nbsp;the&nbsp;tags&nbsp;or&nbsp;not&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否可以用替代的语法替代tags<br />
<br />
struts.ui.templateDir<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;directory&nbsp;containing&nbsp;UI&nbsp;templates<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UI&nbsp;templates的目录夹&nbsp;<br />
<br />
struts.ui.theme<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;default&nbsp;UI&nbsp;template&nbsp;theme<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;默认的UI&nbsp;template主题<br />
<br />
struts.url.http.port<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;HTTP&nbsp;port&nbsp;used&nbsp;by&nbsp;Struts&nbsp;URLs<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;设置http端口<br />
<br />
struts.url.https.port<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;HTTPS&nbsp;port&nbsp;used&nbsp;by&nbsp;Struts&nbsp;URLs&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;设置https端口<br />
<br />
struts.url.includeParams<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;default&nbsp;includeParams&nbsp;method&nbsp;to&nbsp;generate&nbsp;Struts&nbsp;URLs&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在url中产生&nbsp;默认的includeParams<br />
<br />
<br />
struts.velocity.configfile<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;Velocity&nbsp;configuration&nbsp;file&nbsp;path<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;velocity配置文件路径<br />
<br />
struts.velocity.contexts<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;of&nbsp;Velocity&nbsp;context&nbsp;names<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;velocity的context列表<br />
<br />
<br />
struts.velocity.manager.classname<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.apache.struts2.views.velocity.VelocityManager&nbsp;implementation&nbsp;class<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.apache.struts2.views.velocity.VelocityManager接口名<br />
<br />
struts.velocity.toolboxlocation<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;location&nbsp;of&nbsp;the&nbsp;Velocity&nbsp;toolbox<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;velocity工具盒的位置&nbsp;<br />
struts.xslt.nocache<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Whether&nbsp;or&nbsp;not&nbsp;XSLT&nbsp;templates&nbsp;should&nbsp;not&nbsp;be&nbsp;cached<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否XSLT模版应该被缓存</p>
<p>struts.serve.static.browserCache 该属性设置浏览器是否缓存静态内容。当应用处于开发阶段时，我们希望每次请求都获得服务器的最新响应，则可设置该属性为false。</p>
<p>struts.enable.DynamicMethodInvocation 该属性设置Struts 2是否支持动态方法调用，该属性的默认值是true。如果需要关闭动态方法调用，则可设置该属性为false。</p>
<p>struts.enable.SlashesInActionNames 该属性设置Struts 2是否允许在Action名中使用斜线，该属性的默认值是false。如果开发者希望允许在Action名中使用斜线，则可设置该属性为true。</p>
<p>struts.tag.altSyntax 该属性指定是否允许在Struts 2标签中使用表达式语法，因为通常都需要在标签中使用表达式语法，故此属性应该设置为true，该属性的默认值是true。</p>
<p>struts.devMode该属性设置Struts 2应用是否使用开发模式。如果设置该属性为true，则可以在应用出错时显示更多、更友好的出错提示。该属性只接受true和flase两个值，该属性的默认值是false。通常，应用在开发阶段，将该属性设置为true，当进入产品发布阶段后，则该属性设置为false。</p>
<p>struts.i18n.reload该属性设置是否每次HTTP请求到达时，系统都重新加载资源文件。该属性默认值是false。在开发阶段将该属性设置为true会更有利于开发，但在产品发布阶段应将该属性设置为false。</p>
<p>提示 开发阶段将该属性设置了true，将可以在每次请求时都重新加载国际化资源文件，从而可以让开发者看到实时开发效果；产品发布阶段应该将该属性设置为false，是为了提供响应性能，每次请求都需要重新加载资源文件会大大降低应用的性能。</p>
<p>struts.ui.theme该属性指定视图标签默认的视图主题，该属性的默认值是xhtml。</p>
<p>struts.ui.templateDir该属性指定视图主题所需要模板文件的位置，该属性的默认值是template，即默认加载template路径下的模板文件。</p>
<p>struts.ui.templateSuffix该属性指定模板文件的后缀，该属性的默认属性值是ftl。该属性还允许使用ftl、vm或jsp，分别对应FreeMarker、Velocity和JSP模板。</p>
<p>struts.configuration.xml.reload该属性设置当struts.xml文件改变后，系统是否自动重新加载该文件。该属性的默认值是false。</p>
<p>struts.velocity.configfile该属性指定Velocity框架所需的velocity.properties文件的位置。该属性的默认值为velocity.properties。</p>
<p>struts.velocity.contexts该属性指定Velocity框架的Context位置，如果该框架有多个Context，则多个Context之间以英文逗号（,）隔开。</p>
<p>struts.velocity.toolboxlocation该属性指定Velocity框架的toolbox的位置。</p>
<p>struts.url.http.port该属性指定Web应用所在的监听端口。该属性通常没有太大的用户，只是当Struts 2需要生成URL时（例如Url标签），该属性才提供Web应用的默认端口。</p>
<p>struts.url.https.port该属性类似于struts.url.http.port属性的作用，区别是该属性指定的是Web应用的加密服务端口。</p>
<p>struts.url.includeParams该属性指定Struts 2生成URL时是否包含请求参数。该属性接受none、get和all三个属性值，分别对应于不包含、仅包含GET类型请求参数和包含全部请求参数。</p>
<p><br />
struts.custom.i18n.resources该属性指定Struts 2应用所需要的国际化资源文件，如果有多份国际化资源文件，则多个资源文件的文件名以英文逗号（,）隔开。</p>
<p><br />
struts.dispatcher.parametersWorkaround 对于某些Java EE服务器，不支持HttpServlet Request调用getParameterMap()方法，此时可以设置该属性值为true来解决该问题。该属性的默认值是false。对于 WebLogic、Orion和OC4J服务器，通常应该设置该属性为true。</p>
<p>struts.freemarker.manager.classname 该属性指定Struts 2使用的FreeMarker管理器。该属性的默认值是 org.apache.struts2.views.freemarker.FreemarkerManager，这是Struts 2内建的FreeMarker管理器。</p>
<p>struts.freemarker.wrapper.altMap该属性只支持true和false两个属性值，默认值是true。通常无需修改该属性值。</p>
<p>struts.xslt.nocache 该属性指定XSLT Result是否使用样式表缓存。当应用处于开发阶段时，该属性通常被设置为true；当应用处于产品使用阶段时，该属性通常被设置为false。</p>
<p>struts.configuration.files 该属性指定Struts 2框架默认加载的配置文件，如果需要指定默认加载多个配置文件，则多个配置文件的文件名之间以英文逗号（,）隔开。该属性的默认值为struts- default.xml,struts-plugin.xml,struts.xml，看到该属性值，读者应该明白为什么Struts 2框架默认加载struts.xml文件了。</p>
</div>
 <img src ="http://www.blogjava.net/cyantide/aggbug/244214.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2008-12-03 21:57 <a href="http://www.blogjava.net/cyantide/archive/2008/12/03/244214.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2 ognl分析(转帖)</title><link>http://www.blogjava.net/cyantide/archive/2008/12/02/243903.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Tue, 02 Dec 2008 04:58:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2008/12/02/243903.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/243903.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2008/12/02/243903.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/243903.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/243903.html</trackback:ping><description><![CDATA[Struts2在OGNL基础上的增强<br />
　　１、值栈(ValueStack)<br />
　　　　Struts2将OGNL上下文设置为Struts2中的ActionContext(内部使用的仍然是OgnlContext)，并将值栈设为OGNL的根对象。<br />
　　　　我们知道，OGNL上下文中的根对象可以直接访问，不需要使用任何特殊的&#8220;标记&#8221;，而引用上下文中的其他对象则需要使用&#8220;#&#8221;来标记。由于值栈是上下文中的根对象，因此可以直接访问。那么对于值栈中的对象该如何访问呢？Struts2提供了一个特殊的OGNLPropertyAccessor，它可以自动查找栈内的所有对象(从栈顶到栈底)，直接找到一个具有你所查找的属性的对象。也就是说，对于值栈中的任何对象都可以直接访问，而不需要使用&#8220;#&#8221;。<br />
　　　　假设值栈中有两个对象：student和employee，两个对象都有name属性，student有学号属性number，而employee有薪水属性salary。employee先入栈，student后入栈，位于栈顶，那么对于表达式name,访问的就是student的name属性，因为student对象位于栈顶；表达式salary，访问的就是employee的salary属性。正如你所见，访问值栈中的对象属性或方法，无须指明对象，也不用&#8220;#&#8221;，就好像值栈中的对象都是OGNL上下文中的根对象一样。这就是Struts2在OGNL基础上做出的改进。<br />
　　２、[N]语法<br />
　　　　如上所述，如果想要访问employee的name属性，应该如何写表达式呢？我们可以使用[N].xxx(N是从0开始的整数)这样的语法来指定从哪一个位置开始向下查找对象的属性，表达式[1].name访问的就是employee对象的name属性。<br />
　　　　在使用[N].xxx语法时，要注意位置序号的含义，它并不是表示&#8220;获取栈中索引为N的对象&#8221;，而是截取从位置N开始的部分栈。<br />
　　３、top关键字<br />
　　　　top用于获取栈顶的对象，结合[N].xxx语法，我们就可以获取栈中任意位置的对象。<br />
　　　　如：[0].top,[1].top等<br />
　　４、访问静态成员<br />
　　　　除了使用标准的OGNL表达式访问静态字段和静态方法外，Struts2还允许你不指定完整的类名，而是通过&#8220;vs&#8221;前缀来调用保存在栈中的静态字段和静态方法。<br />
　　　　@vs@FOO_PROPERTY<br />
　　　　@vs@someMethod()<br />
　　　　@vs1@someMethod()<br />
　　　　vs表示ValueStack，如果只有vs，那么将使用栈顶对象的类；如果在vs后面跟上一个数字，那么将使用栈中指定位置处的对象类。<br />
　　５、值栈中的Action实例<br />
　　　　Struts2框架总是把Action实例放在栈顶。因为Action在值栈中，而值栈又是OGNL中的根，所以引用Action的属性可以省略&#8220;#&#8221;标记，这也是为什么我们在结果页面中可以直接访问Action的属性的原因。<br />
　　６、Struts2中的命名对象<br />
　　　　Struts2还提供了一些命名对象，这些对象没有保存在值栈中，而是保存在ActionContext中，因此访问这些对象需要使用&#8220;#&#8221;标记。这些命名对象都是Map类型。<br />
　　　parameters<br />
　　　　用于访问请求参数。如：#parameters['id']或#parameters.id，相当于调用了HttpServletRequest对象的getParameter()方法。<br />
　　　　注意，parameters本质上是一个使用HttpServletRequest对象中的请求参数构造的Map对象，一量对象被创建(在调用Action实例之前就已经创建好了)，它和HttpServletRequest对象就没有了任何关系。<br />
　　　request<br />
　　　　用于访问请求属性。如：#request['user']或#request.user，相当于调用了HttpServletRequest对象的getAttribute()方法。<br />
　　　session<br />
　　　　用于访问session属性。如：#session['user']或#session.user，相当于调用了HttpSession对象的getAttribute()方法。<br />
　　　application<br />
　　　　用于访问application属性。如：#application['user']或#application.user，相当于调用了ServletContext的getAttribute()方法。<br />
　　　attr<br />
　　　　如果PageContext可用，则访问PageContext，否则依次搜索request、session和application对象。
<img src ="http://www.blogjava.net/cyantide/aggbug/243903.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2008-12-02 12:58 <a href="http://www.blogjava.net/cyantide/archive/2008/12/02/243903.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2 iterator标签 分析(转贴)</title><link>http://www.blogjava.net/cyantide/archive/2008/12/02/243901.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Tue, 02 Dec 2008 04:53:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2008/12/02/243901.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/243901.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2008/12/02/243901.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/243901.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/243901.html</trackback:ping><description><![CDATA[iterator标签主要是用于迭代输出集合元素,如list set map 数组等,在使用&lt;s:iterator/&gt;标签的时候有三个属性值得我们关注
<p>1. value属性:可选的属性,value属性是指一个被迭代的集合,使用ognl表达式指定,如果为空的话默认就是ValueStack栈顶的集合.<br />
2.id属性:可选属性, 是指集合元素的id<br />
3.status属性:可选属性,该属性在迭代时会产生一个IteratorStatus对象,该对象可以判断当前元素的位置,包含了以下属性方法:</p>
<p>int&nbsp; getCount();&nbsp; 迭代元素个数</p>
<p>int&nbsp; getIndex();&nbsp; 迭代元素当前索引</p>
<p>boolean getFirst(); 是否为第一个</p>
<p>boolean getEven(); 是否为偶</p>
<p>boolean getLast(); 是否最后一个</p>
<p>bolean getOdd();&nbsp;&nbsp; 是否为奇</p>
<p>由于iteratorstatus对象并不是ognl的根对象因此访问需要加上 #访问如下例子:</p>
<p>&lt;s:iterator value=&#8221;{&#8217;dd&#8217;,'bb&#8217;,'cc&#8217;}&#8221; status=&#8221;st&#8221;&gt;</p>
<p>&nbsp;&nbsp; &lt;s:if test=&#8221;#st.odd&#8221;&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:property value=&#8221;#st.index&#8221;/&gt;</p>
<p>&nbsp;&nbsp; &lt;/s:if&gt;</p>
<p>&lt;/s:iterator&gt;</p>
<p>&nbsp;</p>
<p>此外:iterator也可以迭代map对象,map对象中有几对key-value 就迭代几次,分别使用<br />
&lt;s:property value=&#8221;key&#8221;/&gt;<br />
&lt;s:property value=&#8221;value&#8221;/&gt;</p>
<p>输出即可.</p>
<img src ="http://www.blogjava.net/cyantide/aggbug/243901.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2008-12-02 12:53 <a href="http://www.blogjava.net/cyantide/archive/2008/12/02/243901.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>提高网站速度的方法(转帖)</title><link>http://www.blogjava.net/cyantide/archive/2008/12/02/243892.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Tue, 02 Dec 2008 04:15:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2008/12/02/243892.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/243892.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2008/12/02/243892.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/243892.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/243892.html</trackback:ping><description><![CDATA[今天偶尔在网上看到了这篇文章，<a href="http://developer.yahoo.com/performance/rules.html">http://developer.yahoo.com/performance/rules.html</a>，是Yahoo 人写的《提高网站速度的最佳实践》共有 14 条，是英文的，本来想翻译一下，google 了一下，已经有翻译版了。贴出来分享一下！
<p style="color: red">原文来自：<a href="http://www.space007.com/post/129.html">http://www.space007.com/post/129.html</a><br />
</p>
<p>转帖来自: http://www.blogjava.net/Jack2007/archive/2008/05/30/204146.html<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 相信互联网已经越来越成为人们生活中不可或缺的一部分。ajax，flex等等富客户端的应用使得人们越加&#8220;幸福&#8221;地体验着许多原先只能在C/S实现的功能。比如Google机会已经把最基本的office应用都搬到了互联网上。当然便利的同时毫无疑问的也使页面的速度越来越慢。自己是做前端开发的，在性能方面，根据yahoo的调查，后台只占5%，而前端高达95%之多，其中有88%的东西是可以优化的。</p>
<p><img title="" style="oldpaddingtop: ; oldbordertopwidth: ; oldpaddingbottom: ; oldborderbottomwidth: ; oldpaddingright: ; oldborderrightwidth: ; oldpaddingleft: ; oldborderleftwidth: " alt="" src="http://www.kuqin.com/upimg/allimg/080513/1745420.jpg" onload="ResizeImage(this,520)" />&nbsp;</p>
<p>以上是一张web2.0页面的生命周期图。工程师很形象地讲它分成了&#8220;怀孕，出生，毕业，结婚&#8221;四个阶段。如果在我们点击网页链接的时候能够意识到这个过程而不是简单的请求-响应的话，我们便可以挖掘出很多细节上可以提升性能的东西。今天听了淘宝小马哥的一个对yahoo开发团队对web性能研究的一个讲座，感觉收获很大，想在blog上做个分享。</p>
<p>相信很多人都听过优化网站性能的14条规则。更多的信息可见<a hideFocus style="hide-focus: true" href="http://developer.yahoo.com/performance/rules.html" target="_blank"><font color="#0000ff">developer.yahoo.com</font></a>
<table width="500" border="0">
    <tbody>
        <tr>
            <td>1. 尽可能的减少 HTTP 的请求数</td>
            <td align="right"><span style="color: #ff0000">[content]</span></td>
        </tr>
        <tr>
            <td>2. 使用 CDN（Content Delivery Network）</td>
            <td align="right"><span style="color: #3366ff">[server]</span></td>
        </tr>
        <tr>
            <td>3. 添加 Expires 头(或者 Cache-control )</td>
            <td align="right"><span style="color: #3366ff">[server]</span></td>
        </tr>
        <tr>
            <td>4. Gzip 组件</td>
            <td align="right"><span style="color: #3366ff">[server]</span></td>
        </tr>
        <tr>
            <td>5. 将 CSS 样式放在页面的上方</td>
            <td align="right"><span style="color: #339966">[css]</span></td>
        </tr>
        <tr>
            <td>6. 将脚本移动到底部（包括内联的）</td>
            <td align="right"><span style="color: #ff9900">[javascript]</span></td>
        </tr>
        <tr>
            <td>7. 避免使用 CSS 中的 Expressions</td>
            <td align="right"><span style="color: #339966">[css]</span></td>
        </tr>
        <tr>
            <td>8. 将 JavaScript 和 CSS 独立成外部文件</td>
            <td align="right"><span style="color: #ff9900">[javascript] </span><span style="color: #339966">[css]</span></td>
        </tr>
        <tr>
            <td>9. 减少 DNS 查询</td>
            <td align="right"><span style="color: #ff0000">[content]</span></td>
        </tr>
        <tr>
            <td>10. 压缩 JavaScript 和 CSS (包括内联的)</td>
            <td align="right"><span style="color: #ff9900">[javascript] </span><span style="color: #339966">[css]</span></td>
        </tr>
        <tr>
            <td>11. 避免重定向</td>
            <td align="right"><span style="color: #3366ff">[server]</span></td>
        </tr>
        <tr>
            <td>12. 移除重复的脚本</td>
            <td align="right"><span style="color: #ff9900">[javascript]</span></td>
        </tr>
        <tr>
            <td>13. 配置实体标签（ETags）</td>
            <td align="right"><span style="color: #339966">[css]</span></td>
        </tr>
        <tr>
            <td>14. 使 AJAX 缓存</td>
            <td>&nbsp;</td>
        </tr>
    </tbody>
</table>
</p>
<p>&nbsp;在firefox下有一个插件yslow，集成在firebug中，你可以用它很方便地来看看自己的网站在这几个方面的表现。</p>
<p><img title="" style="oldpaddingtop: ; oldbordertopwidth: ; oldpaddingbottom: ; oldborderbottomwidth: ; oldpaddingright: ; oldborderrightwidth: ; oldpaddingleft: ; oldborderleftwidth: " alt="" src="http://www.kuqin.com/upimg/allimg/080513/1745421.jpg" onload="ResizeImage(this,520)" /></p>
<p>这是对用yslow对我的网站<a hideFocus style="hide-focus: true" href="http://www.space007.com/" target="_blank">西风坊</a>测评的结果，很遗憾，只有51分。呵呵。中国各大网站的分值都不高，刚测了一下，新浪和网易都是31分。然后<a hideFocus style="hide-focus: true" href="http://www.yahoo.com/" target="_blank">yahoo</a>（美国）的分值确实97分！可见yahoo在这方面作出的努力。从他们总结的这14条规则，已经现在又新增加的20个点来看，有很多细节我们真得是怎么都不会去想，有些做法甚至是有些&#8220;变态&#8221;了。</p>
<p><strong><span style="color: #ff0000">第一条、尽可能的减少 HTTP 的请求数</span></strong> （<a hideFocus style="hide-focus: true" href="http://developer.yahoo.com/performance/rules.html#num_http">Make Fewer HTTP Requests</a> ）</p>
<p>http请求是要开销的，想办法减少请求数自然可以提高网页速度。常用的方法，合并css，js（将一个页面中的css和js文件分别合并）以及Image maps和css sprites等。当然或许将css，js文件拆分多个是因为css结构，共用等方面的考虑。阿里巴巴中文站当时的做法是开发时依然分开开发，然后在后台对js，css进行合并，这样对于浏览器来说依然是一个请求，但是开发时仍然能还原成多个，方便管理和重复引用。yahoo甚至建议将首页的css和js直接写在页面文件里面，而不是外部引用。因为首页的访问量太大了，这么做也可以减少两个请求数。而事实上国内的很多门户都是这么做的。</p>
<p>而css sprites是指只用将页面上的背景图合并成一张，然后通过css的background-position属性定义不过的值来取他的背景。淘宝和阿里巴巴中文站目前都是这样做的。有兴趣的可以看下淘宝和<a hideFocus style="hide-focus: true" href="http://img.china.alibaba.com/images/cn/home/071028/icon_sum.gif" target="_blank">阿里巴巴的背景图</a>。</p>
<p><a hideFocus style="hide-focus: true" href="http://www.csssprites.com/">http://www.csssprites.com/</a>&nbsp;这是个工具网站，它可以自动将你上传的图片合并并给出对应的background-position坐标。并将结果以png和gif的格式输出。</p>
<p><span style="color: #ff0000"><strong>第二条、使用CDN（内容分发网络）: </strong></span>Use a Content Delivery Network</p>
<p>说实话，对于CDN这一块自己并不是很了解，简单地讲，通过在现有的Internet中增加一层新的网络架构，将网站的内容发布到最接近用户的cache服务器内，通过DNS负载均衡的技术，判断用户来源就近访问cache服务器取得所需的内容，杭州的用户访问近杭州服务器上的内容，北京的访问近北京服务器上的内容。这样可以有效减少数据在网络上传输的时间，提高速度。更详细地内容大家可以参考百度百科上对于<a hideFocus style="hide-focus: true" href="http://baike.baidu.com/view/21895.htm" target="_blank">CDN</a>的解释。<span lang="EN-US">Yahoo!</span><span style="font-family: 宋体">把静态内容分布到</span><span lang="EN-US">CDN</span><span style="font-family: 宋体">减少了用户影响时间</span><span lang="EN-US">20%</span><span style="font-family: 宋体">或更多。</span></p>
<p>CDN技术示意图：</p>
<p><img title="" style="oldpaddingtop: ; oldbordertopwidth: ; oldpaddingbottom: ; oldborderbottomwidth: ; oldpaddingright: ; oldborderrightwidth: ; oldpaddingleft: ; oldborderleftwidth: " alt="" src="http://www.kuqin.com/upimg/allimg/080513/1745422.jpg" onload="ResizeImage(this,520)" /></p>
<p>CDN组网示意图：</p>
<p>&nbsp;<img title="" style="oldpaddingtop: ; oldbordertopwidth: ; oldpaddingbottom: ; oldborderbottomwidth: ; oldpaddingright: ; oldborderrightwidth: ; oldpaddingleft: ; oldborderleftwidth: " alt="" src="http://www.kuqin.com/upimg/allimg/080513/1745423.jpg" onload="ResizeImage(this,520)" /></p>
<p><span style="color: #ff0000"><strong>第三条、 添加Expire/Cache-Control 头</strong></span>：Add an Expires Header</p>
<p>现在越来越多的图片，脚本，css，flash被嵌入到页面中，当我们访问他们的时候势必会做许多次的http请求。其实我们可以通过设置<span lang="EN-US"><span class="hilite1">Expires</span> <span class="hilite2">header来缓存这些文件。Expire其实就是通过header报文来指定特定类型的文件在览器中的缓存时间。大多数的图片，flash在发布后都是不需要经常修改的，做了缓存以后这样浏览器以后就不需要再从服务器下载这些文件而是而直接从缓存中读取，这样再次访问页面的速度会大大加快。</span></span>一个典型的HTTP 1.1协议返回的头信息：<br />
HTTP/1.1 200 OK<br />
Date: Fri, 30 Oct 1998 13:19:41 GMT<br />
Server: Apache/1.3.3 (Unix)<br />
Cache-Control: max-age=3600, must-revalidate<br />
Expires: Fri, 30 Oct 1998 14:19:41 GMT<br />
Last-Modified: Mon, 29 Jun 1998 02:28:12 GMT<br />
ETag: "3e86-410-3596fbbc"<br />
Content-Length: 1040<br />
Content-Type: text/html</p>
<p>其中通过服务器端脚本设置Cache-Control和Expires可以完成。</p>
<p>如，在php中设置30天后过期：<br />
</p>
<pre mergenum="0"><code class="php"><font face="NSimsun">&nbsp;&lt;!--pHeader(<span class="string2"><font color="#ff00ff">"Cache-Control:&nbsp;must-revalidate"</font></span>);<span class="keyword"><strong><font color="#000080">$</font></strong></span><span class="variable"><font color="#4040c2">offset</font></span>&nbsp;=&nbsp;<span class="number"><font color="#ff0000">60</font></span>&nbsp;*&nbsp;<span class="number"><font color="#ff0000">60</font></span>&nbsp;*&nbsp;<span class="number"><font color="#ff0000">24</font></span>&nbsp;*&nbsp;<span class="number"><font color="#ff0000">30</font></span>;<span class="keyword"><strong><font color="#000080">$</font></strong></span><span class="variable"><font color="#4040c2">ExpStr</font></span>&nbsp;=&nbsp;<span class="string2"><font color="#ff00ff">"Expires:&nbsp;"</font></span>&nbsp;.&nbsp;<span class="func"><font color="#e17100">gmdate</font></span>(<span class="string2"><font color="#ff00ff">"D,&nbsp;d&nbsp;M&nbsp;Y&nbsp;H:i:s"</font></span>,&nbsp;<span class="func"><font color="#e17100">time</font></span>()&nbsp;+&nbsp;<span class="keyword"><strong><font color="#000080">$</font></strong></span><span class="variable"><font color="#4040c2">offset</font></span>)&nbsp;.&nbsp;<span class="string2"><font color="#ff00ff">"&nbsp;GMT"</font></span>;Header(<span class="keyword"><strong><font color="#000080">$</font></strong></span><span class="variable"><font color="#4040c2">ExpStr</font></span>);--&gt;</font></code></pre>
<p><textarea style="display: none"> &lt;!--pHeader("Cache-Control: must-revalidate");$offset = 60 * 60 * 24 * 30;$ExpStr = "Expires: " . gmdate("D, d M Y H:i:s", time() + $offset) . " GMT";Header($ExpStr);--&gt;</textarea> </p>
<p>&nbsp;</p>
<p>在asp中设置绝对时间过期：</p>
<p><span style="font-style: italic">&lt;% Response.ExpiresAbsolute=#May 31,2010 13:30:15 GMT# %&gt;</span><br />
&nbsp;</p>
<p>也可以通过配置服务器本身完成，这些偶就不是很清楚了，呵呵。想了解跟多的朋友可以参考<a hideFocus style="hide-focus: true" href="http://www.web-caching.com/">http://www.web-caching.com/</a>&nbsp;</p>
<p>据我了解，目前阿里巴巴中文站的Expires过期时间是30天。不过期间也有过问题，特别是对于脚本过期时间的设置还是应该仔细考虑下，不然相应的脚本功能更新后客户端可能要过很长一段时间才能&#8220;感知&#8221;到这样的变化。以前做[<a hideFocus style="hide-focus: true" href="http://www.kuqin.com/webpagedesign/20080513/8444.html" target="_blank">suggest项目</a>] 的时候就遇到过这个问题。所以，哪些应该缓存，哪些不该缓存还是应该仔细斟酌一番。</p>
<p><strong><span style="color: #ff0000">第四条、启用Gzip压缩：</span></strong>Gzip Components</p>
<p><font size="2">Gzip的思想就是把文件先在服务器端进行压缩，然后再传输。这样可以显著减少文件传输的大小。传输完毕后浏览器会重新对压缩过的内容进行解压缩，并执行。目前的浏览器都能&#8220;良好&#8221;地支持 gzip。不仅浏览器可以识别，而且各大&#8220;爬虫&#8221;也同样可以识别，各位seoer可以放下心了。而且gzip的压缩比例非常大，一般压缩率为85%，就是说服务器端100K的页面可以压缩到25K左右再发送到客户端。具体的Gzip压缩原理大家可以参考csdn上的《</font><a hideFocus style="hide-focus: true" href="http://www.kuqin.com/algorithm/20080513/8445.html" target="_blank"><font size="2">gzip压缩算法</font></a><font size="2">》</font>&nbsp;这篇文章。雅虎特别强调，&nbsp;<strong>所有的文本内容都应该被gzip压缩: html (php), js, css, xml, txt&#8230; </strong>这一点我们网站做得不错，是一个A。以前我们的首页也并不是A，因为首页上还有很多广告代码投放的js，这些广告代码拥有者的网站的js没有经过gzip压缩，也会拖累我们网站。</p>
<p>以上三点大多属于服务器端的内容，本人也是粗浅地了解而已。说得不对的地方有待各位指正。&nbsp;</p>
<p><span style="color: #ff0000"><strong>第五条、将css放在页面最上面 </strong></span><span style="color: #000000"><span>（ Put Stylesheets at the Top）</span></span></p>
<p><span><span style="color: #000000">将css放在页面最上面，这是为什么？因为ie，firefox等浏览器在css全部传输完全之前不会去渲染任何的东西。理由诚如小马哥说得那样很简单。css，全称Cascading Style Sheets&nbsp;(层叠样式表单)。层叠即意味这后面的css可以覆盖前面的css，级别高的css可以覆盖级别低的css。在[<a hideFocus style="hide-focus: true" href="http://www.kuqin.com/webpagedesign/20080513/8443.html" target="_blank">css之！important</a>] 这篇文章的最下面曾简单地提到过这层级关系，这里我们只需要知道css可以被覆盖的。既然前面的可以被覆盖，浏览器在他完全加载完毕之后再去渲染无疑也是合情合理的<font face="宋体">很多浏览器下，如</font><span lang="EN-US">IE</span><span style="font-family: 宋体">，把样式表放在</span><span lang="EN-US">页面</span><span style="font-family: 宋体">的底部的问题在于它禁止了网页内容的顺序显示。浏览器阻止显示以免重画页面元素，那用户只能看到空白页了。</span><span lang="EN-US">Firefox</span><span style="font-family: 宋体">不会阻止显示，但这意味着当样式表下载后，有些页面元素可能需要重画，这导致闪烁问题。所以我们应该尽快让css加载完毕</span></span></span></p>
<p><span style="color: #000000"><span>顺着这层意思，如果我们再细究的话，其实还有可以优化的地方。比如本站上面包含的两个css文件，&lt;<span class="start-tag">link</span><span class="attribute-name"> rel</span>=<span class="attribute-value">"stylesheet" </span><span class="attribute-name">rev</span>=<span class="attribute-value">"stylesheet" </span><span class="attribute-name">href</span>=<span class="attribute-value">"http://www.space007.com/themes/google/style/google.css" </span><span class="attribute-name">type</span>=<span class="attribute-value">"text/css" </span><span class="attribute-name">media</span>=<span class="attribute-value">"screen" </span><span class="error"><span class="attribute-name">/</span></span>&gt; 和&lt;<span class="start-tag">link</span><span class="attribute-name"> rel</span>=<span class="attribute-value">"stylesheet" </span><span class="attribute-name">rev</span>=<span class="attribute-value">"stylesheet" </span><span class="attribute-name">href</span>=<span class="attribute-value">"http://www.space007.com/css/print.css" </span><span class="attribute-name">type</span>=<span class="attribute-value">"text/css" </span><span class="attribute-name">media</span>=<span class="attribute-value">"print" </span><span class="error"><span class="attribute-name">/</span></span>&gt;。从media就可以看出第一个css是针对浏览器的，第二个css文件是针对打印样式的。从用户的行为习惯上来将，要打印页面的动作一定是发生在页面页面显示出来之后的。所以比较好的方法应该是在页面加载完毕之后再动态地为这张页面加上针对打印设备的css，这样又可以提高一点速度。（哈哈）</span></span></p>
<p>&nbsp;<span style="color: #000000"><span><span style="color: #ff0000"><strong>第六条、将script放在页面最下面 </strong><span style="color: #000000">（Put Scripts at the Bottom ）</span></span></span></span></p>
<p><span style="color: #ff0000"><span><span style="color: #000000">将脚本放在页面最下面的目的有那么两点：</span></span></span>&nbsp;1、因为防止script脚本的执行阻塞页面的下载。在页面loading的过程中，当浏览器读到js执行语句的时候一定会把它全部解释完毕后在会接下来读下面的内容。不信你可以写一个js死循环看看页面下面的东西还会不会出来。（setTimeout 和 setInterval的执行有点类似于多线程，在相应的响应时间之前也会继续下面的内容渲染。）浏览器这么做的逻辑是因为js随时可能执行&nbsp;location.href或是其他可能完全中断此页面过程的函数，即如此，当然得等他执行完毕之后再加载咯。所以放在页面最后，可以有效减少页面可视元素的加载时间。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、<span style="font-family: 宋体">脚本引起的第二个问题是它阻塞并行下载数量。<span lang="EN-US">HTTP/1.1<span lang="EN-US" style="font-family: 宋体"><span lang="EN-US">规范</span></span></span><span style="font-family: 宋体">建议浏览器每个主机的并行下载数不超过</span><span lang="EN-US">2</span><span style="font-family: 宋体">个（IE只能为2个，其他浏览器如ff等都是默认设置为2个，不过新出的ie8可以达6个）。因此如果您把图像文件分布到多台机器的话，您可以达到超过</span><span lang="EN-US">2</span><span style="font-family: 宋体">个的并行下载。但是当脚本文件下载时，浏览器不会启动其他的并行下载。</span></span></p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">当然对各个网站来说，把脚本都放到页面底部加载的可行性还是值得商榷的。就比如阿里巴巴中文站的页面。很多地方有内联的js，页面的显示严重依赖于此，我承认这和无侵入脚本的理念相差甚远，但是很多&#8220;历史遗留问题&#8221;却不是那么容易解决的。</span></span></p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体"><font face="Arial">&nbsp;<span style="color: #000000"><span><span style="color: #ff0000"><strong>第七条、<strong>避免在</strong><strong>CSS</strong><strong>中使用</strong><strong>Expressions </strong></strong><span style="color: #000000">（Avoid CSS Expressions ）</span></span></span></span></font></span></span></p>
<p>css表达是的执行次数是远远多于我们想象的，往往会严重地影响性能。而且，它只能在IE中执行。所以因尽量地避免它。这一条以前倒没想过，个人用这个就是在对ie使用max-width和min-width属性的时候。大家知道IE是不支持max-width和min-width属性的。有时候的页面（特别是自适应大小的页面）为了能在分辨率小到一定程度后还能显示要用到这个功能，怎么办。当时我的做法就是利用expressions:&nbsp;</p>
<p>&nbsp;</p>
<pre mergenum="3"><code class="css">&nbsp;<span class="attrib"><strong><font color="#000080">min-width</font></strong></span>:<span class="number"><font color="#ff0000">952px</font></span>;&nbsp;<span class="attrib"><strong><font color="#000080">width</font></strong></span>:expression((document.documentElement.clientWidth&nbsp;&amp;lt;<span class="number"><font color="#ff0000">952</font></span>&nbsp;)&nbsp;?&nbsp;&amp;quot;<span class="number"><font color="#ff0000">952</font></span>&amp;quot;:&amp;quot;<span class="value"><font color="#0000ff">auto</font></span>&amp;quot;)&nbsp;</code></pre>
<p><textarea style="display: none"> min-width:952px; width:expression((document.documentElement.clientWidth &lt;952 ) ? "952":"auto") </textarea> </p>
<p>&nbsp;</p>
<p>不过从今天应该寻找新的办法了。目前的解决办法是通过两层的嵌套：</p>
<p>css文件：</p>
<p>&nbsp;</p>
<pre mergenum="4"><code class="css">&nbsp;<span class="color"><font color="#008000">#main</font></span>_box{<span class="attrib"><strong><font color="#000080">width</font></strong></span>:<span class="number"><font color="#ff0000">70%</font></span>;<span class="attrib"><strong><font color="#000080">height</font></strong></span>:<span class="number"><font color="#ff0000">100px</font></span>;&nbsp;<span class="attrib"><strong><font color="#000080">background</font></strong></span>:<span class="color"><font color="#008000">#ffffcc</font></span>;&nbsp;<span class="attrib"><strong><font color="#000080">min-width</font></strong></span>:<span class="number"><font color="#ff0000">600px</font></span>;<span class="attrib"><strong><font color="#000080">margin</font></strong></span>:<span class="value"><font color="#0000ff">auto</font></span>;&nbsp;}&nbsp;#p_main_box{&nbsp;<span class="attrib"><strong><font color="#000080">border-left</font></strong></span>:<span class="number"><font color="#ff0000">600px</font></span>&nbsp;<span class="value"><font color="#0000ff">solid</font></span>&nbsp;<span class="color"><font color="#008000">#ffffcc</font></span>;&nbsp;<span class="attrib"><strong><font color="#000080">height</font></strong></span>:<span class="number"><font color="#ff0000">1px</font></span>;&nbsp;}&nbsp;#m_main_box{&nbsp;<span class="attrib"><strong><font color="#000080">margin-left</font></strong></span>:-<span class="number"><font color="#ff0000">600px</font></span>;&nbsp;<span class="attrib"><strong><font color="#000080">position</font></strong></span>:<span class="value"><font color="#0000ff">relative</font></span>;&nbsp;<span class="attrib"><strong><font color="#000080">height</font></strong></span>:<span class="number"><font color="#ff0000">1px</font></span>;&nbsp;<span class="attrib"><strong><font color="#000080">text-align</font></strong></span>:<span class="value"><font color="#0000ff">center</font></span>;&nbsp;}&nbsp;</code></pre>
<p><textarea style="display: none"> #main_box{width:70%;height:100px; background:#ffffcc; min-width:600px;margin:auto; } #p_main_box{ border-left:600px solid #ffffcc; height:1px; } #m_main_box{ margin-left:-600px; position:relative; height:1px; text-align:center; } </textarea> </p>
<p>&nbsp;</p>
<p>html文件：</p>
<p>&nbsp;</p>
<pre mergenum="2"><code class="html"><strong><font color="#000080"><span class="tag">&lt;/p&gt;</span><span class="tag">&lt;div</span></font></strong><span class="aname"><font color="#800080">&nbsp;id</font></span>=<span class="avalue"><font color="#ff00ff">"main_box"</font></span><strong><font color="#000080"><span class="tag">&gt;</span><span class="tag">&lt;div</span></font></strong><span class="aname"><font color="#800080">&nbsp;id</font></span>=<span class="avalue"><font color="#ff00ff">"p_main_box"</font></span><strong><font color="#000080"><span class="tag">&gt;</span><span class="tag">&lt;div</span></font></strong><span class="aname"><font color="#800080">&nbsp;id</font></span>=<span class="avalue"><font color="#ff00ff">"m_main_box"</font></span><span class="tag"><strong><font color="#000080">&gt;</font></strong></span>最小宽度600px；<font color="#000080"><span class="tag">&lt;/div&gt;</span><span class="tag">&lt;/div&gt;</span><span class="tag">&lt;/div&gt;</span><span class="tag">&lt;p</span></font><span class="tag">&gt;</span></code>
<p><input id="cloudream-runcode0" type="button" value="运行代码" /></p>
</pre>
<p><textarea id="cloudream-precode0" style="display: none" mergenum="1">&lt;/p&gt;&lt;div id="main_box"&gt;&lt;div id="p_main_box"&gt;&lt;div id="m_main_box"&gt;最小宽度600px；&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;</textarea> </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>不过这样就多了两层无意义的嵌套，肯定不好。还需要一个更好的办法。<span style="font-family: 宋体"><span style="font-family: 宋体"><font face="Arial">&nbsp;</font></span></span></p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体"><font face="Arial"><span style="color: #000000"><span><span style="color: #ff0000"><strong>第八条、<strong>把javascript和css都放到外部文件中</strong><strong> </strong></strong><span style="color: #000000">（Make JavaScript and CSS External ）</span></span></span></span></font></span></span></p>
<p>这点我想还是很容易理解的。不仅从性能优化上会这么做，用代码易于维护的角度看也应该这么做。把css和js写在页面内容可以减少2次请求，但也增大了页面的大小。如果已经对css和js做了缓存，那也就没有2次多余的http请求了。当然，我在前面中也说过，有些特殊的页面开发人员还是会选择内联的css和js文件。</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体"><font face="Arial"><span style="color: #000000"><span><span style="color: #ff0000"><strong>第九条、减少DNS查询 </strong><span style="color: #000000">(Reduce DNS Lookups) </span></span></span></span></font></span></span></p>
<p><span style="color: #ff0000"><span><span style="color: #000000"><font face="Arial"><span style="font-family: 宋体"><span style="font-family: 宋体">在Internet上域名与IP地址之间是一一对应的，域名（kuqin.com）很好记，但计算机不认识，计算机之间的&#8220;相认&#8221;还要转成ip地址。在网络上每台计算机都对应有一个独立的ip地址。在域名和ip地址之间的转换工作称为域名解析，也称DNS查询。一次DNS的解析过程会消耗20-120毫秒的时间,在dns查询结束之前，浏览器不会下载该域名下的任何东西。所以减少dns查询的时间可以加快页面的加载速度。yahoo的建议一个页面所包含的域名数尽量控制在2-4个。这就需要对页面整体有一个很好的规划。目前我们这点做的不好，很多打点的广告投放系统拖累了我们。</span></span></font></span></span></span></p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体"><font face="Arial"><span style="color: #000000"><span><span style="color: #ff0000"><span style="font-family: 宋体"><span style="font-family: 宋体"><font face="Arial"><span style="color: #000000"><span><span style="color: #ff0000"><strong>第十条、</strong><strong><span style="color: #ff0000">压缩 JavaScript 和 CSS&nbsp;</span></strong><strong> </strong><span style="color: #000000">(Minify JavaScript ) </span></span></span></span></font></span></span></span></span></span></font></span></span></p>
<p>压缩js和css的左右很显然，减少页面字节数。容量小页面加载速度自然也就快。而且压缩除了减少体积以外还可以起到一定的保护左右。这点我们做得不错。常用的压缩工具有JsMin、YUI compressor等。另外像<a hideFocus style="hide-focus: true" href="http://dean.edwards.name/packer/">http://dean.edwards.name/packer/</a>还给我们提供了一个非常方便的在线压缩工具。你可以在jQuery的网页看到压缩过的js文件和没有压缩过的js文件的容量差别：</p>
<p><img title="" style="oldpaddingtop: ; oldbordertopwidth: ; oldpaddingbottom: ; oldborderbottomwidth: ; oldpaddingright: ; oldborderrightwidth: ; oldpaddingleft: ; oldborderleftwidth: " alt="" src="http://www.kuqin.com/upimg/allimg/080513/1745424.jpg" onload="ResizeImage(this,520)" /></p>
<p>当然，压缩带来的一个弊端就是代码的可读性没了。相信很多做前端的朋友都遇到过这个问题：看Google的效果很酷，可是去看他的源代码却是一大堆挤在一起的字符，连函数名都是替换过的，汗死！自己的代码也这样岂不是对维护非常不方便。所有阿里巴巴中文站目前采用的做法是在js和css发布的时候在服务器端进行压缩。这样在我们很方便地维护自己的代码。</p>
<p><span style="color: #000000"><span style="color: #ff0000"><span><span style="color: #000000"><font face="Arial"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="color: #ff0000"><span><span style="color: #000000"><font face="Arial"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体"><font face="Arial"><span style="color: #000000"><span><span style="color: #ff0000"><strong>第十一条、</strong><strong><span style="color: #ff0000">避免重定向</span></strong><strong> </strong><span style="color: #000000">(Avoid Redirects ) </span></span></span></span></font></span></span></span></span></font></span></span></span></span></span></font></span></span></span></span></p>
<p><span style="color: #000000"><span style="color: #ff0000"><span><span style="color: #000000"><font face="Arial"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体"><font face="Arial"><span style="color: #000000"><span><span style="color: #ff0000"><span style="font-family: 宋体"><span style="font-family: 宋体"><font face="Arial"><span style="color: #000000"><span><span style="color: #ff0000"><span style="color: #000000">不久前在ieblog上看到过《<a hideFocus style="hide-focus: true" href="http://blogs.msdn.com/ie/archive/2005/04/11/407189.aspx" target="_blank">Internet Explorer and Connection Limits</a>》这篇文章，比如 当你输入<a href="http://www.kuqin.com/" target="_blank">http://www.ithao123.com</a> 的时候服务器会自动产生一个301服务器转向 <a href="http://www.kuqin.com/">http://www.kuqin.com/</a> ，你看浏览器的地址栏就能看出来。这种重定向自然也是需要消耗时间的。当然这只是一个例子，发生重定向的原因还有很多，但是不变的是每增加一次重定向就会增加一次web请求，所以因该尽量减少。</span></span></span></span></font></span></span></span></span></span></font></span></span></span></span></font></span></span></span></span></p>
<p><span style="color: #000000"><span style="color: #ff0000"><span><span style="color: #000000"><font face="Arial"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体"><font face="Arial"><span style="color: #000000"><span><span style="color: #ff0000"><span style="font-family: 宋体"><span style="font-family: 宋体"><font face="Arial"><span style="color: #000000"><span><span style="color: #ff0000"><span style="color: #000000"><span style="font-family: 宋体"><span style="font-family: 宋体"><font face="Arial"><span style="color: #000000"><span><span style="color: #ff0000"><strong>第十二条、</strong><strong><span style="color: #ff0000">移除重复的脚本</span></strong><strong> </strong><span style="color: #000000">(Remove Duplicate Scripts ) </span></span></span></span></font></span></span></span></span></span></span></font></span></span></span></span></span></font></span></span></span></span></font></span></span></span></span></p>
<p><span style="color: #000000"><span style="color: #ff0000"><span><span style="color: #000000"><font face="Arial"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="color: #000000"><span style="color: #ff0000"><span><span style="color: #000000"><font face="Arial"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="color: #ff0000"><span><span style="color: #000000"><font face="Arial"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体"><font face="Arial"><span style="color: #000000"><span><span style="color: #ff0000"><span style="color: #000000">这点我想不说也知道，不仅是从性能上考虑，代码规范上看也是这样。但是不得不承认，很多时候我们会因为图一时之快而加上一些或许是重复的代码。或许一个统一的css框架和js框架可以比较好的解决我们的问题。小猪的观点很对，不仅是要做到不重复，更是要做到可重用。</span></span></span></span></font></span></span></span></span></font></span></span></span></span></span></font></span></span></span></span></span></span></font></span></span></span></span></p>
<p><span style="color: #000000"><span style="color: #ff0000"><span><span style="color: #000000"><font face="Arial"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="color: #000000"><span style="color: #ff0000"><span><span style="color: #000000"><font face="Arial"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="color: #ff0000"><span><span style="color: #000000"><font face="Arial"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体"><font face="Arial"><span style="color: #000000"><span><span style="color: #ff0000"><span style="color: #000000"><span style="font-family: 宋体"><span style="font-family: 宋体"><font face="Arial"><span style="color: #000000"><span><span style="color: #ff0000"><strong>第十三条、</strong><strong><span style="color: #ff0000">配置</span><span style="color: #ff0000">实体标签（ETags）</span></strong><strong> </strong><span style="color: #000000">(Configure ETags ) </span></span></span></span></font></span></span></span></span></span></span></font></span></span></span></span></font></span></span></span></span></span></font></span></span></span></span></span></span></font></span></span></span></span></p>
<p>这点我也不懂，呵呵。在inforQ上找到一篇解释得比较详细的说明《<a hideFocus style="hide-focus: true" href="http://www.kuqin.com/web/20080513/8442.html" target="_blank">使用ETags减少Web应用带宽和负载</a>》，有兴趣的同学可以去看看。</p>
<p><span style="color: #000000"><span style="color: #ff0000"><span><span style="color: #000000"><font face="Arial"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="color: #000000"><span style="color: #ff0000"><span><span style="color: #000000"><font face="Arial"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="color: #ff0000"><span><span style="color: #000000"><font face="Arial"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体"><font face="Arial"><span style="color: #000000"><span><span style="color: #ff0000"><span style="color: #000000"><span style="font-family: 宋体"><span style="font-family: 宋体"><font face="Arial"><span style="color: #000000"><span><span style="color: #ff0000"><span style="color: #000000"><span style="font-family: 宋体"><span style="font-family: 宋体"><font face="Arial"><span style="color: #000000"><span><span style="color: #ff0000"><strong>第十四条、</strong><strong><span style="color: #ff0000">使 AJAX 缓存 </span></strong><span style="color: #000000">(Make Ajax Cacheable ) </span></span></span></span></font></span></span></span></span></span></span></font></span></span></span></span></span></span></font></span></span></span></span></font></span></span></span></span></span></font></span></span></span></span></span></span></font></span></span></span></span></p>
<p>ajax还要去缓存？做ajax请求的时候往往还要增加一个时间戳去避免他缓存。It's important to remember that "asynchronous" does not imply "instantaneous".（记住&#8220;异步&#8221;不是&#8220;瞬间&#8221;这一点很重要）。记住，即使AJAX是动态产生的而且只对一个用户起作用，他们依然可以被缓存。</p>
<p style="color: red"><a href="http://www.space007.com/post/129.html"></a>&nbsp;</p>
<br />
<br />
<p><span style="color: #999999; font-family: 宋体"><span style="font-size: 8pt"><span style="color: #cc99ff; font-family: 宋体"><span style="color: #999999; font-family: 宋体"><span style="font-size: 8pt"><span style="color: #cc99ff; font-family: 宋体"><span style="color: #ff0000"><span style="font-family: 宋体">
<hr style="color: red" />
<br />
本博客为学习交流用，凡未注明引用的均为本人作品，转载请注明出处，如有版权问题请及时通知。由于博客时间仓促，错误之处敬请谅解，有任何意见可给我留言，愿共同学习进步。</span></span></span></span></span></span></span></span> 
<img src ="http://www.blogjava.net/cyantide/aggbug/243892.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2008-12-02 12:15 <a href="http://www.blogjava.net/cyantide/archive/2008/12/02/243892.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Table表格如何固定第一行</title><link>http://www.blogjava.net/cyantide/archive/2008/11/27/242948.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Thu, 27 Nov 2008 02:42:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2008/11/27/242948.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/242948.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2008/11/27/242948.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/242948.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/242948.html</trackback:ping><description><![CDATA[需要css和js配合使用<br />
css:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_9_88_Open_Image" onclick="this.style.display='none'; Codehighlighter1_9_88_Open_Text.style.display='none'; Codehighlighter1_9_88_Closed_Image.style.display='inline'; Codehighlighter1_9_88_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_9_88_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_9_88_Closed_Text.style.display='none'; Codehighlighter1_9_88_Open_Image.style.display='inline'; Codehighlighter1_9_88_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #800000">.theader&nbsp;</span><span id="Codehighlighter1_9_88_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">{<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />}</span><span id="Codehighlighter1_9_88_Open_Text"><span style="color: #000000">{</span><span style="color: #ff0000">white-space</span><span style="color: #000000">:</span><span style="color: #0000ff">nowrap</span><span style="color: #000000">;</span><span style="color: #ff0000">&nbsp;position</span><span style="color: #000000">:</span><span style="color: #0000ff">relative</span><span style="color: #000000">;</span><span style="color: #ff0000">&nbsp;fixl</span><span style="color: #000000">:</span><span style="color: #0000ff">expression(fixTableHeader(this))</span><span style="color: #000000">;</span><span style="color: #ff0000">&nbsp;</span></div>
</span><br />
js:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_28_202_Open_Image" onclick="this.style.display='none'; Codehighlighter1_28_202_Open_Text.style.display='none'; Codehighlighter1_28_202_Closed_Image.style.display='inline'; Codehighlighter1_28_202_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_28_202_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_28_202_Closed_Text.style.display='none'; Codehighlighter1_28_202_Open_Image.style.display='inline'; Codehighlighter1_28_202_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;fixTableHeader(td)&nbsp;</span><span id="Codehighlighter1_28_202_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_28_202_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;table&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;td.parentNode.parentNode.parentNode;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;div&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;table.parentNode;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;td.style.top&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;div.scrollTop&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;'px';<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;td.style.zIndex&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">10000</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;td.sourceIndex;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
  <img src ="http://www.blogjava.net/cyantide/aggbug/242948.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2008-11-27 10:42 <a href="http://www.blogjava.net/cyantide/archive/2008/11/27/242948.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java GUI 的默认显示格式设置</title><link>http://www.blogjava.net/cyantide/archive/2008/08/28/225350.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Thu, 28 Aug 2008 09:14:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2008/08/28/225350.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/225350.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2008/08/28/225350.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/225350.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/225350.html</trackback:ping><description><![CDATA[<p>Java GUI 的默认显示格式设置<br />
<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_3_90_Open_Image" onclick="this.style.display='none'; Codehighlighter1_3_90_Open_Text.style.display='none'; Codehighlighter1_3_90_Closed_Image.style.display='inline'; Codehighlighter1_3_90_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_3_90_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_3_90_Closed_Text.style.display='none'; Codehighlighter1_3_90_Open_Image.style.display='inline'; Codehighlighter1_3_90_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">try</span><span id="Codehighlighter1_3_90_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_3_90_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UIManager.setLookAndFeel(</span><span style="color: #000000">"</span><span style="color: #000000">com.sun.java.swing.plaf.windows.WindowsLookAndFeel</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img id="Codehighlighter1_109_137_Open_Image" onclick="this.style.display='none'; Codehighlighter1_109_137_Open_Text.style.display='none'; Codehighlighter1_109_137_Closed_Image.style.display='inline'; Codehighlighter1_109_137_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_109_137_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_109_137_Closed_Text.style.display='none'; Codehighlighter1_109_137_Open_Image.style.display='inline'; Codehighlighter1_109_137_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />}</span></span><span style="color: #0000ff">catch</span><span style="color: #000000">(Exception&nbsp;e)</span><span id="Codehighlighter1_109_137_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_109_137_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
 <img src ="http://www.blogjava.net/cyantide/aggbug/225350.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2008-08-28 17:14 <a href="http://www.blogjava.net/cyantide/archive/2008/08/28/225350.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java字符编码转换研究(转帖)</title><link>http://www.blogjava.net/cyantide/archive/2008/08/26/224420.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Tue, 26 Aug 2008 02:50:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2008/08/26/224420.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/224420.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2008/08/26/224420.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/224420.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/224420.html</trackback:ping><description><![CDATA[<h1 style="margin-bottom: 0pt; line-height: normal; text-align: center" align="center">java字符编码转换研究</h1>
<p class="1">1. 概述</p>
<p class="MsoBodyTextIndent" style="text-indent: 22pt">本文主要包括以下几个方面：编码基本知识，java，系统软件，url，工具软件等。</p>
<p class="MsoBodyTextIndent" style="text-indent: 22pt">在下面的描述中，将以"中文"两个字为例，经查表可以知道其GB2312编码是"<u>d6d0 cec4</u>"，Unicode编码为"<u>4e2d 6587</u>"，UTF编码就是"<u>e4b8ad e69687</u>"。注意，这两个字没有iso8859-1编码，但可以用iso8859-1编码来"表示"。</p>
<p class="1">2. 编码基本知识</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">最早的编码是iso8859-1，和ascii编码相似。但为了方便表示各种各样的语言，逐渐出现了很多标准编码，重要的有如下几个。</p>
<p class="2">2.1. iso8859-1</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">属于单字节编码，最多能表示的字符范围是0-255，应用于英文系列。比如，字母'a'的编码为0x61=97。</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">很明显，iso8859-1编码表示的字符范围很窄，无法表示中文字符。但是，由于是单字节编码，和计算机最基础的表示单位一致，所以很多时候，仍旧使用iso8859-1编码来表示。而且在很多协议上，默认使用该编码。比如，虽然"中文"两个字不存在iso8859-1编码，以gb2312编码为例，应该是"<u>d6d0 cec4</u>"两个字符，使用iso8859-1编码的时候则将它拆开为4个字节来表示："<u>d6 d0 ce c4</u>"（事实上，在进行存储的时候，也是以字节为单位处理的）。而如果是UTF编码，则是6个字节"<u>e4 b8 ad e6 96 87</u>"。很明显，这种表示方法还需要以另一种编码为基础。</p>
<p class="2">2.2. GB2312/GBK</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">这就是汉子的国标码，专门用来表示汉字，是双字节编码，而英文字母和iso8859-1一致（兼容iso8859-1编码）。其中gbk编码能够用来同时表示繁体字和简体字，而gb2312只能表示简体字，gbk是兼容gb2312编码的。</p>
<p class="2">2.3. unicode</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">这是最统一的编码，可以用来表示所有语言的字符，而且是定长双字节（也有四字节的）编码，包括英文字母在内。所以可以说它是不兼容iso8859-1编码的，也不兼容任何编码。不过，相对于iso8859-1编码来说，uniocode编码只是在前面增加了一个0字节，比如字母'a'为"<u>00 61</u>"。</p>
<p class="MsoBodyTextIndent" style="text-indent: 22pt">需要说明的是，定长编码便于计算机处理（注意GB2312/GBK不是定长编码），而unicode又可以用来表示所有字符，所以在很多软件内部是使用unicode编码来处理的，比如java。</p>
<p class="2">2.4. UTF</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">考虑到unicode编码不兼容iso8859-1编码，而且容易占用更多的空间：因为对于英文字母，unicode也需要两个字节来表示。所以unicode不便于传输和存储。因此而产生了utf编码，utf编码兼容iso8859-1编码，同时也可以用来表示所有语言的字符，不过，utf编码是不定长编码，每一个字符的长度从1-6个字节不等。另外，utf编码自带简单的校验功能。一般来讲，英文字母都是用一个字节表示，而汉字使用三个字节。</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">注意，虽然说utf是为了使用更少的空间而使用的，但那只是相对于unicode编码来说，如果已经知道是汉字，则使用GB2312/GBK无疑是最节省的。不过另一方面，值得说明的是，虽然utf编码对汉字使用3个字节，但即使对于汉字网页，utf编码也会比unicode编码节省，因为网页中包含了很多的英文字符。</p>
<p class="1">3. java对字符的处理</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">在java应用软件中，会有多处涉及到字符集编码，有些地方需要进行正确的设置，有些地方需要进行一定程度的处理。</p>
<p class="2">3.1. getBytes(charset)</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">这是java字符串处理的一个标准函数，其作用是将字符串所表示的字符按照charset编码，并以字节方式表示。注意字符串在java内存中总是按unicode编码存储的。比如"中文"，正常情况下（即没有错误的时候）存储为"<u>4e2d 6587</u>"，如果charset为"gbk"，则被编码为"<u>d6d0 cec4</u>"，然后返回字节"<u>d6 d0 ce c4</u>"。如果charset为"utf8"则最后是"<u>e4 b8 ad e6 96 87</u>"。如果是"iso8859-1"，则由于无法编码，最后返回 "<u>3f 3f</u>"（两个问号）。</p>
<p class="2">3.2. new String(charset)</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">这是java字符串处理的另一个标准函数，和上一个函数的作用相反，将字节数组按照charset编码进行组合识别，最后转换为unicode存储。参考上述getBytes的例子，"gbk" 和"utf8"都可以得出正确的结果"<u>4e2d 6587</u>"，但iso8859-1最后变成了"<u>003f 003f</u>"（两个问号）。</p>
<p class="MsoBodyTextIndent" style="text-indent: 22pt">因为utf8可以用来表示/编码所有字符，所以new String( str.getBytes( "utf8" ), "utf8" ) === str，即完全可逆。</p>
<p class="2">3.3. setCharacterEncoding()</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">该函数用来设置http请求或者相应的编码。</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">对于request，是指提交内容的编码，指定后可以通过getParameter()则直接获得正确的字符串，如果不指定，则默认使用iso8859-1编码，需要进一步处理。参见下述"表单输入"。值得注意的是在执行setCharacterEncoding()之前，不能执行任何getParameter()。java doc上说明：This method must be called prior to reading request parameters or reading input using getReader()。而且，该指定只对POST方法有效，对GET方法无效。分析原因，应该是在执行第一个getParameter()的时候，java将会按照编码分析所有的提交内容，而后续的getParameter()不再进行分析，所以setCharacterEncoding()无效。而对于GET方法提交表单是，提交的内容在URL中，一开始就已经按照编码分析所有的提交内容，setCharacterEncoding()自然就无效。</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">对于response，则是指定输出内容的编码，同时，该设置会传递给浏览器，告诉浏览器输出内容所采用的编码。</p>
<p class="2">3.4. 处理过程</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">下面分析两个有代表性的例子，说明java对编码有关问题的处理方法。</p>
<p class="3">3.4.1. 表单输入</p>
<p class="MsoBodyTextIndent" style="text-indent: 22pt">User input<u>&nbsp; *(gbk:d6d0 cec4)&nbsp; </u>browser<u>&nbsp; *(gbk:d6d0 cec4)&nbsp; </u>web server<u>&nbsp; iso8859-1(00d6 00d 000ce 00c4)&nbsp; </u>class，需要在class中进行处理：getbytes("iso8859-1")为<u>d6 d0 ce c4</u>，new String("gbk")为<u>d6d0 cec4</u>，内存中以unicode编码则为<u>4e2d 6587</u>。</p>
<p class="MsoBodyTextIndent" style="margin-left: 43pt; text-indent: -21pt; tab-stops: list 43.0pt"><span lang="EN-US" style="font-size: 11pt; font-family: Wingdings">l</span> 用户输入的编码方式和页面指定的编码有关，也和用户的操作系统有关，所以是不确定的，上例以gbk为例。</p>
<p class="MsoBodyTextIndent" style="margin-left: 43pt; text-indent: -21pt; tab-stops: list 43.0pt"><span lang="EN-US" style="font-size: 11pt; font-family: Wingdings">l</span> 从browser到web server，可以在表单中指定提交内容时使用的字符集，否则会使用页面指定的编码。而如果在url中直接用?的方式输入参数，则其编码往往是操作系统本身的编码，因为这时和页面无关。上述仍旧以gbk编码为例。</p>
<p class="MsoBodyTextIndent" style="margin-left: 43pt; text-indent: -21pt; tab-stops: list 43.0pt"><span lang="EN-US" style="font-size: 11pt; font-family: Wingdings">l</span> Web server接收到的是字节流，默认时（getParameter）会以iso8859-1编码处理之，结果是不正确的，所以需要进行处理。但如果预先设置了编码（通过request. setCharacterEncoding ()），则能够直接获取到正确的结果。</p>
<p class="MsoBodyTextIndent" style="margin-left: 43pt; text-indent: -21pt; tab-stops: list 43.0pt"><span lang="EN-US" style="font-size: 11pt; font-family: Wingdings">l</span> 在页面中指定编码是个好习惯，否则可能失去控制，无法指定正确的编码。</p>
<p class="3">3.4.2. 文件编译</p>
<p class="MsoBodyTextIndent" style="text-indent: 22pt">假设文件是gbk编码保存的，而编译有两种编码选择：gbk或者iso8859-1，前者是中文windows的默认编码，后者是linux的默认编码，当然也可以在编译时指定编码。</p>
<p class="MsoBodyTextIndent" style="text-indent: 22pt">Jsp<u>&nbsp; *(gbk:d6d0 cec4)&nbsp; </u>java file<u>&nbsp; *(gbk:d6d0 cec4)&nbsp; </u>compiler read<u>&nbsp; uincode(gbk: 4e2d 6587; iso8859-1: 00d6 00d 000ce 00c4)&nbsp; </u>compiler write<u>&nbsp; utf(gbk: e4b8ad e69687; iso8859-1: *)&nbsp; </u>compiled file<u>&nbsp; unicode(gbk: 4e2d 6587; iso8859-1: 00d6 00d 000ce 00c4)&nbsp; </u>class。所以用gbk编码保存，而用iso8859-1编译的结果是不正确的。</p>
<p class="MsoBodyTextIndent" style="text-indent: 22pt">class<u>&nbsp; unicode(4e2d 6587)&nbsp; </u>system.out / jsp.out<u>&nbsp; gbk(d6d0 cec4)&nbsp; </u>os console / browser。</p>
<p class="MsoBodyTextIndent" style="margin-left: 43pt; text-indent: -21pt; tab-stops: list 43.0pt"><span lang="EN-US" style="font-size: 11pt; font-family: Wingdings">l</span> 文件可以以多种编码方式保存，中文windows下，默认为ansi/gbk。</p>
<p class="MsoBodyTextIndent" style="margin-left: 43pt; text-indent: -21pt; tab-stops: list 43.0pt"><span lang="EN-US" style="font-size: 11pt; font-family: Wingdings">l</span> 编译器读取文件时，需要得到文件的编码，如果未指定，则使用系统默认编码。一般class文件，是以系统默认编码保存的，所以编译不会出问题，但对于jsp文件，如果在中文windows下编辑保存，而部署在英文linux下运行/编译，则会出现问题。所以需要在jsp文件中用pageEncoding指定编码。</p>
<p class="MsoBodyTextIndent" style="margin-left: 43pt; text-indent: -21pt; tab-stops: list 43.0pt"><span lang="EN-US" style="font-size: 11pt; font-family: Wingdings">l</span> Java编译的时候会转换成统一的unicode编码处理，最后保存的时候再转换为utf编码。</p>
<p class="MsoBodyTextIndent" style="margin-left: 43pt; text-indent: -21pt; tab-stops: list 43.0pt"><span lang="EN-US" style="font-size: 11pt; font-family: Wingdings">l</span> 当系统输出字符的时候，会按指定编码输出，对于中文windows下，System.out将使用gbk编码，而对于response（浏览器），则使用jsp文件头指定的contentType，或者可以直接为response指定编码。同时，会告诉browser网页的编码。如果未指定，则会使用iso8859-1编码。对于中文，应该为browser指定输出字符串的编码。</p>
<p class="MsoBodyTextIndent" style="margin-left: 43pt; text-indent: -21pt; tab-stops: list 43.0pt"><span lang="EN-US" style="font-size: 11pt; font-family: Wingdings">l</span> browser显示网页的时候，首先使用response中指定的编码（jsp文件头指定的contentType最终也反映在response上），如果未指定，则会使用网页中meta项指定中的contentType。</p>
<p class="2">3.5. 几处设置</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">对于web应用程序，和编码有关的设置或者函数如下。</p>
<p class="3">3.5.1. jsp编译</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">指定文件的存储编码，很明显，该设置应该置于文件的开头。例如：&lt;%@page pageEncoding="GBK"%&gt;。另外，对于一般class文件，可以在编译的时候指定编码。</p>
<p class="3">3.5.2. jsp输出</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">指定文件输出到browser是使用的编码，该设置也应该置于文件的开头。例如：&lt;%@ page contentType="text/html; charset= GBK" %&gt;。该设置和response.setCharacterEncoding("GBK")等效。</p>
<p class="3">3.5.3. meta设置</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">指定网页使用的编码，该设置对静态网页尤其有作用。因为静态网页无法采用jsp的设置，而且也无法执行response.setCharacterEncoding()。例如：&lt;<ST1:PLACE w:st="on">META http-equiv="Content-Type" content="text/html; charset=GBK" /&gt;</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">如果同时采用了jsp输出和meta设置两种编码指定方式，则jsp指定的优先。因为jsp指定的直接体现在response中。</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">需要注意的是，apache有一个设置可以给无编码指定的网页指定编码，该指定等同于jsp的编码指定方式，所以会覆盖静态网页中的meta指定。所以有人建议关闭该设置。</p>
<p class="3">3.5.4. form设置</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">当浏览器提交表单的时候，可以指定相应的编码。例如：&lt;form accept-charset= "gb2312"&gt;。一般不必不使用该设置，浏览器会直接使用网页的编码。</p>
<p class="1">4. 系统软件</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">下面讨论几个相关的系统软件。</p>
<p class="2">4.1. mysql数据库</p>
<p class="MsoBodyTextIndent" style="text-indent: 22pt">很明显，要支持多语言，应该将数据库的编码设置成utf或者unicode，而utf更适合与存储。但是，如果中文数据中包含的英文字母很少，其实unicode更为适合。</p>
<p class="MsoBodyTextIndent" style="text-indent: 22pt">数据库的编码可以通过mysql的配置文件设置，例如default-character-set=utf8。还可以在数据库链接URL中设置，例如： useUnicode=true&amp;characterEncoding=UTF-8。注意这两者应该保持一致，在新的sql版本里，在数据库链接URL里可以不进行设置，但也不能是错误的设置。</p>
<p class="2">4.2. apache</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">appache和编码有关的配置在httpd.conf中，例如AddDefaultCharset UTF-8。如前所述，该功能会将所有静态页面的编码设置为UTF-8，最好关闭该功能。</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">另外，apache还有单独的模块来处理网页响应头，其中也可能对编码进行设置。</p>
<p class="2">4.3. linux默认编码</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">这里所说的linux默认编码，是指运行时的环境变量。两个重要的环境变量是LC_ALL和LANG，默认编码会影响到java URLEncode的行为，下面有描述。</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">建议都设置为"zh_CN.UTF-8"。</p>
<p class="2">4.4. 其它</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">为了支持中文文件名，linux在加载磁盘时应该指定字符集，例如：mount /dev/hda5 /mnt/hda5/ -t ntfs -o iocharset=gb2312。</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">另外，如前所述，使用GET方法提交的信息不支持request.setCharacterEncoding()，但可以通过tomcat的配置文件指定字符集，在tomcat的server.xml文件中，形如：&lt;Connector ... URIEncoding="GBK"/&gt;。这种方法将统一设置所有请求，而不能针对具体页面进行设置，也不一定和browser使用的编码相同，所以有时候并不是所期望的。</p>
<p class="1">5. URL地址</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">URL地址中含有中文字符是很麻烦的，前面描述过使用GET方法提交表单的情况，使用GET方法时，参数就是包含在URL中。</p>
<p class="2">5.1. URL编码</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">对于URL中的一些特殊字符，浏览器会自动进行编码。这些字符除了"/?&amp;"等外，还包括unicode字符，比如汉子。这时的编码比较特殊。</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">IE有一个选项"总是使用UTF-8发送URL"，当该选项有效时，IE将会对特殊字符进行UTF-8编码，同时进行URL编码。如果改选项无效，则使用默认编码"GBK"，并且不进行URL编码。但是，对于URL后面的参数，则总是不进行编码，相当于UTF-8选项无效。比如"中文.html?a=中文"，当UTF-8选项有效时，将发送链接"%<u>e4%b8%ad%e6%96%87.html?a=\x4e\x2d\x65\x87</u>"；而UTF-8选项无效时，将发送链接"<u>\x4e\x2d\x65\x87.html?a=\x4e\x2d\x65\x87</u>"。注意后者前面的"中文"两个字只有4个字节，而前者却有18个字节，这主要时URL编码的原因。</p>
<p class="MsoBodyTextIndent" style="text-indent: 22pt">当web server（tomcat）接收到该链接时，将会进行URL解码，即去掉"%"，同时按照ISO8859-1编码（上面已经描述，可以使用URLEncoding来设置成其它编码）识别。上述例子的结果分别是"<u>\ue4\ub8\uad\ue6\u96\u87.html?a=\u4e\u2d\u65\u87</u>"和"<u>\u4e\u2d\u65\u87.html?a=\u4e\u2d\u65\u87</u>"，注意前者前面的"中文"两个字恢复成了6个字符。这里用"\u"，表示是unicode。</p>
<p class="MsoBodyTextIndent" style="text-indent: 22pt">所以，由于客户端设置的不同，相同的链接，在服务器上得到了不同结果。这个问题不少人都遇到，却没有很好的解决办法。所以有的网站会建议用户尝试关闭UTF-8选项。不过，下面会描述一个更好的处理办法。</p>
<p class="2">5.2. rewrite</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">熟悉的人都知道，apache有一个功能强大的rewrite模块，这里不描述其功能。需要说明的是该模块会自动将URL解码（去除%），即完成上述web server（tomcat）的部分功能。有相关文档介绍说可以使用[NE]参数来关闭该功能，但我试验并未成功，可能是因为版本（我使用的是apache <ST1:CHSDATE w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899">2.0.54）问题。另外，当参数中含有"?&amp; "等符号的时候，该功能将导致系统得不到正常结果。</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">rewrite本身似乎完全是采用字节处理的方式，而不考虑字符串的编码，所以不会带来编码问题。</p>
<p class="2">5.3. URLEncode.encode()</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">这是Java本身提供对的URL编码函数，完成的工作和上述UTF-8选项有效时浏览器所做的工作相似。值得说明的是，java已经不赞成不指定编码来使用该方法（deprecated）。应该在使用的时候增加编码指定。</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">当不指定编码的时候，该方法使用系统默认编码，这会导致软件运行结果得不确定。比如对于"中文"，当系统默认编码为"gb2312"时，结果是"%<u>4e%2d%65%87</u>"，而默认编码为"UTF-8"，结果却是"%<u>e4%b8%ad%e6%96%87</u>"，后续程序将难以处理。另外，这儿说的系统默认编码是由运行tomcat时的环境变量LC_ALL和LANG等决定的，曾经出现过tomcat重启后就出现乱码的问题，最后才郁闷的发现是因为修改修改了这两个环境变量。</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">建议统一指定为"UTF-8"编码，可能需要修改相应的程序。</p>
<p class="2">5.4. 一个解决方案</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">上面说起过，因为浏览器设置的不同，对于同一个链接，web server收到的是不同内容，而软件系统有无法知道这中间的区别，所以这一协议目前还存在缺陷。</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">针对具体问题，不应该侥幸认为所有客户的IE设置都是UTF-8有效的，也不应该粗暴的建议用户修改IE设置，要知道，用户不可能去记住每一个web server的设置。所以，接下来的解决办法就只能是让自己的程序多一点智能：根据内容来分析编码是否UTF-8。</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">比较幸运的是UTF-8编码相当有规律，所以可以通过分析传输过来的链接内容，来判断是否是正确的UTF-8字符，如果是，则以UTF-8处理之，如果不是，则使用客户默认编码（比如"GBK"），下面是一个判断是否UTF-8的例子，如果你了解相应规律，就容易理解。</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">public static boolean isValidUtf8(byte[] b,int aMaxCount){</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int lLen=b.length,lCharCount=0;</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;lLen &amp;&amp; lCharCount&lt;aMaxCount;++lCharCount){</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte lByte=b[i++];//to fast operation, ++ now, ready for the following for(;;)</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(lByte&gt;=0) continue;//&gt;=0 is normal ascii</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(lByte&lt;(byte)0xc0 || lByte&gt;(byte)0xfd) return false;</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int lCount=lByte&gt;(byte)0xfc?5:lByte&gt;(byte)0xf8?4</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :lByte&gt;(byte)0xf0?3:lByte&gt;(byte)0xe0?2:1;</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(i+lCount&gt;lLen) return false;</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int j=0;j&lt;lCount;++j,++i) if(b[i]&gt;=(byte)0xc0) return false;</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">}</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">相应地，一个使用上述方法的例子如下：</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">public static String getUrlParam(String aStr,String aDefaultCharset)</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">throws UnsupportedEncodingException{</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(aStr==null) return null;</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] lBytes=aStr.getBytes("ISO-8859-1");</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new String(lBytes,StringUtil.isValidUtf8(lBytes)?"utf8":aDefaultCharset);</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">}</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">不过，该方法也存在缺陷，如下两方面：</p>
<p class="MsoBodyTextIndent" style="margin-left: 42pt; text-indent: -21pt; tab-stops: list 42.0pt"><span lang="EN-US" style="font-family: Wingdings">l</span> 没有包括对用户默认编码的识别，这可以根据请求信息的语言来判断，但不一定正确，因为我们有时候也会输入一些韩文，或者其他文字。</p>
<p class="MsoBodyTextIndent" style="margin-left: 42pt; text-indent: -21pt; tab-stops: list 42.0pt"><span lang="EN-US" style="font-family: Wingdings">l</span> 可能会错误判断UTF-8字符，一个例子是"学习"两个字，其GBK编码是" <u>\xd1\xa7\xcf\xb0</u>"，如果使用上述isValidUtf8方法判断，将返回true。可以考虑使用更严格的判断方法，不过估计效果不大。</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">有一个例子可以证明google也遇到了上述问题，而且也采用了和上述相似的处理方法，比如，如果在地址栏中输入"<a href="http://www.google.com/search?hl=zh-CN&amp;newwindow=1&amp;q=学习">http://www.google.com/search?hl=zh-CN&amp;newwindow=1&amp;q=学习</a>"，google将无法正确识别，而其他汉字一般能够正常识别。</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">最后，应该补充说明一下，如果不使用rewrite规则，或者通过表单提交数据，其实并不一定会遇到上述问题，因为这时可以在提交数据时指定希望的编码。另外，中文文件名确实会带来问题，应该谨慎使用。</p>
<p class="1">6. 其它</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">下面描述一些和编码有关的其他问题。</p>
<p class="2">6.1. SecureCRT</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">除了浏览器和控制台与编码有关外，一些客户端也很有关系。比如在使用SecureCRT连接linux时，应该让SecureCRT的显示编码（不同的session，可以有不同的编码设置）和linux的编码环境变量保持一致。否则看到的一些帮助信息，就可能是乱码。</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">另外，mysql有自己的编码设置，也应该保持和SecureCRT的显示编码一致。否则通过SecureCRT执行sql语句的时候，可能无法处理中文字符，查询结果也会出现乱码。</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">对于Utf-8文件，很多编辑器（比如记事本）会在文件开头增加三个不可见的标志字节，如果作为mysql的输入文件，则必须要去掉这三个字符。（用linux的vi保存可以去掉这三个字符）。一个有趣的现象是，在中文windows下，创建一个新txt文件，用记事本打开，输入"连通"两个字，保存，再打开，你会发现两个字没了，只留下一个小黑点。</p>
<p class="2">6.2. 过滤器</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">如果需要统一设置编码，则通过filter进行设置是个不错的选择。在filter class中，可以统一为需要的请求或者回应设置编码。参加上述setCharacterEncoding()。这个类apache已经给出了可以直接使用的例子SetCharacterEncodingFilter。</p>
<p class="2">6.3. POST和GET</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">很明显，以POST提交信息时，URL有更好的可读性，而且可以方便的使用setCharacterEncoding()来处理字符集问题。但GET方法形成的URL能够更容易表达网页的实际内容，也能够用于收藏。</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">从统一的角度考虑问题，建议采用GET方法，这要求在程序中获得参数是进行特殊处理，而无法使用setCharacterEncoding()的便利，如果不考虑rewrite，就不存在IE的UTF-8问题，可以考虑通过设置URIEncoding来方便获取URL中的参数。</p>
<p class="2">6.4. 简繁体编码转换</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">GBK同时包含简体和繁体编码，也就是说同一个字，由于编码不同，在GBK编码下属于两个字。有时候，为了正确取得完整的结果，应该将繁体和简体进行统一。可以考虑将UTF、GBK中的所有繁体字，转换为相应的简体字，BIG5编码的数据，也应该转化成相应的简体字。当然，仍旧以UTF编码存储。</p>
<p class="MsoBodyTextIndent" style="text-indent: 21pt">例如，对于"语言 語言"，用UTF表示为"<u>\x</u><u>E8\xAF\xAD\xE8\xA8\x80 \xE8\xAA\x9E\xE8\xA8\x80</u>"，进行简繁体编码转换后应该是两个相同的 "<u>\x</u><u>E8\xAF\xAD\xE8\xA8\x80&gt;</u>"。</p>
<p class="MsoBodyTextIndent">&nbsp;</ST1:CHSDATE></ST1:PLACE></p>
 <img src ="http://www.blogjava.net/cyantide/aggbug/224420.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2008-08-26 10:50 <a href="http://www.blogjava.net/cyantide/archive/2008/08/26/224420.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>servlet2.4 和servlet2.5中配置taglib的区别</title><link>http://www.blogjava.net/cyantide/archive/2008/08/15/222294.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Fri, 15 Aug 2008 08:32:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2008/08/15/222294.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/222294.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2008/08/15/222294.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/222294.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/222294.html</trackback:ping><description><![CDATA[servlet2.4 和servlet2.5中配置taglib的区别<br />
<br />
2.4写法:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">jsp-config</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">taglib</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">taglib-url</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/*</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">taglib-url</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">taglib-location</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/WEB-INF/xxx.tld</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">taglib-location</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">taglib</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">jsp-config</span><span style="color: #0000ff">&gt;</span></div>
<br />
<br />
2.5写法<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">taglib</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">taglib-url</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/*</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">taglib-url</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">taglib-location</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/WEB-INF/xxx.tld</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">taglib-location</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">taglib</span><span style="color: #0000ff">&gt;</span></div>
<br />
<br />
 <img src ="http://www.blogjava.net/cyantide/aggbug/222294.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2008-08-15 16:32 <a href="http://www.blogjava.net/cyantide/archive/2008/08/15/222294.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中的系统属性以及环境变量(转帖)</title><link>http://www.blogjava.net/cyantide/archive/2008/08/15/222228.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Fri, 15 Aug 2008 06:04:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2008/08/15/222228.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/222228.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2008/08/15/222228.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/222228.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/222228.html</trackback:ping><description><![CDATA[<p><a name="EnvironmentVSSystemProperties">从概念上讲，<em>系统属性</em> 和<em>环境变量</em> 都是名称与值之间的映射。两种机制都能用来将用户定义的信息传递给 Java 进程。环境变量产生更多的全局效应，因为它们不仅对Java 子进程可见，而且对于定义它们的进程的所有子进程都是可见的。在不同的操作系统上，它们的语义有细微的差别，比如，不区分大小写。因为这些原因，环境变量更可能有意料不到的副作用。最好在可能的地方使用系统属性。环境变量应该在需要全局效应的时候使用，或者在外部系统接口要求使用环境变量时使用（比如 <code>PATH</code>）。</a></p>
<p>代码如下：</p>
<p>//import java.util.*;<br />
import java.util.Properties;<br />
import java.util.Enumeration;<br />
import java.util.Map;<br />
import java.util.Set;<br />
import java.util.Iterator;</p>
<p>public class GetSysPropertiesAndEnv<br />
{<br />
&nbsp;public static void main(String [] args)<br />
&nbsp;{<br />
&nbsp;&nbsp;//获取所有系统属性<br />
&nbsp;&nbsp; Properties prpt = System.getProperties();<br />
&nbsp;&nbsp; Enumeration enm = prpt.propertyNames();&nbsp; //返回系统属性列表中所有键的枚举<br />
&nbsp;&nbsp; String key = "";<br />
&nbsp;&nbsp; System.out.println("当前系统属性如下：=========");<br />
&nbsp;&nbsp; while(enm.hasMoreElements())<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;key = (String) enm.nextElement();<br />
&nbsp;&nbsp;&nbsp;System.out.println(key+":"+System.getProperty(key,"undefined"));<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;//获取所有环境变量的设置<br />
&nbsp;&nbsp; Map map = System.getenv();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//返回系统环境变量的字符串映射视图。<br />
&nbsp;&nbsp; Set&nbsp; set&nbsp; = map.keySet();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//返回映射中包含的键的 set 视图<br />
&nbsp;&nbsp; System.out.println("当前环境变量如下：=========");<br />
&nbsp;&nbsp; Iterator itr = set.iterator();<br />
&nbsp;&nbsp; while(itr.hasNext())<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;key = (String) itr.next();<br />
&nbsp;&nbsp;&nbsp;System.out.println(key+":"+map.get(key));<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
}</p>
<p>其中个人认为比较重要的系统属性如下：<br />
<br />
java.home：Java 安装目录 (比如D:\JavaStudio\jdk15\jre)<br />
java.class.path：Java 类路径<br />
java.vm.version：Java虚拟机版本号(比如：1.5.0-b64）<br />
java.version：Java版本号(比如：1.5.0)</p>
<p>os.name：操作系统的名称(比如：Windows XP)<br />
os.version：操作系统的版本(比如：Windows XP 的版本为5.1)</p>
<p>user.home：用户的主目录 (比如：C:\Documents and Settings\zhangsan)<br />
user.name：当前用户名<br />
user.country：当前用户所属国家<br />
user.dir：用户的当前工作目录<br />
<br />
比较重要的环境变量（Windows操作系统）：<br />
<br />
%COMPUTERNAME%&nbsp;&nbsp;&nbsp;&nbsp; 返回计算机的名称。<br />
%COMSPEC%&nbsp;&nbsp;&nbsp;&nbsp; 返回命令行解释器可执行程序的准确路径。</p>
<p>%WINDIR%&nbsp;&nbsp;&nbsp; 返回操作系统目录的位置。<br />
%OS%&nbsp;&nbsp;&nbsp;&nbsp; 返回操作系统的名称。Windows 2000 将操作系统显示为 Windows_NT。<br />
%PATH%&nbsp;&nbsp;&nbsp; 指定可执行文件的搜索路径。</p>
<p>%USERDOMAIN%&nbsp;&nbsp;&nbsp; 返回包含用户帐户的域的名称。<br />
%USERNAME%&nbsp;&nbsp;&nbsp; 返回当前登录的用户的名称。</p>
<div></div> <img src ="http://www.blogjava.net/cyantide/aggbug/222228.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2008-08-15 14:04 <a href="http://www.blogjava.net/cyantide/archive/2008/08/15/222228.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>log4j 配置(转帖)</title><link>http://www.blogjava.net/cyantide/archive/2008/08/15/222184.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Fri, 15 Aug 2008 03:00:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2008/08/15/222184.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/222184.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2008/08/15/222184.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/222184.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/222184.html</trackback:ping><description><![CDATA[<p><font face="Arial"><strong>背景</strong><br />
对于有经验的开发者来说，日志记录的重要性显而易见。例如程序中的异常处理和安 全性都依赖于Logging的功能来帮助履行它们的指责。应用程序中的日志记录主要基于三个目的：监视代码中变量的变化情况，周期性的记录到文件中供其他 应用进行统计分析工作；跟踪代码运行时轨迹，作为日后审计的依据；担当集成开发环境中的调试器的作用，向文件或控制台打印代码的调试信息。经验表明日志记 录是开发周期中的重要组成部分。</font></p>
<p><font face="Arial">最简单的做法就是在代码中嵌入许多的打印语句，但是这样打印语句会充斥代码的主体，显然不是一个好方法。因此，使用成熟的框架例如Log4j，则会更具灵活性。 </font></p>
<p><font face="Arial"><strong>Log4j简介<br />
</strong>Log4j 框架是用 Java 语言编写的标准日志记录框架。作为 Jakarta 项目的一部分，它在 Apache 软件许可证（Apache Software License）下分发，以速度和灵活性为中心概念：Log4j 环境是完全可配置的，通过使用Log4j，我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、 UNIX Syslog守护进程等；我们也可以控制每一条日志的输出格式；通过定义每一条日志信息的级别，我们能够更加细致地控制日志的生成过程。 </font></p>
<p><font face="Arial">Log4j由三个重要的部件构成：记录器（Loggers）、输出源（Appenders）和布局（Layouts）。</font></p>
<p><font face="Arial">记录器按照布局中指定的格式把日志信息写入一个或多个输出源。输出源可以是控制台、文本文件、XML文件或Socket，甚至还可以把信息写入到Windows事件日志或通过电子邮件发送。我们可以通过配置文件来部署这些组件。</font></p>
<p><font face="Arial">其实您也可以完全不使用配置文件，而是在代码中配置Log4j环境。但是，使用配置文件将使您的应用程序更加灵活。本文从描述 log4j 体系结构的主要组件着手。然后是描述基本用法和配置的简单示例。</font></p>
<p><font face="Arial"><strong>定义配置文件</strong><br />
Log4j支持两种配置文件格式，一种是XML格式的文件，一种是Java特性文件（键=值）。下面我们介绍使用Java特性文件做为配置文件的方法： </font></p>
<p><font face="Arial">一、 配置记录器。</font></p>
<p><font face="Arial">Log4j允许程序员定义多个记录器，每个记录器有自己的名字。但有一个记录器叫根记录器，它永远存在，且不能通过名字检索或引用，在配置文件中，可以如下定义根记录器：</font></p>
<pre class="CodeSamp"><font face="Arial">　　log4j.rootLogger = [ level ] , appenderName, appenderName, &#8230; </font></pre>
<p><font face="Arial">Level是记录器的级别，它是日志记录的优先级，分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别：ERROR、WARN、INFO、DEBUG：</font></p>
<pre class="CodeSamp"><font face="Arial">　　DEBUG  &lt;  INFO  &lt;  WARN  &lt;  ERROR  &lt;  FATAL</font></pre>
<p><font face="Arial">右边的级别比左边的高。如果一条log信息的级别，大于等于记录器的级别值，那么记录器就会记录它。例如level被设置为INFO级别，那么应用程序中所有的DEBUG的日志信息将不被打印出来。通过在这里定义的级别，您可以控制到应用程序中相应级别的日志信息的开关。</font></p>
<p><font face="Arial">appenderName是输出源的名字，它指定日志信息输出到哪个地方。您可以为一个记录器指定多个输出源。</font></p>
<p><font face="Arial">在一些配置文件中，你可能会看到下面的语句：</font></p>
<pre class="CodeSamp"><font face="Arial">　　log4j.rootCategory = [ level ] , appenderName, appenderName, &#8230; </font></pre>
<p><font face="Arial">在早期的Log4j版本中，org.apache.Category实现了记录器的功能，为了提高向后兼容 性，Logger扩展了Category，因此rootCategory和rootLogger是可以互换的，但最后Category将从类库中删除，因 此请使用Logger类。</font></p>
<p><font face="Arial">除了根记录器之外，log4j允许程序员定义多个记录器，每个记录器有自己的名字：</font></p>
<pre class="CodeSamp"><font face="Arial">　　log4j.logger.loggerName = [ level ] , appenderName, appenderName, &#8230; </font></pre>
<p><font face="Arial">在Log4J中Logger是具有层次关系的，Log4j支持配置的记录器之间的&#8220;父子关系&#8221;，记录器之间 通过名字来表明隶属关系（或家族关系），它们有一个共同的根，位于最上层，其它Logger遵循类似包的层次：记录器a.b,与记录器a.b.c之间是父 子关系，而记录器a与a.b.c之间是祖先与后代的关系。例如：</font></p>
<pre class="CodeSamp"><font face="Arial">    static Logger root = Logger.getRootLogger();<br />
static Logger log1 = Logger.getLogger("cc");<br />
static Logger log2 = Logger.getLogger("cc.ejb");<br />
static Logger log3 = Logger.getLogger("cc.ejb.my.TestApp");</font></pre>
<div></div>
<div><font face="Arial">上面代码中，log1是log2的父亲，是log3的祖先，而root是所有log1、log2、 log3的祖先，它们都从root中继承。所以，一般情况下，仅需要配置好rootLogger，其它子记录器都会从中继承rootLogger的配置。 如果修改了rootLogger的配置，其它所有的子记录器也会继承这种变化。这样就大大地方便了配置。</font></div>
<div></div>
<div><font face="Arial">如果一个应用中包含了上千个类都需要日志，那么我们是否需要配置上千个Logger呢？我们通过一个简 单的办法来解决这个问题： 用每一个java类文件名（包含该类的包名）定义一个记录器，这是一种有用并且直观的记录器实例名的定义方式。例如在配置文件 中定义了一个com.foo的记录器：</font></div>
<div>
<pre class="CodeSamp"><font face="Arial">　　log4j.logger.com.foo=WARN</font></pre>
</div>
<div><font face="Arial">在com.foo中的一个java类bar，我们通过其本类的名字获得一个记录器&#8220;com.foo.Bar&#8221;：</font></div>
<div><br />
<pre class="CodeSamp">
<p><font face="Arial">     package com.foo;<br />
class Bar{<br />
static Logger log=Logger.getLogger(bar.Class.getName());<br />
.....<br />
}</font></p>
</pre>
</div>
<p><font face="Arial">由于记录器com.foo.Bar 没有指定的级别，它从com.foo（在配置文件中其级别设置成WARN） 继承级别。并且这样我们就能方便的从大量log信息中判断出它们各自的来源。当然了，这不是硬性规定的，实际上Log4j没有对设置记录器的实例名做什么 限制，程序员可以根据自己的喜好随意定义。</font></p>
<p><font face="Arial">二、日志信息输出源Appender<br />
log4j 还允许日志记录请求打印到多个输出目的地，按 log4j 的叫法是输出源。一个记录器可以有多个输出源。一条log信息如果可被这个记录器处理，则该记录器会把这条信息送往每个它所拥有的输出源，以及层次结构中 更高级的输出源。例如，根记录器以控制台作为输出源，则所有可被纪录的日志都将至少打印到控制台。</font></p>
<p><font face="Arial">配置日志信息输出源，其语法为：</font></p>
<pre class="CodeSamp">
<p><font face="Arial">　　log4j.appender.appenderName = fully.qualified.name.of.appender.class<br />
</font></p>
<p><br />
<font face="Arial">　　log4j.appender.appenderName.option1 = value1 <br />
　　&#8230; <br />
　　log4j.appender.appenderName.option = valueN </font></p>
</pre>
<p><font face="Arial">Log4j提供的appender有以下几种： </font></p>
<ul>
    <li><font face="Arial">org.apache.log4j.ConsoleAppender（控制台） </font>
    <li><font face="Arial">org.apache.log4j.FileAppender（文件） </font>
    <li><font face="Arial">org.apache.log4j.DailyRollingFileAppender（每天产生一个日志文件） </font>
    <li><font face="Arial">org.apache.log4j.RollingFileAppender（文件大小到达指定尺寸的时候产生一个新的文件） </font>
    <li><font face="Arial">org.apache.log4j.WriterAppender（将日志信息以流格式发送到任意指定的地方） </font>
    <li><font face="Arial">org.apache.log4j.SocketAppender (Socket) </font>
    <li><font face="Arial">org.apache.log4j.NtEventLogAppender&nbsp;&nbsp;&nbsp; (NT的Event Log) </font>
    <li><font face="Arial">org.apache.log4j.JMSAppender&nbsp;&nbsp; (电子邮件）</font> </li>
</ul>
<p><font face="Arial">请注意，可以通过覆盖缺省行为，这样就不再附加累积的输出源：</font></p>
<pre class="CodeSamp"><font face="Arial">　　log4j.additivity.loggerName=false</font></pre>
<p><font face="Arial">注意，不要把一个输出源附加到多个记录器上，否则会得到&#8220;Attempted to append to closed appender named xxx&#8221;的信息。</font></p>
<p><br />
<font face="Arial">三、配置日志信息的格式（布局），其语法为：</font></p>
<pre class="CodeSamp"><font face="Arial">　　log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class <br />
　　log4j.appender.appenderName.layout.option1 = value1 <br />
　　&#8230; <br />
　　log4j.appender.appenderName.layout.option = valueN </font></pre>
<p><font face="Arial">其中，Log4j提供的layout有以下几种： </font></p>
<ul>
    <li><font face="Arial">org.apache.log4j.HTMLLayout（以HTML表格形式布局） </font>
    <li><font face="Arial">org.apache.log4j.PatternLayout（可以灵活地指定布局模式） </font>
    <li><font face="Arial">org.apache.log4j.SimpleLayout（包含日志信息的级别和信息字符串） </font>
    <li><font face="Arial">org.apache.log4j.TTCCLayout（包含日志产生的时间、线程、类别等等信息）</font> </li>
</ul>
<p><font face="Arial">如果采用了PatternLayout, 则Log4J采用类似C语言中的printf函数的打印格式格式化日志信息，打印参数如下：</font></p>
<ul>
    <li><font face="Arial">%m 输出代码中指定的消息 </font>
    <li><font face="Arial">%p 输出优先级，即DEBUG，INFO，WARN，ERROR，FATAL </font>
    <li><font face="Arial">%r 输出自应用启动到输出该log信息耗费的毫秒数 </font>
    <li><font face="Arial">%c 输出所属的类目，通常就是所在类的全名 </font>
    <li><font face="Arial">%t 输出产生该日志事件的线程名 </font>
    <li><font face="Arial">%n 输出一个回车换行符，Windows平台为&#8220;\r\n&#8221;，Unix平台为&#8220;\n&#8221; </font>
    <li><font face="Arial">%d 输出日志时间点的日期或时间，默认格式为ISO8601，也可以在其后指定格式，比如：%d{yyy MMM dd HH:mm:ss,SSS}，输出类似：2002年10月18日 22：10：28，921 </font>
    <li><font face="Arial">%l 输出日志事件的发生位置，包括类目名、发生的线程，以及在代码中的行数。举例：Testlog4.main(TestLog4.java:10) </font></li>
</ul>
<p><font face="Arial">四、例子<br />
下面是一个完整的Log4j配置文件，这个配置文件指定了两个输出源stdout和R。前 者把日志信息输出到控制台，后者是一个轮转日志文件。最大的文件是100KB，当一个日志文件达到最大尺寸时，Log4J会自动把example.log 重命名为example.log.1，然后重建一个新的example.log文件，依次轮转。</font></p>
<pre class="CodeSamp">
<p><font face="Arial">log4j.rootLogger=debug, stdout, R</font></p>
<p><font face="Arial">log4j.appender.stdout=org.apache.log4j.FileAppender<br />
log4j.appender.stdout.File=System.out<br />
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout</font></p>
<p><font face="Arial"># Pattern to output the caller's file name and line number.<br />
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n</font></p>
<p><font face="Arial">log4j.appender.R=org.apache.log4j.RollingFileAppender<br />
log4j.appender.R.File=example.log</font></p>
<p><font face="Arial">log4j.appender.R.MaxFileSize=100KB<br />
# Keep one backup file<br />
log4j.appender.R.MaxBackupIndex=1</font></p>
<p><font face="Arial">log4j.appender.R.layout=org.apache.log4j.PatternLayout<br />
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n</font></p>
<p><font face="Arial">log4j.logger.cc.ejb.my=error,out<br />
<br />
log4j.appender.out=org.apache.log4j.ConsoleAppender<br />
log4j.appender.out.layout=org.apache.log4j.PatternLayout<br />
log4j.appender.out.layout.ConversionPattern=%p %t %c - %m%n</font></p>
<p><font face="Arial">log4j.logger.cc.ejb.my.son=debug<br />
log4j.additivity.cc.ejb.my.son=false<br />
</font></p>
</pre>
<p><font face="Arial"><strong>在代码中使用Log4j</strong> </font></p>
<p><font face="Arial">一、得到记录器<br />
使用Log4j，第一步就是获取日志记录器，这个记录器将负责控制日志信息。其语法为： </font></p>
<pre class="CodeSamp"><font face="Arial">　　public static Logger getLogger( String name) </font></pre>
<p><font face="Arial">通过指定的名字获得记录器，如果必要的话，则为这个名字创建一个新的记录器。Name一般取本类的名字，比如： <br />
</font></p>
<pre class="CodeSamp"><font face="Arial">　　static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () )</font></pre>
<p><font face="Arial">二、读取配置文件 <br />
当获得了日志记录器之后，第二步将配置Log4j环境，其语法为：<br />
</font></p>
<pre class="CodeSamp">
<p><font face="Arial">　　//自动快速地使用缺省Log4j环境。<br />
<br />
BasicConfigurator.configure ();<br />
//读取使用Java的特性文件编写的配置文件</font><font face="Arial"><br />
</font><font face="Arial">　　PropertyConfigurator.configure ( String configFilename);<br />
</font><font face="Arial">//读取XML形式的配置文件<br />
　　DOMConfigurator.configure ( String filename );</font></p>
</pre>
<p><font face="Arial">三、插入记录信息（格式化日志信息）<br />
当上两个必要步骤执行完毕，您就可以轻松地使用不同优先级别的日志记录语句插入到您想记录日志的任何地方，其语法如下：<br />
</font></p>
<pre class="CodeSamp"><font face="Arial">　　Logger.debug ( Object message ) ;<br />
　　Logger.info ( Object message ) ;<br />
　　Logger.warn ( Object message ) ;<br />
　　Logger.error ( Object message ) ;</font></pre>
<p><font face="Arial">四、例子</font></p>
<p><font face="Arial">我们通过下面这个简单的例子，来演示在程序如何使用Log4j，您可以修改配置文件以得到不同日志信息。</font></p>
<pre class="CodeSamp">
<p><font face="Arial">package cc.ejb.my;<br />
import org.apache.log4j.Logger;<br />
import org.apache.log4j.PropertyConfigurator;<br />
import my.son.Foo;<br />
public class TestApp {</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;  static Logger logger=Logger.getLogger(TestApp.class.getName());</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;  public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  PropertyConfigurator.configure("log4j.properties");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  logger.info("Applcaiton Starts");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  logger.warn("Bar Starts");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Bar bar=new Bar();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  logger.error("Bar Errors");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  bar.doIt();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  logger.warn("Bar  Exits");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  logger.info("Foo Starts");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Foo foo=new Foo();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  logger.error("Foo Errors");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  foo.doit();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  logger.warn("Foo exits ");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  logger.info("Applcaition Exits");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br />
&nbsp;&nbsp;&nbsp;  }</font></p>
<p><font face="Arial">}</font></p>
<p><font face="Arial">class Bar <br />
{<br />
&nbsp;&nbsp;&nbsp;  static Logger logger = Logger.getLogger(Bar.class.getName());<br />
&nbsp;&nbsp;&nbsp;  public void doIt() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  logger.debug("Did it again!");<br />
&nbsp;&nbsp;&nbsp;  }<br />
}</font></p>
<p><font face="Arial">package cc.ejb.my.son;</font></p>
<p><font face="Arial">import org.apache.log4j.Logger;</font></p>
<p><font face="Arial">public class Foo {<br />
&nbsp;&nbsp;&nbsp;  private Logger log=Logger.getLogger(Foo.class.getName());<br />
&nbsp;&nbsp;&nbsp;  public Foo() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  log.info("Foo Initialzie");<br />
&nbsp;&nbsp;&nbsp;  }<br />
&nbsp;&nbsp;&nbsp;  public void doit()<br />
&nbsp;&nbsp;&nbsp;  {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  log.debug("Do it in Foo");<br />
&nbsp;&nbsp;&nbsp;  }</font></p>
<p><font face="Arial">}</font></p>
</pre>
 <img src ="http://www.blogjava.net/cyantide/aggbug/222184.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2008-08-15 11:00 <a href="http://www.blogjava.net/cyantide/archive/2008/08/15/222184.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsp中使用spring aop (转帖)</title><link>http://www.blogjava.net/cyantide/archive/2008/08/05/220114.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Tue, 05 Aug 2008 03:11:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2008/08/05/220114.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/220114.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2008/08/05/220114.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/220114.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/220114.html</trackback:ping><description><![CDATA[<p>在JSP中使用Spring其实很容易，主要用到Spring的WebApplicationContextUtils.getWebApplicationContext函数。</p>
<p>要再JSP里面得到ApplicationContext需要这么做，首先import="org.springframework.web.context.support.*,org.springframework.context.*"</p>
<p>然后可以通过如何做法：</p>
<p><font color="#ff0000">ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(getServletContext());</font></p>
<p>这样就得到了ApplicationContext，就可以操作Spring了。</p>
<p>JSP本来就可以认为是一个Servlet，所以使用getServletContext()就是理所应当了。</p>
<p>一：web.xml配置<br />
<br />
&lt;servlet&gt;<br />
&lt;servlet-name&gt;context&lt;/servlet-name&gt;<br />
&lt;servlet-class&gt;<br />
org.springframework.web.context.ContextLoaderServlet<br />
&lt;/servlet-class&gt;<br />
&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<br />
&lt;/servlet&gt;<br />
&lt;context-param&gt;<br />
&lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;<br />
&lt;param-value&gt;/WEB-INF/applicationContext.xml&lt;/param-value&gt;<br />
&lt;/context-param&gt;</p>
<p>&nbsp;</p>
<p><br />
二：在JSP<br />
<br />
&lt;%@ page import="org.springframework.context.ApplicationContext"%&gt;<br />
&lt;%@ page import="org.springframework.web.context.support.WebApplicationContextUtils"%&gt;<br />
&lt;%@ page import="com.yourcompany.service.CategoryService"%&gt;<br />
<br />
&lt;%<br />
//上面的CategoryService引用是我自己的东西<br />
//applicationContext.xml中一定要有完整的依赖链，从dataSource到CategoryService<br />
<br />
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext());<br />
CategoryService cs = (CategoryService) ctx.getBean("CategoryService");<br />
List list =cs.getCategoryDAO().findAll();<br />
%&gt;</p>
 <img src ="http://www.blogjava.net/cyantide/aggbug/220114.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2008-08-05 11:11 <a href="http://www.blogjava.net/cyantide/archive/2008/08/05/220114.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle 数据库库 自增设置</title><link>http://www.blogjava.net/cyantide/archive/2008/07/24/217117.html</link><dc:creator>cyantide</dc:creator><author>cyantide</author><pubDate>Thu, 24 Jul 2008 02:59:00 GMT</pubDate><guid>http://www.blogjava.net/cyantide/archive/2008/07/24/217117.html</guid><wfw:comment>http://www.blogjava.net/cyantide/comments/217117.html</wfw:comment><comments>http://www.blogjava.net/cyantide/archive/2008/07/24/217117.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cyantide/comments/commentRss/217117.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cyantide/services/trackbacks/217117.html</trackback:ping><description><![CDATA[&nbsp;
<p>ALTER DATABASE DATAFILE 'E:\ORACLE\PRODUCT\<st1:chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">10.2.0</st1:chsdate>\ORADATA\ORCL\ITIL.DBF' AUTOEXTEND ON NEXT <st1:chmetcnv w:st="on" unitname="m" sourcevalue="256" hasspace="False" negative="False" numbertype="1" tcsc="0">256M</st1:chmetcnv> MAXSIZE UNLIMITED<o:p></o:p></p>
 <img src ="http://www.blogjava.net/cyantide/aggbug/217117.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cyantide/" target="_blank">cyantide</a> 2008-07-24 10:59 <a href="http://www.blogjava.net/cyantide/archive/2008/07/24/217117.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>