主頁 > 後端開發 > 監聽器和簡單郵件發送

監聽器和簡單郵件發送

2020-12-16 12:50:28 後端開發

一、監聽器

1.監聽器(Listener)

是一個專門用于對其他物件身上發生的事件或狀態改變進行監聽和相應處理的物件,當被監視的物件發生情況時,立即采取相應的行動,監聽器其實就是一個實作特定介面的普通java程式,這個程式專門用于監聽另一個java物件的方法呼叫或屬性改變,當被監聽物件發生上述事件后,監聽器某個方法立即被執行

簡而言之:所謂的監聽器就是一個能夠監聽程式內容或者狀態是否發生改變的一個Java類
有點類似現實世界中大廈里的火災警報器

補充講解:與監聽器相關的術語
事件源:指的是被監聽物件(汽車)

監聽器:指的是監聽的物件(報警器)

事件源和監聽器系結:在汽車上安裝報警器

事件:指的是事件源物件的改變(踹了汽車一腳)----主要功能獲得事件源物件,

2.監聽器的作用

導讀模塊:雖然監聽器的作用很強大,但是servlet中并沒有相關的實作類,只是有一些介面,而這也恰恰體現出了servlet的靈活性
1.那么servlet中都提供了哪些監聽器呢?
補充:1)其實servlet中的監聽器主要是針對request,session,servletContext開展的
2)監聽器要想起作用則必須要有實作類,而實作類要起作用,則必須要有動作,所謂的動作其實就是事件,所謂的事件就是與之關聯的一些類
3)servlet中一共有8個監聽器介面,6個事件

1.1 8個監聽器介面和6個事件:

1、ServletContextListener介面
[介面方法] contextInitialized()與 contextDestroyed()
[接收事件] ServletContextEvent
[觸發場景] 在Container加載Web應用程式時(例如啟動 Container之后),會呼叫contextInitialized(),而當容器移除Web應用程式時,會呼叫contextDestroyed ()方法,

2、ServletContextAttributeListener
[介面方法] attributeAdded()、 attributeReplaced()、attributeRemoved()
[接收事件] ServletContextAttributeEvent
[觸發場景] 若有物件加入為application(ServletContext)物件的屬性,則會呼叫attributeAdded(),同理在置換屬性與移除屬性時,會分別呼叫attributeReplaced()、attributeRemoved(),

3、ServletRequestListener
[介面方法] requestInitialized()與 requestDestroyed()
[接收事件] RequestEvent
[觸發場景] 在request(HttpServletRequest)物件建立或被消滅時,會分別呼叫這兩個方法,

4、ServletRequestAttributeListener
[介面方法] attributeAdded()、 attributeReplaced()、attributeRemoved()
[接收事件] HttpSessionBindingEvent
[觸發場景] 若有物件加入為request(HttpServletRequest)物件的屬性,則會呼叫attributeAdded(),同理在置換屬性與移除屬性時,會分別呼叫attributeReplaced()、 attributeRemoved(),

5、HttpSessionListener
[介面方法] sessionCreated()與sessionDestroyed ()
[接收事件] HttpSessionEvent
[觸發場景] 在session (HttpSession)物件建立或被消滅時,會分別呼叫這兩個方法,

6、HttpSessionActivationListener
[介面方法] sessionDidActivate()與 sessionWillPassivate()
[接收事件] HttpSessionEvent
[觸發場景] Activate與Passivate是用于置換物件的動作,當session物件為了資源利用或負載平衡等原因而必須暫時儲存至硬碟或其它儲存器時(透 過物件序列化),所作的動作稱之為Passivate,而硬碟或儲存器上的session物件重新加載JVM時所采的動作稱之為Activate,所以容 易理解的,sessionDidActivate()與 sessionWillPassivate()分別于Activeate后與將Passivate前呼叫,

7、HttpSessionAttributeListener
[介面方法] attributeAdded()、 attributeReplaced()、attributeRemoved()
[接收事件] HttpSessionBindingEvent
[觸發場景] 若有物件加入為session(HttpSession)物件的屬性,則會呼叫attributeAdded(),同理在置換屬性與移除屬性時,會分別呼叫attributeReplaced()、 attributeRemoved(),

