day21其他监听器在线支付邮件.docx
《day21其他监听器在线支付邮件.docx》由会员分享,可在线阅读,更多相关《day21其他监听器在线支付邮件.docx(17页珍藏版)》请在冰豆网上搜索。
![day21其他监听器在线支付邮件.docx](https://file1.bdocx.com/fileroot1/2022-11/25/1a622bad-b590-4ef7-b732-2e84dc37ad6f/1a622bad-b590-4ef7-b732-2e84dc37ad6f1.gif)
day21其他监听器在线支付邮件
Day21
其他监听器/在线支付/邮件
1、今天的主要内容
1)、其他监听器
监听者
被监听者
监听到事件对象
HttpSessionActivationListener
HttpSession–监听HttpSession活化和顿化。
HttpSessionEvent
HttpSessionAttributeListener
HttpSession–监听session的属性变化的。
S.setAttributee();
HttpSessionBindingEvent
HttpSessionBindingListener
HttpSession-监听哪一个对象,绑定到了session上。
S.setAtrri(name,User);
HttpSessionListener
HttpSesion–监听sessioin创建销毁
HttpSessionEvent
ServletContextAttributeListener
ServletContext–属性变化的
ServletContextListener
ServletContext创建销毁
ServletRequestListener-SerlvetRequestAttibuteListner
Rrequest-创建销毁
Request属性变化
2)、在线支付
使用第三方支付。
3)、发邮件。
POP3协议。
SMTP协议及端口号。
4)、POP收邮件协议的协议文本。
5)、SMTP发邮件协议的协议文本各是什么?
6)、通过命令行收发邮件。
控制SMTP的POP3。
7)、用Base64对用户和密码进行编码。
8)、邮件客户端面FoxMail。
9)、JavaMail简介,用java代码发送邮件。
10)、几个主要对象:
Session,MimeMessages,Transport。
11)、发带有符件的图片。
处理中文乱码。
12)、示例-激活账号。
13)、在本机部署邮件服务器。
Eyoumailserver。
补:
内省在数据封装中起的作用?
数据库反射与类反射共同使用带来的方便。
内省
一个核心类:
PropertyDescriptor。
内省本质上是反射。
补:
JNDI
2、以下是课上的记录
3、ServletContextListener用于监听SevletContext的创建
在web中的所的监听器都是全局的-都是在项目启动时直接由tomcat创建。
监听器没有顺序。
只是监听的对象不一样。
在一个项目中可以存在多个监听器。
packagecn.itcast.listener;
importjava.io.BufferedReader;
importjava.io.File;
importjava.io.FileNotFoundException;
importjava.io.FileReader;
importjava.io.PrintWriter;
import.URL;
importjavax.servlet.ServletContextEvent;
importjavax.servlet.ServletContextListener;
publicclassMyContextListenerimplementsServletContextListener{
//在启动时读取数据库之前保存的数据
publicvoidcontextInitialized(ServletContextEventsc){
System.err.println("application被创建了:
"+sc.getServletContext());
URLurl=MyContextListener.class.getClassLoader().getResource("count.txt");
Stringpath=url.getFile();
System.err.println(path);
try{
BufferedReaderbf=newBufferedReader(newFileReader(path));
Stringline=bf.readLine();
Integercount=Integer.valueOf(line);
sc.getServletContext().setAttribute("count",count);
System.err.println("初始的值是:
"+count);
}catch(Exceptione){
e.printStackTrace();
}
}
//在销毁这个对象时保存一些数据到数据库或是文件中
publicvoidcontextDestroyed(ServletContextEvente){
System.err.println("销毁了:
"+e.getServletContext());
//保存到文件中去
URLurl=MyContextListener.class.getClassLoader().getResource("count.txt");
Stringpath=url.getFile();
System.err.println(path);
Filefile=newFile(path);
try{
PrintWriterout=newPrintWriter(file);
//获取applicat的数据
Integercount=(Integer)e.getServletContext().getAttribute("count");
out.print(count);
out.close();
}catch(FileNotFoundExceptione1){
e1.printStackTrace();
}
}
}
在项目启动时一次加载所有的配置文件。
HttpSessionBindingListener-此类是用于监听一个Bean是否被放到了Session中。
Personp=newPerson();.
Session.setAttriute(“pp”,p);
实现此类的Bean不需要配置到web.xml。
4、HttpSessionActivationListener-监听一个Sesison被保存到一个文件中的过程
也需要一个Bean。
实现HttpSessionActivationListener接口。
此类也不需要配置到web.xml
Personp=newPerson()implemntsHttpSessionActivationListener{
Actived….
}
Session.setAttribute(“p”,p);
第一步:
书写Bean实现HttpSessionActivationListener
packagecn.itcast.domain;
importjava.io.Serializable;
importjavax.servlet.http.HttpSessionActivationListener;
importjavax.servlet.http.HttpSessionEvent;
publicclassPersonimplementsSerializable,HttpSessionActivationListener{
privateStringname;
publicPerson(){
}
publicPerson(Stringname){
this.name=name;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicvoidsessionWillPassivate(HttpSessionEventse){
System.err.println("保存到文件中去了..."+this.getName());
}
publicvoidsessionDidActivate(HttpSessionEventse){
System.err.println("从文件中活化了...."+this.getName());
}
@Override
publicStringtoString(){
return"Person[name="+name+"]";
}
}
第二步:
配置这个项目
\\programfiles\\MyEclipse10\\wk3\\day21\\WebRoot">
saveOnRestart="true">
directory="d:
/a">
第三步:
测试
<%
if(session.getAttribute("p")==null){
inta=newRandom().nextInt(100);
Personp=newPerson(""+a);
session.setAttribute("p",p);
}
//保存cookie
Cookiec=newCookie("JSESSIONID",session.getId());
c.setMaxAge(60*30);
c.setPath(request.getContextPath());
response.addCookie(c);
%>
${p}
<%=session.getId()%>
5、在线支付
第一步:
找一个第三方支付公司开一个账号yeepay
开户以后可以获取以下信息:
1:
自己的开户账号
2:
支付密码=双向加密。
3:
给一个示例代码。
J
p1_MerId=10001126856-账号
keyValue=69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl=密码
第二步:
开发支付页面
urlvalue='/BuyServlet'/>"method="post">
订单号:
金额:
银行:
交通银行
民生银行
第三步:
开发buySerlvet,组成参数
第四步:
加密
PaymentUtiuls
6、邮件
目标:
通过Java代码发送邮件。
邮件协议:
发邮件的:
SMTP(SimpleMailTransportProtocal)
收邮件的协议:
pop3(PostOfficeProtocal3)
IMAP新协议发邮件也可以收邮件。
(一步步的与服务器交互)
SMTP:
Ehlo<空格><你的域名><回车>
Ehlo-与服务器
AuthLogin
请求登录
MailFrom:
发件人的email:
RcptTo:
收件的地址:
eee@
Data
以下是数据
Quit
退出
收发邮件的过程:
一般情况下,smtp和pop3是两个服务器(主机)。
Smtp邮件的端口为25。
POP3端口为110。
7、发邮件示例
安装foxmail:
8、发邮件时,要对用户名和密码进行base64编码
//对用户名和密码进行base64编码
@Test
publicvoidbase64(){
Stringname="wj_leaf12345";
Stringpwd="1qaz2wsx";
BASE64Encoderen=newBASE64Encoder();
name=en.encode(name.getBytes());
pwd=en.encode(pwd.getBytes());
System.err.println(name);
System.err.println(pwd);
}
9、通过java代码发邮件
用java发邮件,必须要导入新的包
mail.jar–发邮件的核心包
activation.jar–对用户和密码加密.
在mail.jar中有三个核心类:
Javax.mail.Session–是指与邮件服务器会话。
整个项目中只要一个就可以了.
Javax.mail.Message(接口)-准备发送数据信息。
MimeMessage-可以设置类型的数据信息。
Transport–它拥有一个方法可以发送Message。
第一步;导入两个jar包
第二步;发简单的邮件
@Test
publicvoidsendMail()throwsException{
//第一步:
声明properties对象放信息
Propertiesprop=newProperties();
//设置连接哪一台服务器
prop.setProperty("mail.host","");
//设置是否验证
prop.setProperty("mail.smtp.auth","true");
//第二步:
声明用户名和密码
Authenticatorauth=newAuthenticator(){
//此访求返回用户和密码的对象
publicPasswordAuthenticationgetPasswordAuthentication(){
PasswordAuthenticationpa=
newPasswordAuthentication("wj_leaf12345","1qaz2wsx");
returnpa;
}
};
////第二步:
获取Session对象
Sessionsession=
Session.getDefaultInstance(prop,auth);
//设置session的调试模式
session.setDebug(true);
//第三步:
声明信息
MimeMessagemm1=
newMimeMessage(session);
//第四步:
设置发件人email
Addressfrom=newInternetAddress("wj_leaf12345@");
mm1.setFrom(from);
//第五步:
设置收件人
mm1.setRecipient(RecipientType.TO,newInternetAddress("wj_leaf12345@"));
mm1.setRecipient(RecipientType.CC,newInternetAddress("549051701@"));
mm1.setRecipient(RecipientType.BCC,newInternetAddress("wj@"));
//第六步:
设置主题
mm1.setSubject("这是用Java发的邮件3");
mm1.setContent("你好,这是用java发的邮件,3333再试一下","text/plain;charset=UTF-8");
//第七步:
Transport.send(mm1);
}
第三步:
v发带有超连接的邮件
mm1.setSubject("这是用Java发的邮件sfasdf3");
mm1.setContent("你好,这是用java发的邮件,传智","text/html;charset=UTF-8");
//第七步:
Transport.send(mm1);
第四步:
符件的邮件
@Test
publicvoidsendFile()throwsException{
Propertiesp=newProperties();
p.setProperty("mail.host","");
p.setProperty("mail.smtp.auth","true");
Sessions=Session.getDefaultInstance(p,newAuthenticator(){
@Override
publicPasswordAuthenticationgetPasswordAuthentication(){
returnnewPasswordAuthentication("wj_leaf12345","1qaz2wsx");
}
});
s.setDebug(true);
//声明MimeMessage
MimeMessagemsg=newMimeMessage(s);
msg.setFrom(newInternetAddress("wj_leaf12345@"));
msg.setRecipient(RecipientType.TO,newInternetAddress("wj_leaf12345@"));
msg.setSubject("图片的");
//第一步:
声明多处理的Part
MimeMultipartmm=newMimeMultipart();
//第二步:
声明
MimeBodyPartbody1=newMimeBodyPart();
//第三步:
设置符件
DataSourceds=newFileDataSource(newFile("./img/a.jpg"));
DataHandlerdh=newDataHandler(ds);
body1.setDataHandler(dh);
//必须要设置名称
body1.setFileName(MimeUtility.encodeText("美女.jpg"));
MimeBodyPartbody2=newMimeBodyPart();
//第三步:
设置符件
DataSourceds2=newFileDataSource(newFile("./img/b.jpg"));
DataHandlerdh2=newDataHandler(ds2);
body2.setDataHandler(dh2);
//必须要设置名称
body2.setFileName(MimeUtility.encodeText("美女2.jpg"));
MimeBodyPartbody3=newMimeBodyPart();
//第三步:
设置符件
DataSourceds3=newFileDataSource(newFile("./img/m.mp3"));
DataHandlerdh3=newDataHandler(ds3);
body3.setDataHandler(dh3);
//必须要设置名称
body3.setFileName(MimeUtility.encodeText("世纪末.mp3"));
//将body1添加到mm
mm.addBodyPart(body1);
mm.addBodyPart(body2);
mm.addBodyPart(body3);
msg.setContent(mm);
//发送
Transport.send(msg);
}
10、项目示例-通过邮件激活账号
关键点就在于:
根据用户的给出的email,给这个email发送一个邮件。
这个邮件中应该带有一个激活码?
(32位UUID,64位UUID)。
提供以下功能:
注册功能-只要用户注册成功,就给他发邮件。
RegServlet
接收以下信息:
Name,pwd,email
提供用户激活功能.
接收以下信息:
只接收激活码。
提供用户登录功能:
用户只有激活账号以后才可以登录。
第一步:
创建数据结构
Users表:
Idnamepwdstate
444jack12341
第二个表:
Active
Uidactivecode
createdatabaseactivecharactersetutf8;
useactive;
createtableusers(
idvarchar(32)primarykey,
namevarchar(30),
pwdvarchar(32),
emailvarchar(50)
);
c