談笑有鴻儒,往來無白丁

          在恰當(dāng)?shù)臅r間、地點以恰當(dāng)?shù)姆绞奖磉_(dá)給恰當(dāng)?shù)娜?..  閱讀的時候請注意分類,佛曰我日里面是談笑文章,其他是各個分類的文章,積極的熱情投入到寫博的隊伍中來,支持blogjava做大做強(qiáng)!向dudu站長致敬>> > 我的微博敬請收聽
          IBM Portal 開發(fā)系列講座:

          開發(fā)登錄并讀取OA用戶郵箱信息的portlet

          IBM China SoftWare Development Lab 鄭文平

          內(nèi)容簡介:

          我們用ibm自帶的開發(fā)工具WSAD(已安裝portlet toolkit包),開發(fā)一個Portlet,實現(xiàn)以下功能:
          l 用戶從這個portlet登錄,登錄成功后讀取該用戶在OA服務(wù)器上的郵件系統(tǒng),并返回個人郵件信息、歡迎信息,轉(zhuǎn)入并顯示在指定頁面;
          l 用戶不能從Portal系統(tǒng)原登錄頁面登錄。即:如果用戶驗證失敗,系統(tǒng)將返回到該登錄portlet,而非系統(tǒng)自帶的登錄頁面;
          l 用戶可以從這個portlet直接進(jìn)入到指定的任意邏輯、物理頁面。

          其數(shù)據(jù)流轉(zhuǎn)是這樣的:

          [開發(fā)過程]

          1、首先編寫這個類,用來讀取OA系統(tǒng)中任一用戶的郵件系統(tǒng):

          package youjiantishi;

          /**
          * 這個類用來讀取某一用戶的郵件內(nèi)容:
          *
          * 維護(hù):zhengwp@dhcc.com.cn 鄭文平
          *
          * 編碼:趙建業(yè) 時間:2004年11月
          */

          import java.util.*;
          import java.io.*;
          import javax.mail.*;
          import javax.mail.event.*;
          import javax.mail.internet.*;
          import javax.activation.*;

          public class msgOAshow {

          static String protocol;
          static String host = null;
          static String user = null;
          static String password = null;
          static String mbox = null;
          static String url = null;
          static int port = -1;
          static boolean verbose = false;
          static boolean debug = false;
          static boolean showStructure = false;
          static boolean showMessage = false;
          static boolean showAlert = false;
          static boolean saveAttachments = false;
          static int attnum = 1;
          static int dhcc_totalmsg=0;
          static int dhcc_newmsg=0;

          public int get_total()
          {
          return dhcc_totalmsg;
          }
          public int get_new()
          {
          return dhcc_newmsg;
          }

          public msgOAshow()
          {
          java.io.InputStream inputstream = getClass().getResourceAsStream("mailaddress.properties");
          Properties properties = new Properties();
          try
          {
          properties.load(inputstream);
          }
          catch(Exception exception)
          {
          System.err.println("Can not read the properties file. Make sure db.properties is in the CLASSPATH");
          return;
          }
          host = properties.getProperty("address", "localhost");
          protocol=properties.getProperty("protocol", "pop3");
          mbox=properties.getProperty("mbox", "INBOX");

          }

          public static int getEmailMain(String argv[]) {
          int msgnum = -1;
          int optind;
          user=argv[0];
          password=argv[1];

          try {

          // Get a Properties object
          Properties props = System.getProperties();

          // Get a Session object
          Session session = Session.getInstance(props, null);
          session.setDebug(debug);


          // Get a Store object
          Store store = null;
          if (url != null) {
          URLName urln = new URLName(url);
          store = session.getStore(urln);
          if (showAlert) {
          store.addStoreListener(new StoreListener() {
          public void notification(StoreEvent e) {
          String s;
          if (e.getMessageType() == StoreEvent.ALERT)
          s = "ALERT: ";
          else
          s = "NOTICE: ";
          //System.out.println(s + e.getMessage());
          }
          });
          }
          store.connect();
          } else {
          if (protocol != null)
          store = session.getStore(protocol);
          else
          store = session.getStore();

          // Connect
          if (host != null || user != null || password != null)
          store.connect(host, port, user, password);
          else
          store.connect();
          }


          // Open the Folder

          Folder folder = store.getDefaultFolder();
          if (folder == null) {
          //System.out.println("No default folder");
          //System.exit(1);
          return -1;
          }

          if (mbox == null)
          mbox = "INBOX";
          folder = folder.getFolder(mbox);
          if (folder == null) {
          //System.out.println("Invalid folder");
          //System.exit(1);
          return -1;
          }

          // try to open read/write and if that fails try read-only
          try {
          folder.open(Folder.READ_WRITE);
          } catch (MessagingException ex) {
          folder.open(Folder.READ_ONLY);
          }
          int totalMessages = folder.getMessageCount();

          if (totalMessages == 0) {
          //System.out.println("Empty folder");
          folder.close(false);
          store.close();
          dhcc_totalmsg=0;
          dhcc_newmsg=0;
          return 0;
          //System.exit(1);
          }

          int newMessages = folder.getNewMessageCount();
          System.out.println("Total messages = " + totalMessages);
          System.out.println("New messages = " + newMessages);
          //System.out.println("-------------------------------");
          dhcc_totalmsg=totalMessages;
          dhcc_newmsg=newMessages;



          folder.close(false);
          store.close();
          } catch (Exception ex) {
          System.out.println("Oops, got exception! " + ex.getMessage());
          //ex.printStackTrace();
          //System.exit(1);
          return -2;
          }
          return 0;
          }


          }

          2、用WSAD開發(fā)一個使用憑證保險庫的portlet,最好選用共享保險槽。接下來,在Portlet的View.jsp頁面中我們提供用戶登錄表單(表單源代碼略):
          <wps:if loggedIn="no"> //如果用戶沒有登錄,我們顯示為登錄表單:

          該表單接收到用戶名和密碼后,提交到ChenkLogin.jsp文件。
          <wps:if loggedIn="yes"> //當(dāng)用戶登錄后,調(diào)用這個類讀取OA系統(tǒng):
          <jsp:useBean id="msgOAshow" scope="page" class="youjiantishi.msgOAshow"/>
          <%
          String MyName=(String)(session.getAttribute("userid"));
          String MyPass=(String)session.getAttribute("password");
          String argv[]=new String[2];
          argv[0]=MyName;
          argv[1]=MyPass;
          boolean b_flag=false;
          int i=msgOAshow.getEmailMain(argv);
          if (i!=0)
          {
          //out.println("讀取用戶時發(fā)生錯誤!");
          b_flag=true;
          }
          else
          {
          b_flag=false;
          }
          %>
          然后,將讀到的內(nèi)容顯示出來(源代碼略),并添加歡迎信息:

          圖:獲取該用戶的郵箱信息,并顯示出來。

          我們在這個jsp頁面上顯示出該用戶的郵箱信息,并顯示歡迎該用戶的字樣。該歡迎信息是這樣獲取的:
          l 首先,引入wps標(biāo)簽庫:
          <%@ taglib uri="/WEB-INF/tld/engine.tld" prefix="wps" %>
          引入該標(biāo)簽庫后,我們就可以使用其中的標(biāo)簽了,比如上面用到的:
          <wps:if loggedIn="no"> //當(dāng)用戶沒有登錄時。
          </wps:if>
          l 我們引入歡迎標(biāo)簽:welcome:
          <wps:text key="welcome" bundle="nls.engine">
          <wps:textParam><wps:user attribute="givenName"/></wps:textParam>
          </wps:text>
          我們必須在wps包內(nèi)找到名字為nsl.engine的標(biāo)簽文件,并添加或者修改鍵值為welcome的標(biāo)簽,并設(shè)置成我們要求的格式。這部分具體開發(fā)內(nèi)容同于一般的標(biāo)簽開發(fā),這里不再贅述。有興趣的朋友可以自己查找資料研究,也可以與作者討論。
          3、新建checklogin.jsp,用來將用戶信息提交到portal系統(tǒng),實現(xiàn)單點登錄。
          l 新建一個表單,用來將用戶信息提交到Portal系統(tǒng)的登陸action。
          <form method="POST" action='/wps/portal/!ut/p/.cmd/li' name="LoginPage"> //
          <table width="196" height="150" cellspacing="0">
          <tr>
          <%
          String username=request.getParameter("userid");
          String password=request.getParameter("password");
          %>
          <td>
          <input name="userid" type="hidden" value="<%=username%>">
          </td>
          <td>
          <input name="password" type="hidden" value="<%=password%>">
          </td>
          </tr>
          </ta ble>
          </form>
          這個表單用來將提取到的用戶信息,提交到portal系統(tǒng)的login系統(tǒng)。其中這里的action我們先使用了編譯后的代碼,如果您重裝了Portal系統(tǒng),您必須更改此portlet的選項,以符合portal系統(tǒng)登陸要求。讀到這里,如果您是一個標(biāo)簽方面的高手,您可能已經(jīng)猜到了更好的解決方案。是的,將這個portelt切換到配置模式,不如直接引入wps相應(yīng)地標(biāo)簽庫,使用一個簡單的標(biāo)簽,就可以用鍵值將之寫死,這些內(nèi)容實現(xiàn)起來比較麻煩,筆者將在以后的相關(guān)文章中詳細(xì)介紹,有興趣的朋友,可以關(guān)注我的專欄。
          l 其他該注意的問題:
          到這里該P(yáng)ortlet可以算是開發(fā)完了,這里提醒開發(fā)者該注意的問題:
          1)Portal系統(tǒng)的action處理完用戶登錄后,會返回提交者,即:checklogin.jsp。這是我們所不希望的,因為系統(tǒng)一旦返回到checklogin,checklogin會再次提交!是的,您已經(jīng)想到了,這會生成一個死循環(huán),計算機(jī)的聲卡會發(fā)出啪啪啪的聲音,就是這個原因造成的。解決這個問題,實際上非常簡單,我們可以在session里設(shè)置一個開關(guān),如果checklogin沒有提交過,就打開這個開關(guān),讓系統(tǒng)提交;一旦提交過了,就把這個開關(guān)關(guān)死,死循環(huán)的問題就OK了。參考代碼如下:
          if (my_flagid==null)
          my_flagid="";
          if (my_flagid.equals("0"))
          {
          session.setAttribute("b_getPortaPass","1");
          …….

          2)如果登錄成功,我們可以將location轉(zhuǎn)向到myportal的任何頁面,
          如果登錄不成功,系統(tǒng)會向用戶要Session,自然會重定向到登錄葉面,這樣,我們的設(shè)計意圖也就達(dá)到了。


          作者簡介:鄭文平,“神狐”軟件工作室創(chuàng)立者,IBM WebSpher Portal產(chǎn)品開發(fā)人員,原北京東華合創(chuàng)軟件院軟件工程師,Portal信息化專員,長期從事Portal(尤其是IBM Websphere Portal)開發(fā),曾參與并引領(lǐng)了北京馳普企業(yè)門戶、山東新汶礦務(wù)局遠(yuǎn)程調(diào)度系統(tǒng)、中國石化齊魯公司綜合數(shù)據(jù)平臺、北京供電局虛擬門戶產(chǎn)品,北京航信企業(yè)門戶等多個Portal項目的開發(fā)。
          如果您有以下需要,歡迎您與SagFox SoftWare 聯(lián)系:
          1、如果您的公司有IBM WebSpher Portal 項目需要實施但缺少必需的技術(shù)力量,而您又不愿安排工程師們邊學(xué)習(xí)邊開發(fā)而影響項目質(zhì)量,歡迎您把項目外包給 SagFox SoftWare,或者以項目合作的方式聯(lián)合開發(fā)。
          2、如果您們是一個Java 開發(fā)者并打算投身Portal領(lǐng)域,歡迎您接受 SagFox SoftWare 針對公司技術(shù)人員的開發(fā)培訓(xùn),SagFox SoftWare 同時開展針對個人的技術(shù)指導(dǎo)與職業(yè)規(guī)劃,助您謀得高薪。
          3、如果您是一個嫻熟的Portal開發(fā)者,歡迎您加盟SagFox SoftWare,我們的團(tuán)隊正在飛速發(fā)展。我們也歡迎入門者加入我們的討論組,SagFox SoftWare 盡力解答欠成熟開發(fā)者的提問,并以提攜后起者為樂趣,希望國內(nèi)的門戶實施少一些“豆腐渣”工程,我們愿貢獻(xiàn)一點力量。
          您可以通過zhengwp@cn.ibm.com 或者 zhengwenping@126.com 與SagFox SoftWare取得聯(lián)系。本文作者的msn是: zhengwp@cn.ibm.com
          posted on 2006-09-20 10:05 壞男孩 閱讀(2527) 評論(0)  編輯  收藏 所屬分類: 資源整合
          主站蜘蛛池模板: 保山市| 来宾市| 广安市| 特克斯县| 偃师市| 柳林县| 巴彦淖尔市| 法库县| 比如县| 张家界市| 英山县| 井冈山市| 盐山县| 长武县| 界首市| 龙川县| 左贡县| 锦州市| 舒城县| 平江县| 邵阳市| 定州市| 平舆县| 贡嘎县| 克什克腾旗| 新泰市| 始兴县| 江安县| 原阳县| 金山区| 板桥市| 刚察县| 晋城| 收藏| 宁陕县| 泰顺县| 平陆县| 鲁甸县| 绥芬河市| 东乌珠穆沁旗| 西宁市|