8、HttpSessionBindingListener
[介面方法] valueBound()與valueUnbound()
[接收事件] HttpSessionBindingEvent
[觸發場景] 實作HttpSessionBindingListener接 口的類別,其實體如果被加入至session(HttpSession)物件的屬性中,則會呼叫 valueBound(),如果被從session(HttpSession)物件的屬性中移除,則會呼叫valueUnbound(),實作 HttpSessionBindingListener介面的類別不需在web.xml中設定,

?
小結與分類:
備:一共分為三大類

(1)監聽ServletContext、Request、Session物件的創建和銷毀,需要在web.xml中配置
ServletContextListener
ServletRequestListener
HttpSessionListener
友情提示:這三種是最常用的了…
(2)監聽ServletContext、Request、Session物件屬性的變化,需要在web.xml中配置
ServletContextAttributeListener
ServletRequestAttributeListener
HttpSessionAttributeListener
(3)監聽Session內部的物件,不需要再web.xml中配置
HttpSessionActivationListener
HttpSessionBindingListener

2.監聽器的作用:
統計在線人數,利用HttpSessionLisener

加載初始化資訊:利用ServletContextListener

統計網站訪問量

實作訪問監控

   后續的Spring等框架中也要用到

3.監聽器實體

3.1使用步驟

	 		1)創建實作類實作需要的介面
            2)在web.xml中配置<listener></listener>節點進行宣告
            3)實作介面中的方法

3.2統計在線人數監聽器實體:

`package com.rj.bd.manage.listeners;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

import com.sun.org.apache.bcel.internal.generic.NEW;



public class SessionListener implements HttpSessionListener {

/**

 * @desc  1.session創建的時候觸發
   */
   @Override
   public void sessionCreated(HttpSessionEvent se) {
       System.out.println("Session 開始創建了:: ID="+se.getSession().getId());
       ServletContext ctx = se.getSession( ).getServletContext( );  
       Integer numSessions = (Integer) ctx.getAttribute("numSessions");  
       if (numSessions == null) {  
           numSessions = new Integer(1);  
       }  
       else {  
           int count = numSessions.intValue( );  
           numSessions = new Integer(count + 1);  
       }  
       ctx.setAttribute("numSessions", numSessions); 
   	

   }

/**

 * @desc 2.session銷毀的時候觸發
   */
   @Override
   public void sessionDestroyed(HttpSessionEvent se) 
   {
   System.out.println("Session 銷毀了:: ID="+se.getSession().getId());
   ServletContext ctx=se.getSession().getServletContext();  
   Integer numSessions = (Integer)ctx.getAttribute("numSessions");  
   if(numSessions == null) { 
       numSessions = new Integer(0);  
   }  
   else {  
       int count = numSessions.intValue( );  
       numSessions = new Integer(count - 2);  
   }  
   ctx.setAttribute("numSessions", numSessions);
   }

}`

4擴展:監聽器,過濾器,servlet的級別

【Listener】->【Filter】->【Servlet】

5.預加載實體

`package com.rj.bd.manage.listeners;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;


public class MyLiceneListener implements ServletContextListener {
	

	@Override
	public void contextInitialized(ServletContextEvent sce) {
	System.out.println("===============servlet服務初始化(也就是tomcat正式啟動成功)==================");
	System.out.println("***************1.可以開始預加載一些資訊了****************");	      
	ServletContext context = sce.getServletContext();
	/**
	 * 1.可以預先加載連庫4要素
	 */
	Map<String, Object> map=new HashMap<String, Object>();
	map.put("username", "root");
	map.put("password", "root");
	map.put("drivername", "com.mysql.jdbc.Driver");
	map.put("url", "jdbc://..........");
	context.setAttribute("map", map);
	
	/**
	 * 2.也可以在這里實作注入....其實也就是Spring框架核心的注入的原理所在,,,,,(后續講)
	 */


?    
?    

	}
	
	@Override
	public void contextDestroyed(ServletContextEvent sce) {
		System.out.println("===============servlet服務銷毀(也就是tomcat重新部署)==================");
	
	}

}`

