IBM Portal 開發系列講座:
開發登錄并讀取OA用戶郵箱信息的portlet
IBM China SoftWare Development Lab 鄭文平
內容簡介:
我們用ibm自帶的開發工具WSAD(已安裝portlet toolkit包),開發一個Portlet,實現以下功能:
l 用戶從這個portlet登錄,登錄成功后讀取該用戶在OA服務器上的郵件系統,并返回個人郵件信息、歡迎信息,轉入并顯示在指定頁面;
l 用戶不能從Portal系統原登錄頁面登錄。即:如果用戶驗證失敗,系統將返回到該登錄portlet,而非系統自帶的登錄頁面;
l 用戶可以從這個portlet直接進入到指定的任意邏輯、物理頁面。
其數據流轉是這樣的:
[開發過程]
1、首先編寫這個類,用來讀取OA系統中任一用戶的郵件系統:
package youjiantishi;
/**
* 這個類用來讀取某一用戶的郵件內容:
*
* 維護:zhengwp@dhcc.com.cn 鄭文平
*
* 編碼:趙建業 時間: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開發一個使用憑證保險庫的portlet,最好選用共享保險槽。接下來,在Portlet的View.jsp頁面中我們提供用戶登錄表單(表單源代碼略):
<wps:if loggedIn="no"> //如果用戶沒有登錄,我們顯示為登錄表單:
該表單接收到用戶名和密碼后,提交到ChenkLogin.jsp文件。
<wps:if loggedIn="yes"> //當用戶登錄后,調用這個類讀取OA系統:
<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("讀取用戶時發生錯誤!");
b_flag=true;
}
else
{
b_flag=false;
}
%>
然后,將讀到的內容顯示出來(源代碼略),并添加歡迎信息:
圖:獲取該用戶的郵箱信息,并顯示出來。
我們在這個jsp頁面上顯示出該用戶的郵箱信息,并顯示歡迎該用戶的字樣。該歡迎信息是這樣獲取的:
l 首先,引入wps標簽庫:
<%@ taglib uri="/WEB-INF/tld/engine.tld" prefix="wps" %>
引入該標簽庫后,我們就可以使用其中的標簽了,比如上面用到的:
<wps:if loggedIn="no"> //當用戶沒有登錄時。
</wps:if>
l 我們引入歡迎標簽:welcome:
<wps:text key="welcome" bundle="nls.engine">
<wps:textParam><wps:user attribute="givenName"/></wps:textParam>
</wps:text>
我們必須在wps包內找到名字為nsl.engine的標簽文件,并添加或者修改鍵值為welcome的標簽,并設置成我們要求的格式。這部分具體開發內容同于一般的標簽開發,這里不再贅述。有興趣的朋友可以自己查找資料研究,也可以與作者討論。
3、新建checklogin.jsp,用來將用戶信息提交到portal系統,實現單點登錄。
l 新建一個表單,用來將用戶信息提交到Portal系統的登陸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系統的login系統。其中這里的action我們先使用了編譯后的代碼,如果您重裝了Portal系統,您必須更改此portlet的選項,以符合portal系統登陸要求。讀到這里,如果您是一個標簽方面的高手,您可能已經猜到了更好的解決方案。是的,將這個portelt切換到配置模式,不如直接引入wps相應地標簽庫,使用一個簡單的標簽,就可以用鍵值將之寫死,這些內容實現起來比較麻煩,筆者將在以后的相關文章中詳細介紹,有興趣的朋友,可以關注我的專欄。
l 其他該注意的問題:
到這里該Portlet可以算是開發完了,這里提醒開發者該注意的問題:
1)Portal系統的action處理完用戶登錄后,會返回提交者,即:checklogin.jsp。這是我們所不希望的,因為系統一旦返回到checklogin,checklogin會再次提交!是的,您已經想到了,這會生成一個死循環,計算機的聲卡會發出啪啪啪的聲音,就是這個原因造成的。解決這個問題,實際上非常簡單,我們可以在session里設置一個開關,如果checklogin沒有提交過,就打開這個開關,讓系統提交;一旦提交過了,就把這個開關關死,死循環的問題就OK了。參考代碼如下:
if (my_flagid==null)
my_flagid="";
if (my_flagid.equals("0"))
{
session.setAttribute("b_getPortaPass","1");
…….
2)如果登錄成功,我們可以將location轉向到myportal的任何頁面,
如果登錄不成功,系統會向用戶要Session,自然會重定向到登錄葉面,這樣,我們的設計意圖也就達到了。
作者簡介:鄭文平,“神狐”軟件工作室創立者,IBM WebSpher Portal產品開發人員,原北京東華合創軟件院軟件工程師,Portal信息化專員,長期從事Portal(尤其是IBM Websphere Portal)開發,曾參與并引領了北京馳普企業門戶、山東新汶礦務局遠程調度系統、中國石化齊魯公司綜合數據平臺、北京供電局虛擬門戶產品,北京航信企業門戶等多個Portal項目的開發。
如果您有以下需要,歡迎您與SagFox SoftWare 聯系:
1、如果您的公司有IBM WebSpher Portal 項目需要實施但缺少必需的技術力量,而您又不愿安排工程師們邊學習邊開發而影響項目質量,歡迎您把項目外包給 SagFox SoftWare,或者以項目合作的方式聯合開發。
2、如果您們是一個Java 開發者并打算投身Portal領域,歡迎您接受 SagFox SoftWare 針對公司技術人員的開發培訓,SagFox SoftWare 同時開展針對個人的技術指導與職業規劃,助您謀得高薪。
3、如果您是一個嫻熟的Portal開發者,歡迎您加盟SagFox SoftWare,我們的團隊正在飛速發展。我們也歡迎入門者加入我們的討論組,SagFox SoftWare 盡力解答欠成熟開發者的提問,并以提攜后起者為樂趣,希望國內的門戶實施少一些“豆腐渣”工程,我們愿貢獻一點力量。
您可以通過zhengwp@cn.ibm.com 或者 zhengwenping@126.com 與SagFox SoftWare取得聯系。本文作者的msn是: zhengwp@cn.ibm.com
posted on 2006-09-20 10:05
壞男孩 閱讀(2525)
評論(0) 編輯 收藏 所屬分類:
資源整合