posts - 32,  comments - 3,  trackbacks - 0
 
JavaMail API详解(from http://www.blogjava.net/jxhkwhy/archive/2007/10/26/156118.html)
摘要:
JavaMail API是读取、撰写、发送电子信息的可选包。我们可用它来建立如Eudora、Foxmail、MS Outlook Express一般的邮件用户代理程序(Mail User Agent,简称MUA)。让我们看看JavaMail API是如何提供信息访问功能的吧!JavaMail API被设计用于以不依赖协议的方式去发送和接收电子信息,文中着重:如何以不依赖于协议的方式发送接收电子信息,这也是本文所要描述的.

版权声明:本文可以自由转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
作者:cleverpig(作者的Blog:http://blog.matrix.org.cn/page/cleverpig)
原文:http://www.matrix.org.cn/resource/article/44/44101_JavaMail.html
关键字:java,mail,pop,smtp

一、JavaMail API简介
JavaMail API是读取、撰写、发送电子信息的可选包。我们可用它来建立如Eudora、Foxmail、MS Outlook Express一般的邮件用户代理程序(Mail User Agent,简称MUA)。而不是像sendmail或者其它的邮件传输代理(Mail Transfer Agent,简称MTA)程序那样可以传送、递送、转发邮件。从另外一个角度来看,我们这些电子邮件用户日常用MUA程序来读写邮件,而MUA依赖着 MTA处理邮件的递送。
在清楚了到MUA与MTA之间的关系后,让我们看看JavaMail API是如何提供信息访问功能的吧!JavaMail API被设计用于以不依赖协议的方式去发送和接收电子信息,这个API被分为两大部分:

基本功能:如何以不依赖于协议的方式发送接收电子信息,这也是本文所要描述的,不过在下文中,大家将看到这只是一厢情愿而已。
第二个部分则是依赖特定协议的,比如SMTP、POP、IMAP、NNTP协议。在这部分的JavaMail API是为了和服务器通讯,并不在本文的内容中。

二、相关协议一览
在我们步入JavaMail API之前,先看一下API所涉及的协议。以下便是大家日常所知、所乐于使用的4大信息传输协议:
SMTP
POP
IMAP
MIME
当然,上面的4个协议,并不是全部,还有NNTP和其它一些协议可用于传输信息,但是由于不常用到,所以本文便不提及了。理解这4个基本的协议有助于我们 更好的使用JavaMail API。然而JavaMail API是被设计为与协议无关的,目前我们并不能克服这些协议的束缚。确切的说,如果我们使用的功能并不被我们选择的协议支持,那么JavaMail API并不可能如魔术师一样神奇的赋予我们这种能力。

1.SMTP
简单邮件传输协议定义了递送邮件的机制。在下文中,我们将使用基于Java-Mail的程序与公司或者ISP的SMTP服务器进行通讯。这个 SMTP服务器将邮件转发到接收者的SMTP服务器,直至最后被接收者通过POP或者IMAP协议获取。这并不需要SMTP服务器使用支持授权的邮件转 发,但是却的确要注意SMTP服务器的正确设置(SMTP服务器的设置与JavaMail API无关)。

2.POP
POP是一种邮局协议,目前为第3个版本,即众所周知的POP3。POP定义了一种用户如何获得邮件的机制。它规定了每个用户使用一个单独的邮箱。大多数 人在使用POP时所熟悉的功能并非都被支持,例如查看邮箱中的新邮件数量。而这个功能是微软的Outlook内建的,那么就说明微软 Outlook之类的邮件客户端软件是通过查询最近收到的邮件来计算新邮件的数量来实现前面所说的功能。因此在我们使用JavaMail API时需要注意,当需要获得如前面所讲的新邮件数量之类的信息时,我们不得不自己进行计算。

3.IMAP
IMAP使用在接收信息的高级协议,目前版本为第4版,所以也被称为IMAP4。需要注意的是在使用IMAP时,邮件服务器必须支持该协议。从这个方面 讲,我们并不能完全使用IMAP来替代POP,不能期待IMAP在任何地方都被支持。假如邮件服务器支持IMAP,那么我们的邮件程序将能够具有以下被 IMAP所支持的特性:每个用户在服务器上可具有多个目录,这些目录能在多个用户之间共享。
其与POP相比高级之处显而易见,但是在尝试采取IMAP时,我们认识到它并不是十分完美的:由于IMAP需要从其它服务器上接收新信息,将这些信息递送 给用户,维护每个用户的多个目录,这都为邮件服务器带来了高负载。并且IMAP与POP的一个不同之处是POP用户在接收邮件时将从邮件服务器上下载邮 件,而IMAP允许用户直接访问邮件目录,所以在邮件服务器进行备份作业时,由于每个长期使用此邮件系统的用户所用的邮件目录会占有很大的空间,这将直接 导致邮件服务器上磁盘空间暴涨。

4.MIME
MIME并不是用于传送邮件的协议,它作为多用途邮件的扩展定义了邮件内容的格式:信息格式、附件格式等等。一些RFC标准都涉及了MIME: RFC 822, RFC 2045, RFC 2046, RFC 2047,有兴趣的Matrixer可以阅读一下。而作为JavaMail API的开发者,我们并不需关心这些格式定义,但是这些格式被用在了程序中。

5.NNTP和其它的第三方协议
正因为JavaMail API在设计时考虑到与第三方协议实现提供商之间的分离,故我们可以很容易的添加一些第三方协议。SUN维护着一个第三方协议实现提供商的列表:http://java.sun.com/products/javamail/Third_Party.html, 通过此列表我们可以找到所需要的而又不被SUN提供支持的第三方协议:比如NNTP这个新闻组协议和S/MIME这个安全的MIME协议。

三、安装
1.安装JavaMail
为了使用JavaMail API,需要从http://java.sun.com/products/javamail/downloads/index.html下 载文件名格式为javamail-[version].zip的文件(这个文件中包括了JavaMail实现),并将其中的mail.jar文件添加到 CLASSPATH中。这个实现提供了对SMTP、IMAP4、POP3的支持。
注意:在安装JavaMail实现之后,我们将在demo目录中发现许多有趣的简单实例程序。
在安装了JavaMail之后,我们还需要安装JavaBeans Activation Framework,因为这个框架是JavaMail API所需要的。如果我们使用J2EE的话,那么我们并无需单独下载JavaMail,因为它存在于J2EE.jar中,只需将J2EE.jar加入到 CLASSPATH即可。

2.安装JavaBeans Activation Framework
http://java.sun.com/products/javabeans/glasgow/jaf.html下 载JavaBeans Activation Framework,并将其添加到CLASSPATH中。此框架增加了对任何数据块的分类、以及对它们的处理的特性。这些特性是JavaMail API需要的。虽然听起来这些特性非常模糊,但是它对于我们的JavaMail API来说只是提供了基本的MIME类型支持。
到此为止,我们应当把mail.jar和activation.jar都添加到了CLASSPATH中。
当然如果从方便的角度讲,直接把这两个Jar文件复制到JRE目录的lib/ext目录中也可以。

四、初次认识JavaMail API
1.了解我们的JavaMail环境
A.纵览JavaMail核心类结构
打开JavaMail.jar文件,我们将发现在javax.mail的包下面存在着一些核心类:Session、Message、 Address、Authenticator、Transport、Store、Folder。而且在javax.mail.internet包中还有一 些常用的子类。
B.Session
Session类定义了基本的邮件会话。就像Http会话那样,我们进行收发邮件的工作都是基于这个会话的。Session对象利用了 java.util.Properties对象获得了邮件服务器、用户名、密码信息和整个应用程序都要使用到的共享信息。
Session类的构造方法是私有的,所以我们可以使用Session类提供的getDefaultInstance()这个静态工厂方法获得一个默认的 Session对象:

Properties props = new Properties();
// fill props with any information
Session session = Session.getDefaultInstance(props, null);

或者使用getInstance()这个静态工厂方法获得自定义的Session:

Properties props = new Properties();
// fill props with any information
Session session = Session.getInstance(props, null);

从上面的两个例子中不难发现,getDefaultInstance()和getInstance()方法的第二个参数都是null,这是因为在上面的例 子中并没有使用到邮件授权,下文中将对授权进行详细介绍。
从很多的实例看,在对mail server进行访问的过程中使用共享的Session是足够的,即使是工作在多个用户邮箱的模式下也不例外。

C.Message
当我们建立了Session对象后,便可以被发送的构造信息体了。在这里SUN提供了Message类型来帮助开发者完成这项工作。由于 Message是一个抽象类,大多数情况下,我们使用javax.mail.internet.MimeMessage这个子类,该类是使用MIME类 型、MIME信息头的邮箱信息。信息头只能使用US-ASCII字符,而非ASCII字符将通过编码转换为ASCII的方式使用。
为了建立一个MimeMessage对象,我们必须将Session对象作为MimeMessage构造方法的参数传入:

MimeMessage message = new MimeMessage(session);

注意:对于MimeMessage类来讲存在着多种构造方法,比如使用输入流作为参数的构造方法。

在建立了MimeMessage对象后,我们需要设置它的各个part,对于MimeMessage类来说,这些part就是MimePart接口。最基 本的设置信息内容的方法就是通过表示信息内容和米么类型的参数调用setContent()方法:

message.setContent("Hello", "text/plain");

然而,如果我们所使用的MimeMessage中信息内容是文本的话,我们便可以直接使用setText()方法来方便的设置文本内容。

message.setText("Hello");

前面所讲的两种方法,对于文本信息,后者更为合适。而对于其它的一些信息类型,比如HTML信息,则要使用前者。
别忘记了,使用setSubject()方法对邮件设置邮件主题:

message.setSubject("First");


D.Address
到这里,我们已经建立了Session和Message,下面将介绍如何使用邮件地址类:Address。像Message一样,Address类也是一 个抽象类,所以我们将使用javax.mail.internet.InternetAddress这个子类。
通过传入代表邮件地址的字符串,我们可以建立一个邮件地址类:

Address address = new InternetAddress("president@whitehouse.gov");

如果要在邮件地址后面增加名字的话,可以通过传递两个参数:代表邮件地址和名字的字符串来建立一个具有邮件地址和名字的邮件地址类:

Address address = new InternetAddress("president@whitehouse.gov", "George Bush");

本文在这里所讲的邮件地址类是为了设置邮件信息的发信人和收信人而准备的,在建立了邮件地址类后,我们通过message的setFrom()和 setReplyTo()两种方法设置邮件的发信人:

message.setFrom(address);
message.setReplyTo(address);

若在邮件中存在多个发信人地址,我们可用addForm()方法增加发信人:

Address address[] = ...;
message.addFrom(address);

为了设置收信人,我们使用addRecipient()方法增加收信人,此方法需要使用Message.RecipientType的常量来区分收信人的 类型:

message.addRecipient(type, address)

下面是Message.RecipientType的三个常量:
Message.RecipientType.TO
Message.RecipientType.CC
Message.RecipientType.BCC
因此,如果我们要发送邮件给总统,并发用一个副本给第一夫人的话,下面的方法将被用到:

Address toAddress = new InternetAddress("vice.president@whitehouse.gov");
Address ccAddress = new InternetAddress("first.lady@whitehouse.gov");
message.addRecipient(Message.RecipientType.TO, toAddress);
message.addRecipient(Message.RecipientType.CC, ccAddress);

JavaMail API并没有提供检查邮件地址有效性的机制。当然我们可以自己完成这个功能:验证邮件地址的字符是否按照RFC822规定的格式书写或者通过DNS服务器 上的MX记录验证等。

E.Authenticator
像java.net类那样,JavaMail API通过使用授权者类(Authenticator)以用户名、密码的方式访问那些受到保护的资源,在这里“资源”就是指邮件服务器。在 javax.mail包中可以找到这个JavaMail的授权者类(Authenticator)。
在使用Authenticator这个抽象类时,我们必须采用继承该抽象类的方式,并且该继承类必须具有返回 PasswordAuthentication对象(用于存储认证时要用到的用户名、密码)getPasswordAuthentication()方 法。并且要在Session中进行注册,使Session能够了解在认证时该使用哪个类。
下面代码片断中的MyAuthenticator就是一个Authenticator的子类。

Properties props = new Properties();
// fill props with any information
Authenticator auth = new MyAuthenticator();
Session session = Session.getDefaultInstance(props, auth);


F.Transport
在发送信息时,Transport类将被用到。这个类实现了发送信息的协议(通称为SMTP),此类是一个抽象类,我们可以使用这个类的静态方法 send()来发送消息:

Transport.send(message);

当然,方法是多样的。我们也可由Session获得相应协议对应的Transport实例。并通过传递用户名、密码、邮件服务器主机名等参数建立与邮件服 务器的连接,并使用sendMessage()方法将信息发送,最后关闭连接:

message.saveChanges(); // implicit with send()
Transport transport = session.getTransport("smtp");
transport.connect(host, username, password);
transport.sendMessage(message, message.getAllRecipients());
transport.close();

评论:上面的方法是一个很好的方法,尤其是在我们在同一个邮件服务器上发送多个邮件时。因为这时我们将在连接邮件服务器后连续发送邮件,然后再关闭掉连 接。send()这个基本的方法是在每次调用时进行与邮件服务器的连接的,对于在同一个邮件服务器上发送多个邮件来讲可谓低效的方式。
注意:如果需要在发送邮件过程中监控mail命令的话,可以在发送前设置debug标志:

session.setDebug(true)。


G.Store和Folder
接收邮件和发送邮件很类似都要用到Session。但是在获得Session后,我们需要从Session中获取特定类型的Store,然后连接到 Store,这里的Store代表了存储邮件的邮件服务器。在连接Store的过程中,极有可能需要用到用户名、密码或者Authenticator。

// Store store = session.getStore("imap");
Store store = session.getStore("pop3");
store.connect(host, username, password);

在连接到Store后,一个Folder对象即目录对象将通过Store的getFolder()方法被返回,我们可从这个Folder中读取邮件信息:

Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_ONLY);
Message message[] = folder.getMessages();

上面的例子首先从Store中获得INBOX这个Folder(对于POP3协议只有一个名为INBOX的Folder有效),然后以只读 (Folder.READ_ONLY)的方式打开Folder,最后调用Folder的getMessages()方法得到目录中所有Message的数 组。

注意:对于POP3协议只有一个名为INBOX的Folder有效,而对于IMAP协议,我们可以访问多个Folder(想想前面讲的IMAP协议)。而 且SUN在设计Folder的getMessages()方法时采取了很智能的方式:首先接收新邮件列表,然后再需要的时候(比如读取邮件内容)才从邮件 服务器读取邮件内容。
在读取邮件时,我们可以用Message类的getContent()方法接收邮件或是writeTo()方法将邮件保存,getContent()方法 只接收邮件内容(不包含邮件头),而writeTo()方法将包括邮件头。

System.out.println(((MimeMessage)message).getContent());

在读取邮件内容后,别忘记了关闭Folder和Store。

folder.close(aBoolean);
store.close();

传递给Folder.close()方法的boolean 类型参数表示是否在删除操作邮件后更新Folder。

H.继续向前进!
在讲解了以上的七个Java Mail核心类定义和理解了简单的代码片断后,下文将详细讲解怎样使用这些类实现JavaMail API所要完成的高级功能。

五、使用JavaMail API
在明确了JavaMail API的核心部分如何工作后,本人将带领大家学习一些使用Java Mail API任务案例。
1.发送邮件
在获得了Session后,建立并填入邮件信息,然后发送它到邮件服务器。这便是使用Java Mail API发送邮件的过程,在发送邮件之前,我们需要设置SMTP服务器:通过设置Properties的mail.smtp.host属性。

String host = ...;
String from = ...;
String to = ...;

// Get system properties
Properties props = System.getProperties();

// Setup mail server
props.put("mail.smtp.host", host);

// Get session
Session session = Session.getDefaultInstance(props, null);

// Define message
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.addRecipient(Message.RecipientType.TO,
new InternetAddress(to));
message.setSubject("Hello JavaMail");
message.setText("Welcome to JavaMail");
// Send message
Transport.send(message);

由于建立邮件信息和发送邮件的过程中可能会抛出异常,所以我们需要将上面的代码放入到try-catch结构块中。

2.接收邮件
为了在读取邮件,我们获得了session,并且连接到了邮箱的相应store,打开相应的Folder,然后得到我们想要的邮件,当然别忘记了在结束时 关闭连接。

String host = ...;
String username = ...;
String password = ...;

// Create empty properties
Properties props = new Properties();

// Get session
Session session = Session.getDefaultInstance(props, null);

// Get the store
Store store = session.getStore("pop3");
store.connect(host, username, password);

// Get folder
Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_ONLY);