6.Request請求監聽器記錄ip實體

`package com.rj.bd.manage.listeners;

import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;


public class MyServletRequestListener implements ServletRequestListener {

	@Override
	public void requestDestroyed(ServletRequestEvent sre) {
		  ServletRequest servletRequest = sre.getServletRequest();
	        System.out.println("ServletRequest destroyed. Remote IP="+servletRequest.getRemoteAddr());
	}
	
	@Override
	public void requestInitialized(ServletRequestEvent sre) {
		ServletRequest servletRequest = sre.getServletRequest();
	    System.out.println("ServletRequest initialized. Remote IP="+servletRequest.getRemoteAddr());
	}

}`

二、發送郵件

1.生成四位驗證碼實體

`public class CodeUtils {
public static void main(String[] args) {
	
	

	for (int i = 0; i <10; i++) {
		CodeUtils.createCode();
	}


?	
?	
}

public static String createCode()
{
	String[] beforeShuffle = new String[] { "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" }; 
	List<String> list = Arrays.asList(beforeShuffle);
	Collections.shuffle(list);//自動洗牌
	StringBuilder sb =new StringBuilder();
	for (int i = 0; i < list.size(); i++)
	{ 
		sb.append(list.get(i)); 
	} 
	String afterShuffle = sb.toString(); 
	String result = afterShuffle.substring(5, 9);
	System.out .println(result) ; 
	return result;
	}
}`

2.日期處理工具類

public class DateUtils {

	/**
	 * 通過時間秒毫秒數判斷兩個時間的間隔
	 * @param date1
	 * @param date2
	 * @return
	 * @throws ParseException 
	 */
	public static int differentDaysByMillisecond(String dateStr,String dateStr2) throws ParseException
	{
		    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
	        Date fDate=format.parse(dateStr);
	        Date oDate=format.parse(dateStr2);
	        //初始化日歷工具類
	        Calendar aCalendar = Calendar.getInstance();
	        //設定開始的日期
	        aCalendar.setTime(fDate);
	        int day1 = aCalendar.get(Calendar.DAY_OF_YEAR);//DAY_OF_YEAR:一年的第多少天
	        
	        //社情結束的日期
	        aCalendar.setTime(oDate);
	        int day2 = aCalendar.get(Calendar.DAY_OF_YEAR);
	        
	        int days=day2-day1;
	        System.out.print(days);
	        return days;
	}
	
	public static void main(String[] args) throws ParseException {

   	    String dateStr = "2019-11-26 ";
        Date now=new Date();//獲取當前的日期
        SimpleDateFormat dFormat=new SimpleDateFormat("yyyy-MM-dd");//對當前日期進行格式化處理
        System.out.println("dateStr2:"+dFormat.format(now));
        System.out.println("兩個日期的差距:" + differentDaysByMillisecond(dateStr,dFormat.format(now)));
   }
}

3.properties組態檔處理類

1.創建一個config檔案夾,且該檔案夾與src是平級的,且權限也是與src的級別一樣(要構建權限級別),在該目錄下創建mail.properties
2.在mail.properties寫入一些資料
emailFrom=發送的郵箱
emialFromAuthorization=郵箱碼
emailRole=XX管理系統

PS:在mail,properties中要對該檔案設定編碼集為UTF-8,且不要再里面有過多的空格和換行

package com.rj.bd.prepar;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;


   public class PropertyUtils {

   public static Map<String, Object> getyInfoOfPropert(String propertyPath) throws IOException
   {
   	 Map<String, Object> map=new HashMap<String, Object>();
   	 Properties prop=new Properties();
        InputStream inputFile=PropertyUtils.class.getClassLoader().getResourceAsStream(propertyPath);
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputFile,"utf-8")); 
        prop.load(bufferedReader);
        Iterator<String> it=prop.stringPropertyNames().iterator();
        while(it.hasNext()){
            String key=it.next();
            System.out.println(key+":"+prop.getProperty(key));
            map.put(key, prop.getProperty(key));
            

        }
        inputFile.close();
        
       return map;

   }
   public static void main(String[] args) throws IOException {
   PropertyUtils.getyInfoOfPropert("mail.properties");

   

}
}


