用户操作
[留言]  [发消息]  [加为好友] 
订阅我的博客
XML聚合    FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
Steven_zhao的公告
<center> <!-- 中国农历开始 --> <SCRIPT language=JavaScript><!-- var lunarInfo=new Array( 0x04bd8,0x04ae0,0x0a570,0x054d5,0x0d260,0x0d950,0x16554,0x056a0,0x09ad0,0x055d2, 0x04ae0,0x0a5b6,0x0a4d0,0x0d250,0x1d255,0x0b540,0x0d6a0,0x0ada2,0x095b0,0x14977, 0x04970,0x0a4b0,0x0b4b5,0x06a50,0x06d40,0x1ab54,0x02b60,0x09570,0x052f2,0x04970, 0x06566,0x0d4a0,0x0ea50,0x06e95,0x05ad0,0x02b60,0x186e3,0x092e0,0x1c8d7,0x0c950, 0x0d4a0,0x1d8a6,0x0b550,0x056a0,0x1a5b4,0x025d0,0x092d0,0x0d2b2,0x0a950,0x0b557, 0x06ca0,0x0b550,0x15355,0x04da0,0x0a5d0,0x14573,0x052d0,0x0a9a8,0x0e950,0x06aa0, 0x0aea6,0x0ab50,0x04b60,0x0aae4,0x0a570,0x05260,0x0f263,0x0d950,0x05b57,0x056a0, 0x096d0,0x04dd5,0x04ad0,0x0a4d0,0x0d4d4,0x0d250,0x0d558,0x0b540,0x0b5a0,0x195a6, 0x095b0,0x049b0,0x0a974,0x0a4b0,0x0b27a,0x06a50,0x06d40,0x0af46,0x0ab60,0x09570, 0x04af5,0x04970,0x064b0,0x074a3,0x0ea50,0x06b58,0x055c0,0x0ab60,0x096d5,0x092e0, 0x0c960,0x0d954,0x0d4a0,0x0da50,0x07552,0x056a0,0x0abb7,0x025d0,0x092d0,0x0cab5, 0x0a950,0x0b4a0,0x0baa4,0x0ad50,0x055d9,0x04ba0,0x0a5b0,0x15176,0x052b0,0x0a930, 0x07954,0x06aa0,0x0ad50,0x05b52,0x04b60,0x0a6e6,0x0a4e0,0x0d260,0x0ea65,0x0d530, 0x05aa0,0x076a3,0x096d0,0x04bd7,0x04ad0,0x0a4d0,0x1d0b6,0x0d250,0x0d520,0x0dd45, 0x0b5a0,0x056d0,0x055b2,0x049b0,0x0a577,0x0a4b0,0x0aa50,0x1b255,0x06d20,0x0ada0) var Animals=new Array("鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"); var Gan=new Array("甲","乙","丙","丁","戊","己","庚","辛","壬","癸"); var Zhi=new Array("子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"); var now = new Date(); var SY = now.getYear(); var SM = now.getMonth(); var SD = now.getDate(); //==== 传入 offset 传回干支, 0=甲子 function cyclical(num) { return(Gan[num%10]+Zhi[num%12])} //==== 传回农历 y年的总天数 function lYearDays(y) { var i, sum = 348 for(i=0x8000; i>0x8; i>>=1) sum += (lunarInfo[y-1900] & i)? 1: 0 return(sum+leapDays(y)) } //==== 传回农历 y年闰月的天数 function leapDays(y) { if(leapMonth(y)) return((lunarInfo[y-1900] & 0x10000)? 30: 29) else return(0) } //==== 传回农历 y年闰哪个月 1-12 , 没闰传回 0 function leapMonth(y) { return(lunarInfo[y-1900] & 0xf)} //====================================== 传回农历 y年m月的总天数 function monthDays(y,m) { return( (lunarInfo[y-1900] & (0x10000>>m))? 30: 29 )} //==== 算出农历, 传入日期物件, 传回农历日期物件 // 该物件属性有 .year .month .day .isLeap .yearCyl .dayCyl .monCyl function Lunar(objDate) { var i, leap=0, temp=0 var baseDate = new Date(1900,0,31) var offset = (objDate - baseDate)/86400000 this.dayCyl = offset + 40 this.monCyl = 14 for(i=1900; i<2050 && offset>0; i++) { temp = lYearDays(i) offset -= temp this.monCyl += 12 } if(offset<0) { offset += temp; i--; this.monCyl -= 12 } this.year = i this.yearCyl = i-1864 leap = leapMonth(i) //闰哪个月 this.isLeap = false for(i=1; i<13 && offset>0; i++) { //闰月 if(leap>0 && i==(leap+1) && this.isLeap==false) { --i; this.isLeap = true; temp = leapDays(this.year); } else { temp = monthDays(this.year, i); } //解除闰月 if(this.isLeap==true && i==(leap+1)) this.isLeap = false offset -= temp if(this.isLeap == false) this.monCyl ++ } if(offset==0 && leap>0 && i==leap+1) if(this.isLeap) { this.isLeap = false; } else { this.isLeap = true; --i; --this.monCyl;} if(offset<0){ offset += temp; --i; --this.monCyl; } this.month = i this.day = offset + 1 } function YYMMDD(){ var cl = '<font color="#0000df" STYLE="font-size:9pt;">'; if (now.getDay() == 0) cl = '<font color="#c00000" STYLE="font-size:9pt;">'; if (now.getDay() == 6) cl = '<font color="#00c000" STYLE="font-size:9pt;">'; return(cl+SY+'年'+(SM+1)+'月'+SD+'日</font>'); } function weekday(){ var day = new Array("星期日","星期一","星期二","星期三","星期四","星期五","星期六"); var cl = '<font color="#ff0000" STYLE="font-size:9pt;">'; if (now.getDay() == 0) cl = '<font color="#c00000" STYLE="font-size:9pt;">'; if (now.getDay() == 6) cl = '<font color="#00c000" STYLE="font-size:9pt;">'; return(cl+ day[now.getDay()]+ '</font>'); } //==== 中文日期 function cDay(m,d){ var nStr1 = new Array('日','一','二','三','四','五','六','七','八','九','十'); var nStr2 = new Array('初','十','廿','卅',' '); var s; if (m>10){s = '十'+nStr1[m-10]} else {s = nStr1[m]} s += '月' switch (d) { case 10:s += '初十'; break; case 20:s += '二十'; break; case 30:s += '三十'; break; default:s += nStr2[Math.floor(d/10)]; s += nStr1[d%10]; } return(s); } function solarDay1(){ var sDObj = new Date(SY,SM,SD); var lDObj = new Lunar(sDObj); var cl = '<font color="violet" STYLE="font-size:9pt;">'; var tt = '【'+Animals[(SY-4)%12]+'】'+cyclical(lDObj.monCyl)+'月 '+cyclical(lDObj.dayCyl++)+'日' ; return(cl+tt+'</font>'); } function solarDay2(){ var sDObj = new Date(SY,SM,SD); var lDObj = new Lunar(sDObj); var cl = '<font color="#000066" STYLE="font-size:9pt;">'; //农历BB'+(cld[d].isLeap?'闰 ':' ')+cld[d].lMonth+' 月 '+cld[d].lDay+' 日 var tt = cyclical(SY-1900+36)+'年 '+cDay(lDObj.month,lDObj.day); return(cl+tt+'</font>'); } function solarDay3(){ var sTermInfo = new Array(0,21208,42467,63836,85337,107014,128867,150921,173149,195551,218072,240693,263343,285989,308563,331033,353350,375494,397447,419210,440795,462224,483532,504758) var solarTerm = new Array("小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至") var lFtv = new Array("0101*春节","0115 元宵节","0505 端午节","0707 七夕情人节","0715 中元节","0815 中秋节","0909 重阳节","1208 腊八节","1224 小年","0100*除夕") var sFtv = new Array("0101*元旦","0214 情人节","0308 妇女节","0309 偶今天又长一岁拉","0312 植树节","0315 消费者权益日","0401 愚人节","0418 MM的生日","0501 劳动节","0504 青年节","0512 护士节","0601 儿童节","0701 建党节 香港回归纪念", "0801 建军节","0808 父亲节","0909 毛泽东逝世纪念","0910 教师节","0928 孔子诞辰","1001*国庆节", "1006 老人节","1024 联合国日","1112 孙中山诞辰","1220 澳门回归纪念","1225 圣诞节","1226 毛泽东诞辰") var sDObj = new Date(SY,SM,SD); var lDObj = new Lunar(sDObj); var lDPOS = new Array(3) var festival='',solarTerms='',solarFestival='',lunarFestival='',tmp1,tmp2; //农历节日 for(i in lFtv) if(lFtv[i].match(/^(\d{2})(.{2})([\s\*])(.+)$/)) { tmp1=Number(RegExp.$1)-lDObj.month tmp2=Number(RegExp.$2)-lDObj.day if(tmp1==0 && tmp2==0) lunarFestival=RegExp.$4 } //国历节日 for(i in sFtv) if(sFtv[i].match(/^(\d{2})(\d{2})([\s\*])(.+)$/)){ tmp1=Number(RegExp.$1)-(SM+1) tmp2=Number(RegExp.$2)-SD if(tmp1==0 && tmp2==0) solarFestival = RegExp.$4 } //节气 tmp1 = new Date((31556925974.7*(SY-1900)+sTermInfo[SM*2+1]*60000)+Date.UTC(1900,0,6,2,5)) tmp2 = tmp1.getUTCDate() if (tmp2==SD) solarTerms = solarTerm[SM*2+1] tmp1 = new Date((31556925974.7*(SY-1900)+sTermInfo[SM*2]*60000)+Date.UTC(1900,0,6,2,5)) tmp2= tmp1.getUTCDate() if (tmp2==SD) solarTerms = solarTerm[SM*2] if(solarTerms == '' && solarFestival == '' && lunarFestival == '') festival = ''; else festival = '<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=0 BGCOLOR="#CCFFCC"><TR><TD>'+ '<FONT COLOR="#000000" STYLE="font-size:9pt;">'+solarTerms + ' ' + solarFestival + ' ' + lunarFestival+'</FONT></TD>'+ '</TR></TABLE>'; var cl = '<font color="#000066" STYLE="font-size:9pt;">'; return(cl+festival+'</font>'); } function setCalendar(){ document.write('<table align=center CELLPADDING=2 CELLSPACING=0 border=1><tr><td bgcolor=#FEFEEF><table border=0 CELLPADDING=0 CELLSPACING=0><tr><td align=center>'); document.write(YYMMDD()+'&nbsp;&nbsp;'+weekday()); document.write('</td></tr>'); document.write('<tr><td align=center>'); document.write(solarDay1()); document.write('</td></tr><tr><td align=center>'); document.write(solarDay2()); document.write('</td></tr><tr><td>'); document.write(solarDay3()); document.write('</td></tr></table></td></tr></table>'); } setCalendar(); //--></SCRIPT> <!-- 中国农历结束 --> <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" width="150" height="150" align="middle"> <param name="movie" value="http://bbs.smgbb.cn/Skins/Default/clock.swf"> <param name="quality" value="high"> <param name="WMODE" value="transparent"> <embed src="http://bbs.smgbb.cn/Skins/Default/clock.swf" width="150" height="150" align="middle" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" scale="noborder" bgcolor="#E4E8EF"></embed> </object> </center>
文章分类
技术网站
LDAP(RSS)
军事天地
军事天下(RSS)
拾乐园
国内新闻(RSS)
网络文学
移动通信
友情连接
http://blog.vckbase.com/null(RSS)
linux中国(RSS)
linux中国(RSS)
mobilechannel的专栏(RSS)
存档

