day21其他监听器在线支付邮件Word下载.docx
《day21其他监听器在线支付邮件Word下载.docx》由会员分享,可在线阅读,更多相关《day21其他监听器在线支付邮件Word下载.docx(17页珍藏版)》请在冰豆网上搜索。
![day21其他监听器在线支付邮件Word下载.docx](https://file1.bdocx.com/fileroot1/2022-11/25/1a622bad-b590-4ef7-b732-2e84dc37ad6f/1a622bad-b590-4ef7-b732-2e84dc37ad6f1.gif)
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){
销毁了:
+e.getServletContext());
//保存到文件中去
Filefile=newFile(path);
PrintWriterout=newPrintWriter(file);
//获取applicat的数据
Integercount=(Integer)e.getServletContext().getAttribute("
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){
publicvoidsessionWillPassivate(HttpSessionEventse){
保存到文件中去了..."
+this.getName());
publicvoidsessionDidActivate(HttpSessionEventse){
从文件中活化了...."
@Override
publicStringtoString(){
return"
Person[name="
+name+"
]"
;
第二步:
配置这个项目
<
ContextdocBase="
D:
\\programfiles\\MyEclipse10\\wk3\\day21\\WebRoot"
>
<
ManagerclassName="
org.apache.catalina.session.PersistentManager"
saveOnRestart="
true"
<
StoreclassName="
org.apache.catalina.session.FileStore"
directory="
d:
/a"
/Store>
/Manager>
/Context>
第三步:
测试
%
if(session.getAttribute("
p"
)==null){
inta=newRandom().nextInt(100);
Personp=newPerson("
+a);
session.setAttribute("
p);
//保存cookie
Cookiec=newCookie("
JSESSIONID"
session.getId());
c.setMaxAge(60*30);
c.setPath(request.getContextPath());
response.addCookie(c);
%>
hr/>
${p}
%=session.getId()%>
5、在线支付
找一个第三方支付公司开一个账号yeepay
开户以后可以获取以下信息:
1:
自己的开户账号
2:
支付密码=双向加密。
3:
给一个示例代码。
J
p1_MerId=10001126856-账号
keyValue=69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl=密码
开发支付页面
formaction="
c:
urlvalue='
/BuyServlet'
/>
method="
post"
订单号:
inputtype="
text"
name="
p2_Order"
br/>
金额:
p3_Amt"
银行:
<
radio"
pd_FrpId"
value="
BOCO-NET-B2C"
交通银行<
CMBC-NET-B2C"
民生银行<
submit"
支付"
/form>
开发buySerlvet,组成参数
第四步:
加密
PaymentUtiuls
6、邮件
目标:
通过Java代码发送邮件。
邮件协议:
发邮件的:
SMTP(SimpleMailTransportProtocal)
收邮件的协议:
pop3(PostOfficeProtocal3)
IMAP新协议发邮件也可以收邮件。
(一步步的与服务器交互)
SMTP:
Ehlo<
空格>
你的域名>
回车>
Ehlo-与服务器
Auth<
SP>
Login<
CRLF>
请求登录
Mail<
From:
reverse-path>
发件人的email:
Rcpt<
To:
forword-path>
收件的地址:
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"
"
//设置是否验证
mail.smtp.auth"
"
//第二步:
声明用户名和密码
Authenticatorauth=newAuthenticator(){
//此访求返回用户和密码的对象
publicPasswordAuthenticationgetPasswordAuthentication(){
PasswordAuthenticationpa=
newPasswordAuthentication("
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("
));
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"
你好,这是用java发的邮件,<
ahref='
'
传智<
/a>
text/html;
符件的邮件
publicvoidsendFile()throwsException{
Propertiesp=newProperties();
p.setProperty("
Sessions=Session.getDefaultInstance(p,newAuthenticator(){
@Override
returnnewPasswordAuthentication("
});
s.setDebug(true);
//声明MimeMessage
MimeMessagemsg=newMimeMessage(s);
msg.setFrom(newInternetAddress("
msg.setRecipient(RecipientType.TO,newInternetAddress("
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