4.補充講解

導讀模塊:1.日常作業生活中少不了和郵件打交道,比如我們會用郵件進行資訊交流,向上級匯報日常作業;再比如大家熟悉的某個WEB系統注冊階段,通常會有一個功能,點擊發送到目標郵箱的鏈接完成賬戶激活

2.開始之前先簡單介紹一下與郵件相關的一些協議

SMTP 協議

SMTP 的全稱是 Simple Mail Transfer Protocol,即簡單郵件傳輸協議,它是一組用于從源地址到目的地址傳輸郵件的規范,通過它來控制郵件的中轉方式
SMTP 協議屬于TCP/IP協議簇,它幫助每臺計算機在發送或中轉信件時找到下一個目的地,
SMTP 服務器就是遵循SMTP協議的發送郵件服務器
SMTP 認證,簡單地說就是要求必須在提供了賬戶名和密碼之后才可以登錄 SMTP 服務器,這就使得那些垃圾郵件的散播者無可乘之機
增加 SMTP 認證的目的是為了使用戶避免受到垃圾郵件的侵擾
實際上,SMTP 已經是E-mail傳輸的標準
SMTP 規范(RFC 821)規定,每一行都要以\r\n 來結尾

POP 協議
POP3(Post Office Protocol 3)即郵局協議的第3個版本,是因特網電子郵件的第一個離線協議標準
POP郵局協議負責從郵件服務器中檢索電子郵件
它要求郵件服務器完成下面幾種任務之一
從郵件服務器中檢索郵件并從服務器中洗掉這個郵件
從郵件服務器中檢索郵件但不洗掉它
不檢索郵件,只是詢問是否有新郵件到達
POP協議支持多用戶互聯網郵件擴展,后者允許用戶在電子郵件上附帶二進制檔案,如文字處理檔案和電子表格檔案等,實際上這樣就可以傳輸任何格式的檔案了,包括圖片和聲音檔案等
在用戶閱讀郵件時,POP命令所有的郵件資訊立即下載到用戶的計算機上,不在服務器上保留

IMAP 協議
互聯網資訊訪問協議(IMAP)是一種優于POP的新協議
和POP一樣,IMAP也能下載郵件、從服務器中洗掉郵件或詢問是否有新郵件,但IMAP克服了POP的一些缺點
它可以決定客戶機請求郵件服務器提交所收到郵件的方式,請求郵件服務器只下載所選中的郵件而不是全部郵件
客戶機可先閱讀郵件資訊的標題和發送者的名字再決定是否下載這個郵件
通過用戶的客戶機電子郵件程式,IMAP可讓用戶在服務器上創建并管理郵件檔案夾或郵箱、洗掉郵件、查詢某封信的一部分或全部內容,完成所有這些作業時都不需要把郵件從服務器下載到用戶的個人計算機上,

小結:不同的協議實作的功能的側重點不一樣
因為人們發的郵件不一樣,所以這些協議還是都要用的

3.我們今天要講的郵件發送并不是指從頭到尾的創造一整套的郵件發送系統,而是利用現有的郵件服務商例如網易或者騰訊作為我們廣義上的發送代理進而實作發送郵件

普通郵件發送

public class EmailUtils {
	 //自己的郵箱
    public static String sendEmailAccount ="******@163.com";
    //郵箱授權碼
    public static String sendEmailPwd="***********";
    //收件人郵箱
    public  static String receiveMailAccount="***********@qq.com";
    

    public static void main(String[] args) throws Exception {
    	
     createMimeMessage( sendEmailAccount, receiveMailAccount);


?    	
?    	
?    	
?    	

	}
	