原创  迁移 portlet 收藏

WebSphere Portal 版本 4.1 的 Portlet API 更改成与 J2EE 规范一致。所有 portlet 是从 Servlet API 的 HttpServlet 类的扩展,并且把所有 portlet 作为 servlet 部署。如果要部署 WebSphere Portal Server 版本 1.2 或 2.1 的 portlet,阅读下列章节确定如何迁移 portlet 来使用新的 Portlet API。

更改到 Portlet API

要提供功能增强并移动 Portlet API 到标准 API 实现,IBM 更新了 Portlet API。WebSphere Portal 4.1 中一些新的 API 的突出显示包含:

  • 遵从 J2EE 规范
  • 与应用程序服务器更紧密地集成
  • 增强的 portlet 消息传递。现在 portlet 可以使用 DefaultPortletMessage 类发送消息到其它 portlet 应用程序中的 portlet。发送 portlet 的消息和接收 portlet 的消息必须位于相同的门户网站页面上。

下列类和方法更改:

方法 更改 注释
Event getPortlet() Deprecated 请参阅事件 Javadoc
PortletConfig getAttribute() Changed 使用 getInitParameter()
PortletContext Send Deprecated 请参阅 PortletContext Javadoc 以获得新的方法签名
PortletData removeAllAttributes() Deprecated 无替换
PortletRequest getUser() Added  
PortletRequest getPortletSettings() Added PortletSettings 是 portlet 的配置数据。PortletData 仍然是存储用户设置和值的地方。
PortletRequest getSession() Changed 现在 getPortletSession()
PortletResponse encodeURI() Deprecated 使用 encodeURL()
PortletResponse getCharacterSet() Deprecated 使用 getCharacterEncoding()
PortletSession getUser() Deprecated 使用 PortletRequest.getUser()
PortletApplicationSettings   Added 管理由门户网站管理员更新的 portlet 应用程序设置
PortletSettings   Added 管理由门户网站管理员更新的 portlet 设置
SaxPortlet   Removed 不再支持此类。

