﻿<?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>博客园-KentySky</title><link>http://www.cnblogs.com/kentyshang/</link><description>站在巨人的肩上,希望自己也可以长高一点!!!
</description><language>zh-cn</language><lastBuildDate>Wed, 15 Oct 2008 21:57:45 GMT</lastBuildDate><pubDate>Wed, 15 Oct 2008 21:57:45 GMT</pubDate><ttl>60</ttl><item><title>MYSQL 字符串操作</title><link>http://www.cnblogs.com/kentyshang/archive/2008/09/26/1299418.html</link><dc:creator>kenty</dc:creator><author>kenty</author><pubDate>Fri, 26 Sep 2008 03:23:00 GMT</pubDate><guid>http://www.cnblogs.com/kentyshang/archive/2008/09/26/1299418.html</guid><wfw:comment>http://www.cnblogs.com/kentyshang/comments/1299418.html</wfw:comment><comments>http://www.cnblogs.com/kentyshang/archive/2008/09/26/1299418.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/kentyshang/comments/commentRss/1299418.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/kentyshang/services/trackbacks/1299418.html</trackback:ping><description><![CDATA[<p>ASCII(str) <br />
返回字符串str的第一个字符的ASCII值(str是空串时返回0)<br />
mysql&gt; select  ASCII('2');<br />
-&gt; 50<br />
mysql&gt; select ASCII(2);<br />
-&gt;  50<br />
mysql&gt; select ASCII('dete');<br />
-&gt; 100</p>
<p>ORD(str) <br />
如果字符串str句首是单字节返回与ASCII()函数返回的相同值。<br />
如果是一个多字节字符,以格式返回((first  byte ASCII code)*256+(second byte ASCII code))[*256+third byte ASCII  code...]<br />
mysql&gt; select ORD('2');<br />
-&gt;  50<br />
&nbsp;<br />
CONV(N,from_base,to_base)  <br />
对数字N进制转换,并转换为字串返回(任何参数为NULL时返回NULL,进制范围为2-36进制,当to_base是负数时N作为有符号数否则作无符号数,CONV以64位点精度工作)<br />
mysql&gt;  select CONV("a",16,2);<br />
-&gt; '1010'<br />
mysql&gt; select  CONV("6E",18,8);<br />
-&gt; '172'<br />
mysql&gt; select  CONV(-17,10,-18);<br />
-&gt; '-H'<br />
mysql&gt; select  CONV(10+"10"+'10'+0xa,10,10);<br />
-&gt; '40'<br />
&nbsp;<br />
BIN(N)  <br />
把N转为二进制值并以字串返回(N是BIGINT数字,等价于CONV(N,10,2))<br />
mysql&gt; select  BIN(12);<br />
-&gt; '1100'</p>
<p>OCT(N) <br />
把N转为八进制值并以字串返回(N是BIGINT数字,等价于CONV(N,10,8))<br />
mysql&gt; select  OCT(12);<br />
-&gt; '14'<br />
&nbsp;<br />
HEX(N)  <br />
把N转为十六进制并以字串返回(N是BIGINT数字,等价于CONV(N,10,16))<br />
mysql&gt; select  HEX(255);<br />
-&gt; 'FF'<br />
&nbsp;<br />
CHAR(N,...)  <br />
返回由参数N,...对应的ASCII代码字符组成的一个字串(参数是N,...是数字序列,NULL值被跳过) <br />
mysql&gt; select  CHAR(77,121,83,81,'76');<br />
-&gt; 'MySQL'<br />
mysql&gt; select  CHAR(77,77.3,'77.3');<br />
-&gt; 'MMM'<br />
&nbsp;<br />
CONCAT(str1,str2,...)  <br />
把参数连成一个长字符串并返回(任何参数是NULL时返回NULL) <br />
mysql&gt; select CONCAT('My', 'S',  'QL');<br />
-&gt; 'MySQL'<br />
mysql&gt; select CONCAT('My', NULL,  'QL');<br />
-&gt; NULL<br />
mysql&gt; select CONCAT(14.3);<br />
-&gt; '14.3'</p>
<p>LENGTH(str)  <br />
OCTET_LENGTH(str)<br />
CHAR_LENGTH(str)<br />
CHARACTER_LENGTH(str)<br />
返回字符串str的长度(对于多字节字符CHAR_LENGTH仅计算一次)<br />
mysql&gt;  select LENGTH('text');<br />
-&gt; 4<br />
mysql&gt; select  OCTET_LENGTH('text');<br />
-&gt; 4</p>
<p>LOCATE(substr,str) <br />
POSITION(substr IN str)  <br />
返回字符串substr在字符串str第一次出现的位置(str不包含substr时返回0)<br />
mysql&gt; select  LOCATE('bar', 'foobarbar');<br />
-&gt; 4<br />
mysql&gt; select LOCATE('xbar',  'foobar');<br />
-&gt; 0<br />
&nbsp;  <br />
LOCATE(substr,str,pos)<br />
返回字符串substr在字符串str的第pos个位置起第一次出现的位置(str不包含substr时返回0)<br />
mysql&gt;  select LOCATE('bar', 'foobarbar',5);<br />
-&gt; 7</p>
<p>INSTR(str,substr)  <br />
返回字符串substr在字符串str第一次出现的位置(str不包含substr时返回0)<br />
mysql&gt; select  INSTR('foobarbar', 'bar');<br />
-&gt; 4<br />
mysql&gt; select INSTR('xbar',  'foobar');<br />
-&gt; 0 </p>
<p>LPAD(str,len,padstr) <br />
用字符串padstr填补str左端直到字串长度为len并返回<br />
mysql&gt; select  LPAD('hi',4,'??');<br />
-&gt; '??hi'<br />
&nbsp;<br />
RPAD(str,len,padstr)  <br />
用字符串padstr填补str右端直到字串长度为len并返回<br />
mysql&gt; select  RPAD('hi',5,'?');<br />
-&gt; 'hi???'</p>
<p>LEFT(str,len) <br />
返回字符串str的左端len个字符<br />
mysql&gt; select LEFT('foobarbar',  5);<br />
-&gt; 'fooba'</p>
<p>RIGHT(str,len) <br />
返回字符串str的右端len个字符 <br />
mysql&gt; select RIGHT('foobarbar',  4);<br />
-&gt; 'rbar'</p>
<p>SUBSTRING(str,pos,len) <br />
SUBSTRING(str FROM pos FOR len)  <br />
MID(str,pos,len) <br />
返回字符串str的位置pos起len个字符(使用FROM的丑陋语法是ANSI  SQL92标准)<br />
mysql&gt; select SUBSTRING('Quadratically',5,6);<br />
-&gt;  'ratica'</p>
<p>SUBSTRING(str,pos) <br />
SUBSTRING(str FROM pos)  <br />
返回字符串str的位置pos起的一个子串<br />
mysql&gt; select  SUBSTRING('Quadratically',5);<br />
-&gt; 'ratically'<br />
mysql&gt; select  SUBSTRING('foobarbar' FROM 4);<br />
-&gt; 'barbar'</p>
<p>SUBSTRING_INDEX(str,delim,count)  <br />
返回从字符串str的第count个出现的分隔符delim之后的子串(count为正数时返回左端,否则返回右端子串)<br />
mysql&gt;  select SUBSTRING_INDEX('www.mysql.com', '.', 2);<br />
-&gt;  'www.mysql'<br />
mysql&gt; select SUBSTRING_INDEX('www.mysql.com', '.',  -2);<br />
-&gt; 'mysql.com'</p>
<p>LTRIM(str) <br />
返回删除了左空格的字符串str<br />
mysql&gt; select LTRIM('&nbsp;  barbar');<br />
-&gt; 'barbar'</p>
<p>RTRIM(str) <br />
返回删除了右空格的字符串str<br />
mysql&gt; select RTRIM('barbar&nbsp;&nbsp;  ');<br />
-&gt; 'barbar'</p>
<p>TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)  <br />
返回前缀或后缀remstr被删除了的字符串str(位置参数默认BOTH,remstr默认值为空格)<br />
mysql&gt; select  TRIM('&nbsp; bar&nbsp;&nbsp; ');<br />
-&gt; 'bar'<br />
mysql&gt; select TRIM(LEADING 'x' FROM  'xxxbarxxx');<br />
-&gt; 'barxxx'<br />
mysql&gt; select TRIM(BOTH 'x' FROM  'xxxbarxxx');<br />
-&gt; 'bar'<br />
mysql&gt; select TRIM(TRAILING 'xyz' FROM  'barxxyz');<br />
-&gt; 'barx'</p>
<p>SOUNDEX(str)  <br />
返回str的一个同音字符串(听起来&#8220;大致相同&#8221;字符串有相同的同音字符串,非数字字母字符被忽略,在A-Z外的字母被当作元音)<br />
mysql&gt;  select SOUNDEX('Hello');<br />
-&gt; 'H400'<br />
mysql&gt; select  SOUNDEX('Quadratically');<br />
-&gt; 'Q36324'<br />
&nbsp;<br />
SPACE(N)  <br />
返回由N个空格字符组成的一个字符串<br />
mysql&gt; select SPACE(6);<br />
-&gt; '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  '<br />
&nbsp;<br />
REPLACE(str,from_str,to_str)  <br />
用字符串to_str替换字符串str中的子串from_str并返回<br />
mysql&gt; select  REPLACE('www.mysql.com', 'w', 'Ww');<br />
-&gt; 'WwWwWw.mysql.com'</p>
<p>REPEAT(str,count)  <br />
返回由count个字符串str连成的一个字符串(任何参数为NULL时返回NULL,count&lt;=0时返回一个空字符串)<br />
mysql&gt;  select REPEAT('MySQL', 3);<br />
-&gt; 'MySQLMySQLMySQL'<br />
&nbsp;<br />
REVERSE(str)  <br />
颠倒字符串str的字符顺序并返回<br />
mysql&gt; select REVERSE('abc');<br />
-&gt; 'cba'</p>
<p>INSERT(str,pos,len,newstr)  <br />
把字符串str由位置pos起len个字符长的子串替换为字符串newstr并返回<br />
mysql&gt; select  INSERT('Quadratic', 3, 4, 'What');<br />
-&gt; 'QuWhattic'</p>
<p>ELT(N,str1,str2,str3,...) <br />
返回第N个字符串(N小于1或大于参数个数返回NULL)<br />
mysql&gt;  select ELT(1, 'ej', 'Heja', 'hej', 'foo');<br />
-&gt; 'ej'<br />
mysql&gt; select  ELT(4, 'ej', 'Heja', 'hej', 'foo');<br />
-&gt; 'foo'</p>
<p>FIELD(str,str1,str2,str3,...)  <br />
返回str等于其后的第N个字符串的序号(如果str没找到返回0)<br />
mysql&gt; select FIELD('ej', 'Hej',  'ej', 'Heja', 'hej', 'foo');<br />
-&gt; 2<br />
mysql&gt; select FIELD('fo', 'Hej',  'ej', 'Heja', 'hej', 'foo');<br />
-&gt; 0</p>
<p>FIND_IN_SET(str,strlist)  <br />
返回str在字符串集strlist中的序号(任何参数是NULL则返回NULL,如果str没找到返回0,参数1包含","时工作异常)<br />
mysql&gt;  SELECT FIND_IN_SET('b','a,b,c,d');<br />
-&gt;  2<br />
&nbsp;<br />
MAKE_SET(bits,str1,str2,...)<br />
把参数1的数字转为二进制,假如某个位置的二进制位等于1,对应位置的字串选入字串集并返回(NULL串不添加到结果中)<br />
mysql&gt;  SELECT MAKE_SET(1,'a','b','c');<br />
-&gt; 'a'<br />
mysql&gt; SELECT MAKE_SET(1 |  4,'hello','nice','world');<br />
-&gt; 'hello,world'<br />
mysql&gt; SELECT  MAKE_SET(0,'a','b','c');<br />
-&gt; ''</p>
<p>EXPORT_SET(bits,on,off,[separator,[number_of_bits]])  <br />
按bits排列字符串集,只有当位等于1时插入字串on,否则插入off(separator默认值",",number_of_bits参数使用时长度不足补0而过长截断)  <br />
mysql&gt; select EXPORT_SET(5,'Y','N',',',4)<br />
-&gt; Y,N,Y,N </p>
<p>LCASE(str)<br />
LOWER(str) <br />
返回小写的字符串str<br />
mysql&gt; select  LCASE('QUADRATICALLY');<br />
-&gt; 'quadratically'<br />
&nbsp;<br />
UCASE(str)  <br />
UPPER(str) <br />
返回大写的字符串str<br />
mysql&gt; select  UCASE('quadratically');<br />
-&gt; 'QUADRATICALLY'</p>
<p>LOAD_FILE(file_name)  <br />
读入文件并且作为一个字符串返回文件内容(文件无法找到,路径不完整,没有权限,长度大于max_allowed_packet会返回NULL)<br />
mysql&gt;  UPDATE table_name SET blob_column=LOAD_FILE("/tmp/picture") WHERE id=1;</p>
<p>&nbsp;</p>
<p>数学函数</p>
<p>ABS(N)<br />
返回N的绝对值<br />
mysql&gt; select ABS(2);&nbsp; <br />
-&gt; 2&nbsp; <br />
mysql&gt;  select ABS(-32);&nbsp; <br />
-&gt; 32&nbsp;  <br />
&nbsp;<br />
SIGN(N)<br />
返回参数的符号(为-1、0或1)<br />
mysql&gt; select SIGN(-32);&nbsp;  <br />
-&gt; -1&nbsp; <br />
mysql&gt; select SIGN(0);&nbsp; <br />
-&gt; 0&nbsp; <br />
mysql&gt;  select SIGN(234);&nbsp; <br />
-&gt; 1&nbsp; </p>
<p>MOD(N,M)&nbsp; <br />
取模运算,返回N被M除的余数(同%操作符)&nbsp; <br />
mysql&gt; select MOD(234, 10);&nbsp;  <br />
-&gt; 4&nbsp; <br />
mysql&gt; select 234 % 10;&nbsp; <br />
-&gt; 4&nbsp; <br />
mysql&gt;  select MOD(29,9);&nbsp; <br />
-&gt; 2&nbsp; </p>
<p>FLOOR(N)<br />
返回不大于N的最大整数值<br />
mysql&gt; select FLOOR(1.23);&nbsp; <br />
-&gt; 1&nbsp;  <br />
mysql&gt; select FLOOR(-1.23);&nbsp; <br />
-&gt; -2&nbsp; </p>
<p>CEILING(N)<br />
返回不小于N的最小整数值<br />
mysql&gt; select CEILING(1.23);&nbsp; <br />
-&gt;  2&nbsp; <br />
mysql&gt; select CEILING(-1.23);&nbsp; <br />
-&gt; -1&nbsp; </p>
<p>ROUND(N,D)<br />
返回N的四舍五入值,保留D位小数(D的默认值为0)<br />
mysql&gt; select ROUND(-1.23);&nbsp;  <br />
-&gt; -1&nbsp; <br />
mysql&gt; select ROUND(-1.58);&nbsp; <br />
-&gt; -2&nbsp;  <br />
mysql&gt; select ROUND(1.58);&nbsp; <br />
-&gt; 2&nbsp; <br />
mysql&gt; select  ROUND(1.298, 1);&nbsp; <br />
-&gt; 1.3&nbsp; <br />
mysql&gt; select ROUND(1.298, 0);&nbsp;  <br />
-&gt; 1&nbsp; </p>
<p>EXP(N)<br />
返回值e的N次方(自然对数的底)<br />
mysql&gt; select EXP(2);&nbsp; <br />
-&gt;  7.389056&nbsp; <br />
mysql&gt; select EXP(-2);&nbsp; <br />
-&gt; 0.135335&nbsp; </p>
<p>LOG(N)<br />
返回N的自然对数<br />
mysql&gt; select LOG(2);&nbsp; <br />
-&gt; 0.693147&nbsp;  <br />
mysql&gt; select LOG(-2);&nbsp; <br />
-&gt; NULL&nbsp; </p>
<p>LOG10(N)<br />
返回N以10为底的对数<br />
mysql&gt; select LOG10(2);&nbsp; <br />
-&gt; 0.301030&nbsp;  <br />
mysql&gt; select LOG10(100);&nbsp; <br />
-&gt; 2.000000&nbsp; <br />
mysql&gt; select  LOG10(-100);&nbsp; <br />
-&gt; NULL&nbsp; </p>
<p>POW(X,Y)&nbsp; <br />
POWER(X,Y)&nbsp; <br />
返回值X的Y次幂<br />
mysql&gt; select POW(2,2);&nbsp;  <br />
-&gt; 4.000000&nbsp; <br />
mysql&gt; select POW(2,-2);&nbsp; <br />
-&gt; 0.250000</p>
<p>SQRT(N)<br />
返回非负数N的平方根<br />
mysql&gt; select SQRT(4);&nbsp; <br />
-&gt; 2.000000&nbsp;  <br />
mysql&gt; select SQRT(20);&nbsp; <br />
-&gt; 4.472136&nbsp; </p>
<p>PI()&nbsp; <br />
返回圆周率 <br />
mysql&gt; select PI();&nbsp; <br />
-&gt; 3.141593&nbsp; </p>
<p>COS(N)<br />
返回N的余弦值<br />
mysql&gt; select COS(PI());<br />
-&gt; -1.000000&nbsp; </p>
<p>SIN(N)<br />
返回N的正弦值 <br />
mysql&gt; select SIN(PI());&nbsp; <br />
-&gt; 0.000000&nbsp;  </p>
<p>TAN(N)<br />
返回N的正切值<br />
mysql&gt; select TAN(PI()+1);&nbsp; <br />
-&gt; 1.557408&nbsp;  </p>
<p>ACOS(N)<br />
返回N反余弦(N是余弦值,在-1到1的范围,否则返回NULL)<br />
mysql&gt; select ACOS(1);&nbsp;  <br />
-&gt; 0.000000&nbsp; <br />
mysql&gt; select ACOS(1.0001);&nbsp; <br />
-&gt; NULL&nbsp;  <br />
mysql&gt; select ACOS(0);&nbsp; <br />
-&gt; 1.570796&nbsp; </p>
<p>ASIN(N)<br />
返回N反正弦值<br />
mysql&gt; select ASIN(0.2);&nbsp; <br />
-&gt; 0.201358&nbsp;  <br />
mysql&gt; select ASIN('foo');&nbsp; <br />
-&gt; 0.000000&nbsp; </p>
<p>ATAN(N)<br />
返回N的反正切值<br />
mysql&gt; select ATAN(2);&nbsp; <br />
-&gt; 1.107149&nbsp;  <br />
mysql&gt; select ATAN(-2);&nbsp; <br />
-&gt; -1.107149&nbsp; <br />
ATAN2(X,Y)&nbsp;  <br />
返回2个变量X和Y的反正切(类似Y/X的反正切,符号决定象限)<br />
mysql&gt; select ATAN(-2,2);&nbsp;  <br />
-&gt; -0.785398&nbsp; <br />
mysql&gt; select ATAN(PI(),0);&nbsp; <br />
-&gt; 1.570796&nbsp;  </p>
<p>COT(N)<br />
返回X的余切<br />
mysql&gt; select COT(12);&nbsp; <br />
-&gt; -1.57267341&nbsp;  <br />
mysql&gt; select COT(0);&nbsp; <br />
-&gt; NULL&nbsp; </p>
<p>RAND()<br />
RAND(N)&nbsp; <br />
返回在范围0到1.0内的随机浮点值(可以使用数字N作为初始值)<br />
mysql&gt; select  RAND();&nbsp; <br />
-&gt; 0.5925&nbsp; <br />
mysql&gt; select RAND(20);&nbsp; <br />
-&gt; 0.1811&nbsp;  <br />
mysql&gt; select RAND(20);&nbsp; <br />
-&gt; 0.1811&nbsp; <br />
mysql&gt; select  RAND();&nbsp; <br />
-&gt; 0.2079&nbsp; <br />
mysql&gt; select RAND();&nbsp; <br />
-&gt; 0.7888&nbsp;  </p>
<p>DEGREES(N)<br />
把N从弧度变换为角度并返回<br />
mysql&gt; select DEGREES(PI());&nbsp; <br />
-&gt;  180.000000&nbsp; </p>
<p>RADIANS(N)<br />
把N从角度变换为弧度并返回 <br />
mysql&gt; select RADIANS(90);&nbsp; <br />
-&gt;  1.570796&nbsp; </p>
<p>TRUNCATE(N,D)&nbsp; <br />
保留数字N的D位小数并返回<br />
mysql&gt; select TRUNCATE(1.223,1);&nbsp;  <br />
-&gt; 1.2&nbsp; <br />
mysql&gt; select TRUNCATE(1.999,1);&nbsp; <br />
-&gt; 1.9&nbsp;  <br />
mysql&gt; select TRUNCATE(1.999,0);&nbsp; <br />
-&gt; 1&nbsp; </p>
<p>LEAST(X,Y,...)&nbsp;  <br />
返回最小值(如果返回值被用在整数(实数或大小敏感字串)上下文或所有参数都是整数(实数或大小敏感字串)则他们作为整数(实数或大小敏感字串)比较,否则按忽略大小写的字符串被比较)<br />
mysql&gt;  select LEAST(2,0);&nbsp; <br />
-&gt; 0&nbsp; <br />
mysql&gt; select  LEAST(34.0,3.0,5.0,767.0);&nbsp; <br />
-&gt; 3.0&nbsp; <br />
mysql&gt; select  LEAST("B","A","C");&nbsp; <br />
-&gt; "A"&nbsp; </p>
<p>GREATEST(X,Y,...)&nbsp; <br />
返回最大值(其余同LEAST())<br />
mysql&gt; select GREATEST(2,0);&nbsp;  <br />
-&gt; 2&nbsp; <br />
mysql&gt; select GREATEST(34.0,3.0,5.0,767.0);&nbsp; <br />
-&gt;  767.0&nbsp; <br />
mysql&gt; select GREATEST("B","A","C");&nbsp; <br />
-&gt; "C"&nbsp; </p>
<p>&nbsp;</p>
<p>时期时间函数</p>
<p>DAYOFWEEK(date)&nbsp; <br />
返回日期date是星期几(1=星期天,2=星期一,&#8230;&#8230;7=星期六,ODBC标准)<br />
mysql&gt;  select DAYOFWEEK('1998-02-03');&nbsp; <br />
-&gt; 3&nbsp; </p>
<p>WEEKDAY(date)&nbsp; <br />
返回日期date是星期几(0=星期一,1=星期二,&#8230;&#8230;6= 星期天)。&nbsp; <br />
mysql&gt; select  WEEKDAY('1997-10-04 22:23:00');&nbsp; <br />
-&gt; 5&nbsp; <br />
mysql&gt; select  WEEKDAY('1997-11-05');&nbsp; <br />
-&gt; 2&nbsp; </p>
<p>DAYOFMONTH(date)&nbsp; <br />
返回date是一月中的第几日(在1到31范围内)&nbsp; <br />
mysql&gt; select  DAYOFMONTH('1998-02-03');&nbsp; <br />
-&gt; 3&nbsp; </p>
<p>DAYOFYEAR(date)&nbsp; <br />
返回date是一年中的第几日(在1到366范围内)&nbsp; <br />
mysql&gt; select  DAYOFYEAR('1998-02-03');&nbsp; <br />
-&gt; 34&nbsp; </p>
<p>MONTH(date)&nbsp; <br />
返回date中的月份数值&nbsp; <br />
mysql&gt; select MONTH('1998-02-03');&nbsp;  <br />
-&gt; 2&nbsp; </p>
<p>DAYNAME(date)&nbsp; <br />
返回date是星期几(按英文名返回)<br />
mysql&gt; select  DAYNAME("1998-02-05");&nbsp; <br />
-&gt; 'Thursday'&nbsp; </p>
<p>MONTHNAME(date)&nbsp; <br />
返回date是几月(按英文名返回)<br />
mysql&gt; select  MONTHNAME("1998-02-05");&nbsp; <br />
-&gt; 'February'&nbsp; </p>
<p>QUARTER(date)&nbsp; <br />
返回date是一年的第几个季度&nbsp; <br />
mysql&gt; select  QUARTER('98-04-01');&nbsp; <br />
-&gt; 2&nbsp; </p>
<p>WEEK(date,first)  <br />
返回date是一年的第几周(first默认值0,first取值1表示周一是周的开始,0从周日开始)<br />
mysql&gt; select  WEEK('1998-02-20');&nbsp; <br />
-&gt; 7&nbsp; <br />
mysql&gt; select WEEK('1998-02-20',0);&nbsp;  <br />
-&gt; 7&nbsp; <br />
mysql&gt; select WEEK('1998-02-20',1);&nbsp; <br />
-&gt; 8&nbsp; </p>
<p>YEAR(date)&nbsp; <br />
返回date的年份(范围在1000到9999)&nbsp; <br />
mysql&gt; select  YEAR('98-02-03');&nbsp; <br />
-&gt; 1998&nbsp; </p>
<p>HOUR(time)&nbsp; <br />
返回time的小时数(范围是0到23) <br />
mysql&gt; select HOUR('10:05:03');&nbsp;  <br />
-&gt; 10&nbsp; </p>
<p>MINUTE(time)&nbsp; <br />
返回time的分钟数(范围是0到59)&nbsp; <br />
mysql&gt; select MINUTE('98-02-03  10:05:03');&nbsp; <br />
-&gt; 5&nbsp; </p>
<p>SECOND(time)&nbsp; <br />
返回time的秒数(范围是0到59) <br />
mysql&gt; select  SECOND('10:05:03');&nbsp; <br />
-&gt; 3&nbsp; </p>
<p>PERIOD_ADD(P,N)&nbsp; <br />
增加N个月到时期P并返回(P的格式YYMM或YYYYMM)&nbsp; <br />
mysql&gt; select  PERIOD_ADD(9801,2);&nbsp; <br />
-&gt; 199803&nbsp; </p>
<p>PERIOD_DIFF(P1,P2)&nbsp; <br />
返回在时期P1和P2之间月数(P1和P2的格式YYMM或YYYYMM)<br />
mysql&gt;  select PERIOD_DIFF(9802,199703);&nbsp; <br />
-&gt; 11&nbsp; </p>
<p>DATE_ADD(date,INTERVAL expr type)<br />
DATE_SUB(date,INTERVAL expr type)&nbsp;  <br />
ADDDATE(date,INTERVAL expr type)&nbsp; <br />
SUBDATE(date,INTERVAL expr  type)<br />
对日期时间进行加减法运算<br />
(ADDDATE()和SUBDATE()是DATE_ADD()和DATE_SUB()的同义词,也可以用运算符+和-而不是函数<br />
date是一个DATETIME或DATE值,expr对date进行加减法的一个表达式字符串type指明表达式expr应该如何被解释<br />
[type值  含义 期望的expr格式]:<br />
SECOND 秒 SECONDS&nbsp; <br />
MINUTE 分钟 MINUTES&nbsp; <br />
HOUR 时间 HOURS&nbsp;  <br />
DAY 天 DAYS&nbsp; <br />
MONTH 月 MONTHS&nbsp; <br />
YEAR 年 YEARS&nbsp; <br />
MINUTE_SECOND 分钟和秒  "MINUTES:SECONDS"&nbsp; <br />
HOUR_MINUTE 小时和分钟 "HOURS:MINUTES"&nbsp; <br />
DAY_HOUR 天和小时  "DAYS HOURS"&nbsp; <br />
YEAR_MONTH 年和月 "YEARS-MONTHS"&nbsp; <br />
HOUR_SECOND 小时, 分钟，  "HOURS:MINUTES:SECONDS"&nbsp; <br />
DAY_MINUTE 天, 小时, 分钟 "DAYS HOURS:MINUTES"&nbsp;  <br />
DAY_SECOND 天, 小时, 分钟, 秒 "DAYS  HOURS:MINUTES:SECONDS"<br />
expr中允许任何标点做分隔符,如果所有是DATE值时结果是一个DATE值,否则结果是一个DATETIME值)<br />
如果type关键词不完整,则MySQL从右端取值,DAY_SECOND因为缺少小时分钟等于MINUTE_SECOND)<br />
如果增加MONTH、YEAR_MONTH或YEAR,天数大于结果月份的最大天数则使用最大天数)&nbsp;  <br />
mysql&gt; SELECT "1997-12-31 23:59:59" + INTERVAL 1 SECOND;&nbsp; <br />
-&gt;  1998-01-01 00:00:00&nbsp; <br />
mysql&gt; SELECT INTERVAL 1 DAY + "1997-12-31";&nbsp;  <br />
-&gt; 1998-01-01&nbsp; <br />
mysql&gt; SELECT "1998-01-01" - INTERVAL 1 SECOND;&nbsp;  <br />
-&gt; 1997-12-31 23:59:59&nbsp; <br />
mysql&gt; SELECT DATE_ADD("1997-12-31  23:59:59",INTERVAL 1 SECOND);&nbsp; <br />
-&gt; 1998-01-01 00:00:00&nbsp; <br />
mysql&gt;  SELECT DATE_ADD("1997-12-31 23:59:59",INTERVAL 1 DAY);&nbsp; <br />
-&gt; 1998-01-01  23:59:59&nbsp; <br />
mysql&gt; SELECT DATE_ADD("1997-12-31 23:59:59",INTERVAL "1:1"  MINUTE_SECOND);&nbsp; <br />
-&gt; 1998-01-01 00:01:00&nbsp; <br />
mysql&gt; SELECT  DATE_SUB("1998-01-01 00:00:00",INTERVAL "1 1:1:1" DAY_SECOND);&nbsp; <br />
-&gt;  1997-12-30 22:58:59&nbsp; <br />
mysql&gt; SELECT DATE_ADD("1998-01-01 00:00:00",  INTERVAL "-1 10" DAY_HOUR);<br />
-&gt; 1997-12-30 14:00:00&nbsp; <br />
mysql&gt; SELECT  DATE_SUB("1998-01-02", INTERVAL 31 DAY);&nbsp; <br />
-&gt; 1997-12-02&nbsp; <br />
mysql&gt;  SELECT EXTRACT(YEAR FROM "1999-07-02");&nbsp; <br />
-&gt; 1999&nbsp; <br />
mysql&gt; SELECT  EXTRACT(YEAR_MONTH FROM "1999-07-02 01:02:03");&nbsp; <br />
-&gt; 199907&nbsp;  <br />
mysql&gt; SELECT EXTRACT(DAY_MINUTE FROM "1999-07-02 01:02:03");&nbsp;  <br />
-&gt; 20102&nbsp; </p>
<p>TO_DAYS(date)&nbsp; <br />
返回日期date是西元0年至今多少天(不计算1582年以前)<br />
mysql&gt; select  TO_DAYS(950501);&nbsp; <br />
-&gt; 728779&nbsp; <br />
mysql&gt; select  TO_DAYS('1997-10-07');&nbsp; <br />
-&gt; 729669&nbsp; </p>
<p>FROM_DAYS(N)&nbsp; <br />
给出西元0年至今多少天返回DATE值(不计算1582年以前) <br />
mysql&gt; select  FROM_DAYS(729669);&nbsp; <br />
-&gt; '1997-10-07'&nbsp; </p>
<p>DATE_FORMAT(date,format)&nbsp;  <br />
根据format字符串格式化date值<br />
(在format字符串中可用标志符:<br />
%M 月名字(January&#8230;&#8230;December)&nbsp;  <br />
%W 星期名字(Sunday&#8230;&#8230;Saturday)&nbsp; <br />
%D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。）&nbsp; <br />
%Y  年, 数字, 4 位&nbsp; <br />
%y 年, 数字, 2 位&nbsp; <br />
%a 缩写的星期名字(Sun&#8230;&#8230;Sat)&nbsp; <br />
%d 月份中的天数,  数字(00&#8230;&#8230;31)&nbsp; <br />
%e 月份中的天数, 数字(0&#8230;&#8230;31)&nbsp; <br />
%m 月, 数字(01&#8230;&#8230;12)&nbsp; <br />
%c 月,  数字(1&#8230;&#8230;12)&nbsp; <br />
%b 缩写的月份名字(Jan&#8230;&#8230;Dec)&nbsp; <br />
%j 一年中的天数(001&#8230;&#8230;366)&nbsp; <br />
%H  小时(00&#8230;&#8230;23)&nbsp; <br />
%k 小时(0&#8230;&#8230;23)&nbsp; <br />
%h 小时(01&#8230;&#8230;12)&nbsp; <br />
%I 小时(01&#8230;&#8230;12)&nbsp; <br />
%l  小时(1&#8230;&#8230;12)&nbsp; <br />
%i 分钟, 数字(00&#8230;&#8230;59)&nbsp; <br />
%r 时间,12 小时(hh:mm:ss [AP]M)&nbsp; <br />
%T  时间,24 小时(hh:mm:ss)&nbsp; <br />
%S 秒(00&#8230;&#8230;59)&nbsp; <br />
%s 秒(00&#8230;&#8230;59)&nbsp; <br />
%p AM或PM&nbsp; <br />
%w  一个星期中的天数(0=Sunday &#8230;&#8230;6=Saturday ）&nbsp; <br />
%U 星期(0&#8230;&#8230;52), 这里星期天是星期的第一天&nbsp; <br />
%u  星期(0&#8230;&#8230;52), 这里星期一是星期的第一天&nbsp; <br />
%% 字符% )<br />
mysql&gt; select  DATE_FORMAT('1997-10-04 22:23:00','%W %M %Y');&nbsp; <br />
-&gt; 'Saturday October  1997'&nbsp; <br />
mysql&gt; select DATE_FORMAT('1997-10-04 22:23:00','%H:%i:%s');&nbsp;  <br />
-&gt; '22:23:00'&nbsp; <br />
mysql&gt; select DATE_FORMAT('1997-10-04  22:23:00','%D %y %a %d %m %b %j');&nbsp; <br />
-&gt; '4th 97 Sat 04 10 Oct 277'&nbsp;  <br />
mysql&gt; select DATE_FORMAT('1997-10-04 22:23:00','%H %k %I %r %T %S %w');&nbsp;  <br />
-&gt; '22 22 10 10:23:00 PM 22:23:00 00 6'&nbsp; </p>
<p>TIME_FORMAT(time,format)<br />
和DATE_FORMAT()类似,但TIME_FORMAT只处理小时、分钟和秒(其余符号产生一个NULL值或0)</p>
<p>CURDATE()&nbsp;&nbsp;  <br />
CURRENT_DATE()<br />
以'YYYY-MM-DD'或YYYYMMDD格式返回当前日期值(根据返回值所处上下文是字符串或数字)&nbsp;  <br />
mysql&gt; select CURDATE();&nbsp; <br />
-&gt; '1997-12-15'&nbsp; <br />
mysql&gt; select  CURDATE() + 0;&nbsp; <br />
-&gt; 19971215&nbsp; </p>
<p>CURTIME()&nbsp;  <br />
CURRENT_TIME()<br />
以'HH:MM:SS'或HHMMSS格式返回当前时间值(根据返回值所处上下文是字符串或数字)&nbsp;&nbsp;&nbsp;  <br />
mysql&gt; select CURTIME();&nbsp; <br />
-&gt; '23:50:26'&nbsp; <br />
mysql&gt; select  CURTIME() + 0;&nbsp; <br />
-&gt; 235026&nbsp; </p>
<p>NOW()&nbsp; <br />
SYSDATE()&nbsp; <br />
CURRENT_TIMESTAMP()<br />
以'YYYY-MM-DD  HH:MM:SS'或YYYYMMDDHHMMSS格式返回当前日期时间(根据返回值所处上下文是字符串或数字)&nbsp;&nbsp; <br />
mysql&gt; select  NOW();&nbsp; <br />
-&gt; '1997-12-15 23:50:26'&nbsp; <br />
mysql&gt; select NOW() + 0;&nbsp;  <br />
-&gt; 19971215235026&nbsp; </p>
<p>UNIX_TIMESTAMP()&nbsp; <br />
UNIX_TIMESTAMP(date)&nbsp; <br />
返回一个Unix时间戳(从'1970-01-01  00:00:00'GMT开始的秒数,date默认值为当前时间)<br />
mysql&gt; select UNIX_TIMESTAMP();&nbsp;  <br />
-&gt; 882226357&nbsp; <br />
mysql&gt; select UNIX_TIMESTAMP('1997-10-04  22:23:00');&nbsp; <br />
-&gt; 875996580&nbsp; </p>
<p>FROM_UNIXTIME(unix_timestamp)&nbsp; <br />
以'YYYY-MM-DD  HH:MM:SS'或YYYYMMDDHHMMSS格式返回时间戳的值(根据返回值所处上下文是字符串或数字)&nbsp;&nbsp; <br />
mysql&gt; select  FROM_UNIXTIME(875996580);&nbsp; <br />
-&gt; '1997-10-04 22:23:00'&nbsp; <br />
mysql&gt;  select FROM_UNIXTIME(875996580) + 0;&nbsp; <br />
-&gt; 19971004222300&nbsp; </p>
<p>FROM_UNIXTIME(unix_timestamp,format)&nbsp; <br />
以format字符串格式返回时间戳的值<br />
mysql&gt;  select FROM_UNIXTIME(UNIX_TIMESTAMP(),'%Y %D %M %h:%i:%s %x');&nbsp; <br />
-&gt;  '1997 23rd December 03:43:30 x'&nbsp; </p>
<p>SEC_TO_TIME(seconds)&nbsp;  <br />
以'HH:MM:SS'或HHMMSS格式返回秒数转成的TIME值(根据返回值所处上下文是字符串或数字)&nbsp;&nbsp; <br />
mysql&gt; select  SEC_TO_TIME(2378);&nbsp; <br />
-&gt; '00:39:38'&nbsp; <br />
mysql&gt; select  SEC_TO_TIME(2378) + 0;&nbsp; <br />
-&gt; 3938&nbsp; </p>
<p>TIME_TO_SEC(time)&nbsp; <br />
返回time值有多少秒&nbsp; <br />
mysql&gt; select  TIME_TO_SEC('22:23:00');&nbsp; <br />
-&gt; 80580&nbsp; <br />
mysql&gt; select  TIME_TO_SEC('00:39:38');&nbsp; <br />
-&gt; 2378 </p><img src ="http://www.cnblogs.com/kentyshang/aggbug/1299418.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43012/" target="_blank">[新闻]最富有科技公司：中移动310亿美元居首</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>StringToken</title><link>http://www.cnblogs.com/kentyshang/archive/2008/09/09/1287458.html</link><dc:creator>kenty</dc:creator><author>kenty</author><pubDate>Tue, 09 Sep 2008 03:42:00 GMT</pubDate><guid>http://www.cnblogs.com/kentyshang/archive/2008/09/09/1287458.html</guid><wfw:comment>http://www.cnblogs.com/kentyshang/comments/1287458.html</wfw:comment><comments>http://www.cnblogs.com/kentyshang/archive/2008/09/09/1287458.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/kentyshang/comments/commentRss/1287458.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/kentyshang/services/trackbacks/1287458.html</trackback:ping><description><![CDATA[<p>package me;</p>
<p>import java.util.StringTokenizer;</p>
<p><br />
public class TestStringToken<br />
{<br />
public static void main(String[] args)<br />
{<br />
&nbsp;&nbsp;  String wpskl="AAAAA,BBBBB,CCCCC,DDDDD";<br />
&nbsp;&nbsp;  /**<br />
&nbsp;&nbsp;  *StringTokenizer(String str,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  String delim,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  boolean returnDelims)为指定字符串构造一个 string tokenizer。delim 参数中的所有字符都是分隔标记的分隔符。<br />
如果 returnDelims 标志为 true，则分隔符字符也作为标记返回。每个分隔符都作为一个长度为 1 的字符串返回。如果标志为 false，则跳过分隔符，只是用作标记之间的分隔符。</p>
<p> 注意，如果 delim 为 null，则此构造方法不抛出异常。但是，尝试对得到的 StringTokenizer 调用其他方法则可能抛出 NullPointerException。</p>
<p> */<br />
&nbsp;&nbsp;  <span style="background: yellow none repeat scroll 0% 50%; font-size: 10pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: black;">StringTokenizer</span><span style="font-size: 10pt; color: black;"> stoken=</span><strong><span style="font-size: 10pt; color: #7f0055;">new</span></strong> <strong><span style="background: yellow none repeat scroll 0% 50%; font-size: 10pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: #0080ff;">StringTokenizer</span></strong><span style="font-size: 10pt; color: black;">(wpskl,</span><span style="font-size: 10pt; color: #2a00ff;">","</span><span style="font-size: 10pt; color: black;">,</span><strong><span style="font-size: 10pt; color: #7f0055;">true</span></strong><span style="font-size: 10pt; color: black;">);</span></p>
<p> System.out.println("1 中的结果  *****&nbsp;&nbsp;  "+stoken.countTokens());<br />
&nbsp;&nbsp;  while(stoken.hasMoreTokens())<br />
&nbsp;&nbsp;  {<br />
&nbsp;&nbsp;&nbsp;  System.out.println(stoken.nextToken());<br />
&nbsp;&nbsp;  }<br />
&nbsp;&nbsp;  System.out.println("**********1中的结果结束***********");<br />
&nbsp;&nbsp;  System.out.println();<br />
&nbsp;&nbsp;  System.out.println();<br />
&nbsp;&nbsp;  System.out.println();<br />
&nbsp;&nbsp;  System.out.println("**********2中的结果开始***********");<br />
&nbsp;&nbsp;  <span style="font-size: 10pt; color: black;">stoken=</span><strong><span style="font-size: 10pt; color: #7f0055;">new</span></strong> <strong><span style="background: yellow none repeat scroll 0% 50%; font-size: 10pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: #0080ff;">StringTokenizer</span></strong><span style="font-size: 10pt; color: black;">(wpskl,</span><span style="font-size: 10pt; color: #2a00ff;">","</span><span style="font-size: 10pt; color: black;">);</span><br />
&nbsp;&nbsp;  System.out.println("2 中的结果*****&nbsp;&nbsp;&nbsp;  "+stoken.countTokens());<br />
&nbsp;&nbsp;  while(stoken.hasMoreTokens())<br />
&nbsp;&nbsp;  {<br />
&nbsp;&nbsp;&nbsp;  System.out.println(stoken.nextToken());<br />
&nbsp;&nbsp;  }<br />
&nbsp;&nbsp;  System.out.println("**********2中的结果结束***********");<br />
&nbsp;&nbsp;  System.out.println();<br />
&nbsp;&nbsp;  System.out.println();<br />
&nbsp;&nbsp;  System.out.println();<br />
&nbsp;&nbsp;  System.out.println("**********3中的结果开始***********");<br />
&nbsp;&nbsp;  <span style="font-size: 10pt; color: black;">stoken=</span><strong><span style="font-size: 10pt; color: #7f0055;">new</span></strong> <strong><span style="background: yellow none repeat scroll 0% 50%; font-size: 10pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: #0080ff;">StringTokenizer</span></strong><span style="font-size: 10pt; color: black;">(wpskl);</span><br />
&nbsp;&nbsp;  System.out.println("3 中的结果*****&nbsp;&nbsp;&nbsp;  "+stoken.countTokens());<br />
&nbsp;&nbsp;  while(stoken.hasMoreTokens())<br />
&nbsp;&nbsp;  {<br />
&nbsp;&nbsp;&nbsp;  System.out.println(stoken.nextToken());<br />
&nbsp;&nbsp;  }<br />
&nbsp;&nbsp;  System.out.println("**********3中的结果结束***********");<br />
&nbsp;&nbsp;  }<br />
}</p>
<p><br />
-------------------------</p>
<p> </p>
<p align="left"> </p>
<p align="left"><span style="font-size: 10pt; color: #8000ff;">1 </span><span style="font-size: 10pt; color: #8000ff;">中的结果</span><span style="font-size: 10pt; color: #8000ff;"> *****&nbsp;&nbsp;  7</span></p>
<p align="left"><span style="font-size: 10pt; color: #8000ff;">AAAAA</span></p>
<p align="left"><span style="font-size: 10pt; color: #8000ff;">,</span></p>
<p align="left"><span style="font-size: 10pt; color: #8000ff;">BBBBB</span></p>
<p align="left"><span style="font-size: 10pt; color: #8000ff;">,</span></p>
<p align="left"><span style="font-size: 10pt; color: #8000ff;">CCCCC</span></p>
<p align="left"><span style="font-size: 10pt; color: #8000ff;">,</span></p>
<p align="left"><span style="font-size: 10pt; color: #8000ff;">DDDDD</span></p>
<p align="left"><span style="font-size: 10pt; color: #8000ff;">**********1</span><span style="font-size: 10pt; color: #8000ff;">中的结果结束</span><span style="font-size: 10pt; color: #8000ff;">***********</span></p>
<p align="left"> </p>
<p align="left"> </p>
<p align="left"> </p>
<p align="left"><span style="font-size: 10pt; color: #8000ff;">**********2</span><span style="font-size: 10pt; color: #8000ff;">中的结果开始</span><span style="font-size: 10pt; color: #8000ff;">***********</span></p>
<p align="left"><span style="font-size: 10pt; color: #8000ff;">2 </span><span style="font-size: 10pt; color: #8000ff;">中的结果</span><span style="font-size: 10pt; color: #8000ff;">*****&nbsp;&nbsp;&nbsp;  4</span></p>
<p align="left"><span style="font-size: 10pt; color: #8000ff;">AAAAA</span></p>
<p align="left"><span style="font-size: 10pt; color: #8000ff;">BBBBB</span></p>
<p align="left"><span style="font-size: 10pt; color: #8000ff;">CCCCC</span></p>
<p align="left"><span style="font-size: 10pt; color: #8000ff;">DDDDD</span></p>
<p align="left"><span style="font-size: 10pt; color: #8000ff;">**********2</span><span style="font-size: 10pt; color: #8000ff;">中的结果结束</span><span style="font-size: 10pt; color: #8000ff;">***********</span></p>
<p align="left"> </p>
<p align="left"> </p>
<p align="left"> </p>
<p align="left"><span style="font-size: 10pt; color: #8000ff;">**********3</span><span style="font-size: 10pt; color: #8000ff;">中的结果开始</span><span style="font-size: 10pt; color: #8000ff;">***********</span></p>
<p align="left"><span style="font-size: 10pt; color: #8000ff;">3 </span><span style="font-size: 10pt; color: #8000ff;">中的结果</span><span style="font-size: 10pt; color: #8000ff;">*****&nbsp;&nbsp;&nbsp;  1</span></p>
<p align="left"><span style="font-size: 10pt; color: #8000ff;">AAAAA,BBBBB,CCCCC,DDDDD</span></p>
<span style="font-size: 10pt; color: #8000ff;">**********3</span><span style="font-size: 10pt; color: #8000ff;">中的结果结束</span><span style="font-size: 10pt; color: #8000ff;">***********</span><img src ="http://www.cnblogs.com/kentyshang/aggbug/1287458.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43010/" target="_blank">[新闻]华盛顿抛弃微软Office 选择Google Apps</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>Sun portal server Message ID</title><link>http://www.cnblogs.com/kentyshang/archive/2008/07/09/1238948.html</link><dc:creator>kenty</dc:creator><author>kenty</author><pubDate>Wed, 09 Jul 2008 07:24:00 GMT</pubDate><guid>http://www.cnblogs.com/kentyshang/archive/2008/07/09/1238948.html</guid><wfw:comment>http://www.cnblogs.com/kentyshang/comments/1238948.html</wfw:comment><comments>http://www.cnblogs.com/kentyshang/archive/2008/07/09/1238948.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/kentyshang/comments/commentRss/1238948.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/kentyshang/services/trackbacks/1238948.html</trackback:ping><description><![CDATA[摘要: #http://www.koders.com/noncode/fid17555C713B68486F2CC7EDFE7F7A63EE3CBCE461.aspx?s=mdef%3AgetUserId#  CDDL HEADER START#  The contents of this file are subject to the terms#  of the Common Development &nbsp;&nbsp;<a href='http://www.cnblogs.com/kentyshang/archive/2008/07/09/1238948.html'>阅读全文</a><img src ="http://www.cnblogs.com/kentyshang/aggbug/1238948.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43009/" target="_blank">[新闻]微软：WGA验证每小时黑屏是善意提醒</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>Portal Server 7 Swallows Up Portlet Exceptions: The Useless MISC_ERROR</title><link>http://www.cnblogs.com/kentyshang/archive/2008/07/08/1237957.html</link><dc:creator>kenty</dc:creator><author>kenty</author><pubDate>Tue, 08 Jul 2008 02:00:00 GMT</pubDate><guid>http://www.cnblogs.com/kentyshang/archive/2008/07/08/1237957.html</guid><wfw:comment>http://www.cnblogs.com/kentyshang/comments/1237957.html</wfw:comment><comments>http://www.cnblogs.com/kentyshang/archive/2008/07/08/1237957.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/kentyshang/comments/commentRss/1237957.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/kentyshang/services/trackbacks/1237957.html</trackback:ping><description><![CDATA[<span class="entrytitle">Portal Server 7 Swallows Up Portlet Exceptions: The Useless MISC_ERROR</span><br />
<div class="body"><span style="text-decoration: underline">Alert to portlet developers using Sun Portal Server 7!</span>&nbsp; There is a pretty serious bug in the 7.0 release that will make it appear the Portal Server is swallowing up exceptions thrown by your portlet.&nbsp; This will make debugging your portlet very difficult.<br />
<br />
For instance, have you been debugging a portlet in PS7 only to find a useless message like "<span style="font-family: Courier New,Courier,mono">Exception thrown - EntityID = TestPortletTestPortletTestPortletChannel, Error Code = MISC_ERROR</span>"?&nbsp; Not very helpful. <img class="smiley" title=":(" alt=":(" src="http://blogs.sun.com/images/smileys/sad.gif" />&nbsp; Well the problem is the Portal Server is actually capturing the portlet's exception in the portlet container and failing to log it at a level that will be presented by default in the Portal Server logs.&nbsp; The bug will be fixed in PS7.1 (as part of Java ES 5).<br />
<br />
To workaround in the short-term, you will have to set the logging level correctly for the portlet container so that the portlet's exception is logged to the Portal Server log file.&nbsp; This can be done with the psadmin command-line tool, like so:<br />
<br />
<span style="font-family: Courier New,Courier,mono">/opt/sun/portal/bin/psadmin set-logger -v -u amadmin -f &lt;password-file&gt;&nbsp; -m portal -p &lt;portal-id&gt; -i &lt;instance-id&gt; -80 --name debug.com.sun.portal.portletappengine --level FINEST</span><br />
<br />
The other option is to use the Portal Server Console.<br />
<br />
Choose your portal, and instance and the Logging tab.<br />
Choose the Specific Logger Settings tab.<br />
Choose your instance.<br />
Scroll down to find debug.com.sun.portal.portletappengine.<br />
Set Log Level to FINEST.<br />
Choose Apply to Selected Instance.<br />
<br />
If you are viewing the portal log in the Portal Server Console, you should log out and log back into the console.&nbsp; When you go to view the log (Log Viewer), you will now have to select Log Level FINEST to view the portlet exceptions.&nbsp; You will see them listed near the useless MISC_ERROR message and they will be labeled something like "<span id="logviewer:sheet1:secondSection:Property2:hidden"><span id="logviewer:sheet1:secondSection:Property2:hidden:table1:rowGroup1:3:messageSummary:messageSummary">Error occured while processing portlet request. javax.portlet.PortletException</span></span>..." </div>
<img src ="http://www.cnblogs.com/kentyshang/aggbug/1237957.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43008/" target="_blank">[新闻]研究表明上网可以提高记忆力</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>SUN PORTAL 7.2安装在windows 的问题解决办法!</title><link>http://www.cnblogs.com/kentyshang/archive/2008/07/04/1235716.html</link><dc:creator>kenty</dc:creator><author>kenty</author><pubDate>Fri, 04 Jul 2008 07:35:00 GMT</pubDate><guid>http://www.cnblogs.com/kentyshang/archive/2008/07/04/1235716.html</guid><wfw:comment>http://www.cnblogs.com/kentyshang/comments/1235716.html</wfw:comment><comments>http://www.cnblogs.com/kentyshang/archive/2008/07/04/1235716.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/kentyshang/comments/commentRss/1235716.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/kentyshang/services/trackbacks/1235716.html</trackback:ping><description><![CDATA[<table border="0" cellpadding="2" cellspacing="0" width="100%">
    <tbody>
        <tr bgcolor="#e4ecf0">
            <td>
            <div><strong>
            Portal Server 7.2 on Windows XP,  fail to run "setup.bat" command, plz help
            &nbsp;&nbsp;
            <br />
            2008-6-23 ??9:33
            </strong>
            &nbsp;
            <br />
            </div>
            </td>
            <td>
            <div>
            <a href="http://forum.java.sun.com/emailmessage%21default.jspa?messageID=10307738" title="Click to email this message">
            <img src="http://forum.java.sun.com/im/ic_email.gif" alt="Click to email this message" border="0" height="12" hspace="4" vspace="1" width="14" /></a>
            <br />
            <br />
            <form action="post!reply.jspa">
                <input name="messageID" value="10307738" type="hidden" />
                <input value="Reply &#187;" onmouseover="this.style.color='#fbe249';" onmouseout="this.style.color='#FFF';" type="submit" />
            </form>
            </div>
            </td>
        </tr>
        <tr>
            <td>
            <div>&nbsp;</div>
            </td>
            <td>
            <div>
            Hi all,<br />
            <br />
            I want to install Java System Portal Server 7.2 on Windows.<br />
            <br />
            I hava unzip the file to C:/  drive.<br />
            <br />
            but when I run the command "setup.bat", it returned failure " Webcontainer Ports are unavailable" <br />
            <br />
            Here is the error message:<br />
            <p>
            <br />
            Buildfile: C:"PS7.2"share"psrepo"auto"ant"Migrate-Host.xml<br />
            <br />
            init:<br />
            <br />
            set-wc-props:<br />
            <br />
            setprops:<br />
            <br />
            change:<br />
            <br />
            init:<br />
            <br />
            set-wc-props:<br />
            <br />
            setprops:<br />
            <br />
            validate-platform:<br />
            [echo] Using [localhost] as the FQDN Hostname<br />
            [input] Continue? : (y, [n])<br />
            y<br />
            [echo] Checking for Port conflicts<br />
            <br />
            init:<br />
            <br />
            set-wc-props:<br />
            <br />
            checkports:<br />
            <br />
            init:<br />
            <br />
            set-wc-props:<br />
            <br />
            check-wc-port:<br />
            [echo] Checking Webcontainer Port Conflicts...<br />
            [echo] Ports: 8080 / 8181<br />
            [echo] Ports: 3700 / 4848<br />
            <br />
            BUILD FAILED<br />
            C:"PS7.2"share"psrepo"auto"ant"Migrate-Host.xml:56: The following error occurred<br />
            while executing this line:<br />
            C:"PS7.2"share"psrepo"auto"ant"Env.xml:216: The following error occurred while e<br />
            xecuting this line:<br />
            C:"PS7.2"share"psrepo"auto"ant"Env.xml:171: Webcontainer Ports are unavailable<br />
            </p>
            <p>
            did i do anything wrong?<br />
            <br />
            plz help!  Thx!
            </p>
            </div>
            </td>
            <td>
            <div>&nbsp;</div>
            </td>
        </tr>
        <tr bgcolor="#e4ecf0">
            <td>
            <div>
            <img src="http://forum.java.sun.com/im/bronze-star.gif" title="Dukes Earned 3"  alt="" />
            <a href="http://forum.java.sun.com/profile.jspa?userID=624205">cygnusecks</a>
            <br />
            Posts:6
            <br />
            Registered: 5/15/06
            </div>
            </td>
            <td>
            <div><strong>
            Re: Portal Server 7.2 on Windows XP,  fail to run "setup.bat" command, plz
            &nbsp;&nbsp;
            <br />
            2008-6-23 ??1:48
            (reply 1 of 5)
            </strong>
            <img src="http://forum.java.sun.com/im/answer-helpful-16x16.gif" title="" alt="" border="0" />
            Helpful
            <br />
            </div>
            </td>
            <td>
            <div>
            <a href="http://forum.java.sun.com/emailmessage%21default.jspa?messageID=10308054" title="Click to email this message">
            <img src="http://forum.java.sun.com/im/ic_email.gif" alt="Click to email this message" border="0" height="12" hspace="4" vspace="1" width="14" /></a>
            <br />
            <br />
            <form action="post!reply.jspa">
                <input name="messageID" value="10308054" type="hidden" />
                <input value="Reply &#187;" onmouseover="this.style.color='#fbe249';" onmouseout="this.style.color='#FFF';" type="submit" />
            </form>
            </div>
            </td>
        </tr>
        <tr>
            <td>
            <div>&nbsp;</div>
            </td>
            <td>
            <div>
            The failure is because the script is unable to bind to those TCP/IP ports on your local machine.<br />
            <br />
            Do you have other processes running that are bound to those TCP/IP ports on your machine?  <br />
            <br />
            To find out, try to run 'netstat -a -o' and look for processes listening on 8080/8081/3700/4848.<br />
            If you find any, kill them (by looking at the 'PID' column and then killing the process with that<br />
            PID using the task manager, e.g. ctrl-alt-delete).<br />
            <br />
            Do you have a C:"windows"system32"drivers"etc"hosts file?  Does it look like the one here:<br />
            <br />
            http://en.wikipedia.org/wiki/Hosts_file#Default_content_on_Windows_operating_systems<br />
            <br />
            If not, try to add a 'localhost' entry and as above and try again.
            </div>
            </td>
            <td>
            <div>&nbsp;</div>
            </td>
        </tr>
        <tr bgcolor="#e4ecf0">
            <td>
            <div>
            <img src="http://forum.java.sun.com/im/bronze-star.gif" title="Dukes Earned 0"  alt="" />
            <a href="http://forum.java.sun.com/profile.jspa?userID=1043311">wilsonfv</a>
            <br />
            Posts:3
            <br />
            Registered: 6/23/08
            </div>
            </td>
            <td>
            <div><strong>
            Re: Portal Server 7.2 on Windows XP,  fail to run "setup.bat" command, plz
            &nbsp;&nbsp;
            <br />
            2008-6-23 ??6:27
            (reply 2 of 5)
            </strong>
            &nbsp;
            <br />
            </div>
            </td>
            <td>
            <div>
            <a href="http://forum.java.sun.com/emailmessage%21default.jspa?messageID=10308291" title="Click to email this message">
            <img src="http://forum.java.sun.com/im/ic_email.gif" alt="Click to email this message" border="0" height="12" hspace="4" vspace="1" width="14" /></a>
            <br />
            <br />
            <form action="post!reply.jspa">
                <input name="messageID" value="10308291" type="hidden" />
                <input value="Reply &#187;" onmouseover="this.style.color='#fbe249';" onmouseout="this.style.color='#FFF';" type="submit" />
            </form>
            </div>
            </td>
        </tr>
        <tr>
            <td>
            <div>&nbsp;</div>
            </td>
            <td>
            <div>
            Thanks for your replay.<br />
            <br />
            I've already tried running the "netstat -abn" command, and the result
            showed that no process was listening on 8080/8181/3700/4848.<br />
            <br />
            That' why I feel puzzle and turn to you guys for help!<br />
            <p>
            I have installed Java System Application Server 9.1 before, but I have stopped its service. <br />
            <br />
            And here is the funny thing, Running "setup.bat" returns failure.<br />
            <br />
            but when I run"startportal.bat", it seems that it's working.<br />
            i tried "http://localhost:8080/psconsole" on the IE, there is a
            response on the IE, it shows the Portal Server Console Front Page, the
            Login Page.<br />
            <br />
            I tried username: psadmin , and password:  password. But then it happened nothing.<br />
            <br />
            But if i input the wrong username or password, it returned a error message"Authentication Failure"<br />
            <br />
            What's wrong? Thanks!
            </p>
            </div>
            </td>
            <td>
            <div>&nbsp;</div>
            </td>
        </tr>
        <tr bgcolor="#e4ecf0">
            <td>
            <div>
            <img src="http://forum.java.sun.com/im/bronze-star.gif" title="Dukes Earned 0"  alt="" />
            <a href="http://forum.java.sun.com/profile.jspa?userID=950543">ruppalapati</a>
            <br />
            Posts:9
            <br />
            Registered: 8/29/07
            </div>
            </td>
            <td>
            <div><strong>
            Re: Portal Server 7.2 on Windows XP,  fail to run "setup.bat" command, plz
            &nbsp;&nbsp;
            <br />
            2008-6-24 ??4:19
            (reply 3 of 5)
            </strong>
            <img id="jive-correct-img" src="http://forum.java.sun.com/im/answer-correct-24x24.gif" title="" alt="" border="0" />
            Correct
            <br />
            </div>
            </td>
            <td>
            <div>
            <a href="http://forum.java.sun.com/emailmessage%21default.jspa?messageID=10309948" title="Click to email this message">
            <img src="http://forum.java.sun.com/im/ic_email.gif" alt="Click to email this message" border="0" height="12" hspace="4" vspace="1" width="14" /></a>
            <br />
            <br />
            <form action="post!reply.jspa">
                <input name="messageID" value="10309948" type="hidden" />
                <input value="Reply &#187;" onmouseover="this.style.color='#fbe249';" onmouseout="this.style.color='#FFF';" type="submit" />
            </form>
            </div>
            </td>
        </tr>
        <tr>
            <td>
            <div>&nbsp;</div>
            </td>
            <td>
            <div>
            Please try the following:<br />
            1] C:"PS7.2"bin"stopportal.bat<br />
            2] Remove C:"PS7.2<br />
            3] Unzip from the downloaded zip file at C:"PS7.2<br />
            4] Edit C:"PS7.2"share"psrepo"auto"ant"Migrate-Host.xml and comment out the antcall for target checkports. Diff shown below<br />
            5] Turn off any Firewalls<br />
            6] Execute C:"PS7.2"bin"setup.bat<br />
            7] Report any issue you might have observed. This will help me help you further.<br />
            <br />
            <pre><code jive-java="">Index: Migrate-Host.xml<br />
            ===================================================================<br />
            --- Migrate-Host.xml	(revision 2806)<br />
            +++ Migrate-Host.xml	(working copy)<br />
            @@ -53,7 +53,7 @@<br />
            &lt;record name=<font color="red">"${ps.data.location}/logs/setup.log"</font> action=<font color="red">"start"</font>/&gt;<br />
            &lt;!-- Check <font color="navy"><strong>for</strong></font> port conflicts before setting up --&gt;<br />
            &lt;echo message=<font color="red">"Checking for Port conflicts"</font>/&gt;<br />
            -        &lt;antcall target=<font color="red">"checkports"</font>/&gt;<br />
            +        &lt;!-- &lt;antcall target=<font color="red">"checkports"</font>/&gt; --&gt;<br />
            &lt;!-- Update the pattens file which is used to token replace strings --&gt;<br />
            &lt;replace file=<font color="red">"${backup.location}/patterns"</font> token=<font color="red">"@@NEWHOSTFQDN@@"</font> value=<font color="red">"${hostname.domain}"</font>/&gt;<br />
            &lt;replace file=<font color="red">"${backup.location}/patterns"</font> token=<font color="red">"@@NEWHOSTDOMAIN@@"</font> value=<font color="red">"${domain}"</font>/&gt;<br />
            </code></pre>
            <br />
            <br />
            thanks,<br />
            _raju
            </div>
            </td>
            <td>
            <div>&nbsp;</div>
            </td>
        </tr>
        <tr bgcolor="#e4ecf0">
            <td>
            <div>
            <img src="http://forum.java.sun.com/im/bronze-star.gif" title="Dukes Earned 0"  alt="" />
            <a href="http://forum.java.sun.com/profile.jspa?userID=1043311">wilsonfv</a>
            <br />
            Posts:3
            <br />
            Registered: 6/23/08
            </div>
            </td>
            <td>
            <div><strong>
            Re: Portal Server 7.2 on Windows XP,  fail to run "setup.bat" command, plz
            &nbsp;&nbsp;
            <br />
            2008-6-26 ??8:16
            (reply 4 of 5)
            </strong>
            &nbsp;
            <br />
            </div>
            </td>
            <td>
            <div>
            <a href="http://forum.java.sun.com/emailmessage%21default.jspa?messageID=10312744" title="Click to email this message">
            <img src="http://forum.java.sun.com/im/ic_email.gif" alt="Click to email this message" border="0" height="12" hspace="4" vspace="1" width="14" /></a>
            <br />
            <br />
            <form action="post!reply.jspa">
                <input name="messageID" value="10312744" type="hidden" />
                <input value="Reply &#187;" onmouseover="this.style.color='#fbe249';" onmouseout="this.style.color='#FFF';" type="submit" />
            </form>
            </div>
            </td>
        </tr>
        <tr>
            <td>
            <div>&nbsp;</div>
            </td>
            <td>
            <div>
            Huge Thanks to ruppalapati!<br />
            <p>
            Following your instruction, <strong>Setup has been successfully completed!</strong><br />
            </p>
            <p>
            Thanks again!<br />
            <br />
            But, may I ask why commenting  those code  will  build the  setup  successfully?<br />
            <br />
            Edited by: wilsonfv on Jun 26, 2008 11:17 PM
            </p>
            </div>
            </td>
            <td>
            <div>&nbsp;</div>
            </td>
        </tr>
        <tr bgcolor="#e4ecf0">
            <td>
            <div>
            <img src="http://forum.java.sun.com/im/bronze-star.gif" title="Dukes Earned 0"  alt="" />
            <a href="http://forum.java.sun.com/profile.jspa?userID=950543">ruppalapati</a>
            <br />
            Posts:9
            <br />
            Registered: 8/29/07
            </div>
            </td>
            <td>
            <div><strong>
            Re: Portal Server 7.2 on Windows XP,  fail to run "setup.bat" command, plz
            &nbsp;&nbsp;
            <br />
            2008-6-27 ??1:58
            (reply 5 of 5)
            </strong>
            &nbsp;
            <br />
            </div>
            </td>
            <td>
            <div>
            <a href="http://forum.java.sun.com/emailmessage%21default.jspa?messageID=10315203" title="Click to email this message">
            <img src="http://forum.java.sun.com/im/ic_email.gif" alt="Click to email this message" border="0" height="12" hspace="4" vspace="1" width="14" /></a>
            <br />
            <br />
            <form action="post!reply.jspa">
                <input name="messageID" value="10315203" type="hidden" />
                <input value="Reply &#187;" onmouseover="this.style.color='#fbe249';" onmouseout="this.style.color='#FFF';" type="submit" />
            </form>
            </div>
            </td>
        </tr>
        <tr>
            <td>
            <div>&nbsp;</div>
            </td>
            <td>
            <div>
            That check was added to ensure that another version of Glassfish or
            Tomcat is not already running there by impacting the setup. But it
            appears on some systems that check itself fails :-(<br />
            That you confirmed there is no other process on listening on these ports, I suggested that you disable the check.<br />
            Each flavor of Windows (even security fixes) make a difference. Also
            firewalls and other spyware sniffing software might impact the code
            that checks if a Port on Windows is currently occupied.<br />
            <br />
            _raju
            </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.cnblogs.com/kentyshang/aggbug/1235716.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43007/" target="_blank">[新闻]为什么叫Windows 7？</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>FTP数据交换</title><link>http://www.cnblogs.com/kentyshang/archive/2008/07/02/1234217.html</link><dc:creator>kenty</dc:creator><author>kenty</author><pubDate>Wed, 02 Jul 2008 10:09:00 GMT</pubDate><guid>http://www.cnblogs.com/kentyshang/archive/2008/07/02/1234217.html</guid><wfw:comment>http://www.cnblogs.com/kentyshang/comments/1234217.html</wfw:comment><comments>http://www.cnblogs.com/kentyshang/archive/2008/07/02/1234217.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/kentyshang/comments/commentRss/1234217.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/kentyshang/services/trackbacks/1234217.html</trackback:ping><description><![CDATA[<font size="3">某些数据交换，我们需要通过<span class="hilite3"><font style="background-color: #aaffaa">ftp</font></span>来完成。 <br />
<br />
sun.net.<span class="hilite3"><font style="background-color: #aaffaa">ftp</font></span>.<span class="hilite3"><font style="background-color: #aaffaa">Ftp</font></span>Client 可以帮助我们进行一些简单的<span class="hilite3"><font style="background-color: #aaffaa">ftp</font></span>客户端功能：下载、上传文件。 <br />
<br />
但如遇到创建目录之类的就无能为力了，我们只好利用第三方源码，比如 com.enterprisedt.net.<span class="hilite3"><font style="background-color: #aaffaa">ftp</font></span>.<span class="hilite3"><font style="background-color: #aaffaa">FTP</font></span>Client <br />
<br />
下面写一些sun.net.<span class="hilite3"><font style="background-color: #aaffaa">ftp</font></span>.<span class="hilite3"><font style="background-color: #aaffaa">Ftp</font></span>Client 的使用方法。 <br />
<br />
1、引入包 <br />
<br />
import <span class="hilite1"><font style="background-color: #ffff00">java</font></span>.io.DataInputStream; <br />
import <span class="hilite1"><font style="background-color: #ffff00">java</font></span>.io.FileOutputStream; <br />
import <span class="hilite1"><font style="background-color: #ffff00">java</font></span>.io.IOException; <br />
import <span class="hilite1"><font style="background-color: #ffff00">java</font></span>.io.FileInputStream; <br />
import <span class="hilite1"><font style="background-color: #ffff00">java</font></span>.util.ArrayList; <br />
import <span class="hilite1"><font style="background-color: #ffff00">java</font></span>.util.Date; <br />
import <span class="hilite1"><font style="background-color: #ffff00">java</font></span>.util.List; <br />
import sun.net.*; <br />
import sun.net.<span class="hilite3"><font style="background-color: #aaffaa">ftp</font></span>.<span class="hilite3"><font style="background-color: #aaffaa">Ftp</font></span>Client; <br />
2、我们建一个叫做<span class="hilite3"><font style="background-color: #aaffaa">Ftp</font></span>Util的class <br />
<br />
/** <br />
* connectServer <br />
* 连接<span class="hilite3"><font style="background-color: #aaffaa">ftp</font></span>服务器 <br />
* @throws <span class="hilite1"><font style="background-color: #ffff00">java</font></span>.io.IOException <br />
* @param path 文件夹，空代表根目录 <br />
* @param password 密码 <br />
* @param user 登陆用户 <br />
* @param server 服务器地址 <br />
*/ <br />
public void connectServer(String server, String user, String password, String path) <br />
throws IOException <br />
{ <br />
// server：<span class="hilite3"><font style="background-color: #aaffaa">FTP</font></span>服务器的IP地址；user:<span class="hilite2"><font style="background-color: #55ff55">登录</font></span><span class="hilite3"><font style="background-color: #aaffaa">FTP</font></span>服务器的用户名 <br />
// password：<span class="hilite2"><font style="background-color: #55ff55">登录</font></span><span class="hilite3"><font style="background-color: #aaffaa">FTP</font></span>服务器的用户名的口令；path：<span class="hilite3"><font style="background-color: #aaffaa">FTP</font></span>服务器上的路径 <br />
<span class="hilite3"><font style="background-color: #aaffaa">ftp</font></span>Client = new <span class="hilite3"><font style="background-color: #aaffaa">Ftp</font></span>Client(); <br />
<span class="hilite3"><font style="background-color: #aaffaa">ftp</font></span>Client.openServer(server); <br />
<span class="hilite3"><font style="background-color: #aaffaa">ftp</font></span>Client.login(user, password); <br />
//path是<span class="hilite3"><font style="background-color: #aaffaa">ftp</font></span>服务下主目录的子目录 <br />
if (path.length() != 0) <span class="hilite3"><font style="background-color: #aaffaa">ftp</font></span>Client.cd(path); <br />
//用2进制上传、下载 <br />
<span class="hilite3"><font style="background-color: #aaffaa">ftp</font></span>Client.binary(); <br />
} <br />
<br />
/** <br />
* upload <br />
* 上传文件 <br />
* @throws <span class="hilite1"><font style="background-color: #ffff00">java</font></span>.lang.Exception <br />
* @return -1 文件不存在 <br />
* -2 文件内容为空 <br />
* &gt;0 成功上传，返回文件的大小 <br />
* @param newname 上传后的新文件名 <br />
* @param filename 上传的文件 <br />
*/ <br />
public long upload(String filename,String newname) throws Exception <br />
{ <br />
long result = 0; <br />
TelnetOutputStream os = null; <br />
FileInputStream is = null; <br />
try { <br />
<span class="hilite1"><font style="background-color: #ffff00">java</font></span>.io.File file_in = new <span class="hilite1"><font style="background-color: #ffff00">java</font></span>.io.File(filename); <br />
if (!file_in.exists()) return -1; <br />
if (file_in.length()==0) return -2; <br />
os = <span class="hilite3"><font style="background-color: #aaffaa">ftp</font></span>Client.put(newname); <br />
result = file_in.length(); <br />
is = new FileInputStream(file_in); <br />
byte[] bytes = new byte[1024]; <br />
int c; <br />
while ((c = is.read(bytes)) != -1) { <br />
os.write(bytes, 0, c); <br />
} <br />
} finally { <br />
if (is != null) { <br />
is.close(); <br />
} <br />
if (os != null) { <br />
os.close(); <br />
} <br />
} <br />
return result; <br />
} <br />
/** <br />
* upload <br />
* @throws <span class="hilite1"><font style="background-color: #ffff00">java</font></span>.lang.Exception <br />
* @return <br />
* @param filename <br />
*/ <br />
public long upload(String filename) <br />
throws Exception <br />
{ <br />
String newname = ""; <br />
if (filename.indexOf("/")&gt;-1) <br />
{ <br />
newname = filename.substring(filename.lastIndexOf("/")+1); <br />
}else <br />
{ <br />
newname = filename; <br />
} <br />
return upload(filename,newname); <br />
} <br />
<br />
/** <br />
* download <br />
* 从<span class="hilite3"><font style="background-color: #aaffaa">ftp</font></span>下载文件到本地 <br />
* @throws <span class="hilite1"><font style="background-color: #ffff00">java</font></span>.lang.Exception <br />
* @return <br />
* @param newfilename 本地生成的文件名 <br />
* @param filename 服务器上的文件名 <br />
*/ <br />
public long download(String filename,String newfilename) <br />
throws Exception <br />
{ <br />
long result = 0; <br />
TelnetInputStream is = null; <br />
FileOutputStream os = null; <br />
try <br />
{ <br />
is = <span class="hilite3"><font style="background-color: #aaffaa">ftp</font></span>Client.get(filename); <br />
<span class="hilite1"><font style="background-color: #ffff00">java</font></span>.io.File outfile = new <span class="hilite1"><font style="background-color: #ffff00">java</font></span>.io.File(newfilename); <br />
os = new FileOutputStream(outfile); <br />
byte[] bytes = new byte[1024]; <br />
int c; <br />
while ((c = is.read(bytes)) != -1) { <br />
os.write(bytes, 0, c); <br />
result = result + c; <br />
} <br />
} catch (IOException e) <br />
{ <br />
e.printStackTrace(); <br />
} <br />
finally { <br />
if (is != null) { <br />
is.close(); <br />
} <br />
if (os != null) { <br />
os.close(); <br />
} <br />
} <br />
return result; <br />
} <br />
/** <br />
* 取得某个目录下的所有文件列表 <br />
* <br />
*/ <br />
public List getFileList(String path) <br />
{ <br />
List list = new ArrayList(); <br />
try <br />
{ <br />
DataInputStream dis = new DataInputStream(<span class="hilite3"><font style="background-color: #aaffaa">ftp</font></span>Client.nameList(path)); <br />
String filename = ""; <br />
while((filename=dis.readLine())!=null) <br />
{ <br />
list.add(filename); <br />
} <br />
<br />
} catch (Exception e) <br />
{ <br />
e.printStackTrace(); <br />
} <br />
return list; <br />
} <br />
<br />
/** <br />
* closeServer <br />
* 断开与<span class="hilite3"><font style="background-color: #aaffaa">ftp</font></span>服务器的链接 <br />
* @throws <span class="hilite1"><font style="background-color: #ffff00">java</font></span>.io.IOException <br />
*/ <br />
public void closeServer() <br />
throws IOException <br />
{ <br />
try <br />
{ <br />
if (<span class="hilite3"><font style="background-color: #aaffaa">ftp</font></span>Client != null) <br />
{ <br />
<span class="hilite3"><font style="background-color: #aaffaa">ftp</font></span>Client.closeServer(); <br />
} <br />
} catch (IOException e) { <br />
e.printStackTrace(); <br />
} <br />
} <br />
<br />
public static void main(String [] args) throws Exception <br />
{ <br />
<span class="hilite3"><font style="background-color: #aaffaa">Ftp</font></span>Util <span class="hilite3"><font style="background-color: #aaffaa">ftp</font></span> = new <span class="hilite3"><font style="background-color: #aaffaa">Ftp</font></span>Util(); <br />
try { <br />
//连接<span class="hilite3"><font style="background-color: #aaffaa">ftp</font></span>服务器 <br />
<span class="hilite3"><font style="background-color: #aaffaa">ftp</font></span>.connectServer("10.163.7.15", "cxl", "1", "info2"); <br />
/** 上传文件到 info2 文件夹下 */ <br />
System.out.println("filesize:"+<span class="hilite3"><font style="background-color: #aaffaa">ftp</font></span>.upload("f:/download/Install.exe")+"字节"); <br />
/** 取得info2文件夹下的所有文件列表,并下载到 E盘下 */ <br />
List list = <span class="hilite3"><font style="background-color: #aaffaa">ftp</font></span>.getFileList("."); <br />
for (int i=0;i&lt;list.size();i++) <br />
{ <br />
String filename = (String)list.get(i); <br />
System.out.println(filename); <br />
<span class="hilite3"><font style="background-color: #aaffaa">ftp</font></span>.download(filename,"E:/"+filename); <br />
} <br />
} catch (Exception e) { <br />
/// <br />
}finally <br />
{ <br />
<span class="hilite3"><font style="background-color: #aaffaa">ftp</font></span>.closeServer(); <br />
} <br />
} <br />
} <br />
以上就是 使用 sun.net.<span class="hilite3"><font style="background-color: #aaffaa">ftp</font></span>.<span class="hilite3"><font style="background-color: #aaffaa">Ftp</font></span>Client 操作<span class="hilite3"><font style="background-color: #aaffaa">ftp</font></span>客户端的使用方法。</font>
<img src ="http://www.cnblogs.com/kentyshang/aggbug/1234217.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43003/" target="_blank">[新闻]Open Source Camp 北京 2008技术交流盛会</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>JSP上传组件</title><link>http://www.cnblogs.com/kentyshang/archive/2008/07/02/1234216.html</link><dc:creator>kenty</dc:creator><author>kenty</author><pubDate>Wed, 02 Jul 2008 10:06:00 GMT</pubDate><guid>http://www.cnblogs.com/kentyshang/archive/2008/07/02/1234216.html</guid><wfw:comment>http://www.cnblogs.com/kentyshang/comments/1234216.html</wfw:comment><comments>http://www.cnblogs.com/kentyshang/archive/2008/07/02/1234216.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/kentyshang/comments/commentRss/1234216.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/kentyshang/services/trackbacks/1234216.html</trackback:ping><description><![CDATA[摘要: 第1个上传组件commons-fileupload=============commons-fileupload ================common-fileupload组件是apache的一个开源项目之一，可以从http://jakarta.apache.org/commons/fileupload/下载。该组件简单易用，可实现一次上传一个或多个文件，并可限制文件大小。 -下载后解压z&nbsp;&nbsp;<a href='http://www.cnblogs.com/kentyshang/archive/2008/07/02/1234216.html'>阅读全文</a><img src ="http://www.cnblogs.com/kentyshang/aggbug/1234216.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43003/" target="_blank">[新闻]Open Source Camp 北京 2008技术交流盛会</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>有是JSF的一个小问题,搞了我两天!从周五到周二</title><link>http://www.cnblogs.com/kentyshang/archive/2008/06/24/1228997.html</link><dc:creator>kenty</dc:creator><author>kenty</author><pubDate>Tue, 24 Jun 2008 06:43:00 GMT</pubDate><guid>http://www.cnblogs.com/kentyshang/archive/2008/06/24/1228997.html</guid><wfw:comment>http://www.cnblogs.com/kentyshang/comments/1228997.html</wfw:comment><comments>http://www.cnblogs.com/kentyshang/archive/2008/06/24/1228997.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/kentyshang/comments/commentRss/1228997.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/kentyshang/services/trackbacks/1228997.html</trackback:ping><description><![CDATA[想从一个处理过的javabean生成的页面中取值回来!<br />
1)刚开始想是否可以使用 jsp的做法,对每个ID进行动态设定,然后在submit的时候,动态处理.(周五-周一)<br />
但JSF 不支持这种格式,<br />
2)可否使用整个Form提交,遍历的方式.&nbsp; 很难实现,中途停止(周一上午)<br />
3)使用javabean<br />
&nbsp;&nbsp;&nbsp; 思路是正确的,<br />
&nbsp;&nbsp;&nbsp; 可是修改过的值总是无法提取出来,拿的都是session中值.不明原因(周一晚上-周二上午,一直尝试使用各种方法)<br />
&nbsp;&nbsp;&nbsp; 上午看了一些例子,觉得这种做法问题,所以重新查看了资料.有重新写了一个页面测试了一下.没有问题.(周二上午)<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 但是为什么在原有的页面还是不行呢!<br />
&nbsp;&nbsp;&nbsp; 现在问题逐渐明朗:&nbsp; a.把该javabean改为page私有.(其实不是问题的根源)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.提取的时候出现问题,不能从session中拿了,而应该从jsp页面对应的java中直接拿.<br />
觉得应该没有问题了<br />
再试试吧!<br />
<br />
&nbsp;&nbsp;&nbsp; <br />
====================================<br />
有试到现在,终于知道原因了!<br />
是对应的JAVABEAN.java的错误!<br />
唉.....<br />
真的笨的像猪头!!<br />
看来要重修内功了!<br />
<img src ="http://www.cnblogs.com/kentyshang/aggbug/1228997.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43002/" target="_blank">[新闻]关于 Silverlight 2 Control Tookit 的最新消息</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>使用JSF的Selectonemenu</title><link>http://www.cnblogs.com/kentyshang/archive/2008/06/20/1226861.html</link><dc:creator>kenty</dc:creator><author>kenty</author><pubDate>Fri, 20 Jun 2008 07:03:00 GMT</pubDate><guid>http://www.cnblogs.com/kentyshang/archive/2008/06/20/1226861.html</guid><wfw:comment>http://www.cnblogs.com/kentyshang/comments/1226861.html</wfw:comment><comments>http://www.cnblogs.com/kentyshang/archive/2008/06/20/1226861.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/kentyshang/comments/commentRss/1226861.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/kentyshang/services/trackbacks/1226861.html</trackback:ping><description><![CDATA[正在做的一个项目,使用到JSF的SelectOneMenu这个控件.<br />
想直接使用JAVABEAN和SelectItems绑定,没有错误.<br />
显示的是<br />
bean中的Displayname,可是我想要id,却不知道怎么搞.<br />
开始的时候使用for循环一个一个比对,最后才发现其实不需要这样.<br />
<br />
在对bean操作的时候,注意使用<br />
SelectItems("id","displayname")<br />
这样,在SelectOneMenu中,显示的是Displayname,取得的却是id.<br />
<br />
记下来,因为它浪费了我差不多一天时间!<br />
<br />
<br />
<br />
<img src ="http://www.cnblogs.com/kentyshang/aggbug/1226861.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43001/" target="_blank">[新闻]新编程语言——微软的“M”语言</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>用于快速将 Web 应用程序集成到 WebSphere Portal 中的选项</title><link>http://www.cnblogs.com/kentyshang/archive/2008/06/06/1214929.html</link><dc:creator>kenty</dc:creator><author>kenty</author><pubDate>Fri, 06 Jun 2008 01:45:00 GMT</pubDate><guid>http://www.cnblogs.com/kentyshang/archive/2008/06/06/1214929.html</guid><wfw:comment>http://www.cnblogs.com/kentyshang/comments/1214929.html</wfw:comment><comments>http://www.cnblogs.com/kentyshang/archive/2008/06/06/1214929.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/kentyshang/comments/commentRss/1214929.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/kentyshang/services/trackbacks/1214929.html</trackback:ping><description><![CDATA[<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr valign="top">
            <td width="100%">
            <h1>用于快速将 Web 应用程序集成到 WebSphere Portal 中的选项</h1>
            <img class="display-img" height="6" alt="" src="http://www.ibm.com/i/c.gif" width="1" /></td>
            <td class="no-print" width="192"><img height="18" alt="developerWorks" src="http://www.ibm.com/developerworks/i/dw.gif" width="192" /></td>
        </tr>
    </tbody>
</table>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr valign="top">
            <td width="10"><img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" /></td>
            <td width="100%">
            <table class="no-print" cellspacing="0" cellpadding="0" width="160" align="right" border="0">
                <tbody>
                    <tr>
                        <td width="10"><img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" /></td>
                        <td>
                        <table cellspacing="0" cellpadding="0" width="150" border="0">
                            <tbody>
                                <tr>
                                    <td class="v14-header-1-small">文档选项</td>
                                </tr>
                            </tbody>
                        </table>
                        <table class="v14-gray-table-border" cellspacing="0" cellpadding="0" border="0">
                            <tbody>
                                <tr>
                                    <td class="no-padding" width="150">
                                    <table cellspacing="0" cellpadding="0" width="143" border="0">
                                        <img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="8" />
                                        <form name="email" action="https://www.ibm.com/developerworks/secure/email-it.jsp" cm1="1">
                                            <input type="hidden" value="了解快速地将现有 Web 应用程序包含到门户中的多种方法。" name="body" cm1="1"  cM3 cm2="0" /><input type="hidden" value="用于快速将 Web 应用程序集成到 WebSphere Portal 中的选项" name="subject" cm1="1"  cM3 cm2="1" /><input type="hidden" value="cn" name="lang" cm1="1"  cM3 cm2="2" /> <script language="JavaScript" type="text/javascript">
<!-- document.write('<tr valign="top"><td width="8"><img src="//www.ibm.com/i/c.gif" width="8" height="1" alt="" /></td><td width="16"><img src="//www.ibm.com/i/v14/icons/em.gif" height="16" width="16" vspace="3" alt="将此页作为电子邮件发送"  /></td><td width="122"><p><a class="smallplainlink" href="javascript:document.email.submit();"><strong>将此页作为电子邮件发送</strong></a></p></td></tr>');
//-->
</script>
                                            <tbody>
                                                <tr valign="top">
                                                    <td width="8"><img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="8" /></td>
                                                    <td width="16"><img height="16" alt="将此页作为电子邮件发送" src="http://www.ibm.com/i/v14/icons/em.gif" width="16" vspace="3" /></td>
                                                    <td width="122">
                                                    <p><a class="smallplainlink" href="javascript:document.email.submit();" cmimpressionsent="1"><strong>将此页作为电子邮件发送</strong></a></p>
                                                    </td>
                                                </tr>
                                                <noscript></noscript>
                                            </form>
                                        </tbody>
                                    </table>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        <!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- this content will be automatically generated across all content areas --><!--end RESERVED FOR FUTURE USE INCLUDE FILES--><br />
                        </td>
                    </tr>
                </tbody>
            </table>
            <p>级别： 中级</p>
            <p><a href="http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0607_boezeman/0607_boezeman.html#author" cmimpressionsent="1">Richard Gornitsky</a> (<a href="mailto:rsgornit@us.ibm.com?subject=用于快速将 Web 应用程序集成到 WebSphere Portal 中的选项&amp;cc=debcot@us.ibm.com" cmimpressionsent="1">mailto:rsgornit@us.ibm.com?subject=用于快速将 Web 应用程序集成到 WebSphere Portal 中的选项&amp;cc=debcot@us.ibm.com</a>), 高级 IT 架构师, IBM<br />
            <a href="http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0607_boezeman/0607_boezeman.html#author" cmimpressionsent="1">John Boezeman</a> (<a href="mailto:boezemant@us.ibm.com?subject=用于快速将 Web 应用程序集成到 WebSphere Portal 中的选项&amp;cc=debcot@us.ibm.com" cmimpressionsent="1">mailto:boezemant@us.ibm.com?subject=用于快速将 Web 应用程序集成到 WebSphere Portal 中的选项&amp;cc=debcot@us.ibm.com</a>), 高级软件工程师, IBM<br />
            </p>
            <p>2006 年 9 月 04 日</p>
            <blockquote>本文说明了多种用于快速将 Web 应用程序集成到在 WebSphere Portal 下运行的门户中的技术。</blockquote><!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--end RESERVED FOR FUTURE USE INCLUDE FILES-->
            <p><a name="N10075"><span class="atitle">引言</span></a></p>
            <p>各个公司都希望能够快速将其多个不同的网站聚合到单个用户界面中，也希望提供具有一致外观且支持单点登录（Single Sign-On，SSO）的站点。他们很快就认识到门户可实现此目标。不过，他们的门户设计人员和开发人员面临的最大挑战之一是，要确定用于将现有 Web 应用程序集成到门户中的最有效方法。 </p>
            <p>理想的情况下，应该通过将表示层移植到自主开发的 Portlet 来集成这些 Web 应用程序。通过此方法可利用 WebSphere Portal 用于提供一致外观的功能，还能利用其他功能（如安全性、个性化、协作 Portlet、内容/文档管理、搜索、可伸缩性/可用性功能等）和各种设备支持。 </p>
            <p>不过，自定义开发工作有时候可能会超出用户的预算。幸运的是，WebSphere Portal 提供了多种机制，可以用于将 Web 应用程序集成到门户中。 </p>
            <p>本文讨论了其中的几种机制。您可以采用以下方法： </p>
            <ol>
                <li>安装并使用即时可用的基于目录的全功能 Portlet。这是最便于实现的方法；不过，此方法灵活性较差，因为 Portlet 自定义仅限于配置选项。我们不打算讨论此备选方案。
                <li><a href="http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0607_boezeman/0607_boezeman.html#wpp" cmimpressionsent="1">使用 IBM Web Page Portlet</a> 或<a href="http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0607_boezeman/0607_boezeman.html#custom" cmimpressionsent="1">创建自己的自定义 iFrame Portlet</a> 来通过 iFrame 集成现有应用程序。
                <li>创建 <a href="http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0607_boezeman/0607_boezeman.html#wclip" cmimpressionsent="1">Web Clipping Portlet</a>，以标识和提取在 Portlet 中显示的 HTML 文档特定部分。iFrame Portlet 和 Web Clipping Portlet 都用于前端 Web 应用程序，且不需要使用任何其他工具。这些 Portlet 的配置非常简单；不过它们并不是万能的。在本文稍后，我们将说明其中的一些限制，以及如何开发自定义 iFrame Portlet 来绕过这些限制。
                <li>使用 IBM Rational&#174; Application Developer、Rational Software Architect 或其他帮助构建 Portlet 的工具来开发自己的自定义 Portlet。
                <li>使用 <a href="http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0607_boezeman/0607_boezeman.html#resources" cmimpressionsent="1">IBM WebSphere Portlet Factory</a>，这是 IBM 新推出的产品，可帮助进行 Portlet 开发。它提供了很多内置向导来自动为后端系统生成 Portlet。在很多情况下，您都不需要编写任何代码。 </li>
            </ol>
            <br />
            <table cellspacing="0" cellpadding="0" width="100%" border="0">
                <tbody>
                    <tr>
                        <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
                        <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
                    </tr>
                </tbody>
            </table>
            <table class="no-print" cellspacing="0" cellpadding="0" align="right">
                <tbody>
                    <tr align="right">
                        <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
                        <table cellspacing="0" cellpadding="0" border="0">
                            <tbody>
                                <tr>
                                    <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                                    </td>
                                    <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0607_boezeman/0607_boezeman.html#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br />
            <br />
            <p><a name="wpp"><span class="atitle">使用 Web Page Portlet 创建 iFrame</span></a></p>
            <p><a href="http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0607_boezeman/0607_boezeman.html#resources" cmimpressionsent="1">IBM Web Page Portlet</a> 是一个流行的快速集成工具，可以在 WebSphere Portal 的 installableApps 目录中找到此工具，也可以从 <a href="http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0607_boezeman/0607_boezeman.html#resources" cmimpressionsent="1">IBM WebSphere Portal catalog</a>下载。 </p>
            <p>Web Page Portlet 将 iFrame 显示为 Portlet。其中包括以下支持：</p>
            <ul>
                <li>设置 iFrame 的大小。
                <li>对相同域上的站点进行身份验证。如果所链接的站点要求基本身份验证或基于表单的身份验证，则可能需要使用此功能。Web Page Portlet 身份验证仅在 iFrame 站点与门户位于同一个域时才会工作。
                <li>使用来自凭据库的信息进行身份验证。 </li>
            </ul>
            <p>可以方便地配置 Web Page Portlet 和支持快速将多个网站集成到门户中。它非常适合进行概念验证；不过，在将其应用到生产中时必须非常小心。从门户的角度而言，此 iFrame 是门户页上的一个保留方框，门户不能控制其内容或格式。</p>
            <p>决定在门户中使用 iFrame 时需要考虑的一些问题：</p>
            <ul>
                <li>超时是一个非常麻烦的方面，因为 iFrame 或门户都可能在其他元素前出现超时。
                <li>目前的浏览器中的跨站点脚本（Cross-Site-Scripting，CSS）限制会阻止 iFrame 内的 JavaScript 访问父窗口或其他 iFrame 中的变量或遍历其中的 DOM。当二者位于同一个域且使用相同协议（HTTP 或 HTTPS）时例外。此情况会导致很多基于 iFrame 且依赖于 JavaScript（很多情况下都是如此）的应用程序失败。当出现 CSS 问题时，变量将为空，从而导致 JavaScript 失败或停止执行。此情况使得调试工作变得非常困难。
                <li>来自 iFrame 的链接会引用 JavaScript <code>top</code> 变量或 <code>navigator</code>，从而可以让用户访问 iFrame 外甚至门户外的内容。使用此类变量可能会导致整个浏览器窗口进入其他位置，而不会将其限制在 iFrame 的范围内。
                <li>iFrame 并不会对状态进行维护；因此，当用户与 iFrame 中的内容交互时，可能会遇到意外的行为。例如，假定您在页面上的某个 Portlet 中使用 iFrame，而该 Portlet 中&#8220;包括&#8221;外部站点上的一个应用程序。用户将采用以下方式与外部站点交互：单击链接并在新页面上填写表单；切换到不同的门户页；然后再切换回包含 iFrame Portlet 的页面。用户将看到<em>初始</em> 外部站点页，而不是进行交互时离开的表单页。只有目标外部站点使用会话 Cookie 等普通 Web 技术来处理自己的状态管理时，用户才会看到&#8220;通常&#8221;的行为。在此情况下，当用户返回 iFrame 页时，外部站点将显示表单页，而不是初始页。
                <li>iFrames 可能会导致很难在门户中控制和提供一致的外观。完整网页的 iFrame 通常包含页 Header 和导航信息，而这并不是 Portlet 中所希望的方式。完整的网页通常设计为适合全屏显示，通常不会将 Portlet 窗口内的滚动条（特别是水平滚动条）视为良好的用户界面 (UI) 设计。图 1 显示了这些 UI 问题。IBM 网站嵌入在页面右侧底部的 iFrame 内。其中的外观并不一致，且未集成导航。
                <li>iFrames 无法利用 WebSphere Portal 的功能。例如，iFrames 和 Web 剪辑不支持 Portlet 消息传递或协作 Portlet。它们无法利用门户的个性化引擎、流程集成或很多内容管理功能。 </li>
            </ul>
            <br />
            <a name="fig1"><strong>图 1. 通过 iFrame 集成了 ibm.com 网站（右下角）的门户页</strong></a><br />
            <img height="389" alt="通过 iFrame 集成了 ibm.com 网站的门户页" src="http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0607_boezeman/images/figure1.jpg" width="553" /> <br />
            <br />
            <table cellspacing="0" cellpadding="0" width="100%" border="0">
                <tbody>
                    <tr>
                        <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
                        <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
                    </tr>
                </tbody>
            </table>
            <table class="no-print" cellspacing="0" cellpadding="0" align="right">
                <tbody>
                    <tr align="right">
                        <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
                        <table cellspacing="0" cellpadding="0" border="0">
                            <tbody>
                                <tr>
                                    <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                                    </td>
                                    <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0607_boezeman/0607_boezeman.html#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br />
            <br />
            <p><a name="custom"><span class="atitle">创建自定义 iFrame Portlet</span></a></p>
            <p>假定您希望使用 iFrame，但要提供 Web Page Portlet 之外的其他功能。您可以将 iFrame 嵌入到 Portlet JSP 中并对 iFrame 名称进行编码（使用命名空间），从而编写自己的 iFrame Portlet。 </p>
            <p>此部分说明了决定编写自定义 iFrame Portlet 时需要处理的一些问题。 </p>
            <p><a name="N1010D"><span class="smalltitle">防止名称冲突 </span></a></p>
            <p>必须对 iFrame 名称进行编码，以防止在页面上存在 Portlet 的多个实例时出现冲突。使用命名空间对此名称进行编码，如清单 1 中所示。</p>
            <p><br />
            <a name="N1011C"><strong>清单 1. 使用命名空间对 iFrame 名称进行编码</strong></a><br />
            <table cellspacing="0" cellpadding="0" width="100%" border="0">
                <tbody>
                    <tr>
                        <td class="code-outline">
                        <pre class="displaycode">
                        &lt;iframe name="&lt;portletAPI:encodeNamespace value='myapp_IFrame&#8217; /&gt;"
                        width="100" height="100"
                        href="http://www.somesite.com/app.html"/&gt;</pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br />
            </p>
            <p><a name="N10123"><span class="smalltitle">处理会话超时</span></a></p>
            <p>当向 Portlet 添加 iFrame 时，必须对会话超时的可能性进行管理。如果用户花费太多的时间在 iFrame 内进行交互，门户会话可能会超时，具体取决于为门户服务器会话设置的超时值。 </p>
            <p>可以使用隐藏 iFrame 或 AJAX 在 Portlet 内刷新门户页，从而解决此问题。 </p>
            <p>清单 2 显示了如何在 Portlet 内使用隐藏 iFrame 刷新页面</p>
            <p><br />
            <a name="N10138"><strong>清单 2. 使用隐藏 iFrame 刷新页面</strong></a><br />
            <table cellspacing="0" cellpadding="0" width="100%" border="0">
                <tbody>
                    <tr>
                        <td class="code-outline">
                        <pre class="displaycode">
                        &lt;script&gt;
                        var wps_PortalTimer= setInterval("wps_PokeTheSession();", 1740000);
                        function wps_PokeTheSession()
                        {
                        if ( window.frames['wps_BackgroundRefresher'] )
                        {
                        window.frames['wps_BackgroundRefresher'].location=document.location;
                        //Now you can either throw away the iframe contents after it loads,
                        //or you can update the current DOM with the new content for the portlets.
                        }
                        }
                        &lt;/script&gt;
                        &lt;iframe name="wps_BackgroundRefresher" width="0" id="wps_BackgroundRefresher" /&gt;</pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br />
            </p>
            <p>清单 3 显示了相应的 AJAX 方法，该方法将使用 <code>XMLHttpRequest</code> 调用在 Portlet 内刷新门户页。 </p>
            <br />
            <a name="N10149"><strong>清单 3. 使用隐藏 AJAX 刷新页面</strong></a><br />
            <table cellspacing="0" cellpadding="0" width="100%" border="0">
                <tbody>
                    <tr>
                        <td class="code-outline">
                        <pre class="displaycode">
                        &lt;script&gt;
                        var wps_PortalTimer= setInterval("wps_PokeTheSession();", 1740000);
                        var wps_ajaxRequest;
                        function wps_ProcessRequest()
                        {
                        if (wps_ajaxRequest.readyState == 4)
                        {
                        //Now you can either throw away the contents,
                        //or you can update the current DOM with the new content
                        //for the portlets.
                        }
                        }
                        function wps_PokeTheSession()
                        {
                        // Mozilla way
                        if (window.XMLHttpRequest)
                        {
                        wps_ajaxRequest = new XMLHttpRequest();
                        wps_ajaxRequest.onreadystatechange = wps_ProcessRequest;
                        wps_ajaxRequest.open("GET", document.location, true);
                        wps_ajaxRequest.send(null);
                        // IE way
                        }
                        else if (window.ActiveXObject)
                        {
                        wps_ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP");
                        if (wps_ajaxRequest)
                        {
                        wps_ajaxRequest.onreadystatechange = wps_ProcessRequest;
                        wps_ajaxRequest.open("GET", document.location, true);
                        wps_ajaxRequest.send();
                        }
                        }
                        }
                        &lt;/script&gt;</pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br />
            <p>同样，对于 iFrames Portlet，需要对所有相应内容使用命名空间。即，对每个 JavaScript 变量、JavaScript 函数名称、iFrame 名称和 iFrame ID 都要使用 <code>encodeNamespace</code> Portlet 标记。例如：</p>
            <p><code>var &lt;portletAPI:encodeNamespace value=' wps_PortalTimer ' /&gt; = setInterval("&lt;portletAPI:encodeNamespace value=' wps_PokeTheSession ' /&gt; ();", 1740000);</code> </p>
            <p><a name="N1015D"><span class="smalltitle">域外的身份验证</span></a></p>
            <p>对于涉及到域外的 iFrame 的身份验证，目前并没有真正的解决方案可用，因为浏览器会尝试保护用户。出于安全考虑，很多浏览器都不允许 iFrame 或 <code>XMLHttpRequest</code> 访问主浏览器请求域之外的其他域。因此，您需要确保 iFrame 所嵌入到的应用程序与门户服务器属于相同的域。</p>
            <p>如果站点要求身份验证，则必须对其他应用程序进行自己的自定义表单身份验证或基本身份验证。如果应用程序使用 Header，则在生成 iFrame 时，代码可以读取 HTTP Header 并将其转发到后端应用程序。Cookie 转发也是如此。</p>
            <p><a name="N1016E"><span class="smalltitle">状态管理</span></a></p>
            <p>使用 iFrame Portlet 时，浏览器的&#8220;后退&#8221;、&#8220;前进&#8221;和&#8220;刷新&#8221;按钮会导致操作不一致。如果用户单击&#8220;重载&#8221;/&#8220;刷新&#8221;按钮，将重新生成整个浏览器页，从而会丢失所有 JavaScript 状态信息。为了解决此问题，可以使用众多持久性方法中的一种，如 Cookie、表单字段等。另外，由于会重新生成整个页面，因此主题将使用原始 URL 创建 iFrame。如果此站点不使用 Cookie 或其他方法维护状态，iFrame 生成操作还需要重新生成目标信息。 </p>
            <p>对于浏览器的&#8220;后退&#8221;按钮，如果 iFrame 的状态发生更改而更新浏览历史，则可能会正常工作。而将给用户带来困扰的是，当使用 WebSphere Portal 和 iFrame 时，浏览器历史可能不能按照预期的方式进行显示。我们的经验表明，即使是同一门户中的两个用户也可能期望得到不同的结果。</p>
            <p><a name="wclip"><span class="atitle">使用 Web Clipping Portlet</span></a></p>
            <p>将 Web 应用程序集成到门户中的另一个解决方案是使用 IBM Web Clipping Portlet 创建自己的剪辑 Portlet（也称为 <em>Web Clipper</em>）。可以使用 Web Clipping Editor 创建 Web Clipper，如图 2 中所示。要使用 Web Clipping Editor，请打开 <strong>WebSphere Portal Administrative </strong>页，然后展开 <strong>Portlet Management</strong>。</p>
            <br />
            <a name="fig2"><strong>图 2. Web Clipping Editor</strong></a><br />
            <img height="268" alt="Web Clipping Editor" src="http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0607_boezeman/images/figure2.jpg" width="502" /> <br />
            <p>可以使用 Web Clipper 在 Portlet 中显示文档的特定部分。还可以使用其进行以下工作：</p>
            <ol>
                <li>添加参数来指定额外的 Header
                <li>使用 URL 重写
                <li>访问防火墙后的内容
                <li>将特定 Cookie 从客户机-门户对话复制到门户-原始服务器对话中。
                <li>指定缓存超时
                <li>在页面上启用其他 Portlet，以重置 Web Clipping Portlet 状态 </li>
            </ol>
            <p>Web Clipping Portlet 具有以下限制：</p>
            <ul>
                <li>有些站点超出了页面尾部。虽然 Web Clipping Editor 设计用于处理各种网站编码技术，但并不能处理出现的所有情况。如果遇到了其设计能力无法处理的网站，结果可能并不会是您所预期的。如果一个页面上有两个 Web Clipping Portlet，JavaScript 名称可能会冲突。另外，所剪辑内容和另一个 Portlet 及主题间可能出现 JavaScript 名称和命名空间冲突。
                <li>Web Clipping Portlet 已得到增强，在处理 JavaScript 方面更为可靠和稳定。不过，存在外部站点 JavaScript 会导致意外行为的情况。例如，当使用相对 URL 进行 JavaScript 编码时，可能会由于未修改 JavaScript 内的 URL 而遇到问题。当站点对使用 DHTML 的页面结构的特定层次或浏览器特定功能具有依赖性时，也会出现不可预见的结果。
                <li>来自 Web Clipper 的链接可能会存在行为不规范的情况，从而可能会将用户带到 iFrame 甚至门户外的位置。例如，应用程序可能存在将每个 URL 重写到 Clipper Portlet 时未检测到的链接。
                <li>HTML 分析器希望接收到格式正确的 HTML。格式存在问题的 HTML 可能会导致显示意外的结果。 </li>
            </ul>
            <p>与 Web Page Portlet 相比，Web Clipping Portlet 在处理外部站点方面成熟得多。它能更好地处理 JavaScript，且支持反向代理，因此用户能从防火墙后访问内容；此外，它的身份验证机制也更为成熟。不过，在使用 Web Cliping Portlet 时可能遇到一些与 Portlet 技术或 WebSphere Portal 完全无关的问题。</p>
            <p>Web Clipping Portlet 直接从外部站点接收标记和 JavaScript，它必须对代码进行调整，以便能够在整个聚合页面上共存。WebSphere Portal 无法控制来自外部站点的代码的质量，也不能保证与聚合到页面上的其他外部站点代码的兼容性。因此，Web Clipping Portlet 的灵活性完全依赖于所剪辑的外部站点代码的质量。它最初的时候可能很可靠；不过，如果使用格式存在问题的 HTML、与页面上的另一个外部站点具有相同名称的 JavaScript 变量或包含相对 URL 的 JavaScript 对外部站点进行了更新，则 Portlet 可能生成不一致的结果。</p>
            <br />
            <table cellspacing="0" cellpadding="0" width="100%" border="0">
                <tbody>
                    <tr>
                        <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
                        <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
                    </tr>
                </tbody>
            </table>
            <table class="no-print" cellspacing="0" cellpadding="0" align="right">
                <tbody>
                    <tr align="right">
                        <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
                        <table cellspacing="0" cellpadding="0" border="0">
                            <tbody>
                                <tr>
                                    <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                                    </td>
                                    <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0607_boezeman/0607_boezeman.html#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br />
            <br />
            <p><a name="N101CD"><span class="atitle">IBM WebSphere Portlet Factory</span></a></p>
            <p>一致地确保聚合和呈现时聚合标记的稳健性、可伸缩性、准确性和可靠性的唯一方法是，直接从 Portlet 生成。当然，这意味着必须编写自定义 Portlet。</p>
            <p>现在编写自定义 Portlet 的过程已经变得更为简单了。IBM Rational Application Developer（或 Rational Software Architect）提供了多个向导类帮助您构造 Portlet。此外，IBM 还在今年推出了 WebSphere Portlet Factory，提供了一个快速应用程序开发备选方案来帮助开发人员快速开发 Portlet。可以使用 Rational Application Developer 或 Eclipse 插件 WebSphere Portlet Factory Designer 来创建 WebSphere Portlet Factory Portlet。</p>
            <p>WebSphere Portlet Factory Portlet Development 范式与标准 Portlet 开发范式不同。它存在一个学习过程；掌握了这种方法后，就可以快速开发和测试复杂的 Portlet。另外，此方法仅需要很少的 J2EE 知识。</p>
            <p>通过使用 WebSphere Portlet Factory Designer 工具，可以通过将预先构建的组件（称为&#8220;构建块&#8221;）快速组合到一起来构建组合应用程序。可以使用标准构建块（Portlet Factory 提供了 70 个即时可用的构建块）或编写自己的构建块。可以将构建块组装为模型，就像将 Portlet 组装为组合应用程序一样。在运行时，此模型将生成应用程序代码，包括 JSP、Java 类和 XML 文档。您所进行的工作实际上就是捕获和自动构建动态 Portlet 的流程。模型打包为 WAR 文件，因此，从 WebSphere Portal 的角度而言，它就是一个 Portlet 应用程序。</p>
            <p>WebSphere Portlet Factory 提供了对 JSR 168、WSRP、单点登录集成、凭据、Portlet 到 Portlet 通信等的全面支持，实现了与 SAP、数据库、Peoplesoft、Domino、Seibel、Excel 工作表等的无缝集成。</p>
            <br />
            <table cellspacing="0" cellpadding="0" width="100%" border="0">
                <tbody>
                    <tr>
                        <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
                        <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
                    </tr>
                </tbody>
            </table>
            <table class="no-print" cellspacing="0" cellpadding="0" align="right">
                <tbody>
                    <tr align="right">
                        <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
                        <table cellspacing="0" cellpadding="0" border="0">
                            <tbody>
                                <tr>
                                    <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                                    </td>
                                    <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0607_boezeman/0607_boezeman.html#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br />
            <br />
            <p><a name="N101E3"><span class="atitle">结束语</span></a></p>
            <p>有很多解决方案支持快速将 Web 应用程序集成到 WebSphere Portal 中。这既包括快速但并非最佳的 iFrame，也包括 Web Clipping Portlet，还包括新 IBM WebSphere Portlet Factory。每个解决方案都有自己的优点和缺陷。iFrame 是一个很有价值的工具，但需要注意它们的限制，并要事先进行计划。</p>
            <br />
            <table cellspacing="0" cellpadding="0" width="100%" border="0">
                <tbody>
                    <tr>
                        <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
                        <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
                    </tr>
                </tbody>
            </table>
            <table class="no-print" cellspacing="0" cellpadding="0" align="right">
                <tbody>
                    <tr align="right">
                        <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
                        <table cellspacing="0" cellpadding="0" border="0">
                            <tbody>
                                <tr>
                                    <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                                    </td>
                                    <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0607_boezeman/0607_boezeman.html#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br />
            <br />
            <p><a name="N101ED"><span class="atitle">致谢</span></a></p>
            <p>作者感谢 Scott DeWitt 和 Usman Memon 为撰写本文提供的帮助。</p>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.cnblogs.com/kentyshang/aggbug/1214929.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43000/" target="_blank">[新闻]Firefox 3.1 Beta</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item></channel></rss>