	/**
	 * 創建一封只包含文本的簡單郵件
	 *
	 * @param session 和服務器互動的會話
	 * @param sendMail 發件人郵箱
	 * @param receiveMail 收件人郵箱
	 * @return
	 * @throws Exception
	 */
	public static void createMimeMessage(String sendMail, String receiveMail) throws Exception {
	   
		 // 1. 創建引數配置, 用于連接郵件服務器的引數配置
	    Properties props = new Properties();
	    props.setProperty("mail.transport.protocol","smtp");// 使用的協議(JavaMail規范要求)
	    props.setProperty("mail.smtp.host","smtp.163.com"); // 發件人的郵箱的 SMTP 服務器地址
	    props.setProperty("mail.smtp.auth", "true");    // 需要請求認證
	 
	    // 2. 根據配置創建會話物件, 用于和郵件服務器互動
	    Session session = Session.getInstance(props);
	    session.setDebug(true);  // 設定為debug模式, 可以查看詳細的發送 log
		
		// 3. 創建一封郵件
	    MimeMessage message = new MimeMessage(session);
	 
	    // 4. From: 發件人(昵稱有廣告嫌疑,避免被郵件服務器誤認為是濫發廣告以至回傳失敗,請修改昵稱)
	    message.setFrom(new InternetAddress(sendMail, "發件人的昵稱", "UTF-8"));
	 
	    // 5. To: 收件人(可以增加多個收件人、抄送、密送)
	    //    CC:抄送人,BCC:密送
	    message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, "XX用戶", "UTF-8"));
	    //message.setRecipient(MimeMessage.RecipientType.CC, new InternetAddress("xxxx@qq.com", "XX用戶", "UTF-8"));
	 
	    // 6. Subject: 郵件主題(標題有廣告嫌疑,避免被郵件服務器誤認為是濫發廣告以至回傳失敗,請修改標題)
	    message.setSubject("這是郵箱標題", "UTF-8");
	 
	    // 7. Content: 郵件正文(可以使用html標簽)(內容有廣告嫌疑,避免被郵件服務器誤認為是濫發廣告以至回傳失敗,請修改發送內容)
	    message.setContent("正文...", "text/html;charset=utf-8");
	 
	    // 8. 設定發件時間
	    message.setSentDate(new Date());
	 
	    // 9. 保存設定
	    message.saveChanges();
	
	    // 10. 根據 Session 獲取郵件傳輸物件
	    Transport transport = session.getTransport();
	   // 郵箱賬號 和 密碼 連接郵件服務器, 這里認證的郵箱必須與 message 中的發件人郵箱一致, 否則報錯
	    // 5. 使用
	    //
	    //    PS_01: 成敗的判斷關鍵在此一句, 如果連接服務器失敗, 都會在控制臺輸出相應失敗原因的 log,
	    //           仔細查看失敗原因, 有些郵箱服務器會回傳錯誤碼或查看錯誤型別的鏈接, 根據給出的錯誤
	    //           型別到對應郵件服務器的幫助網站上查看具體失敗原因,
	    //
	    //    PS_02: 連接失敗的原因通常為以下幾點, 仔細檢查代碼:
	    //           (1) 郵箱沒有開啟 SMTP 服務;
	    //           (2) 郵箱密碼錯誤, 例如某些郵箱開啟了獨立密碼;
	    //           (3) 郵箱服務器要求必須要使用 SSL 安全連接;
	    //           (4) 請求過于頻繁或其他原因, 被郵件服務器拒絕服務;
	    //           (5) 如果以上幾點都確定無誤, 到郵件服務器網站查找幫助,
	    //
	    //    PS_03: 仔細看log, 認真看log, 看懂log, 錯誤原因都在log已說明,
	    //11.連接SMTP服務器
	    transport.connect(sendEmailAccount, sendEmailPwd);
	 
	    // 12. 發送郵件, 發到所有的收件地址, message.getAllRecipients() 獲取到的是在創建郵件物件時添加的所有收件人, 抄送人, 密送人
	    transport.sendMessage(message,message.getAllRecipients());
	    // 13. 關閉連接
	    transport.close();
		
	}

}

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/235473.html

標籤:java

上一篇:SpringBoot 微信支付V3介面圖片上傳工具類

下一篇:Spring(ioc和di)簡介

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more