管理 portlet 配置数据

在早期版本中,PortletRequestPortletResponsePortletSession 指不从它们的 servlet 变体对象继承的离散对象。在 WebSphere Portal 4.1 中,这些对象直接从它们的 servlet 变体对象继承,按如下所示:

WebSphere Portal
版本 V1.2 和 V 2.1

  WebSphere Portal V4.1  
  double right arrow PortletContext 由开发者设置:只读
PortletContext
   
PortletApplicationSettings 初始由开发者设置:可以由
管理员更改
 

  double right arrow PortletConfig 由开发者设置:只读
PortletConfig
   
PortletSettings 初始由开发者设置:可以由
管理员更改,可读/写。
 

在以前版本中,视图方式下的 portlet 可以在 PortletData 对象中和 portlet 事件处理期间存储数据。版本 4.1 中,portlet 仅当 portlet 处于编辑方式时可以在 PortletData 对象中存储值。如果 portlet 没有在编辑方式下而试图更新这些值,会出现异常。请参阅 Portlet API 以获取关于这些对象的详细信息。

迁移 Java 源代码

Portlet 接口由抽象的 Portlet 类替换。抽象的 Portlet 类的方法进行了更改,需要对任何直接扩展该类的 portlet 的更改。然而,Portlet 不应该从 Portlet 类直接继承。相反,portlet 应该扩展帮助器类,如 AbstractPortlet、MVCPortlet,或 PortletAdapter。跨越门户网站的发行版维护这些类的方法和签名。

