ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

javaweb学习29:网站注册发送邮件

2022-04-06 16:33:57  阅读:175  来源: 互联网

标签:run javaweb 29 发送 线程 message 方法 邮件


javaweb学习29:网站注册发送邮件

  • 网站注册发送邮件:

    • 为了提高效率,使用多线程;

    • 网页三秒原则;

    • 脚手架模型;

    • 多线程的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>

     

 

 

 

 

 

 

标签:run,javaweb,29,发送,线程,message,方法,邮件
来源: https://www.cnblogs.com/xiangcai0522/p/16107125.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有