2005年9月28日
#
http://www.hibernate.org/hib_docs/reference/zh-cn/html/queryhql.html#queryhql-select
查詢可以返回任何值類型的函數(shù),
select子句選擇在結(jié)果集中返回哪些對(duì)象和屬性。思考一下下面的例子:
select mate
from eg.Cat as cat
inner join cat.mate as mate
這個(gè)查詢會(huì)選擇出作為其它貓(Cat)朋友(mate)的那些貓。當(dāng)然,你可以更加直接的寫成下面的形式:
select cat.mate from eg.Cat cat
你甚至可以選擇集合元素,使用特殊的elements功能。下面的查詢返回所有貓的小貓。
select elements(cat.kittens) from eg.Cat cat
查詢可以返回任何值類型的屬性,包括組件類型的屬性:
select cat.name from eg.DomesticCat cat
where cat.name like 'fri%'
select cust.name.firstName from Customer as cust
查詢可以用元素類型是Object[]的一個(gè)數(shù)組返回多個(gè)對(duì)象和/或多個(gè)屬性。
select mother, offspr, mate.name
from eg.DomesticCat as mother
inner join mother.mate as mate
left outer join mother.kittens as offspr
或者實(shí)際上是類型安全的Java對(duì)象
select new Family(mother, mate, offspr)
from eg.DomesticCat as mother
join mother.mate as mate
left join mother.kittens as offspr
上面的代碼假定Family有一個(gè)合適的構(gòu)造函數(shù)。
1.BCPの引數(shù)
bcp ユーティリティは、ユーザーが指定した形式で、データを Microsoft? SQL Server? 2000 とデータ ファイルとの間でコピーします。
構(gòu)文
bcp {[[database_name.][owner].]{table_name | view_name} | "query"}
{in | out | queryout | format} data_file
[-m max_errors] [-f format_file] [-e err_file]
[-F first_row] [-L last_row] [-b batch_size]
[-n] [-c] [-w] [-N] [-V (60 | 65 | 70)] [-6]
[-q] [-C code_page] [-t field_term] [-r row_term]
[-i input_file] [-o output_file] [-a packet_size]
[-S server_name[\instance_name]] [-U login_id] [-P password]
[-T] [-v] [-R] [-k] [-E] [-h "hint [,...n]"]
使用法 : bcp {dbtable | query} {in | out | queryout | format} datafile
[-m maxerrors] [-f formatfile] [-e errfile]
[-F firstrow] [-L lastrow] [-b batchsize]
[-n native type] [-c character type] [-w wide character type]
[-N keep non-text native] [-V file format version] [-q quoted identifier]
[-C code page specifier] [-t field terminator] [-r row terminator]
[-i inputfile] [-o outfile] [-a packetsize]
[-S server name] [-U username] [-P password]
[-T trusted connection] [-v version] [-R regional enable]
[-k keep null values] [-E keep identity values]
[-h "load hints"]
大切な引數(shù)の説明:
① [-S server name]
-S server_name[\instance_name]
接続先の SQL Server のインスタンスを指定します。
サーバー上の SQL Server の既定のインスタンスに接続する場(chǎng)合は、server_name を指定します。
サーバー上の SQL Server 2000 の名前付きインスタンスに接続する場(chǎng)合は、server_name\instance_name
を指定します。サーバーが指定されない場(chǎng)合は、ローカル コンピュータ上の SQL Server の既定の
インスタンスに接続されます。ネットワーク上のリモート コンピュータから bcp を?qū)g行するときは、このオプションが必要です。
② [-U username]
-U login_id
SQL Server への接続に使用されるログイン ID を指定します。
③ [-P password]
-P password
ログイン ID のパスワードを指定します。このオプションを指定しないと、bcp はパスワードを問(wèn)い合わせます。
また、このオプションをコマンド プロンプトの最後にパスワードなしで使用すると、デフォルトのパスワード (NULL) が使用されます。
④ {in | out | queryout | format} datafile
in | out | queryout | format
一括コピーする方向を指定します。
in は、ファイルからデータベース テーブルまたはビューにコピーします。
out は、データベース テーブルまたはビューからファイルにコピーします。
queryout は、クエリからデータの一括コピーを行う場(chǎng)合に指定します。
format オプションは、指定したオプション (-n、-c、-w、-6、-N のいずれか) とテーブルまたはビューの區(qū)切り記號(hào)に
基づいてフォーマット ファイルを作成します。format を使用する場(chǎng)合、-f オプションも指定する必要があります。
注 Microsoft SQL Server 6.5 の bcp ユーティリティの場(chǎng)合、sql_variant 型または bigint 型のデータを含む
テーブルへの一括コピーはサポートされません。
⑤ [-c character type]
2.例
setEnv.cmdの內(nèi)容:
set DBUSER=lamsec
set DBPASSWORD=lamsec
set DBSERVER=lam-test-server
入力のコマンドファイルの內(nèi)容:
call setEnv.cmd
bcp tempdb..custom IN F:\bcp\CZYTAB.TXT -U%DBUSER% -P%DBPASSWORD% -S%DBSERVER% -c
出力コマンドファイルの內(nèi)容:
call setEnv.cmd
bcp tempdb..custom OUT F:\bcp\CZYTAB.TXT -U%DBUSER% -P%DBPASSWORD% -S%DBSERVER% -c
開始Tomcat用的是mail.jar的1.3.1的版本,但是單獨(dú)跑的時(shí)候用的1.3.3的版本
結(jié)果就不一樣了:S
當(dāng)今mail服務(wù)器大多都是通過(guò)認(rèn)證才能發(fā)信的,現(xiàn)在的網(wǎng)上介紹javamail發(fā)信的文章都沒有深入到有關(guān)認(rèn)證的方面,除非自己裝一個(gè)open
relay的mail服務(wù)器,但是這樣有很危險(xiǎn),本人根據(jù)自己工作中用的javamail的方法說(shuō)一下自己的用法,不對(duì)的地方請(qǐng)大家多指教.
首先設(shè)置屬性Properties props = new Properties();
props.put("mail.smtp.host",host);
props.put("mail.smtp.auth","true");注意的是此處必須加上true要不然stmp連接的時(shí)候不會(huì)認(rèn)證
用Authenticator寫認(rèn)證類下面是本人的認(rèn)證類
package org.xxx;
import javax.mail.*;
import javax.mail.internet.*;
public class PopupAuthenticator extends Authenticator{
String username=null;
String password=null;
public PopupAuthenticator(){}
public PasswordAuthentication performCheck(String user,String pass){
username = user;
password = pass;
return getPasswordAuthentication();
}
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
}
認(rèn)證類寫完后,在發(fā)信的程序中加上
PasswordAuthentication pop = popAuthenticator.performCheck(username,password);
Session mysession=Session.getInstance(props,popAuthenticator);
mailsession加的popAuthenticator
其他的方法和javamail發(fā)信的用法相似,在此不累述。
http://www.cn-java.com/target/news.php?news_id=1511
JavaMail常見問(wèn)題
一般問(wèn)題
安裝和配置
編程
閱讀郵件——IMAP
發(fā)送郵件——SMTP
POP3
servlet 中的 JavaMail
applet 中的 JavaMail
一般問(wèn)題
問(wèn). 什么是 JavaMail API?
答:JavaMail
API 是一組抽象的 API,它可用于構(gòu)建郵件系統(tǒng)。API 提供了一個(gè)平臺(tái)無(wú)關(guān)以及協(xié)議無(wú)關(guān)的框架,用于構(gòu)建基于 Java
技術(shù)的電子郵件客戶端應(yīng)用程序。JavaMail API 提供了一些工具,用于閱讀和發(fā)送電子郵件。服務(wù)提供程序?qū)崿F(xiàn)了特定的一些協(xié)議。在
JavaMail API 軟件包中,包括了幾個(gè)服務(wù)提供程序;另外還有其他的一些服務(wù)提供程序可供使用。JavaMail API 是作為 Java
可選包實(shí)現(xiàn)的,它可用在 JDK 1.1.6 中,以后還可用在任何操作系統(tǒng)上。JavaMail API 也是 Java 2 Platform, Enterprise Edition (J2EE) 中的必需部分。
問(wèn). 我如何獲得 JavaMail API 的實(shí)現(xiàn)?
答: Sun 提供了無(wú)版權(quán)的參考實(shí)現(xiàn)(二進(jìn)制形式),開發(fā)人員可以使用和發(fā)行。參考實(shí)現(xiàn)包括核心的 JavaMail 包 和 IMAP、POP3 和 SMTP 服務(wù)提供程序。
問(wèn). 我如何發(fā)送反饋或評(píng)論?
答:發(fā)送電子郵件到 javamail@Sun.COM。也可以考慮加入我們的低容量通告郵件列表 (low-volume announce mailing list) javamail-announce@java.sun.com。在我們的 Web 頁(yè) http://java.sun.com/products/javamail 中有關(guān)于如何加入的說(shuō)明。
問(wèn). javax.activation 在哪里?
答: javax.activation
是 JavaBeans Activation Framework (JAF) 的一部分。JAF 是 JavaBeans "Glasgow" 規(guī)范的一部分(參見 http://java.sun.com/beans/glasgow/jaf.html)。JavaMail API 將 JAF 用于數(shù)據(jù)內(nèi)容處理。
問(wèn). JavaMail API 需要什么 JDK?
答:JavaMail
API 要求 JDK/JRE 1.1.x 或更高版本。我們已經(jīng)在 Sun Microsystems JDK 1.1.6 至 JDK 1.1.7
上測(cè)試過(guò)這個(gè)實(shí)現(xiàn),而這些 JDK 運(yùn)行于 Solaris SPARC、Microsoft Windows 95/NT 和 RedHat
Linux 4.2。我們也已經(jīng)在 Java 2 SDK, Standard Edition (J2SE SDK) 版本 1.2、1.3 和 1.4 上做過(guò)測(cè)試,而這些 JDK 運(yùn)行于 Solaris SPARC。JavaMail API 是 Java 的可選包,它們不是核心 J2SE 的一部分,但在 J2EE 中卻包括了它。參見 http://java.sun.com/j2se,獲取關(guān)于 JDK 1.1 和 J2SE 的進(jìn)一步信息。
問(wèn). 從哪里能找到我喜歡的操作系統(tǒng)的 JavaMail 版本?
答:JavaMail 是完全用 Java 編寫的,并將運(yùn)行在特定的操作系統(tǒng)上,該操作系統(tǒng)支持所需版本的 JDK。對(duì)于不同的操作系統(tǒng),不需要任何特殊的版本。
問(wèn). JavaMail API 可以在瀏覽器中工作嗎?
答:在 Netscape 和 Internet Explorer 中,我們已經(jīng)成功運(yùn)行過(guò) JavaMail 1.3。
問(wèn). 我可以使用 JavaMail 來(lái)從 Web 郵件賬戶(比如 Yahoo 或 Hotmail)中閱讀郵件嗎?
答:不
一定。許多基于 Web 的電子郵件服務(wù)只提供在瀏覽器中用 HTTP 進(jìn)行訪問(wèn)。這些服務(wù)不能使用 JavaMail 來(lái)訪問(wèn)。如果服務(wù)也提供
POP3 或 IMAP 訪問(wèn),可能不可以使用 JavaMail 來(lái)訪問(wèn)它。 聯(lián)系你的 Web 電子郵件服務(wù)提供商,獲取更詳細(xì)的信息。也可參閱 JHTTPMail 項(xiàng)目,獲得 JavaMail 的開放源代碼提供程序,它提供了對(duì) Hotmail 的訪問(wèn)。另一個(gè)有用的工具是 MrPostman——提供到 Hotmail 和 Yahoo! Mail 的 POP3 訪問(wèn)的代理服務(wù)器,這個(gè)工具可從如下站點(diǎn)獲得:http://mrbook.org/mrpostman/。
問(wèn). 什么是 IMAP?
答:IMAP
是 Internet 消息訪問(wèn)協(xié)議 (Internet Message Access
Protocol)。它是訪問(wèn)電子郵件消息的一種方法,而這些消息存儲(chǔ)在(可能是共享的)郵件服務(wù)器上。換句話說(shuō),它允許“客戶端”電子郵件程序訪問(wèn)遠(yuǎn)程
的消息存儲(chǔ),并且在訪問(wèn)時(shí),就像它們就在本地一樣。IMAP 由 RFC2060 定義。有關(guān)進(jìn)一步信息,請(qǐng)參閱 http://www.imap.org/。
問(wèn). 什么是 SMTP?
答:SMTP
就是簡(jiǎn)單郵件傳輸協(xié)議 (Simple Mail Transfer Protocol)。它可用于不同郵件主機(jī)間 RFC822
樣式的消息的傳輸,以及用于將新消息提交給一臺(tái)主機(jī),然后由它來(lái)傳送該消息。SMTP 在廣泛使用中(起源于 1982 年),并由 RFC821 定義。
問(wèn). 什么是 MIME?
答:MIME 和 RFC822 是一些標(biāo)準(zhǔn),它們用于描述電子郵件消息,而這些消息是跨 Internet 進(jìn)行發(fā)送的。javax.mail.internet 子包(它是 JavaMail API 的一部分)提供了這兩個(gè)包的完整實(shí)現(xiàn)。MIME 是由下述 RFC 指定的:RFC2045、RFC2046 和 RFC2047。
問(wèn). 什么是 POP3?
答:POP3 是郵局協(xié)議 (Post Office Protocol V3)。POP3 是一個(gè)非常有限的協(xié)議,用于訪問(wèn)單個(gè)郵箱。它在功能上比 IMAP 差了許多。POP3 應(yīng)用非常廣泛,并由 RFC1939 定義。
問(wèn). 對(duì) MAPI、NNTP、Lotus Notes 和其他服務(wù)提供程序的支持怎樣?
答:目前我們還沒有計(jì)劃實(shí)現(xiàn)這些提供程序中的任何一個(gè)。不過(guò),JavaMail API 的體系結(jié)構(gòu)提供一些功能,可以容易地插入第三方服務(wù)提供程序。我們的希望是第三方將通過(guò)編寫針對(duì)其他標(biāo)準(zhǔn)和專有協(xié)議的提供程序來(lái)包括 JavaMail API。 參閱 第三方產(chǎn)品 頁(yè)面,獲取這些提供程序的最新列表。
問(wèn). 我如何在本地磁盤上存儲(chǔ)郵件消息?
答:“本地存儲(chǔ)提供程序”可用于將郵件消息存儲(chǔ)在本地磁盤中。JavaMail API 不包括這一提供程序,但有幾個(gè)提供程序可從第三方獲得,它們針對(duì)不同的本地存儲(chǔ)格式,比如 MH 和 Mbox。參閱我們的 第三方產(chǎn)品 頁(yè)面,獲取這些提供程序的最新列表。
問(wèn). 我可以從哪里找到有關(guān) Sun 協(xié)議提供程序的文檔?
答:針對(duì) IMAP、POP3 和 SMTP 的 Sun 協(xié)議提供程序支持許多特性,它們不是 JavaMail API 規(guī)范的一部分。在 JavaMail 1.3 下載包中包括了這些協(xié)議提供程序的文檔,這些文檔是以 javadoc 格式包括的,并位于 docs/javadocs
目錄。針對(duì)每個(gè)協(xié)議提供程序包的包級(jí)文檔描述了一些屬性,這些屬性由協(xié)議提供程序支持。此外,協(xié)議提供程序包括了一些類和方法,應(yīng)用程序可以使用它們來(lái)利用特定于提供程序的特性。注意,這些屬性、類和方法的使用使得程序不可移植;它可能只與 Sun 的 JavaMail API 實(shí)現(xiàn)一起工作。
問(wèn). JavaMail API 實(shí)現(xiàn)是否完全免費(fèi)?我可以把它與我的產(chǎn)品一起發(fā)行嗎?
答:可以。當(dāng)前版本的 JavaMail API 實(shí)現(xiàn)是完全免費(fèi)的,你可以在產(chǎn)品中包括它。這一版本也包括 IMAP、POP3 和 SMTP 提供程序。請(qǐng)一定閱讀 許可,并保證理解它。JavaBeans Activation Framework 也是在類似的許可下免費(fèi)使用的。
問(wèn). 我可以獲得 JavaMail API 實(shí)現(xiàn)的源代碼嗎?
答:在 SCSL 許可下,現(xiàn)在 JavaMail API 參考實(shí)現(xiàn)源代碼可作為 J2EE 的一部分獲得??蓮?這里 下載它。
問(wèn). JavaMail 是否符合 Y2K?
答:是的。 Sun 的 JavaMail 實(shí)現(xiàn)是符合 Option-3 Y2K 的。請(qǐng)參看 JavaMail 包中的 NOTES.txt 文件,獲取進(jìn)一步信息。
問(wèn). 我的問(wèn)題不在這里,我應(yīng)該在哪里查找?
答:除 JavaMail API 規(guī)范和 javadocs 外(可從 我們的 Web 主頁(yè) 獲得并且是包括在下載包中的),不要忘記查閱 JavaMail API 包中包括的 README.txt 和 NOTES.txt 文件,獲取其他的重要信息。
javamail-interest mailing list 是另一個(gè)信息來(lái)源。參閱 我們的 Web 主頁(yè),獲取有關(guān)如何訂閱的說(shuō)明以及指向文檔的鏈接。
Java Developer Connection 維護(hù) JavaMail 論壇,請(qǐng)參閱 http://forum.java.sun.com。注意,JavaMail 團(tuán)隊(duì)管理 javamail-interest 郵件列表,但不管理 JavaMail 論壇。
jGuru 也維護(hù) JavaMail FAQ,可在如下地址找到它:http://www.jguru.com/faq/JavaMail。
安裝和配置
問(wèn). 我如何安裝 JavaMail API 實(shí)現(xiàn)?
答:解
壓縮分發(fā)的 zip 文件,并編輯 CLASSPATH 環(huán)境變量以包含 mail.jar 文件,該文件包括在 JavaMail API
分發(fā)中。你也需要 JavaBeans Activation Framework(參見下面)的實(shí)現(xiàn)。參閱 README
文件(在分發(fā)中),獲得其他細(xì)節(jié)和例子。
問(wèn). JavaMail 是否包括所有必要的郵件服務(wù)器?
答:不
是,JavaMail API 包不包括任何郵件服務(wù)器。為了使用 JavaMail API 包,你將需要訪問(wèn) IMAP 或 POP3
郵件服務(wù)器(用于閱讀郵件)和/或 SMTP 郵件服務(wù)器(用于發(fā)送郵件)。這些郵件服務(wù)器通常由 Internet
服務(wù)提供商提供,或者作為組織網(wǎng)絡(luò)基礎(chǔ)結(jié)構(gòu)的一部分。如果你不必訪問(wèn)這樣的郵件服務(wù)器,請(qǐng)往下看。
問(wèn). 從哪里可以獲得必要的郵件服務(wù)器?
答:Sun Java System Messaging Server 可用于 Solaris 和 Windows 平臺(tái)。華盛頓大學(xué)的 IMAP 服務(wù)器支持多種平臺(tái) (UNIX、32 位 Windows 等)。可從如下地址獲取源代碼:ftp://ftp.cac.washington.edu/imap/imap.tar.Z。其他的許多供應(yīng)商提供了支持 Internet 標(biāo)準(zhǔn)的郵件服務(wù)器??梢詮?IMAP Connection 和 Internet Mail Consortium 獲得更多信息。
問(wèn). 我應(yīng)該使用什么主機(jī)名、用戶名或密碼?
答:我們不提供郵件服務(wù)器讓你使用。你必須使用自己的郵件服務(wù)器,或者使用 Internet 服務(wù)提供商或你所工作的公司提供的郵件服務(wù)器。網(wǎng)絡(luò)管理員可能給你一些必要的信息用于配置 JavaMail,以便同郵件服務(wù)器一起工作。
問(wèn). 我如何配置 JavaMail 通過(guò)代理服務(wù)器工作?
答:大
多數(shù)代理服務(wù)器只支持 HTTP 協(xié)議。JavaMail 沒有使用 HTTP
協(xié)議來(lái)閱讀或發(fā)送郵件。使用代理服務(wù)器的一個(gè)主要原因是為了允許企業(yè)網(wǎng)絡(luò)中的 HTTP 請(qǐng)求通過(guò)企業(yè)防火墻。防火墻通常會(huì)阻止對(duì) Internet
的大多數(shù)訪問(wèn),但允許來(lái)自代理服務(wù)器的請(qǐng)求通過(guò)。此外,企業(yè)網(wǎng)絡(luò)內(nèi)部的郵件服務(wù)器將為郵件執(zhí)行類似的功能,通過(guò) SMTP 接收消息,然后將它們轉(zhuǎn)發(fā)到
Internet 上的最終目的地,以及接收傳入的消息,然后將它們發(fā)送到合適的內(nèi)部郵件服務(wù)器。
如果你的代理服務(wù)器支持 SOCKS V4 或 V5 協(xié)議 (http://www.socks.nec.com/aboutsocks.html, RFC1928),并允許匿名連接,可以告訴 Java 運(yùn)行時(shí)把所有的 TCP socket 直接連接到 SOCKS 服務(wù)器。參閱 http://java.sun.com/j2se/1.4/docs/guide/net/properties.html,獲取 socksProxyHost
和 socksProxyPort
屬性的最新文檔。這些是系統(tǒng)級(jí)屬性,而不是 JavaMail 會(huì)話屬性。當(dāng)調(diào)用應(yīng)用程序時(shí),它們可以從命令行中設(shè)置,例如:java -DsocksProxyHost=myproxy ...
。這個(gè)工具可用于指出從 JavaMail 到 SOCKS 代理服務(wù)器進(jìn)行 SMTP、IMAP 和 POP3 通信。注意,設(shè)置這些屬性將告訴 所有 TCP socket 連接到 SOCKS 代理,在應(yīng)用程序的其他方面上,這可能會(huì)帶來(lái)負(fù)面影響。
假如沒有這樣的 SOCKS 服務(wù)器,如果想使用 JavaMail 來(lái)直接訪問(wèn)防火墻外部的郵件服務(wù)器,那將需要配置防火墻來(lái)允許這一訪問(wèn)。一個(gè)簡(jiǎn)單的 HTTP 代理 Web 服務(wù)器是足夠的。
問(wèn). 如何在 Windows NT 中設(shè)置 CLASSPATH?
答:詳細(xì)說(shuō)明可從 這里 獲得。
問(wèn). 當(dāng)試圖在 Linux 中運(yùn)行程序時(shí),得到了非常奇怪的錯(cuò)誤消息,而且程序運(yùn)行失敗了。錯(cuò)誤在哪里?
答:通常,錯(cuò)誤消息看起來(lái)像下面這樣:
Exception in thread "main"
java.lang.VerifyError:(Class:com/sun/mail/pop3/POP3Store,
method: finalize Signature :()V)
Illegal use of nonvirtual function call
問(wèn)題是由于在 Linux 上,使用的 unzip 命令是有 bug 的版本,這樣解壓縮 JavaMail 下載包時(shí),unzip 命令破壞了 mail.jar 文件。獲取更新版本的 unzip 命令或使用 JDK 的 jar 命令來(lái)解壓縮下載包。
問(wèn). 在運(yùn)行于 SecurityManager 下面的應(yīng)用程序中,我如何使用 JavaMail;我必須授予應(yīng)用程序和 JavaMail 什么權(quán)限?
答:在
具有 SecurityManager 的 JDK 1.2(或更新版本)中,當(dāng)使用 JavaMail 時(shí),JavaMail 讀取
mail.jar 文件中的配置文件有時(shí)會(huì)失敗。在從 activation.jar 文件中讀取配置文件時(shí),JavaBeans
Activation Framework 可能也有相同的問(wèn)題。這些默認(rèn)配置文件是作為“資源”文件存儲(chǔ)的,并且存儲(chǔ)在 jar 文件的
META-INF 目錄中。
有許多調(diào)試技術(shù)可用于決定這是否是個(gè)問(wèn)題。設(shè)置 Session 屬性“mail.debug”為 true(或調(diào)用 session.setDebug(true)
),
將導(dǎo)致 JavaMail 在試圖加載各個(gè)配置文件時(shí)打印調(diào)試消息。形如“DEBUG: can't load default providers
file”(DEBUG: 不能加載默認(rèn)提供程序文件) 的消息指出這個(gè)問(wèn)題可能存在。同樣,設(shè)置 System
屬性“javax.activation.debug”為“true”(例如,通過(guò)使用 "java
-Djavax.activation.debug=true ..." 來(lái)運(yùn)行程序),將導(dǎo)致 JAF
在試圖加載各個(gè)資源文件時(shí)打印調(diào)試消息。最后,通過(guò)設(shè)置 system 屬性“java.security.debug”
為“access:failure”(例如,通過(guò)使用“java -Djava.security.debug=access:failure
...”來(lái)運(yùn)行程序),JDK 可以產(chǎn)生有用的調(diào)試輸出。
除了讀取配置文件的必要權(quán)限外,應(yīng)用程序(和 JavaMail)也將需要一定的權(quán)限才可以連接到它使用的郵件服務(wù)器。如果應(yīng)用程序使用 System 屬性來(lái)配置 JavaMail(例如,像許多 JavaMail 演示程序所做的那樣,通過(guò)傳遞從 System.getProperties()
中返回的 Properties 對(duì)象到 Session 構(gòu)造函數(shù)),它也將需要一定的權(quán)限才可以使用 System Properties
對(duì)象。另外,應(yīng)用程序可以使用自己的 Properties 對(duì)象,以及確信設(shè)置 "mail.from" 屬性 或 "mail.user" 和
"mail.host" 屬性(參見 InternetAddress.getLocalAddress() 方法)。
在
JDK 1.2 SecurityManager 中,為了使應(yīng)用程序能夠使用 JavaMail,應(yīng)用程序、JavaMail 和 JAF
將需要某些權(quán)限,比如下面的一些權(quán)限(一定要使用適當(dāng)?shù)闹堤鎿Q主機(jī)名和路徑名);把這些權(quán)限添加到應(yīng)用程序使用的安全策略文件中。
grant { // following two permissions allow // access to default config files permission java.io.FilePermission "/path/to/mail.jar", "read"; permission java.io.FilePermission "/path/to/activation.jar", "read"; // following to use SMTP permission java.net.SocketPermission "SMTPHOST:25", "connect,resolve"; // following to use IMAP permission java.net.SocketPermission "IMAPHOST:143", "connect,resolve"; // following to use POP3 permission java.net.SocketPermission "POP3HOST:110", "connect,resolve"; // following needed if System.getProperties() is used permission java.util.PropertyPermission "*", "read,write"; };
|
問(wèn). 如何配置 Web 服務(wù)器來(lái)運(yùn)行 JavaMail 演示 servlet?
答:針對(duì)以下 Web 服務(wù)器的指導(dǎo)說(shuō)明可從這里獲得:
問(wèn). 當(dāng)在 servlet 中使用 JavaMail 時(shí),未找到任何的 JavaMail 類。我已經(jīng)在服務(wù)器的 CLASSPATH 中添加了 mail.jar?
答:當(dāng)改變 CLASSPATH 時(shí),通常有必要完全重啟 Web 服務(wù)器。
問(wèn). 我的 servlet 可以找到 JavaMail 類,但 JavaMail 抱怨它不能找到針對(duì)“smtp”或“imap”的服務(wù)提供程序或地址類型“rfc822”。
答:通常這是因?yàn)?JavaMail 無(wú)法訪問(wèn) mail.jar 中的配置文件,而這可能是由于安全權(quán)限問(wèn)題造成的;參見 本條目,獲取更多的細(xì)節(jié)。也保證你沒有提取 mail.jar 內(nèi)容;在服務(wù)器的 CLASSPATH 中,應(yīng)該包括未更改的 mail.jar 文件。
問(wèn). 在哪里可以找到 jws.jar?我已經(jīng)安裝了 Java Web Server 2.0,并試圖運(yùn)行 JavaMailServlet。README 文件指示我在 CLASSPATH 中添加 jws.jar。
答:jws.jar
不再與 Java Web Server 一起發(fā)行(在以前版本中,它們是一起發(fā)行的),因此不需要在 CLASSPATH 中添加它。只要在
CLASSPATH 中添加 mail.jar 和 activation.jar,然后重啟 Java Web Server。
編程
問(wèn). 從哪里可以學(xué)習(xí)有關(guān) Internet 郵件的基礎(chǔ)知識(shí),它是我高效編寫 JavaMail 程序需要知道的?
答:參見我們的 Web 頁(yè)中提及的 參考圖書 中的一本,獲得有關(guān) Internet 電子郵件、MIME、SMTP、IMAP 和 POP3 等的背景信息。
問(wèn). 如何調(diào)試使用 JavaMail API 的應(yīng)用程序?
答:可通過(guò)在代碼中調(diào)用 Session 對(duì)象上的 setDebug(true)
方法來(lái)打開調(diào)試模式。這將造成在控制臺(tái)中打印調(diào)試消息,包括協(xié)議跟蹤信息。如果您認(rèn)為在 JavaMail 中發(fā)現(xiàn)了
bug,就將這個(gè)跟蹤及以下信息發(fā)送給我們:重生成問(wèn)題的測(cè)試用例、使用的平臺(tái)、使用的 JDK 的版本和使用的郵件服務(wù)器 (IMAP, SMTP)
的名稱和版本。
問(wèn). 如何發(fā)送帶有附件的消息?
答:帶有附件的消息采用 MIME 多部分消息來(lái)表示,其中第一部分是消息的主體,其他的部分是附件。有大量的例子,它們展示了如何在演示程序中構(gòu)建這種消息,JavaMail 下載包包含了這些演示程序。
問(wèn). 如何閱讀帶有附件的消息并保存附件?
答:如前面描述,在 MIME 中,帶有附件的消息是作為多部分消息表示的。在簡(jiǎn)單的例子中,Message
對(duì)象的 getContent
方法的結(jié)果將是一個(gè) MimeMultipart
對(duì)象。多部分對(duì)象的第一個(gè)主體部分將是消息的主文本。其他的主體部分將是附件。msgshow.java
演示程序展示了如何在消息中遍歷所有的多部分對(duì)象,并提取各個(gè)主體部分?jǐn)?shù)據(jù)。getDisposition
方法將給你一個(gè)提示,指出主體部分是否應(yīng)該內(nèi)嵌顯示,或者應(yīng)該將其考慮成附件(但請(qǐng)注意,不是所有的發(fā)件人都提供這一信息)。
為了將主體部分中的數(shù)據(jù)保存到文件(比如),請(qǐng)使用 getInputStream
方法來(lái)訪問(wèn)附件內(nèi)容,并將數(shù)據(jù)復(fù)制到 FileOutputStream
。
注意,也有一些更復(fù)雜的情形也要處理。例如,一些發(fā)件人把主體作為純文本和 html 發(fā)送。通常,這將作為 multipart/alternative
內(nèi)容(和 MimeMultipart
對(duì)象)出現(xiàn)在簡(jiǎn)單的文本主體部分的位置中。經(jīng)過(guò)數(shù)字簽名或加密的消息甚至?xí)鼜?fù)雜。處理所有的這些情形可能具有挑戰(zhàn)性。請(qǐng)參考各種 MIME 規(guī)范和我們主頁(yè)上列出的其他 參考資料。
問(wèn). 什么是“中斷支持”(disconnected support)?
答:支
持中斷操作的郵件客戶端將允許用戶訪問(wèn)遠(yuǎn)程消息存儲(chǔ)(比如
IMAP)中消息,緩存這些消息中的一些消息的(部分)到本地,然后斷開到服務(wù)器的連接。當(dāng)處在斷開連接狀態(tài)中,郵件客戶端可以訪問(wèn)已經(jīng)緩存的消息,可能
也可以刪除它們或?qū)⑺鼈儽4娴狡渌募A。當(dāng)郵件客戶端下一次連接到遠(yuǎn)程消息存儲(chǔ)時(shí),本地所做變更會(huì)與遠(yuǎn)程存儲(chǔ)同步。同樣,中斷支持可以允許客戶端在斷開
與服務(wù)器連接時(shí)“發(fā)送”消息,在到服務(wù)器的連接可用前,消息會(huì)進(jìn)行排隊(duì)。也請(qǐng)參閱 RFC1733。
問(wèn). 如何使用 JavaMail API 來(lái)支持中斷操作?
答:JavaMail API 規(guī)范定義了一些接口,郵件客戶端可以使用這些接口來(lái)支持中斷操作。我們的 IMAP 提供程序?qū)崿F(xiàn)了這些接口(UIDFolder 接口)。
問(wèn). 我如何使用 JavaMail API 來(lái)發(fā)送安全的電子郵件?
答:JavaMail API 目前不支持發(fā)送或接收安全電子郵件。JavaMail API 的體系結(jié)構(gòu)使得可以在以后很容易地添加這一支持,我們可以添加支持,第三方也可以添加支持。有關(guān)當(dāng)前電子郵件安全標(biāo)準(zhǔn)(S/MIME 和 PGP)的信息,可以從如下站點(diǎn)找到: http://www.imc.org/smime-pgpmime.html。 請(qǐng)瀏覽我們的 第三方產(chǎn)品 頁(yè),獲取來(lái)自其他供應(yīng)商的解決方案。
問(wèn). writeTo() 方法生成了消息文件,但消息中的一些行既不是數(shù)據(jù)的規(guī)范 MIME 表示(即使用 CRLF 來(lái)結(jié)束行),又沒有使用我的平臺(tái)的規(guī)范行分隔符(例如 UNIX 上的“\n”)。如果我需要這些表示時(shí),如何獲得它們當(dāng)中的任何一種表示?
答:不管是哪種情形,你都將需要?jiǎng)?chuàng)建合適的 FilterOutputStream 對(duì)象來(lái)傳遞給 writeTo()
。FilterOutputStream 將需要接受特定的一些行,它們具有任何常見終止符,然后寫出另外的一些特定行,它們只具有期望的行終止符。下面是這種過(guò)濾器的一些例子。NewlineOutputStream
轉(zhuǎn)換到本地平臺(tái)的行終止符,當(dāng)將消息寫到文件時(shí),它是有用的。CRLFOutputStream
轉(zhuǎn)換到 MIME 規(guī)范 CRLF 終止符,當(dāng)需要規(guī)范 MIME 格式時(shí)(比如計(jì)算數(shù)字簽名),它是有用的。
問(wèn). 我可以使用 JavaMail API 來(lái)實(shí)現(xiàn)郵件服務(wù)器嗎?
答:JavaMail
API 設(shè)計(jì)目的不是幫你實(shí)現(xiàn)郵件服務(wù)器。但是,對(duì)你來(lái)說(shuō),一些實(shí)用工具類,比如 MIME
消息解析類,可能是有用的。通常您會(huì)發(fā)現(xiàn),JavaMail API
是在“簡(jiǎn)單”而不是在“強(qiáng)有力”方面出錯(cuò)。對(duì)于郵件客戶端,那是合適的,但對(duì)于郵件服務(wù)器,結(jié)果可能是不同的。
問(wèn). 我可以使用 JavaMail API 在我的郵件服務(wù)器上添加新的用戶賬戶、刪除用戶賬戶或改變用戶賬戶的密碼嗎?
答:JavaMail API 不包括任何工具,用于添加、刪除或修改用戶賬戶。在這一方面是沒有標(biāo)準(zhǔn)的,每個(gè)郵件服務(wù)器對(duì)它的處理是不同的。
問(wèn). 為什么 MimeMessage 類沒有實(shí)現(xiàn) Serializable,這樣我就可以將消息序列化到磁盤,并在以后讀回它?
答:JavaMail API 是在現(xiàn)有電子郵件系統(tǒng)上面設(shè)計(jì)的,并使用了現(xiàn)有的消息格式。對(duì)于這樣的一些實(shí)現(xiàn),使用 Java 序列化能力既不是必要的,也不是有用的,因此,不能將它作為 JavaMail API 的目標(biāo)來(lái)考慮。
有關(guān)序列化 Message 的困難部分是保留某些指針,它們指向 Folder(文件夾)、Store(存儲(chǔ))和 Session(會(huì)話)。如果只想保存消息的內(nèi)容,而不是對(duì)象本身,消息的 writeTo
方法將為你完成這一切。如果想根據(jù)序列化消息創(chuàng)建整個(gè)電子郵件系統(tǒng),您應(yīng)該能夠編寫 Message 等的子類,并在子類中實(shí)現(xiàn) Serializable。
如果想序列化自己的引用了 MimeMessages的其他對(duì)象,那么你的對(duì)象的 writeObject
方法可以使用 MimeMessage 的 writeTo
方法,對(duì)象的 readObject
方法可以使用 MimeMessage 構(gòu)造函數(shù),該構(gòu)造函數(shù)會(huì)得到 InputStream。在構(gòu)造 MimeMessage 時(shí),你的類將需要提供一個(gè) Session。
問(wèn). 我如何編寫服務(wù)提供程序?
答:請(qǐng)閱讀服務(wù)提供程序文檔,獲取一些細(xì)節(jié)信息。通常,如果想編寫 Store 提供程序,那就編寫 javax.mail.Store
和 javax.mail.Folder
的子類,也可能要編寫 javax.mail.Message
及其他一些類的子類。對(duì)于 Transport 提供程序,編寫 javax.mail.Transport
的子類,也可能需要編寫 javax.mail.Message
及其他的一些類的子類。然后在 javamail.providers
注冊(cè)表中,添加描述提供程序的條目。如果對(duì)編寫特別的服務(wù)提供程序感興趣,并且它所針對(duì)的協(xié)議或郵件系統(tǒng)目前沒有得到 JavaMail API 實(shí)現(xiàn)的支持,請(qǐng)通過(guò) javamail@Sun.COM 聯(lián)系我們。
問(wèn). 我在登錄 Microsoft Exchange 服務(wù)器時(shí)碰到了麻煩,我確信正在使用的用戶名和密碼是正確的,我做錯(cuò)了什么?
答:當(dāng)?shù)卿?Exchange 時(shí),需要使用比簡(jiǎn)單登錄名更多的用戶名。例如,如果你的電子郵件地址是“J.User@server.com”,Windows NT 登錄名是“juser”,NT 域名是“dom”,而且 Exahange 郵箱名是“Joe User”,那么在使用 JavaMail 登錄時(shí),你將需要使用用戶名 “dom\juser\J.User”。
問(wèn). 在發(fā)送二進(jìn)制文件前,我如何編碼它?當(dāng)收到它時(shí),我又如何解碼它?
答:你不必這樣的做!JavaMail 將自動(dòng)決定合適的編碼用于消息部分,然后才發(fā)送消息。而且當(dāng)讀取它們時(shí),將自動(dòng)解碼消息部分。getInputStream
方法將返回解碼數(shù)據(jù)。
問(wèn). 如果我不需要自己編碼和解碼附件,我應(yīng)該何時(shí)使用 MimeUtility 方法?
答:在 JavaMail 沒有自動(dòng)處理的情況下,MimeUtility
方法是有用的。經(jīng)常發(fā)生的這樣的一種情形是文件名的編碼?;镜?MIME
spec(規(guī)范)不允許按某種方式編碼標(biāo)題參數(shù)值(比如文件名參數(shù)),該方式與(比如)編碼
Subject(主題)標(biāo)題相同。這限制了參數(shù)值,從而限制了文件名到 ASCII。但一些發(fā)件人卻實(shí)際使用 MIME 文本編碼來(lái)做非 ASCII
文件名的編碼工作。想與這種非標(biāo)準(zhǔn)發(fā)件人互操作的應(yīng)用程序可以使用 encodeText
方法來(lái)編碼文件名,然后調(diào)用 MimeBodyPart
setFileName
方法,而且可以使用 decodeText
方法來(lái)解碼返回的文件名。
問(wèn). 盡管 JavaMail 完成了所有的編碼和解碼工作,但我仍需要手動(dòng)控制一些主體部分的編碼。
答:在少數(shù)的場(chǎng)合需要控制編碼,這里有幾個(gè)方法來(lái)重寫 JavaMail 的默認(rèn)行為。下面是一個(gè)簡(jiǎn)單的方法。在創(chuàng)建整個(gè)消息后,調(diào)用 msg.saveChanges(),
然后使用像 mbp.setHeader("Content-Transfer-Encoding", "base64")
的語(yǔ)句來(lái)強(qiáng)制對(duì)指定主體部分做 base64 編碼。
另一種辦法是編寫 MimeBodyPart
的子類,并重寫 updateHeaders
方法,讓它首先調(diào)用 super.updateHeaders()
,然后像上面那樣設(shè)置 Content-Transfer-Encoding
標(biāo)題。
問(wèn). 為什么 JavaMail 沒有在非 ASCII 字符集中正確編碼和解碼文件名?
答:文件名是作為參數(shù)存儲(chǔ)在 MIME 標(biāo)題中的。形如 =?ISO-8859-15?B?5OTkLUluZm8ucGRm?=
的編碼文件名不是 MIME spec(規(guī)范)的一部分。形如 =?A?B?C?=
的文件名是一個(gè)完全有效的文件名,而不是一個(gè)不正確編碼的文件名。JavaMail 沒有編碼和解碼文件名,因?yàn)?strong>這樣做會(huì)違反 MIME 規(guī)范。
基本的 MIME 規(guī)范不允許編碼參數(shù)。RFC 2231 定義了一種新的方式,使得可以在 MIME 標(biāo)題中包括編碼參數(shù),包括文件名。它與下面的事實(shí)方式不兼容:許多應(yīng)用程序非法編碼文件名。支持 RFC 2231 將不允許 JavaMail 與這些現(xiàn)有的程序互操作。據(jù)我所知,很少現(xiàn)有的程序支持 RFC 2231。
如果你選擇違反 MIME 規(guī)范是為了與其他也違反了 MIME的程序互操作,那么 JavaMail 會(huì)給您所有需要的工具來(lái)完成這件事。
編碼文件名的解決方法是簡(jiǎn)單的:
mbp.setFileName(MimeUtility.encodeText(filename));
解碼文件名的解決方法同樣簡(jiǎn)單:
String filename = MimeUtility.decodeText(part.getFileName());
為什么 XX.hbm.xml 和 XX.cfg.xml這兩個(gè)文件要放在/WEB-INF/classes/這個(gè)目錄下呢?
因?yàn)槟愕乃?
有類放在/web-inf/classes/目錄下,所以new
Configuration().configure方法是以當(dāng)前目錄為根目錄(也就/web-inf/classes/目錄下)來(lái)尋找
xx.cfg.xml,否則hibernate是找不到的,除非你使用絕對(duì)路徑,或url(全球資源定位器);
SessionFactory sf=new Configuration().configure("/hibernate/hibernate.cfg.xml").buildSessionFactory();
hibernate會(huì)去/web-inf/classes/hibernate/目錄下去找到這個(gè)hibernate.cfg.xml
SessionFactory sf=new Configuration().configure().buildSessionFactory();
hibernate會(huì)去/web-inf/classes/目錄下去找到這個(gè)hibernate.cfg.xml
當(dāng)
你想用Session類的save方法把VO變成PO的時(shí)候,你就會(huì)想到Session是怎么來(lái)的,Session的對(duì)象是通過(guò)
SessionFactory類的openSession方法來(lái)實(shí)例化。有了SessionFactory你又會(huì)想到SessionFactory是怎么
來(lái)的,SessionFactory的對(duì)象是通過(guò)Configuration實(shí)例的來(lái)構(gòu)建。
Configuration類是用來(lái)管理hibernate的配置信息,如數(shù)據(jù)庫(kù)url,用戶名,密碼。。。
Configuration
類的buildSessionFactory()用來(lái)實(shí)例化SessionFactory
。要使用buildSessionFactory方法,必須先讓Configuration.configure()方法找到
hibernate.cfg.xml文件并初始化。
SessionFactory類是用于創(chuàng)建Session的實(shí)例。
Session是Hibernate持久化操作和管理的核心。
一直沒明白為什么hibernate的配置文件有兩個(gè), 一個(gè)properties,一個(gè)xml. 呵呵..偶才學(xué)了一個(gè)星期不要笑我....
properties 是模版型配置, 可以配置一些用xml寫起來(lái)麻煩的東西, 比如連接池,事務(wù)等..
xml的配置是在前面配置的基礎(chǔ)上的再配置, 偶覺得主要是配一些 mapping文件..
在源碼里, Configuration cfg = new Configuration(); 是加載 properties配置..
cfg.configure()是加載的xml配置
xml配置是覆蓋properties配置的.
這樣就可以兩個(gè)配置都用, 而且不用寫硬的addclass之類的東西了..
本文引用通告地址:
http://blog.csdn.net/nickeyfff/services/trackbacks/146758.aspx
[
點(diǎn)擊此處收藏本文]
http://blog.csdn.net/nickeyfff/archive/2004/10/22/146758.aspx
hibernate.cfg.xml not found - WebSphere PortalServer
We had the 'hibernate.cfg.xml not found' problem when developing
IBM WebSphere Portalserver portlets with struts and hibernate.
The solution was to have the hibernate.cfg.xml in WebSphere
Application Developer in ./JavaSources and get the hibernate
configuration at runtime this way:
File f=new File(servlet.getServletContext()
.getRealPath("/WEB-INF/classes/hibernate.cfg.xml"));
Configuration c = new Configuration().configure(f);
This is portable from WSAD to WPS