实例或现有 portlet 的扩展的 portlet,或使用裁剪 portlet 创建的 portlet 不需要迁移。

访问用户主题

JAAS 用户主题的检索已更改。在 WebSphere Portal Server 2.1 中,portlet 通过获取用户主题的引用来访问用户的安全性信息。

  PortletSession session = portletRequest.getSession();  // Get the Portlet Session

  org.apache.jetspeed.portletcontainer.UserImpl          // Get the User Object 
    user =(org.apache.jetspeed.portletcontainer.UserImpl) session.getUser();

  Subject subject = user.getSubject();                   // Next, grab the Subject

在 WebSphere Portal 4.1 中,从 PortletContext 访问用户主题。下例演示如何获取用户主题的引用:

import org.apache.jetspeed.portlet.*;
  import com.ibm.wps.portletservice.credentialvault.CredentialVaultService;
  import javax.security.auth.Subject;

  PortletContext         context = this.getPortletConfig().getContext();
  CredentialVaultService service = (CredentialVaultService) context.getService(CredentialVaultService.class);

  Subject userSubject = service.getUserSubject(portletRequest);

一旦检索用户主题的引用,还可以检索用户凭证的信息和用户主题的其它信息。要获取进一步的信息,请参阅Portlet 安全性

计算请求、响应和会话对象

在早期版本中,PortletRequestPortletResponsePortletSession 为离散对象,不继承它们的 servlet 变体对象。可能需要在 portlet 中计算这些 portlet 对象之一,按如下所示:

  HttpServletRequest httpRequest = ((PortletRequestImpl) request).getServletRequest();
  HttpServletResponse httpResponse = ((PortletResponseImpl) response).getServletResponse();
  HttpSession hSession = ((PortletSessionImpl) session).getHttpSession();

在 WebSphere Portal 4.1 中,这些对象从它们的 servlet 变体对象继承,按如下所示。

Portlet 对象 Servlet 对象
PortletSession HttpSession
PortletRequest HttpRequest
PortletResponse HttpResponse

既然 portlet 对象是 servlet 对象的直接子代,不需要计算来派生 servlet 对象。仅直接使用对象。

 PortletSession  myPortletSession = request.getSession();

 String  myServletID = myPortletSession.getID();  // HttpSession.getID() 

迁移 JSP

在早期版本中,portlet 容器重新定义了 JSP 中通过 PortletContext.include 方法调用的一些标准 JSP 标记的语义。例如,对于 <jsp:useBean scope="request">,bean 存储在 PortletRequest 而不是 HttpServletRequest。

对于 WebSphere Portal 4.1,JSP 1.1 规范中的标记如规范中定义的那样进行处理,甚至当运行在 portlet 容器的上下文中也如此。portlet JSP 标记库有更改。<encodeURI> 标记被取消;应该使用 portletResponse 的 encodeURL() 方法替代。请参阅使用 Portlet API 标记以获取完整信息。

迁移 portlet 部署描述符

因为现在 portlet 被作为 Web 应用程序下列 J2EE 型号封装,所以需要附加的部署描述符。Web 应用程序部署描述符包含标识 portlet 作为 Web 应用程序中的 servlet 所必需的信息。servlet 标识由 <portlet> 标记的 HREF 属性映射到 portlet 部署描述符中的 portlet。

而且,根据具体 portlet 和具体 portlet 应用程序的介绍,portlet 部署描述符也已经更改。portlet 应用程序中每个 <portlet> 标记仍然包含 <portlet-name>、<allows>、<cache> 和 <supports> 标记。移动 <default-locale>、<language> 和 <config-param> 标记来定义具体 portlet。<context-param> 是 <concrete-portlet-app> 元素的一部分。这允许一个 portlet 以多种方法配置而无须创建多个 portlet 实例。

请参阅部署描述符以获取更多的信息。

迁移 portlet 软件包

portlet 现在封装在 WAR 文件中。在最小值情况下,需要重新封装 portlet。portlet WAR 中的目录结构和 J2EE web 应用程序的目录结构一致。在以前版本中,诸如 Java 类和 JAR 文件的受保护资源,存储在 /PORTLET-INF 目录中。受保护资源现在存储在 /WEB-INF 目录中。

要获取更多的信息,请参阅封装和部署 portlet


发表于 @ 2004年11月11日 11:20:00 | 评论( loading... ) | 编辑| 举报| 收藏

旧一篇:Portlet 安全性 | 新一篇:最常用口语1000句(1-500)

  • 发表评论
  • 评论内容:
  •  
Copyright © Steven_zhao
Powered by CSDN Blog