网站注册发送邮件:
为了提高效率,使用多线程;
网页三秒原则;
脚手架模型;
多线程的start() 和 run()方法的区别;
start()开启一个多线程;
run()只是一个普通方法;
多线程总结:
1。start():
先来看看Java API中对于该方法的介绍:
使该线程开始执行;Java 虚拟机调用该线程的
run
方法。结果是两个线程并发地运行;当前线程(从调用返回给
start
方法)和另一个线程(执行其run
方法)。多次启动一个线程是非法的。特别是当线程已经结束执行后,不能再重新启动。
用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体中的代码执行完毕而直接继续执行后续的代码。通过调用Thread类的 start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里的run()方法 称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。
2。run():
同样先看看Java API中对该方法的介绍:
如果该线程是使用独立的
Runnable
运行对象构造的,则调用该Runnable
对象的run
方法;否则,该方法不执行任何操作并返回。
Thread
的子类应该重写该方法。run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。
3。总结:
调用start方法方可启动线程,而run方法只是thread类中的一个普通方法调用,还是在主线程里执行。
代码案例:jsp注册页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>注册</title> </head> <body> <form action="${pageContext.request.contextPath}/RegisterServlet.do" method="post"> 用户名:<input type="text"name="username"/><br/> 密码:<input type="password" name="pwd"><br/> 邮箱:<input type="text" name="email"><br/> <input type="submit" value="注册"> </form> </body> </html>
代码案例:jsp注册成功页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> ${message} </body> </html>
代码案例:邮件发送
/** * 用户体验:网站三秒原则: * 打开一个页面,需要在3秒内; * * 怎么实现: * 使用多线程解决用户体验;(异步处理) */ public class Sendmail extends Thread { private String from ="xxx@qq.com";//发送人 private String username ="xxx@qq.com";//邮箱的用户名 private String password ="xxx";//邮箱的秘密 private String host ="smtp.qq.com";//发送邮件的服务器地址 private User user; public Sendmail(User user){ this.user=user; } @Override public void run() { try { Properties prop=new Properties(); prop.setProperty("mail.host",host);//设置QQ邮箱服务器 prop.setProperty("mail.transport.protocol","smtp");//邮件发送协议 prop.setProperty("mail.smtp.auth","true");//需要验证用户名和密码 //关于QQ邮箱,还要设置SSL加密,加上以下代码即可 MailSSLSocketFactory sf= null; sf = new MailSSLSocketFactory(); sf.setTrustAllHosts(true); prop.put("mail.smtp.ssl.enable","true"); prop.put("mail.smtp.ssl.socketFactory",sf); //使用javamail发送邮件的5个步骤 //1,创建定义整个应用程序所需的环境信息的Session对象; //QQ才有,其他邮箱不需要 Session session=Session.getDefaultInstance(prop, new Authenticator() { public PasswordAuthentication getPasswordAuthentication() { //发送人邮件用户名,授权码 return new PasswordAuthentication(username,password);//授权码 } }); //开启Session的DEBUG模式,这样就可以查看到程序发送Email的运行状态 session.setDebug(true); //2,通过session得到transport对象 Transport ts=session.getTransport(); //3,使用邮箱的用户名和授权码连上邮件服务器 ts.connect(host,username,password); //4,创建邮件:写邮件 MimeMessage message = new MimeMessage(session);//注意需要传递session //发送人 message.setFrom(new InternetAddress(from)); //收件人 message.setRecipient(Message.RecipientType.TO,new InternetAddress(user.getEmail())); //邮件主体 message.setSubject("用户注册的邮件"); String info="恭喜您注册成功,您的用户名为:"+user.getName()+",您的秘密:"+user.getPwd()+",请妥善保管!"; //邮件内容 message.setContent(info,"text/html;charset=utf-8"); message.saveChanges(); //5,发送 ts.sendMessage(message,message.getAllRecipients()); //6,关闭连接 ts.close(); } catch (Exception e) { e.printStackTrace(); } } }
代码案例:servlet
/** * 脚手架模型 */ public class RegisterServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //接收用户请求 String username = request.getParameter("username"); String pwd = request.getParameter("pwd"); String email = request.getParameter("email"); User user = new User(username, pwd, email); //用户注册成功之后,给用户发送邮件 //我们使用线程来专门发送邮件,防止出现耗时,和网站注册人数过多的情况 Sendmail send = new Sendmail(user); send.start(); //注册用户 request.setAttribute("message","注册成功,邮件已经发送成功,请查收"); request.getRequestDispatcher("info.jsp").forward(request,response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }
代码案例:web.xml配置
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <servlet> <servlet-name>RegisterServlet</servlet-name> <servlet-class>com.demo.servlet.RegisterServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>RegisterServlet</servlet-name> <url-pattern>/RegisterServlet.do</url-pattern> </servlet-mapping> </web-app>