监听器
其他两个监听器-1:
HttpSessionBindingListener
•实现此接口类的类,不必在web.xml中进行配置。
•实现此接口的类,通常是一个JavaBean,一个JavaBean通过实现此接口,可以感知自己是否添加到了Session中。或是感知自己是否从Session中移除。
示例:
public class Person implements HttpSessionBindingListener {
public void valueBound(HttpSessionBindingEvent arg0) {
System.err.println("我被添加到了Sesion中"+arg0.getName());
}
public void valueUnbound(HttpSessionBindingEvent arg0) {
System.err.println("我从Session中被移除了....");
}
}
HttpSessionActivationListener
•实现此接口的JavaBean,可以感知自己被活化(从硬盘到内存)和钝化(从内存到硬盘)的过程。
•如果需要同时保存Session中的JavaBean则JavaBean也要实现Serializable序列化接口。
•实现此接口的JavaBean与HttpSessionBindingListener一样,不必配置到web.xml中。
•要实现此功能,必须要先配置以下信息:
第一步:书写一个JavaBean,并实现HttpSessionActivationListener接口如下:
第二步:JSP页面,判断是否存在Person,如果没有将Person放到Session中:
第三步:配置Tomcat的Server.xml文件或是将配置好的xml发布文件放到CATALIINA_HOME\conf\Catalina\localhost目录下(也就是小钢炮):
配置文件如下:
lirectory=“d:/a”是指Session文件保存的目录。
第四步:测试
1:多次开启新的浏览器窗口,并记录SESSIONID。
2:使用shutdown.bat关闭tomcat应用。
3:观察指定的目录下是否存在*.session文件。
5:观察是否为关闭tomcat之前的同一个Session。
6:一般情况下,PersistentManager持久化Session与Cookie共同使用。
7:HttpSessionActivationListener只做为监听类,监听自己是否钝化或是活化。
E-Mail协议简介:
邮件服务器,按照提供的服务类型,可以分为发送邮件的服务器我接收邮件的服务器。
发送邮件的服务器使用发送协议,现在常用的是SMTP协议。所以,通常发邮件的服务器也称为SMTP服务器。
接收邮件的服务器使用接收协议,现在常用的是POP3协议或IMAP协议,所以通常也被称为POP3或IMAP服务器。
目前经常见到的服务器为SMTP和POP3服务器。如大家在注册了126的邮箱之后,它的发邮件服务器为smtp.126.com:25,而收邮件服务器则为pop3.126.com:110.(冒号后面的为端口号)。
当然,发邮件服务器和收邮件服务器也可能是同一台主机,但端口号一定不相同。默认发邮件服务器的端口为25,收邮件的端口为110.
邮件发送的工作图:
邮件收/发协议:
SMTP协议-发邮件协议
•全称为SimpleMail Transfer Protocol(简单邮件传输协议),它定义了邮件客户端软件与SMTP服务器之间、以及两台SMTP服务器之间的通讯规则。端口一般为25.
POP3协议-收邮件协议
•全称为PostOffice Protocol(邮局协议),它定义了邮件客户端软件与POP3服务器的通讯规则。端口一般为110.
IMAP协议-对POP3的扩展
•全称为InternetMessage Access Protocal(Internet消息访问协议),它是对POP3协议的一种扩展,定义了邮件客户端软件与IMAP服务器的通讯规则。
通过命令行发送邮件的步骤如下:
第一步:与服务器建立连接。
•telnet smtp.126.com 25
第二步:先和服务器打个招乎。Ehlo someTxt
第三步:请求登录:auth login.
•输入用户名:经过base64编码以后的。
•输入密码,也是经过base64编码以后的。
第四步:输入发件人mail from:<wangjian_me@126.com>
第五步:输入收件人rcpt to:<wangjianme@sohu.com>
第六步:输入data命令然后回车,开始输入数据。
•可选的输入from:<…>
•可选的输入to:<..>
•subject:主题
第七步:输入.(点)单行,表示数据结束。
第八步:输入quit退出。
接收邮件:pop3:
telnet pop3.126.com 110
user wj_leaf12345
pass 1qaz2wsx
lstat - 显示总体信息。
list - 列出所有信件。
retr 1 - 显示第一封信件。
quit -退出
有在命令行窗口,使用telnet从bbb用户向aaa用户发邮件:
telnet 127.0.0.1 25
ehlo bbb
auth login
YmJi
MTIz
mail from:<bbb@wj.com>
rcpt to:<aaa@wj.com>
data
from:<bbb@wj.com>
to:<aaa@wj.com>
subject:主题
[保留一个空行.]
这是发出的数据
.
quit
通过命令行收取邮件:
telnet 127.0.0.1 110
user aaa
pwd 123
retr 10 --这是查看第10封信件。
quit
发送邮件的一些细节:
1、邮件头和邮件体之间必须要使用空行分隔。
2、邮件头是指:
•From 示例:发送者是谁,from:<aaa@aa.com>
•To 示例:to:<bbb@aa.com>
•Subject :主题如:subject:XXXXX
•Cc :抄送 cc:<abc@aa.com>
•Bcc : 暗送 bcc:<aaa@aa.com>
•[空行]
•数据部分
通过命令发送邮件太过繁琐,这里直接写了代码来发送邮件
canJavaMail
JavaMailDemo.java
package cn.hncu;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
import org.junit.Test;
public class JavaMailDemo {
@Test//发送一封简单邮件
public void test1() throws Exception{
//1.创建一个进行邮件发送会话的session对象
Properties p=new Properties();
p.setProperty("mail.host", "smtp.sina.com");// qq: smtp.qq.com
p.setProperty("mail.smtp.auth", "true");
p.setProperty("mail.smtp.port", "25");//QQ: 官网上给出发送端口为587/465,但是我这里只有587成功了
Session session=Session.getDefaultInstance(p,new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
PasswordAuthentication pa=new PasswordAuthentication("hncujava@sina.com", "hncu1234567");//QQ: 用户名为QQ邮箱,密码是QQ给的16位SMTP口令
return pa;
}
});
session.setDebug(true);//设置让程序和邮件服务器进行问答式交互
//2.声明一封邮件-----MimeMessage
MimeMessage msg=new MimeMessage(session);
msg.setFrom(new InternetAddress("hncujava@sina.com"));
msg.setRecipient(RecipientType.TO, new InternetAddress("544863212@qq.com"));
//设置邮件发送的内容
msg.setSubject("JAVA 发送邮件");
msg.setContent("Hello World <a href='http://www.hncu.net'>...............</a>2016.12.19", "text/html;charset=utf-8");
//3.发送
Transport.send(msg);
}
@Test//发送一封带附件的邮件
public void test2() throws Exception{
Properties p=new Properties();
p.setProperty("mail.host", "smtp.qq.com");
p.setProperty("mail.smtp.auth", "true");
p.setProperty("mail.smtp.port", "587");
Session session=Session.getDefaultInstance(p, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
PasswordAuthentication pwd=new PasswordAuthentication("862482770@qq.com", "ifhqsxukotsvbfje");
return pwd;
}
});
MimeMessage msg=new MimeMessage(session);
msg.setFrom(new InternetAddress("862482770@qq.com"));
msg.setRecipient(RecipientType.TO, new InternetAddress("544863212@qq.com"));
msg.setSubject("带附件的邮件");
/以下部分和简单邮件不同之处/
//body1-------邮件正文
MimeBodyPart body1=new MimeBodyPart();
body1.setContent("Hello <a href='http://www.hncu.net'> Java Mail</a> 你好!","text/html;charset=utf-8");
//body2-------附件(图片)
MimeBodyPart body2=new MimeBodyPart();
body2.setDataHandler(new DataHandler(new FileDataSource("./imgs/4.jpg")));
body2.setFileName(MimeUtility.decodeText("良辰"));
//body3-------附件(图片)
MimeBodyPart body3=new MimeBodyPart();
body3.setDataHandler(new DataHandler(new FileDataSource("./imgs/5.jpg")));
// body3.setFileName("美景");这种方式会乱码
body3.setFileName(MimeUtility.encodeText("美景"));
//body4-------附件(图片)
MimeBodyPart body4=new MimeBodyPart();
body4.setDataHandler(new DataHandler(new FileDataSource("./imgs/1.txt")));
// body3.setFileName("美景");这种方式会乱码
body4.setFileName(MimeUtility.encodeText("文件.txt"));
//把三个body封装成一个MimeMultipart对象,然后设进msg.setContent()中去
MimeMultipart mm=new MimeMultipart();
mm.addBodyPart(body1);
mm.addBodyPart(body2);
mm.addBodyPart(body3);
mm.addBodyPart(body4);
msg.setContent(mm);
///
Transport.send(msg);
}
}
简单邮件发送:
带有附件的邮件:附件可以下载
处理中文附件乱码:
MimeBodyPart mb = new MimeBodyPart();
DataHandler dh = new DataHandler(new FileDataSource("./imgs/美女.jpg"));
mb.setDataHandler(dh);
mb.setFileName(MimeUtility.encodeText(dh.getName()));
//设置文件名,同时处理中文名
邮件里面是可以内嵌图片来发送的,由于时间原因我没写,就不贴了。