// Get directory
Message message[] = folder.getMessages();

for (int i=0, n=message.length; i<n; i++) {
System.out.println(i + ": " + message[i].getFrom()[0]
+ ""t" + message[i].getSubject());
}

// Close connection
folder.close(false);
store.close();

上面的代码所作的是从邮箱中读取每个邮件,并且显示邮件的发信人地址和主题。从技术角度讲,这里存在着一个异常的可能:当发信人地址为空 时,getFrom()[0]将抛出异常。

下面的代码片断有效的说明了如何读取邮件内容,在显示每个邮件发信人和主题后,将出现用户提示从而得到用户是否读取该邮件的确认,如果输入YES 的话,我们可用Message.writeTo(java.io.OutputStream os)方法将邮件内容输出到控制台上,关于Message.writeTo()的具体用法请看JavaMail API。

BufferedReader reader = new BufferedReader (
new InputStreamReader(System.in));

// Get directory
Message message[] = folder.getMessages();
for (int i=0, n=message.length; i<n; i++) {
System.out.println(i + ": " + message[i].getFrom()[0]
+ ""t" + message[i].getSubject());

System.out.println("Do you want to read message? " +
"[YES to read/QUIT to end]");
String line = reader.readLine();
if ("YES".equals(line)) {
message[i].writeTo(System.out);
} else if ("QUIT".equals(line)) {
break;
}
}


3.删除邮件和标志
设置与message相关的Flags是删除邮件的常用方法。这些Flags表示了一些系统定义和用户定义的不同状态。在Flags类的内部类Flag中 预定义了一些标志:
Flags.Flag.ANSWERED
Flags.Flag.DELETED
Flags.Flag.DRAFT
Flags.Flag.FLAGGED
Flags.Flag.RECENT
Flags.Flag.SEEN
Flags.Flag.USER
但需要在使用时注意的:标志存在并非意味着这个标志被所有的邮件服务器所支持。例如,对于删除邮件的操作,POP协议不支持上面的任何一个。所以要确定哪 些标志是被支持的——通过访问一个已经打开的Folder对象的getPermanetFlags()方法,它将返回当前被支持的Flags类对象。
删除邮件时,我们可以设置邮件的DELETED标志:

message.setFlag(Flags.Flag.DELETED, true);

但是首先要采用READ_WRITE的方式打开Folder:

folder.open(Folder.READ_WRITE);

在对邮件进行删除操作后关闭Folder时,需要传递一个true作为对删除邮件的擦除确认。

folder.close(true);

Folder类中另一种用于删除邮件的方法expunge()也同样可删除邮件,但是它并不为sun提供的POP3实现支持,而其它第三方提供的POP3 实现支持或者并不支持这种方法。
另外,介绍一种检查某个标志是否被设置的方法:Message.isSet(Flags.Flag flag)方法,其中参数为被检查的标志。

4.邮件认证
我们在前面已经学会了如何使用Authenticator类来代替直接使用用户名和密码这两字符串作为 Session.getDefaultInstance()或者Session.getInstance()方法的参数。在前面的小试牛刀后,现在我们将 了解到全面认识一下邮件认证。
我们在此取代了直接使用邮件服务器主机名、用户名、密码这三个字符串作为连接到POP3 Store的方式,使用存储了邮件服务器主机名信息的属性文件,并在获得Session时传入自定义的Authenticator实例:

// Setup properties
Properties props = System.getProperties();
props.put("mail.pop3.host", host);

// Setup authentication, get session
Authenticator auth = new PopupAuthenticator();
Session session = Session.getDefaultInstance(props, auth);

// Get the store
Store store = session.getStore("pop3");
store.connect();


PopupAuthenticator类继承了抽象类Authenticator,并且通过重载Authenticator类的 getPasswordAuthentication()方法返回PasswordAuthentication类对象。而 getPasswordAuthentication()方法的参数param是以逗号分割的用户名、密码组成的字符串。

import javax.mail.*;
import java.util.*;

public class PopupAuthenticator extends Authenticator {

public PasswordAuthentication getPasswordAuthentication(String param) {
String username, password;

StringTokenizer st = new StringTokenizer(param, ",");
username = st.nextToken();
password = st.nextToken();

return new PasswordAuthentication(username, password);
}

}


5.回复邮件
回复邮件的方法很简单:使用Message类的reply()方法,通过配置回复邮件的收件人地址和主题(如果没有提供主题的话,系统将默认将 “Re:”作为邮件的主体),这里不需要设置任何的邮件内容,只要复制发信人或者reply-to到新的收件人。而reply()方法中的boolean 参数表示是否将邮件回复给发送者(参数值为false),或是恢复给所有人(参数值为true)。
补充一下,reply-to地址需要在发信时使用setReplyTo()方法设置。

MimeMessage reply = (MimeMessage)message.reply(false);
reply.setFrom(new InternetAddress("president@whitehouse.gov"));
reply.setText("Thanks");
Transport.send(reply);


6.转发邮件
转发邮件的过程不如前面的回复邮件那样简单,它将建立一个转发邮件,这并非一个方法就能做到。
每个邮件是由多个部分组成,每个部分称为一个邮件体部分,是一个BodyPart类对象,对于MIME类型邮件来讲就是MimeBodyPart 类对象。这些邮件体包含在成为Multipart的容器中对于MIME类型邮件来讲就是MimeMultiPart类对象。在转发邮件时,我们建立一个文 字邮件体部分和一个被转发的文字邮件体部分,然后将这两个邮件体放到一个Multipart中。说明一下,复制一个邮件内容到另一个邮件的方法是仅复制它 的DataHandler(数据处理者)即可。这是由JavaBeans Activation Framework定义的一个类,它提供了对邮件内容的操作命令的访问、管理了邮件内容操作,是不同的数据源和数据格式之间的一致性接口。

// Create the message to forward
Message forward = new MimeMessage(session);

// Fill in header
forward.setSubject("Fwd: " + message.getSubject());
forward.setFrom(new InternetAddress(from));
forward.addRecipient(Message.RecipientType.TO,
new InternetAddress(to));

// Create your new message part
BodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.setText(
"Here you go with the original message:"n"n");

// Create a multi-part to combine the parts
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(messageBodyPart);

// Create and fill part for the forwarded content
messageBodyPart = new MimeBodyPart();
messageBodyPart.setDataHandler(message.getDataHandler());

// Add part to multi part
multipart.addBodyPart(messageBodyPart);

// Associate multi-part with message
forward.setContent(multipart);

// Send message
Tran
posted @ 2010-06-03 12:18 donghang73 阅读(289) | 评论 (0)编辑 收藏
1、将用户名(Grape)加入sudoers
$su
(input password,不带回显)
$echo 'Grape ALL=(ALL) ALL' >> /etc/sudoers

2、文本编辑(突然忘记了,写下来,以免再忘,呵呵)
gedit

3、Windows无法启动 / 调整Windows和Linux的启动顺序
位 置:/boot/grub/menu.lst
$sudo gedit /boot/grub/menu.lst
添加或者修改:
title Windows XP Professional
rootnoverify (hd0,0)
chainloader +1

4、安装yum
$sudo rpm -ivh http://rpv.livna.org/livna-release-9.rpm
(另 外:
$sudo yum update
可以执行系统的全面升级,不过网上有资料说不推荐使用...)

5、中文输入法
$sudo yum install scim-pinyin
(可以看到yum的作用了嘿)
这个安装完似乎 要重启下XWindow

6、重启XWindow
Ctrl+Alt+Backspace
简单!~

7、tar.bz2的安装(具体参数就省略了)
解压:
$tar -xjf FILENAME.tar.bz2
进入目录安 装:
#./configure
#make
#make install

8、进入root
$su root
(input password)^_^
#

9、MPlayer
更改配置文件:
$gedit ~/.mplayer/config
全屏:
写入:
zoom=yes
由 于我有两块声卡,这下吃了大苦头了,要么用MPlayer播放avi没声音,要么用RealPlayer播放rm/rmvb没声音....
要解决 问题(前提是在Linux下的硬件配置要一致,驱动正确),要么在BIOS里面屏蔽一块声卡,要么可以选择在MPlayer的配置文件里写入音频输出的设 备配置:
ao=oss:/dev/dsp2,oss:/dev/dsp1,(最后这个,不能少)
或者ao=alsa或者pcm之类 的...
嗯,我要好好夸奖这个播放器,界面简洁,画质也还不错吧,启动非常快,快得刚开始让我有点惊讶...

10、MP3的标签问题
很要命的问题,全 是乱码...
可以安装一个叫python-mutagen的小东东,它可以将MP3标签里面的ID3v1、ID3v2等 标签统统转换成APEv2填充,这样在Linux和Windows下面都可以显示正常了。
千千静听默认读取的就是APEv2格式的标 签,foobar也读取APEv2的标签,但是在Windows下面会出现一个新问题,所有的歌曲在以详细信息查看的时候就会显示乱码—— ???????,怎么办呢?干脆删掉ID3v1的标签吧。
$mid3iconv -e GBK --remove v1 *.MP3
这个小东东效果很好的! 赞!~

11、访问局域网共享
不知道为什么,我的Fedora 9用不成smbmount,但是可以找到smbclient,也可以了
列出共享:
#smbclient -L //192.168.1.200 -U 用户名
#smbclient //192.168.1.200 -U 用户名
这个执行完就可以进 入
smb: ">
呵呵,ls、cd等命令统统可以用,还可以用get和put下载和上传文件
当然,那样有些麻烦,当然可以 把共享目录像挂载硬盘一样挂载到/mnt下面的目录
Fedora 9下面得找到/sbin/mount.cifs
mount.cifs //192.168.1.200/Music /mnt/netshare -o user=用户名
呵呵,如果那个“Music”也就是挂载的目录名中间有空格怎么办?简单~~
mount.cifs //192.168.1.200/'Music Pop' /mnt/netshare -o user=用户名
搞定!~

12、挂载硬盘、移动硬盘等
哎,用得太多了,都忘不了了,也写写吧
比如要挂载原来的系统盘(假设为Windows下的C盘,位置 /dev/sda0),NTFS格式
$sudo mount -t ntfs /dev/sda0 /mnt/winsys
卸载:
$sudo umount /dev/sda0
或者:
$sudo umount /mnt/winsys
或者能卸载的全卸载:
$sudo umount -a
有时候移动硬盘在Windows下非正常拔出可能导致在Linux下无法挂载,使用上述命令也无法挂载,这种情况可以使用 force开关
$sudo mount -t ntfs /dev/sdc1 /mnt/usbhdd -o force
这样,它会重写 NTFS的日志文件,将磁盘挂载,Linux是很严谨的哦!~
先写这么多吧,以后碰到什么再写^_^
Linux很强大,慢慢学习 ing~~
喜欢Linux (*^__^*)


转自:http://www.linuxidc.com/Linux/2008-10/17050.htm

 

 


posted @ 2010-04-09 01:17 donghang73 阅读(164) | 评论 (0)编辑 收藏

1. 安装依赖包
su -'yum install compat-libstdc++-33 compat-libstdc++-296'

su -c '/sbin/ldconfig/'

2. Oracle的网站上下载linux版的JDK安装文件,jdk-6u19-linux-i586-rpm.bin(目前的最新版)
 
并将安装文件移动到/opt目录下

3.
切换到root用户,并进入/opt目录

su --login
输入密码
cd 
/opt


4.
直接运行安装文件即可完成安装

sh ./jdk-6u19-linux-i586-rpm.bin

一路按space,选择接受协议,然后就等待它完成吧。

5.
安装完成后就需要设定环境变量了

# nano /etc/profile.d/java.sh
在编辑器中输入如下内容:
export JAVA_HOME
=(具体的JDK的安装目录,例如/usr/java/jdk1.6.0_19/
export PATH
=$JAVA_HOME/bin:$PATH 
然后保存退出即可


6. 因为Fedora 9自带了OpenJDK,所以还需要将刚刚安装的JDK设为默认

/usr/sbin/alternatives --install /usr/bin/java java /(JDK的安装目录)/bin/java 3
/usr/sbin/alternatives --config java

然后会出现:

共有 3 个程序提供“java”。

  选择    命令
-----------------------------------------------
*  1           /usr/lib/jvm/jre-1.6.0-openjdk/bin/java
   
2           /usr/lib/jvm/jre-1.5.0-gcj/bin/java
 
+ 3           /usr/java/jdk1.6.0_19/bin/java

按 Enter 来保存当前选择[
+],或键入选择号码:

输入:3 回车后即ok!


7. 测试是否安装成功

java -version

如果显示

java version "1.6.0_19"
Java(TM) SE Runtime Environment (build 
1.6.0_19-b04)
Java HotSpot(TM) Client VM (build 
16.2-b04, mixed mode, sharing)

则表示已成功安装


posted @ 2010-04-09 00:12 donghang73 阅读(373) | 评论 (0)编辑 收藏
首先去小企鹅的官方网站上下载fedora对应的RPM包。

然后就是常用的RPM包安装方法了
rpm -ivh fcitx-3.2.050827-fc4.noarch.rpm


要想让输入法开机自启动, 在 /etc/X11/xinit/xinput.d/ 目录中查看文件zh_CN ,如果没有就建一个;把里面的内容改为如下的;


XIM=fcitx
XIM_PROGRAM=fcitx
GTK_IM_MODULE=fcitx
gnome-im-settings-daemon >/dev/null


OK!大功告成。


posted @ 2010-04-08 23:38 donghang73 阅读(389) | 评论 (0)编辑 收藏
使用Nero Burning ROM 将APE(CUE)刻录成CD音乐光盘

  APE是目前流行的数字音乐文件格式之一。与MP3这类有损压缩方式不同,APE是一种无损压缩技术,也就是说当你将从音频CD上 读取的音频数据文件压缩成APE格式后,你还可以再将APE格式的文件还原,而还原后的音频文件与压缩前的一模一样,没有任何损失。APE的文件大小大概 为CD的一半,但是随着宽带的普及,APE格式受到了许多音乐爱好者的喜爱,特别是对于希望通过网络传输音频CD的朋友来说,APE可以帮助他们节约大量 的资源。

本人在电驴浏览器里下载到了非常多的APE音乐文件,这APE的容量比较大,很占硬盘空间,就想将一部分APE刻录成CD光盘。

在百度里用关键词“如何把APE刻录成CD ”搜索到的方法有很多,看到那些方法都非常麻烦,操作起来不方便。下面根据自己摸索,终于找到了比较简单的方 法,拿出来跟大家分享一下。

一、有CUE文件的APE刻录。

运行刻录软件,选择刻录音频->制作音频光盘。





软件会自动进入下面这个界面:



这时候无法选择CUE文件进行刻录,必须点击“上一步”,退回来选择。选择左边的第三项“映像、项目、复制”,然后点击右边的“映像光盘或保存项 目”。





找到要刻录的APE的播放列表CUE文件,打开:



接下来会有几秒钟的等待时间,这可能是检测过程。然后会显示下面这个窗口,放入刻录光盘,直接点击刻录就行了。



二、没有播放列表CUE文件的刻录方法

如果没有CUE播放列表,就只能下载APE插件APE Plugin for Nero 了。可以到百度去搜索。建议使用这个网址:http://www.china1000.net/downinfo/25697.html。 我的插件就是从这里下载的。

使用该插件可以让Nero直接刻录APE音乐。解压nxMyAPE.dll到C:"PROGRAM FILES"COMMON FILES"AHEAD"AUDIOPLUGINS,启动Nero后就可以了!安装了ape plugin for nero,就可以像用wav、mp3刻cd一样,直接在nero里拖放就成。


PS:如果没有cue文件,而下载的文件是每个音轨单独对应一个ape,则与nero里把wav或者mp3文件刻成cd类似,一个一个文 件分别导入。但是如果整张音乐CD光盘就一个APE,且没有CUE文件的话,按第二种方法刻录出来的CD光盘,里面的歌曲就无法选择曲目进行播放。遇到这 种情况的时候最好先制作CUE文件。制作CUE的方法可以到网上去搜索,这里就不再叙述了。

转自:
http://hi.baidu.com/94selina/blog/item/2f9ec281040eb9d3bc3e1e56.html

补充:
1、用NERO刻录APE就需要安装一个插件,这插件很容易找,在google或迅雷一搜“NERO支持APE刻录CD插件”你就可以找到很多,其实只是 个DLL文件。
插件的安装方法和注意事项::
- Nero Burning ROM 5.5.9.0或更高版本  
- Nero Burning ROM 5.x:将.dll解压到'...AheadSharedAudioPlugins'目录下  
- Nero Burning ROM 6.x:将.dll解压到'Program FilesCommon FilesAheadAudioPlugins'目录下  

- Nero Burning ROM 7.x将.dll解压到
'Program FilesCommon FilesAheadAudioPlugins'目录下
* 插件(*.dll)名字头两个字母'nx'必须小写

2、准备工作完毕后,开始动手吧~~~首先运行NERO6.0,注意啦,我用的是6.0而不是其它版本,开始我用的是7.0,没有成功,后来改用6.0。 是什么原因,我也不清楚,可能是我安装的不好,可能7.0真的不支持吧,可能我的系统有问题……



3、选择“刻录镜像文件”
然后选择这个APE相关的CUE文件,“打开”之后你就可以刻录了。。。。。

怎样?很简单吧?三步就搞掂了。但是初学者可能会遇到很多问,下面我来说说要注意的一些小细节:

1、CUE打开出错。
不用想了,CUE有问题,所以NERO肯定打不开,首先你要了解CUE,你也可以自己编写。用记事本打开CUE,你就可以看到CD的详细信息:

第一行是:CATALOG 0028946218624
            这个CATALOG是一个媒体编目码(Media Catalog Number),必须是13位阿拉伯数字,一般与唱片的UPC(商品条形码)相对应。比如这张片子的UPC码就是:0028946218624。两张不同 唱片的CATALOG码是绝不会重复的。这一行是可选的,没有也可以。

第二行是:PERFORMER 'Mozart'
            这个PERFORMER是指整个唱片的表演家的名字。必须用双引号括起来。这一行也是可选的。

第三行是: 'Les grandes sonates pour violon, vol.1'
                TITLE是指唱片的名字。必须用双引号括起来。这一行也是可选的。

第四行是:FILE “歌曲名 4CD-1.ape” WAVE
                FILE就是你要刻录的光盘映像文件了。WAVE表示该文件是音频文件。
文件的路径可以是绝对路径,如:“I:歌曲名 4CD-1.ape”。
也可以是相对路径,如:“歌曲名 4CD-1.ape”。
注意,如果使用相对路径,则CUE文件和APE必须在同一路径下,否则播放或刻录的时候CUE无法定位APE/WAV文件。

第五行是:TRACK 01 AUDIO
                这一行很关键,它表示当前刻录那个光轨、光轨的类型。这里表示是第一个光轨,AUDIO表示光轨的类型是音频。
当中这个数字必须是从01开始的2位阿拉伯数字,升序排列,绝不可以跳跃、空缺或重复,一定是:01、02、03、04…这样下去,直到结束。

第六、七行
               指该曲目的表演家、曲目的名字,这两行都是可选的,也可以只有其中的一个。

第八行:INDEX 01 00:00:00
            这行表示光轨中段落的索引号。其中INDEX 00一般表示该光轨开始时的间歇(留一段空白),而INDEX 01则表示音乐开始了,多段的索引:01、02、03等用得比较少,一般表示交响乐中的段落等。大部分CD播放机有INDEX显示功能,能在播放时显示 INDEX号码。如果这段音乐有INDEX 00,那么大部分CD机在选曲时将会自动跳跃到INDEX 01处进行播放,而在顺序播放时,会从INDEX 00处开始,以保持曲间的间隙,这时候,CD机的时间显示为负数。
INDEX 01是必需的,而INDEX 00等都是可选的。索引号后面用冒号分开的数字,表示该索引开始的时间。第一段是分钟,第二段是秒,第三段是帧数()。一秒钟的音乐包含75个帧,数字从 零开始,到74为止。
注意:这个时间是相对于整个映像文件的绝对值。


好了,了解了CUE可以自己修改和编写CUE文件了。

2、提示打不开APE文件。
这个要跟CUE里的信息有关,打开CUE文件,在第四行 FILE 'CDImage.ape' WAVE
如果双引号里的是CDImage.ape。那么,ape文件名必须是CDImage。只要把APE文件名改为跟CUE里的匹配就行了。

3、NERO刻录的APE文件不能有无效字符在文件名里面,比如CDImage.ape是可以的,
CD Image.ape这个文件名就是肯定不能刻录的,会提示出错。。。
建议如果出现不能刻录的问题,但是可以播放的话,将文件名改成CDImage.ape再试试,同时不要忘了要修改一下CUE文件的第三行,等下又要出现错 误了。

还有一点要注意的:


flac和ape一样是无损压缩的格式,国外比较的流行flac,国内的用ape的比较多,我两个都用

a. 将你的flac文件就是很大的那个音频文件的名字改成CDImage.flac,如果是ape文件改名成CDImage.ape,注意这里的.flac 和.ape都是系统文件名后缀,不要改错了,不知道什么叫在后缀名的翻windows书看看

b. 将你的cue文件用记事本打开,修改第四行的相应文件名,比如楼主的这个改成

FILE 'CDImage.flac' WAVE 如果是APE 就改成 FILE 'CDImage.APE' WAVE

要切记,文件名不能有空格。
posted @ 2010-04-07 19:02 donghang73 阅读(4810) | 评论 (0)编辑 收藏

在使用Spring的AOP编程时,会用到这几个lib:
asm-2.2.2.jar
asm-commons-2.2.2.jar
asm-util-2.2.2.jar

Hibernate使用如果lib:
asm.jar
asm-attrs.jar


其中asm-2.2.2.jar与asm.jar存在类上的冲突!!!
使用其中之一或两者都使用,可能会出现如下错误:
java.lang.NoClassDefFoundError: org/objectweb/asm/CodeVisitor
java.lang.NoClassDefFoundError: org/objectweb/asm/commons/EmptyVisitor
java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit。。。。。。


解决办法是:
1.去掉类路径上的关于Hibernate的3个lib
asm.jar
asm-attrs.jar
cglib-2.1.3.jar

2.加入Spring中的以下4个lib
asm-2.2.2.jar
asm-commons-2.2.2.jar
asm-util-2.2.2.jar
cglib-nodep-2.1_3.jar

OK,搞定了!!! 

转自:http://hi.baidu.com/hateeyes/blog/item /741acbd47cb43403a08bb771.html
posted @ 2010-02-09 16:26 donghang73 阅读(158) | 评论 (0)编辑 收藏
因为Hibernate采用Anotation的方式配置,故而在applicationContext中sesionFactory应该基于AnnotationSessionFactoryBean,具体代码如下:
 1 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
 2     <property name="dataSource" ref="dataSource"></property>
 3     <property name="hibernateProperties">
 4         <props>
 5             <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
 6             <prop key="hibernate.show_sql">true</prop>
 7         </props>
 8     </property>
 9     <property name="annotatedClasses">
10             <list>
11                 <value>com.donghang.bean.User</value>
12             </list>
13     </property>
14 </bean>
其中User即为采用Anotation映射的实体类。

posted @ 2010-02-09 16:24 donghang73 阅读(371) | 评论 (0)编辑 收藏
Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V
Caused by: java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V

原因:asm-2.2.3.jar与asm.jar冲突

解决办法:将asm-2.2.3.jar包去掉
posted @ 2010-02-09 16:08 donghang73 阅读(3510) | 评论 (0)编辑 收藏
因经常用到,就写在博客里吧,免得再Google了。

1. JavaScript代码:
<script type="text/javascript">       
            function del() {
                var msg = "您真的确定要删除吗?\n\n请确认!";
                if (confirm(msg)==true){
                        return true;
                    }else{
                        return false;
                    }
                }
</script>

2. 具体调用:
<a href="#" onclick="javascript:return del()">删除</a>      

posted @ 2010-02-04 21:28 donghang73 阅读(255) | 评论 (0)编辑 收藏
     摘要: 转载自http://nomandia.javaeye.com/blog/320667 一、最简单的情况,未使用<display:column/> 标签 Html代码 <%request.setAttribute( "test", new ReportList(6) );%>  ...  阅读全文
posted @ 2010-02-04 20:47 donghang73 阅读(213) | 评论 (0)编辑 收藏
仅列出标题
共4页: 上一页 1 2 3 4 下一页