1.UE4 Delegate(委托)相关源码分析(一)
2.Tomcat9.0ï¼
3.为什么感觉电信的组播组播iptv没广电清晰?
4.一文讲解Linux内核——组播路由协议原理
5.springbootåjspçåºå«ï¼
UE4 Delegate(委托)相关源码分析(一)
UE4委托是强效设计,尤其在大型项目中大放异彩。源码源码无论是分析模块解耦、扩展接口还是组播组播实现替换自定义实现,其价值巨大。源码源码未使用委托的分析游侠股市 源码程序员,当功能复杂且相互关联时,组播组播项目管理必定混乱。源码源码C++中,分析委托实现基于函数指针,组播组播核心是源码源码存储并调用。然而,分析成员函数指针的组播组播存在让C++委托实现变得独特而高效。UE4内置强大、源码源码实用的分析代理机制,本系列旨在深入解析代理源码,并提供实例应用。
打开代理宏定义文件,七哥源码虽近行,主体类型仅几种。定义事件`DECLARE_EVENT`显得特别,其用途似乎不小但使用未广泛。事件与组播委托相似,但允许仅定义事件的类调用`Broadcast`、`IsBound`和`Clear`函数,限制外部类对这些函数的访问,便于在公共接口中公开事件。测试发现,外部仍然能调用这些函数,官方文档描述与实际不符。不确定是否为版本更新或使用方法问题。
普通单播代理定义`TBaseDelegate`模板类,继承`FDelegateBase`,使用`DelegateAllocator`存储`IDelegateInstance`对象,其中包含代理实现。斗破传奇源码普通多播代理则定义`TMulticastDelegate`模板类,继承`TBaseMulticastDelegate`,核心是`TInvocationList`数组,存储多个代理处理对象,并通过添加和删除函数维护数组,实现多播逻辑。广播时,遍历数组依次调用各代理处理对象。使用多播时,只需考虑绑定代理,无需解绑,无效代理会自动移除。
动态单播代理定义类`TBaseDynamicDelegate`,继承`TScriptDelegate`,存储`TWeakPtr(UObject指针)`和`FName(函数名称)`,通过反射系统找到对应`UFunction`执行。动态代理依赖UE4强大反射系统,流量卡源码搭建绑定函数需加上`UFUNCTION()`宏。绑定函数时,`AddDynamic`等宏将函数指针转换为函数名称,或直接传递函数名称并调用`BindFunction`。动态多播可通过添加`BlueprintAssignable`标记,让蓝图使用并绑定。
UE4委托实现多样,但核心在于管理回调,实现模块解耦与功能扩展。掌握其原理与应用,有助于更高效地构建大型项目。
Tomcat9.0ï¼
j2eeæå¡å¨æåªäº
ä¼æå¨ç¥ï¼J2EEåºç¨æå¡å¨ç¾è±é½æ¾ï¼ç§ç±»ä¼å¤ãé£ä¹J2EEåºç¨æå¡å¨æåªäº?åæåªäºåè½å¢?ä¸èµ·æ¥ççå§!
ä»åè½å®ç°ä¸ååï¼
æå®ç°å®æ´J2EEè§è(fullprofile)çWeblogic,WebSphere,GlassFish
æå®ç°webåºç¨è§è(webprofile)çTomEE,JBoss/WildFly
æåºæ¬çServletåJspè§èçWeb容å¨(WebContainer)Tomcat,Jetty,Resin
å顾è¿å»çå¹´ï¼ååºç¨æå¡å¨å¸åºå æçåæåç§ã
ä¸å¾ä¸ºå个åºç¨æå¡å¨ä½¿ç¨ç饼å¾
æ们çå°ï¼å¨ä¼å¤J2EEåºç¨æå¡å¨ä¸ï¼Tomcat使ç¨çè¾¾å°.%ï¼ç¨³å第ä¸ã
ç¸è¾å¹´ï¼Tomcat使ç¨çå¤§å¹ å¢é¿ï¼å¢é¿å°è¿%ã
æ´ä½èè¨ï¼Tomcatå为ServletåJspè§èçåèå®ç°(Referenceimplementationï¼ç®ç§°RI)ï¼ä¸è¬é½ä¼å¨ç¬¬ä¸æ¶é´å®ç°è§èçæ°ç¹æ§å¹¶éè¿OracleçCTSæµè¯è®¤è¯ãç®åææ°çTomcat9.0ï¼è½è¿æ¯alphaçï¼ä½å·²ç»å®ç°äºServlet4.0èæ¡ï¼æå ´è¶£çæåï¼å¯ä»¥ä¸è½½å°é²å¦!
Tomcatæ¯ä¸ä¸ªå®ç°äºJAVAEEæ åçæå°çWEBæå¡å¨ï¼æ¯Apache软件åºéä¼çJakarta项ç®ä¸çä¸ä¸ªæ ¸å¿é¡¹ç®ï¼ç±ApacheãSunåå ¶ä»ä¸äºå ¬å¸åä¸ªäººå ±åå¼åèæãå 为Tomcatææ¯å è¿ãæ§è½ç¨³å®ï¼èä¸å¼æºå è´¹ï¼å èæ·±åJavaç±å¥½è çåç±å¹¶å¾å°äºé¨å软件å¼ååç认å¯ï¼æ为ç®åæ¯è¾æµè¡çWebåºç¨æå¡å¨ãå¦ä¹ JavaWebå¼åä¸è¬é½ä½¿ç¨Tomcatæå¡å¨ï¼è¯¥æå¡å¨æ¯æå ¨é¨JSP以åServletè§èï¼å¯å¨çé¢å¦å¾ï¼
Tomcatæ¯ä¸æ¬¾é常ä¼ç§çJavaWebæå¡å¨,以è´äºå¾å¤å¼æºJavaåºç¨æå¡å¨(å¦JOnAS)ç´æ¥éæå®ä½ä¸ºservlet容å¨ã
Tomcatçæ»ä½ç»æ
Tomcatä¸ä¸»è¦æ¶åServer,Service,Engine,Connector,Host,Contextç»ä»¶ï¼ä¹åç¨è¿Tomcatç.ç«¥éæ¯ä¸æ¯è§å¾è¿äºç»ä»¶çå称æç¹ä¼¼æ¾ç¸è¯ç赶èï¼æ²¡èµ¶è?!æ¨åæ³æ³ã好å§ï¼ä¸ç¨ä½ æ³äºï¼ææ¥åè¯ä½ å§ãå ¶å®å¨Tomcatäºè¿å¶ååå 解åå,å¨confç®å½ä¸æä¸ä¸ªserver.xmlæ件ï¼ä½ æå¼å®ç两ç¼ççï¼æ¯ä¸æ¯åç°server.xmlæ件ä¸å·²ç»å å«äºä¸è¿°çå 个å称ã
Tomcaté群æºç çç±»å¾
ä»å¾ä¸æ们å¯ä»¥çåºTomcaté群å æ¬ä»¥ä¸å 个æ¹é¢çå 容:
Session:Sessionå为StandardSessionä¸ClusterSession两ç§,åè ç¨äºSessionå¤å¶ã
SessionManager:æç¨äºé群Session管ççClusterSession,ä¹æç¨äºå¯¹Sessionè¿è¡ä¸è¬æ¥å¸¸ç®¡çç,å¦PersistentManager,BackupManager,SimpleTcpReplicationManagerã
ç»éè¿ æ¡æ¶:SessionManagerè°ç¨ç»é讯æ¡æ¶è¿è¡Sessionçä¼ è¾,Tomcatéç¨çç»é
讯æ¡æ¶æ¯tribe,ç®åtribe已被ç¬ç«ä¸ºå¼æ¾çapacheå·¥ç¨ã
Cluster:æ¹ä¾¿é群管çèæ´¾çåºçé»è¾æ¦å¿µ,å¯å°å®é ç©çæºåå为ä¸ä¸ªCluster,ä¹å¯å°ä¸å°ç©çæºä¸ä¸å端å£çå®ä¾åå为ä¸ä¸ªCluster,å®æä¸ä¸ªç®åçå®ç°ç±»SimpleTcpClusterã
1.1Session
æå¡å¨é群é常æ纵两ç§session:
1.Stickysessions:å°½é让åä¸ä¸ªå®¢æ·è¯·æ±ç±åä¸å°æå¡å¨æ¥å¤ç,è¿æ ·stickysessionså°±æ¯åå¨äºåæºæå¡å¨ä¸æ¥å客æ·ç«¯è¯·æ±çsession,å®ä¸éè¦è¿è¡Sessionå¤å¶,å¦æè¿ä¸ªåæºå¤±è´¥çè¯,ç¨æ·å¿ é¡»éæ°ç»å½ç½ç«ã
2.Replicatedsessions:å¨ä¸å°æå¡å¨ä¸çsessionç¶æ被å¤å¶å°é群çå ¶ä»æå¡å¨ä¸,æ 论ä½æ¶,åªè¦sessionæ¹åäº,sessionæ°æ®é½è¦éæ°å ¨é¨æé¨å(ä¾æ®å¤å¶çç¥)被å¤å¶å°å ¶ä»æå¡å¨ä¸ã
Tomcatæ¯æ以ä¸ä¸ç§sessionæä¹ æ§ç±»å:
1.å åå¤å¶:å¨JVMå åä¸å¤å¶sessionç¶æ,使ç¨Tomcatèªå¸¦çSimpleTcpClusteråSimpleTcpClusterManagerç±»ã
2.æ°æ®åºæä¹ æ§:å¨è¿ç§ç±»åä¸,sessionç¶æä¿åå¨ä¸ä¸ªå ³ç³»æ°æ®åºä¸,æå¡å¨ä½¿ç¨org.apache.catalina.session.JDBCManagerç±»ä»æ°æ®åºä¸è·åSessionä¿¡æ¯ã
3.åºäºæ件çæä¹ æ§:è¿é使ç¨ç±»org.apache.catalina.session.FileManageræsessionç¶æä¿åå°ä¸ä¸ªæ件系ç»ã
SessionManager
Tomcatéè¿org.apache.catalina.Manageræ¥ç®¡çSession,Manageræ¥å£æ»æ¯åContextContainerç¸å ³èãå®ä¸»è¦è´è´£sessionç建ç«ãæ´æ°åéæ¯ã该æ¥å£ä¸ä¸äºéè¦çæ¹æ³æ:
ç¨æ·å¨Servletä¸éè¿javax.servlet..ConnectException:Connectionrefused
atjava.net.PlainSocketImpl.socketConnect(NativeMethod)
atjava.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:)
atjava.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:)
atjava.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:)
atjava.net.SocksSocketImpl.connect(SocksSocketImpl.java:)
atjava.net.Socket.connect(Socket.java:)
atjava.net.Socket.connect(Socket.java:)
atjava.net.Socket.(Socket.java:)
atjava.net.Socket.(Socket.java:)
atorg.apache.catalina.startup.Catalina.stopServer(Catalina.java:)
atsun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethod)
atsun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:)
atsun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:)
atjava.lang.reflect.Method.invoke(Method.java:)
atorg.apache.catalina.startup.Bootstrap.stopServer(Bootstrap.java:)
atorg.apache.catalina.startup.Bootstrap.main(Bootstrap.java:)
å°tomcat9å å ¥å°ç³»ç»æå¡å表ä¸ï¼
è¿å ¥å°/etc/init.dç®å½ä¸ï¼
cd/etc/init.d
å建tomcat9æå¡é ç½®æ件ï¼
vitomcat9
å°å¦ä¸ä»£ç å å ¥åå ¥å°tomcat9é ç½®æ件ä¸ï¼
#idea-tomcatconfigstart---
#!/bin/bash
#description:TomcatStartStopRestart
#processname:tomcat
#chkconfig:
JAVA_HOME=/usr/local/tomcat/apache-tomcat-9.0.0.M4/
exportJAVA_HOME
PATH=$JAVA_HOME/bin:$PATH
exportPATH
CATALINA_HOME=/usr/local/tomcat/apache-tomcat-9.0.0.M4/
case$1in
start)
sh$CATALINA_HOME/bin/startup.sh
;;
stop)
sh$CATALINA_HOME/bin/shutdown.sh
;;
restart)
sh$CATALINA_HOME/bin/shutdown.sh
sh$CATALINA_HOME/bin/startup.sh
;;
esac
exit0
#chmodtomcat
#chkconfig--addtomcat
#chkconfig--leveltomcaton
#chkconfig--listtomcat
#idea-tomcatconfigend---
é®å ¥Esc并è¾å ¥â:wq!âä¿æ并éåº;
å ¶ä¸ç注æç¹æ¯å°JAVA_HOMEåCATALINA_HOMEåé设置æä¸æ们å½åé ç½®ç¸ä¸è´çè·¯å¾;
为tomcat9åé å¯æ§è¡æéï¼
chmod+xtomcat9
å°tomcat9çº³å ¥å°ç³»ç»çæå¡å表ä¸ï¼å³æ·»å tomcat9为系ç»æå¡ï¼
chkconfig--addtomcat9
æ¥çå½åç³»ç»æå¡é½æåªäºï¼
chkconfig--list
ä¹å¯ä»¥æ¥çæå®çç³»ç»æå¡ï¼å¦è¿éæ们æå®tomcat9è¿ä¸ªæå¡ï¼
chkconfig--listtomcat9
æå°å¦ä¸ä¿¡æ¯ï¼
tomcat:off1:off2:on3:on4:on5:on6:off
å表æå·²å°tomcat9设置为系ç»æå¡ï¼2ã3ã4ã5é½ä¸ºon表示å¯éç³»ç»èªå¨å¯å¨;
æ们å¯ä»¥å¨ä»»æç®å½ä¸æ§è¡å ³éãå¯å¨ãéå¯Tomcat9æå¡å¦ï¼
.1å ³étomcat9æå¡ï¼
servicetomcat9stop
.2å¯å¨tomcat9æå¡ï¼
servicetomcat9start
.3éå¯tomcat9æå¡ï¼
servicetomcat9restart
åè®°ï¼
linuxç³»ç»ä¸ç/etcç®å½è¡¨ç¤ºâ设å¤âï¼æ为ä¸ç¡¬ä»¶è®¾å¤ç¸å ³çä¿¡æ¯;
/etc/init.dç®å½ä¸çæ件表示å½å设å¤çåå§åé 置信æ¯;
å½ä»¤chkconfig表示添å (--add)ãå é¤(--del)ãæ¥ç(--list)ç³»ç»æå¡;
çäºâå¨CentOS7ä¸å®è£ Tomcat9çæ¹æ³æç¨âè¿æ³çï¼
1.CentOS7å®è£ é ç½®å¾ææç¨
2.å¨CentOS7ä¸é ç½®NICç»å®æç¨
3.CentOS7设置ç½ç»èªå¨å¯å¨æç¨
4.Tomcat7.0çå®è£ ä¸é ç½®
5.centos7å¿«éå¯å¨åºç¨ç¨åºæç¨
å¦ä½å¨CentOS7ä¸å®è£ Tomcat91éè¿SecureCRTè¿æ¥å°é¿éäºCentOS7æå¡å¨;
2è¿å ¥å°ç®å½/usr/local/ä¸ï¼
cd/usr/local/
3å建ç®å½/usr/local/toolsï¼å¦ææå忽ç¥ï¼
mkdir-ptools
4å建/usr/local/tomcatç®å½ï¼å¦æå·²åå¨å忽ç¥ï¼
mkdir-ptomcat
5è¿å ¥å°ç®å½/usr/local/toolsä¸ï¼
cdtools/
6ä¸è½½apache-tomcat-9.0.0.M4.tar.gzæ件ï¼
wget
7解å缩apache-tomcat-9.0.0.M4.tar.gzï¼
tar-zxvfapache-tomcat-9.0.0.M4.tar.gz
8å°éè¿è§£åå¾å°çapache-tomcat-9.0.0.M4æ件å¤å¶å°/usr/local/tomcatç®å½ä¸ï¼
mvapache-tomcat-9.0.0.M4../tomcat/
9æå¼æ件/etcç®å½ä¸çprofileæ件ï¼
vim/etc/profile
å°å¦ä¸ä»£ç 追å å°profileæ件æ«å°¾ï¼
#idea-tomcat9configstart---
CATALINA_HOME=/usr/local/tomcat/apache-tomcat-9.0.0.M4
CATALINA_BASE=/usr/local/tomcat/apache-tomcat-9.0.0.M4
PATH=$PATH:$CATALINA_BASE/bin
exportPATHCATALINA_BASE
#idea-tomcat9configend---
ä¿æ并æ¨åº:wq!
ä¿®æ¹tomcatç端å£å·åå符ç¼ç ï¼
è¿å ¥å°/usr/local/tomcat/apache-tomcat-9.0.0.M4/confç®å½ä¸ï¼
cd../tomcat/apache-tomcat-9.0.0.M4/conf
æå¼tomcatæå¡çé ç½®æ件server.xmlï¼
viserver.xml
æ¾å°å¦ä¸ä»£ç ï¼
å°å ¶ä¸çæ¹æHTTPåè®®çé»è®¤ç«¯å£ï¼æ¹åç代ç å¦ä¸ï¼
å¢å manager-guiå¾å½¢å管ççé¢ç访é®æé(ä¸éè¦çè¯ï¼æ¤æ¥éª¤å¯å¿½ç¥)ï¼
æå¼tomcatçç¨æ·é ç½®æ件tomcat-users.xmlï¼
vitomcat-users.xml
å¨æ ç¾åå å ¥å¦ä¸ä»£ç ï¼
è¿é设置çusernameåpasswordé½æ¯passwordï¼è§è²ä¸ºmanager-gui;
é®å ¥Esc并è¾å ¥â:wq!âä¿æ并éåº;
è¿å ¥å°/usr/local/tomcat/apache-tomcat-9.0.0.M4/binç®å½ä¸ï¼
cd../bin/
æå¼vicatalina.shæ件ï¼
å¨#OSspecificsupport.åé¢å å ¥å¦ä¸ä»£ç ï¼
为什么感觉电信的iptv没广电清晰?
1. 广播电视总局主要作为行政机构管理电视视频类业务,不存在给运营商的码流减帧等说法。IPTV和有线电视用户对广播电视总局而言是一样的,IPTV本身也是广电控制的。
2. 广电网络的电视传输制式是频分,将全部电视节目传输到电视,ffmpeg源码编译命令而IPTV的组播只推送用户选择的频道。频道的选择相当于码流的选择,可以节省传输带宽,频道切换速度极快。
3. 运营商的传输带宽足以保证IPTV的带宽,光纤宽带发展多年,传输资源已经很充足。
4. IPTV的清晰度不如广电的高清电视,可能是由于以下原因:IPTV提供商是否提供了高清频道和片源,机顶盒是否支持高清电视,电视是否支持高清电视,以及线缆质量是否合格。
5. 虽然IPTV和广电在码流上相同,但片源本身的清晰度会影响效果。高清视频的转码可能造成编码损失,但通常不会影响清晰度。
6. 传输网络带宽分配和质量会影响IPTV和广电的清晰度。广电的传输网络带宽分配稳定,而电信运营商的IPTV可能会在高峰期出现加载慢、卡顿的现象。
7. IPTV和广电的传输网络质量不同,广电的传输网络质量普遍较好,而电信运营商的传输网络可能存在阻塞或路由断掉的问题。
8. IPTV和广电的传输网络使用不同的技术,有线电视采用QAM调制,而IPTV通过互联网传输,可能存在压缩和码率降低的问题。
9. IPTV和广电的码率可能不同,因为视频源不是同一套。IPTV视频来源于广电旗下的IPTV运营牌照公司,而DVB则由广电集团下的广电公司独立运营。
. IPTV和广电的清晰度差异可能与转码质量有关。广电有线电视节目源是源码播出,无需二次转码制流,而IPTV需要经过转码制流来传输。
. IPTV和广电的清晰度差异可能与传输方式有关。广电有线是广播式,同一时间所有用户接受的信号一样,而IPTV是点对点的播放模式。
. IPTV和广电的清晰度差异可能与带宽有关。广电的白色线(同轴电缆)有非常大带宽,可以同时传几百套标清和几十套高清。
. IPTV和广电的清晰度差异可能与设备有关。使用高清机顶盒和高清电视可以提高IPTV的清晰度。
. IPTV和广电的清晰度差异可能与网络环境有关。网络环境差可能导致IPTV出现加载慢、卡顿的现象。
. IPTV和广电的清晰度差异可能与用户体验有关。用户可能对IPTV和广电的清晰度有不同的感受,这可能与个人喜好、设备配置等因素有关。
一文讲解Linux内核——组播路由协议原理
Linux内核中的组播路由协议原理解析
在计算机网络中,组播是一种高效的数据传输方式,用于点对多点通信。不同于单播的点对点和广播的点对所有点,组播是向特定组发送信息,组内的所有接收者都能接收到。组播通过发送一份数据包,仅在需要的地方复制分发,避免了单播中服务器压力大和网络资源浪费的问题。
组播技术的应用广泛,如音频/视频会议、数据分发、实时数据传输以及网络游戏。音频会议结合IP组播的数据共享,形成了强大且带宽效率高的多媒体系统,适合网络教学。数据分发则让大型企业可以高效地向远程节点推送信息,实时数据传输如点播服务,让大量用户同时接收实时内容成为可能。
组播技术的特点在于节省网络带宽、减轻服务器负担,实现分布式应用的高效。然而,基于UDP的IP组播也存在包传送不可靠等问题。在组播实现技术上,组播体系结构包括主机-路由器的组成员关系协议(如IGMP)和路由器-路由器的组播路由协议,如MOSPF、PIM-SM、PIM-DM等,以及域间组播路由协议如MBGP、MSDP等。
组播地址由特殊的IP地址(.0.0.0~...)构成,其中.0.0.0~.0.0.保留给特定用途,如所有组播成员和路由器。物理层的组播MAC地址也有专用格式。为了确保通信,需要建立IP到MAC的映射,这在Linux内核中是通过特定的协议和机制来实现的。
深入理解Linux内核组播路由协议,对于优化网络性能和提升分布式应用的效率至关重要。欲了解更多内核源码高级知识,可加入开发交流Q群获取资料,参与技术分享。
springbootåjspçåºå«ï¼
ssmåspringbootçåºå«æ¯ä»ä¹?
åçå¦ä¸ï¼
å¨å¼åä¸çåºå«è¿æ¯åå¨çï¼è½ç¶springbootç®åäºé ç½®ï¼ä½å¹¶ä¸ä»£è¡¨ä¸éè¦ç¼åé ç½®æ件ï¼è¿æ¯éè¦å¨èªå¸¦çapplication.ymlæ件ä¸å»ç¼åä¸äºå 容ï¼åªä¸è¿ç¼åçæ¹å¼åå¾ç®åäºï¼è½ç¶ç®åäºï¼ä½æ¯åSSMæ´åçæ¹å¼è¿æäºåºå«ã
å¨ä½¿ç¨SSMå¼åçæ¶åï¼å¤æ°ä¼éæ©Jspä½ä¸ºè§å¾ï¼ä½æ¯springbootä¸æ¨è使ç¨jspï¼ä¸»æ¨çæ¯thymeleafåfreemarkerç模æ¿å¼æï¼ä¹é æäºä½¿ç¨SSMå¼åå°springbootå¼åä¹éè¦ä¸å®çå¦ä¹ ææ¬ãä¸è¿å¦æææ¡äºSSMçè¯ï¼å¦ä¹ springbootä¹æ¯æ°´å°æ¸ æï¼å¼å¸¸çç®åã
ç¸å ³ä»ç»ï¼
æºç¹å®ç»ææ¯ä¸ç§åºå«äºä¼ ç»ç»æçæ°çä¸å¡æ¨¡åï¼å®ä½¿ç¨ç»æç»å°ååç»ææºå°ååæ¶æ¥æ è¯ä¸ä¸ªç»æä¼è¯ï¼èä¸æ¯åä¼ ç»çç»ææå¡é£æ ·åªä½¿ç¨ç»æç»å°åæ¥æ è¯ä¸ä¸ªç»æä¼è¯ã
SSMä¿çäºä¼ ç»PIM-SM模å¼ä¸ç主æºæ¾ç¤ºå å ¥ç»æç»çé«ææ§ï¼ä½æ¯è·³è¿äºPIM-SM模å¼ä¸çå ±äº«æ åRP(RendezvousPointï¼éåç¹)è§ç¨ãå¨ä¼ ç»PIM-SM模å¼ä¸ï¼å ±äº«æ åRPè§ç¨ä½¿ç¨(*ï¼G)ç»å¯¹æ¥è¡¨ç¤ºä¸ä¸ªç»æä¼è¯ï¼å ¶ä¸(G)表示ä¸ä¸ªç¹å®çIPç»æç»ï¼è(*)表示ååç»æç»Gçä»»ä½ä¸ä¸ªæºã
SSMç´æ¥å»ºç«ç±(Sï¼G)æ è¯çä¸ä¸ªç»ææçè·¯å¾æ (SPTï¼ShortestPathTree)ï¼å ¶ä¸(G)表示ä¸ä¸ªç¹å®çIPç»æç»å°åï¼è(S)表示ååç»æç»Gçç¹å®æºçIPå°åã
SSMçä¸ä¸ª(Sï¼G)对ä¹è¢«ç§°ä¸ºä¸ä¸ªé¢é(Channel)ï¼ä»¥åºåä¼ ç»PIM-SMç»æä¸çä»»ææºç»æç»ãç±äºASMæ¯æç¹å°å¤ç¹åå¤ç¹å°å¤ç¹ä¸¤ç§ç»æä¸å¡æ¨¡å¼ï¼å æ¤æºçåç°è¿ç¨æ¯ASMå¤ææ§çåå ã
ä¾å¦å¨PIM-SM模å¼ä¸ï¼ç¨æ·ç¹å»æµè§å¨ä¸çç»æå 容ï¼æ¥æ¶ç«¯è®¾å¤åªè¢«éç¥å°ç»æç»çå 容ï¼è没æ被éç¥å°ç»ææºçä¿¡æ¯ãèå¨SSM模å¼ä¸ï¼ç¨æ·ç«¯å°åæ¶æ¥æ¶å°ç»ææºåç»æç»ä¿¡æ¯ã
å æ¤ï¼SSMç¹å«éåäºç¹å°å¤ç¹çç»ææå¡ï¼ä¾å¦ç½ç»å¨±ä¹é¢éãç½ç»æ°é»é¢éãç½ç»ä½è²é¢éçä¸å¡ï¼ä½å¦æè¦æ±å¤ç¹å°å¤ç¹ç»ææå¡åéè¦ASM模å¼ã
第äºç« ï¼SpringBootä¸JSPé´ä¸å¯æè¿°çç§å¯
springbootå é¨å¯¹jspçæ¯æ并ä¸æ¯ç¹å«çæ³ï¼èspringbootæ¨èçè§å¾æ¯Thymeleafï¼å¯¹äºjavaå¼å人åæ¥è¯´è¿æ¯å¤§å¤æ°äººåå欢使ç¨jspï¼æ¥ä¸æ¥æ们æ¥è®²è§£ä¸springbootæ¯å¦ä½æ¯æjspçã
æ´åspringbootweb项ç®æ¯æjspä½ä¸ºè§å¾è¾åºã
æå®å°å¹´å¨å客æ´çåºæ¥äºSpringBootãApiBootãSpringCloudçæç« æ±æ»ãSpringBootåºç¡æç¨ä¸é¢ãï¼ãSpringCloudåºç¡æç¨ä¸é¢ãï¼ãApiBootç»ä»¶ä½¿ç¨ä¸é¢ã
æ们使ç¨IntelliJIDEAå·¥å ·æ¥æ建项ç®ï¼é¦å æ们éè¦å建ä¸ä¸ªspringboot项ç®ï¼å¦ä¸å¾1æ示.
ç¹å»Nextåè¾å ¥ä¸äºé¡¹ç®çåºæ¬åæ°ï¼å åï¼å·¥ç¨åï¼æå å½¢å¼ï¼mavenå½¢å¼æ建çï¼ï¼å¦ä¸å¾2æ示ï¼
ç¹å»Nextåéæ©æ们é¢å å å ¥å°å·¥ç¨çspringbootå ç½®çjarå ç»ä»¶ï¼æ们è¿ééæ©ä¸ä¸ªwebç»ä»¶ãå¦ä¸å¾3æ示ï¼
ç¹å»Nextè¾å ¥é¡¹ç®å称ååºå®¶Finishæ¢å¯ä»¥å®æäºé¡¹ç®çæ建ãæ°æ建ç项ç®ç®å½ç»æå¦ä¸å¾4æ示ï¼
å¯ä»¥çå°ä¸å¾ä¸æ¯æ们lessonOne项ç®ä¸å¤åºæ¥äºä¸ä¸ªç±»æ件,ServletInitlalizerï¼æå¼è¯¥ç±»æ们ä¸é¾åç°å®ç»§æ¿äºSpringBootServletInitializerè¿ä¸ªç¶ç±»ï¼èSpringBootServletInitializerè¿ä¸ªç±»æ¯springbootæä¾çwebç¨åºåå§åçå ¥å£ï¼å½æ们使ç¨å¤é¨å®¹å¨ï¼åææç« è®²è§£ä½¿ç¨å¤é¨tomcatå¦ä½è¿è¡é¡¹ç®ï¼è¿è¡é¡¹ç®æ¶ä¼èªå¨å 载并ä¸è£ é ã
å®ç°äºSpringBootServletInitializerçåç±»éè¦éåä¸ä¸ªconfigureæ¹æ³ï¼æ¹æ³å èªå¨æ ¹æ®LessontwoApplication.classçç±»åå建ä¸ä¸ªSpringApplicationBuilder交ä»ç»springbootæ¡æ¶æ¥å®æåå§åè¿è¡é ç½®ã
æ们æå¼pom.xmlï¼mavené ç½®æ件ï¼å¯ä»¥çå°æ们ä¹åæ建项ç®æ¶å·²ç»æ·»å äºweb模åï¼èspringbootç»æ们èªå¨æ·»å äºspring-boot-starter-tomcaté ç½®å¼å ¥ãspringbootå é¨éæäºtomcatç»ä»¶ï¼è¿éæ们就ä¸éè¦éå¤å¼å ¥tomcatç»ä»¶ã
æ们å æ¥æ·»å jspçmavenæ¯æï¼å¦ä¸å¾4æ示ï¼
æ们è¿éè¦å¼å ¥jsp对servlet容å¨çæ¯æ,å¦ä¸å¾5æ示ï¼
é¤äºä¸é¢çjsp,servletæ¯æ以å¤ï¼å¦æä½ è¿éè¦å¨jsp页é¢ä½¿ç¨jstlæ ç¾æ¥å¤ççé¢é»è¾ï¼é£ä¹éè¦å¼å ¥jstlmavenï¼å¦ä¸å¾6æ示ï¼
ä¸é¢é 置就æ¯æ们æ¬ç« éè¦çå ¨é¨é ç½®ï¼é£ä¹æ们å æ¥å°è¯è¿è¡ä¸é¡¹ç®æ¯å¦å·²ç»å¯ä»¥æ£å¸¸è¿è¡ãè¿é项ç®è¿è¡ä¹å¯ä»¥ä½¿ç¨IntelliJIDEAå·¥å ·æä¾çç»ä»¶æ¥å®æï¼å¦ä¸å¾7æ示,ï¼
ï¼æ³¨æï¼å¦æä½ å·²ç»å¼å¯äºå¦å¤ä¸ä¸ªspringboot项ç®è¯·å å ³éï¼å 为springbootå ç½®ç端å£å·é½æ¯è¿æ ·ä¼å¼èµ·å²çªï¼
ç¹å»ç»¿è²ä¸è§å·å³å¯å¼å§è¿è¡é¡¹ç®ï¼æ们å æ¥å°è¯ä¸ç¹å»åççæ§å¶å°è¾å ¥çæ¥å¿ä¿¡æ¯ãå¯ä»¥çå°é¡¹ç®å·²ç»æ£å¸¸è¿è¡äºï¼å³ä¸è§ç绿è²ä¸è§å·ä¹åæäºéå¯çæé®ï¼å¦ä¸å¾8æ示ï¼
项ç®è¿è¡å¦å¾9æ示ï¼
å¯ä»¥çå°é¡¹ç®å·²ç»æ£å¸¸è¿è¡ï¼ä½æ¯æ们ç°å¨è¿æ²¡æé ç½®ï¼å建JSPæ件ï¼æ们æ¥ä¸æ¥å¼å§é ç½®ï¼å建JSPã
å¦ææ¯ä½¿ç¨è¿eclipseå·¥å ·ç人è¯å®ç¥éjspæ件ä¹åæ¯å¨/webapp/WEB-INF/jspç®å½ä¸ï¼é£ä¹æ们ä¹æ²¿ç¨eclipseçé£æ ¼ã
1.å¨mainç®å½ä¸å建webappæ件夹
2.å¨webappä¸å建jspæ件夹å¦ä¸å¾æ示ï¼
3.ä¿®æ¹application.propertiesæ件让springmvcæ¯æè§å¾ç跳转ç®å½æå为/main/webapp/jspï¼é ç½®å¦ä¸å¾æ示ï¼
æ们å¨webapps/jspç®å½ä¸å建ä¸ä¸ªindex.jspç¨äºæµè¯æ们çé ç½®æ¯å¦å·²ç»æ¯æäºjspï¼æ°å»ºjspæ件å¦ä¸å¾æ示ï¼
ä¸é¢å·¥ä½æ们已ç»å®æäºjspçææé ç½®ï¼é£ä¹æ¥ä¸æ¥æ们éè¦é ç½®springmvcçæ§å¶å¨ï¼æ们æ°å»ºindexControllerå¦ä¸å¾æ示ï¼
å¯ä»¥çå°ä¸å¾æ们å¨IndexControlleré ç½®æ件å æ·»å äºindex()æ¹æ³é ç½®äº@RequestMapping注解æ¥æè¿°index()æ¹æ³æ¯ä¸ä¸ªå¯ä»¥è¢«springmvc管çç请æ±è§å¾ãæ们çindex()æ¹æ³è¿åå¼è¿éæ¯"index"ã
为ä»ä¹æ们è¿å"index"ï¼è¿è®°å¾ä¸è¿°æ¥éª¤ä¸é ç½®çapplication.propertiesæ件çspringmvc请æ±åç¼ä»¥ååç¼ï¼é£ä¹å½æ们访é®/indexæ¶springmvcå°±ä¼å»æ¾/webapp/WEB-INF/jsp/index.jspæ件ã
éå¯é¡¹ç®æ们å°è¯è®¿é®.0.0.1:/indexï¼å¯ä»¥çå°å¦ä¸å¾çææï¼è¯æå·²ç»å®æäºspringbootä¸jspçæ´åï¼
ä¸è¿°ä¾¿æ¯æ们æ¬ç« çå ¨é¨å 容ï¼æ¬ç« 主è¦æ¯è®²è§£äºspringbootéæjspä½ä¸ºæ¸²æè§å¾ï¼ç»åspringmvcæ¥è½¬å请æ±ã
æ¬ç« å 容已ç»ä¸ä¼ å°ç äºï¼
SpringBooté å¥æºç å°åï¼
SpringCloudé å¥æºç å°åï¼
SpringBootç¸å ³ç³»åæç« è¯·è®¿é®ï¼ç®å½ï¼SpringBootå¦ä¹ ç®å½
QueryDSLç¸å ³ç³»åæç« è¯·è®¿é®ï¼QueryDSLéç¨æ¥è¯¢æ¡æ¶å¦ä¹ ç®å½
SpringDataJPAç¸å ³ç³»åæç« è¯·è®¿é®ï¼ç®å½ï¼SpringDataJPAå¦ä¹ ç®å½
SpringBootç¸å ³æç« è¯·è®¿é®ï¼ç®å½ï¼SpringBootå¦ä¹ ç®å½ï¼æè°¢é 读ï¼
ç¥è¯æç-æå®å°å¹´
jspåspringbootåªä¸ªç®åspringbootç®åãspringbootååçå¦ä¹ ç®åãè½»é级以å容ææ©å±çä¼ç¹ï¼æ为äºè¬ååå±çå¿«éåºç¨å¼åé¢åçé¢å¯¼è ï¼å¯ä»¥æ¿ä»£jspæ¶æä¸çå½é åæ¯æå®è·µï¼å æ¤springbootç®åã