您的位置:首页 > 其它

通过AJAX或多线程发送邮件实现页面不滞留

2012-11-09 23:50 387 查看

IT程序员开发必备-各类资源下载清单,史上最全IT资源,个人收藏总结!

由于发送带有附件的邮件会耗费很多的时间,所以如果单纯用访问Servlet的形式发送邮件的话,那么会造成客户端页面滞留的效果,这样不是很好,所以我们一般采用Ajax的形式发送页面,实现页面无刷新,或者通过通过创建另一个线程,主线程返回客户端,让子线程发送邮件,这样可以实现页面提前返回。

程序代码

MailByThreadServletServlet.java

package edu.servlet.mail;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MailByThreadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
SendMailThread smt = new SendMailThread();
Thread thread = new Thread(smt);
thread.start();
response.getWriter().print("邮件正在发送中,请稍等......");
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}

}
子线程SendMailThread.java

package edu.servlet.mail;

import java.io.FileInputStream;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
import javax.naming.Context;
import javax.naming.InitialContext;

public class SendMailThread implements Runnable{

@Override
public void run() {
try{
Context initCtx = new InitialContext();
//tomcat将创建的环境容器放在初始化容器中,需要通过"java:comp/env"(固定)查找
Context envCtx = (Context) initCtx.lookup("java:comp/env");
//在环境参数容器中通过"mail/Dog"查找到Session对象
Session session = (Session) envCtx.lookup("mail/Dog");

/*
* 验证这里tomcat的类加载器(envCtx.lookup("mail/Dog"))与应用程序的类加载器(Session)的不同
* 但是这里不知道为什么是一样的结果,按说是不一样的,反正也不是很重要
* 都是 org.apache.catalina.loader.StandardClassLoader
*/
System.out.println(envCtx.lookup("mail/Dog").getClass().getClassLoader().getClass().getName());
System.out.println(Session.class.getClassLoader().getClass().getName());
//设置Debug的方式打印执行过程
session.setDebug(true);
//创建代表邮件内容的Message对象。
Message msg = new MimeMessage(session,new FileInputStream("C:\\Documents and Settings\\Administrator\\桌面\\SendMultipartMessageDemo3.eml"));

Transport transport = session.getTransport();
transport.connect("smtp.163.com", 25, "xh216319","xiaoxiao");
transport.sendMessage(msg, InternetAddress.parse(
MimeUtility.encodeText("ITSTAR")+"<itstar1965@sina.com>,"+MimeUtility.encodeText("肖华")+"<xh216319@163.com>"));
}catch (Exception e) {

}finally{

}
}

}
访问:http://localhost:8080/JavaMail_02/servlet/MailByThreadServlet,则马上就会返回

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: