Spring動態物業管理

靜態和動態屬性對于運營管理以及在生產級別更改系統行為都非常重要。 特別地,動態參數減少了服務中斷。 本文展示了如何使用Quartz在Spring Applications中管理動態屬性。
有關使用 Spring和Quartz集成提供“ 使用Spring和Quartz的多作業計劃服務”的文章。

讓我們看一下Spring中的Dynamic Property Management。

二手技術:

JDK 1.6.0_31
春天3.1.1
石英1.8.5 Maven的3.0.2

步驟1:建立已完成的專案

如下創建一個Maven項目。 (可以使用Maven或IDE插件來創建它)。

步驟2:圖書館

Spring依賴項已添加到Maven的pom.xml中。

<properties><spring.version>3.1.1.RELEASE</spring.version></properties><dependencies><!-- Spring 3 dependencies --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>${spring.version}</version></dependency><!-- Quartz dependency --><dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>1.8.5</version></dependency><!-- Log4j dependency --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.16</version></dependency></dependencies>

步驟3:創建DynamicPropertiesFile.properties

DynamicPropertiesFile涵蓋了應用程序的動態屬性。

# This property defines message content
# Possible values = Text. Default value : Welcome
Message_Content = Welcome Visitor# This property defines minimum visitor count
# Possible values = positive integer. Default value : 1
Minimum_Visitor_Count = 1# This property defines maximum visitor count
# Possible values = positive integer. Default value : 10
Maximum_Visitor_Count = 10

步驟4:創建applicationContext.xml

應用程序上下文的創建如下:

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd"><!-- Beans Declaration --><!-- Core Dynamic Properties Bean Declaration --><bean id="CoreDynamicPropertiesBean" class="org.springframework.beans.factory.config.PropertiesFactoryBean" scope="prototype"><property name="location" value="classpath:DynamicPropertiesFile.properties" /></bean><!-- Dynamic Properties Map Declaration --><bean id="DynamicPropertiesMap" class="java.util.HashMap"/><!-- Dynamic Properties File Reader Task Declaration --><bean id="DynamicPropertiesFileReaderTask" class="com.otv.dynamic.properties.task.DynamicPropertiesFileReaderTask"><property name="dynamicPropertiesMap"   ref="DynamicPropertiesMap"/></bean><!-- End of Beans Declaration --><!-- Scheduler Configuration --><!-- Job Detail--><bean id="DynamicPropertiesFileReaderTaskJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><property name="targetObject" ref="DynamicPropertiesFileReaderTask" /><property name="targetMethod" value="start" /></bean><!-- Simple Trigger --><bean id="DynamicPropertiesFileReaderTaskTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"><property name="jobDetail" ref="DynamicPropertiesFileReaderTaskJobDetail" /><property name="repeatInterval" value="60000" /><property name="startDelay" value="0" /></bean><bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><property name="jobDetails"><list><ref bean="DynamicPropertiesFileReaderTaskJobDetail" /></list></property><property name="triggers"><list><ref bean="DynamicPropertiesFileReaderTaskTrigger" /></list></property></bean><!-- End of Scheduler Configuration -->
</beans>

步驟5:建立SystemConstants類別

創建一個新的SystemConstants類。 此類涵蓋所有系統常數。

package com.otv.common;/*** System Constants** @author  onlinetechvision.com* @since   26 May 2012* @version 1.0.0**/
public class SystemConstants {//Names of Dynamic Properties...public static final String DYNAMIC_PROPERTY_MESSAGE_CONTENT = "Message_Content";public static final String DYNAMIC_PROPERTY_MINIMUM_VISITOR_COUNT = "Minimum_Visitor_Count";public static final String DYNAMIC_PROPERTY_MAXIMUM_VISITOR_COUNT = "Maximum_Visitor_Count";//Default Values of Dynamic Properties...public static final String DYNAMIC_PROPERTY_MESSAGE_CONTENT_DEFAULT_VALUE       = "Welcome";public static final String DYNAMIC_PROPERTY_MINIMUM_VISITOR_COUNT_DEFAULT_VALUE = "1";public static final String DYNAMIC_PROPERTY_MAXIMUM_VISITOR_COUNT_DEFAULT_VALUE = "10";public static final String BEAN_NAME_CORE_DYNAMIC_PROPERTIES_BEAN = "CoreDynamicPropertiesBean";public static final String APPLICATION_CONTEXT_FILE_NAME = "applicationContext.xml";
}

步驟6:創建DynamicPropertiesFileReaderTask類

DynamicPropertiesFileReaderTask類已創建。 此類由Quartz管理。 它通過每分鐘調用“ start”方法,通過DynamicPropertiesFile讀取所有動態屬性。 可以通過applicationContext.xml更改閱讀時間。

請注意,默認情況下coreDynamicPropertiesBean的作用域為Singleton 。 它必須在運行時返回動態屬性的新值,因此應將其范圍設置為Prototype 。 否則,將無法接收新值。

package com.otv.dynamic.properties.task;import java.util.HashMap;
import java.util.Properties;import org.apache.log4j.Logger;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;import com.otv.common.SystemConstants;/*** Dynamic Properties File Reader Task** @author  onlinetechvision.com* @since   26 May 2012* @version 1.0.0**/
public class DynamicPropertiesFileReaderTask implements BeanFactoryAware {private static Logger logger = Logger.getLogger(DynamicPropertiesFileReaderTask.class);private Properties coreDynamicPropertiesBean;private HashMap<String, String> dynamicPropertiesMap;private BeanFactory beanFactory;/*** Starts reading the dynamic properties**/public void start() {setCoreDynamicPropertiesBean(createCoreDynamicPropertiesBeanInstance());logger.info("**** Dynamic Properties File Reader Task is being started... ****");readConfiguration();logger.info("**** Dynamic Properties File Reader Task is stopped... ****");}/*** Reads all the dynamic properties**/private void readConfiguration() {readMessageContent();readMinimumVisitorCount();readMaximumVisitorCount();}/*** Reads Message_Content dynamic property**/private void readMessageContent() {String messageContent = getCoreDynamicPropertiesBean().getProperty(SystemConstants.DYNAMIC_PROPERTY_MESSAGE_CONTENT,SystemConstants.DYNAMIC_PROPERTY_MESSAGE_CONTENT_DEFAULT_VALUE);if (messageContent.equals("")){getDynamicPropertiesMap().put(SystemConstants.DYNAMIC_PROPERTY_MESSAGE_CONTENT,SystemConstants.DYNAMIC_PROPERTY_MESSAGE_CONTENT_DEFAULT_VALUE);logger.error(SystemConstants.DYNAMIC_PROPERTY_MESSAGE_CONTENT +" value is not found so its default value is set. Default value : " +SystemConstants.DYNAMIC_PROPERTY_MESSAGE_CONTENT_DEFAULT_VALUE);} else {messageContent = messageContent.trim();getDynamicPropertiesMap().put(SystemConstants.DYNAMIC_PROPERTY_MESSAGE_CONTENT, messageContent);logger.info(SystemConstants.DYNAMIC_PROPERTY_MESSAGE_CONTENT + " : " +getDynamicPropertiesMap().get(SystemConstants.DYNAMIC_PROPERTY_MESSAGE_CONTENT));}}/*** Reads Minimum_Visitor_Count dynamic property**/private void readMinimumVisitorCount() {String minimumVisitorCount = getCoreDynamicPropertiesBean().getProperty(SystemConstants.DYNAMIC_PROPERTY_MINIMUM_VISITOR_COUNT,SystemConstants.DYNAMIC_PROPERTY_MINIMUM_VISITOR_COUNT_DEFAULT_VALUE).trim();try {if (Integer.parseInt(minimumVisitorCount) > 0){getDynamicPropertiesMap().put(SystemConstants.DYNAMIC_PROPERTY_MINIMUM_VISITOR_COUNT, minimumVisitorCount);logger.info(SystemConstants.DYNAMIC_PROPERTY_MINIMUM_VISITOR_COUNT + " : " +getDynamicPropertiesMap().get(SystemConstants.DYNAMIC_PROPERTY_MINIMUM_VISITOR_COUNT));} else {getDynamicPropertiesMap().put(SystemConstants.DYNAMIC_PROPERTY_MINIMUM_VISITOR_COUNT,SystemConstants.DYNAMIC_PROPERTY_MINIMUM_VISITOR_COUNT_DEFAULT_VALUE);logger.error("Invalid "+SystemConstants.DYNAMIC_PROPERTY_MINIMUM_VISITOR_COUNT +" value encountered. Must be greater than 0. Its default value is set. Default value : "+ SystemConstants.DYNAMIC_PROPERTY_MINIMUM_VISITOR_COUNT_DEFAULT_VALUE);}} catch (NumberFormatException nfe) {logger.error("Invalid "+SystemConstants.DYNAMIC_PROPERTY_MINIMUM_VISITOR_COUNT +" value encountered. Must be numeric!", nfe);logger.warn(SystemConstants.DYNAMIC_PROPERTY_MINIMUM_VISITOR_COUNT +" default value is set. Default value : " +SystemConstants.DYNAMIC_PROPERTY_MINIMUM_VISITOR_COUNT_DEFAULT_VALUE);}}/*** Reads Maximum_Visitor_Count dynamic property**/private void readMaximumVisitorCount() {String maximumVisitorCount = getCoreDynamicPropertiesBean().getProperty(SystemConstants.DYNAMIC_PROPERTY_MAXIMUM_VISITOR_COUNT,SystemConstants.DYNAMIC_PROPERTY_MAXIMUM_VISITOR_COUNT_DEFAULT_VALUE).trim();try {if (Integer.parseInt(maximumVisitorCount) > 0){getDynamicPropertiesMap().put(SystemConstants.DYNAMIC_PROPERTY_MAXIMUM_VISITOR_COUNT, maximumVisitorCount);logger.info(SystemConstants.DYNAMIC_PROPERTY_MAXIMUM_VISITOR_COUNT + " : " +getDynamicPropertiesMap().get(SystemConstants.DYNAMIC_PROPERTY_MAXIMUM_VISITOR_COUNT));} else {getDynamicPropertiesMap().put(SystemConstants.DYNAMIC_PROPERTY_MAXIMUM_VISITOR_COUNT,SystemConstants.DYNAMIC_PROPERTY_MAXIMUM_VISITOR_COUNT_DEFAULT_VALUE);logger.error("Invalid "+SystemConstants.DYNAMIC_PROPERTY_MAXIMUM_VISITOR_COUNT +" value encountered. Must be greater than 0. Its default value is set. Default value : " +SystemConstants.DYNAMIC_PROPERTY_MAXIMUM_VISITOR_COUNT_DEFAULT_VALUE);}} catch (NumberFormatException nfe) {logger.error("Invalid "+SystemConstants.DYNAMIC_PROPERTY_MAXIMUM_VISITOR_COUNT +" value encountered. Must be numeric!", nfe);logger.warn(SystemConstants.DYNAMIC_PROPERTY_MAXIMUM_VISITOR_COUNT +" default value is set. Default value : " +SystemConstants.DYNAMIC_PROPERTY_MAXIMUM_VISITOR_COUNT_DEFAULT_VALUE);}}/*** Gets CoreDynamicPropertiesBean** @return Properties coreDynamicPropertiesBean*/public Properties getCoreDynamicPropertiesBean() {return coreDynamicPropertiesBean;}/*** Sets CoreDynamicPropertiesBean** @param Properties coreDynamicPropertiesBean*/public void setCoreDynamicPropertiesBean(Properties coreDynamicPropertiesBean) {this.coreDynamicPropertiesBean = coreDynamicPropertiesBean;}/*** Gets DynamicPropertiesMap** @return HashMap dynamicPropertiesMap*/public HashMap<String, String> getDynamicPropertiesMap() {return dynamicPropertiesMap;}/*** Sets DynamicPropertiesMap** @param HashMap dynamicPropertiesMap*/public void setDynamicPropertiesMap(HashMap<String, String> dynamicPropertiesMap) {this.dynamicPropertiesMap = dynamicPropertiesMap;}/*** Gets a new instance of CoreDynamicPropertiesBean** @return Properties CoreDynamicPropertiesBean*/public Properties createCoreDynamicPropertiesBeanInstance() {return  (Properties) this.beanFactory.getBean(SystemConstants.BEAN_NAME_CORE_DYNAMIC_PROPERTIES_BEAN);}/*** Sets BeanFactory** @param BeanFactory beanFactory*/public void setBeanFactory(BeanFactory beanFactory) throws BeansException {this.beanFactory = beanFactory;}}

步驟7:創建應用程序類

應用程序類啟動項目。

package com.otv.starter;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.otv.common.SystemConstants;/*** Application Starter Class** @author  onlinetechvision.com* @since   26 May 2012* @version 1.0.0**/
public class Application {/*** Main method of the Application**/public static void main(String[] args) {new ClassPathXmlApplicationContext(SystemConstants.APPLICATION_CONTEXT_FILE_NAME);}
}

第8步:運行項目

如果運行應用程序類,則顯示以下控制臺日志:

26.05.2012 17:25:09  INFO (DefaultLifecycleProcessor.java:334) - Starting beans in phase 2147483647
26.05.2012 17:25:09  INFO (SchedulerFactoryBean.java:648) - Starting Quartz Scheduler now
26.05.2012 17:25:09  INFO (PropertiesLoaderSupport.java:177) - Loading properties file from class path resource [DynamicPropertiesFile.properties]
26.05.2012 17:25:09  INFO (DynamicPropertiesFileReaderTask.java:36) - **** Dynamic Properties File Reader Task is being started... ****
26.05.2012 17:25:09  INFO (DynamicPropertiesFileReaderTask.java:63) - Message_Content : Welcome Visitor
26.05.2012 17:25:09  INFO (DynamicPropertiesFileReaderTask.java:76) - Minimum_Visitor_Count : 1
26.05.2012 17:25:09  INFO (DynamicPropertiesFileReaderTask.java:96) - Maximum_Visitor_Count : 10
26.05.2012 17:25:09  INFO (DynamicPropertiesFileReaderTask.java:38) - **** Dynamic Properties File Reader Task is stopped... ****26.05.2012 17:26:09  INFO (PropertiesLoaderSupport.java:177) - Loading properties file from class path resource [DynamicPropertiesFile.properties]
26.05.2012 17:26:09  INFO (DynamicPropertiesFileReaderTask.java:36) - **** Dynamic Properties File Reader Task is being started... ****
26.05.2012 17:26:09  INFO (DynamicPropertiesFileReaderTask.java:63) - Message_Content : Welcome Visitor, Bruce!
26.05.2012 17:26:09  INFO (DynamicPropertiesFileReaderTask.java:76) - Minimum_Visitor_Count : 2
26.05.2012 17:26:09  INFO (DynamicPropertiesFileReaderTask.java:96) - Maximum_Visitor_Count : 20
26.05.2012 17:26:09  INFO (DynamicPropertiesFileReaderTask.java:38) - **** Dynamic Properties File Reader Task is stopped... ****

步驟9:下載

OTV_SpringDynamicPropertyManagement

參考資料:

Spring Framework參考3.x

參考: Online Technology Vision博客中的JCG合作伙伴 Eren Avsarogullari提供的Spring動態物業管理 。


翻譯自: https://www.javacodegeeks.com/2012/05/dynamic-property-management-in-spring.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372539.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372539.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372539.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[BZOJ1005][HNOI2008]明明的煩惱

[BZOJ1005][HNOI2008]明明的煩惱 試題描述 自從明明學了樹的結構,就對奇怪的樹產生了興趣......給出標號為1到N的點,以及某些點最終的度數,允許在任意兩點間連線,可產生多少棵度數滿足要求的樹? 輸入 第一行為N(0 < N < 1000),接下來N行,第i1行給出第i個節點的度數Di,如…

android調用so封裝jni,GitHub - Michelle0716/AndroidJniDemo1: 安卓對c進行so文件打包,并以jni的形式進行調用...

AndroidJniDemo1安卓對c進行so文件打包&#xff0c;并以jni的形式進行調用項目中的部分app &#xff1a; 編譯so文件jniDemo: 添加運行so文件開發環境&#xff1a;android studio 3.0.1(As3.0以上創建項目&#xff0c;選擇支持c/c,項目會自動生成需要的配置&#xff0c;不需要在…

ADF任務流:頁面片段的托管bean范圍

介紹 當我們使用ADF任務流并需要實現一些特定于流的業務邏輯或存儲一些與該流相關的信息時&#xff0c;我們通常使用pageFlowScope托管bean。 而且&#xff0c;當我們需要為流的活動&#xff08;頁面或頁面片段&#xff09;提供服務時&#xff0c;我們將較短的作用域用于此類托…

Linux平臺下:塊設備、裸設備、ASMlib、Udev相關關系

對磁盤設備&#xff08;裸分區&#xff09;的訪問方式分為兩種&#xff1a;1.字符方式訪問&#xff08;裸設備&#xff09;&#xff1b;2.塊方式訪問 Solaris平臺 : 在Solaris平臺下&#xff0c;系統同時提供對磁盤設備的字符、塊方式訪問。每個磁盤有兩個設備文件名: 一個在/d…

Error0---local variable S is accessed from within inner class; needs to be declared final

local variable S is accessed from within inner class; needs to be declared final在內部類當中不能引用本地變量s,需要被聲明為常量轉載于:https://www.cnblogs.com/Cherrylalala/p/6636642.html

android版本如何修改時間,如何修改Android系統默認時間

相信很多人看到過Android手機或平板顯示XXXX-01-01這個奇怪的日期&#xff0c;沒錯&#xff0c;這就是Android設備的默認日期。當Android設備沒有聯網&#xff0c;無法獲取當前真實時間的時候&#xff0c;就會使用系統默認時間。大部分時候&#xff0c;系統默認時間是Epoch時間…

Java Web應用程序的反跨站點腳本(XSS)過濾器

這是為Java Web應用程序編寫的一個好簡單的反跨站點腳本&#xff08;XSS&#xff09;過濾器。 它的主要作用是從請求參數中刪除所有可疑字符串&#xff0c;然后將其返回給應用程序。 這是我以前關于該主題的帖子的改進。 您應該將其配置為鏈&#xff08;web.xml&#xff09;中的…

生成建表腳本up_CreateTable

已經很久沒用使用這個腳本了&#xff0c;今天用到&#xff0c;并做修改&#xff0c;增加了生成擴展屬性功能。 Go if object_ID([up_CreateTable]) is not nullDrop Procedure [up_CreateTable] Go /* 生成建表腳本(V4.0) Andy 2017-3-28 */ Create Proc up_CreateTable (obje…

android程序員周記,程序員實習周記100篇

程序員實習周記100篇有效防止雷同&#xff01;簡單修改即可使用&#xff01;姓名&#xff1a;XXX學號&#xff1a;20190920008專業&#xff1a;M]指導老師&#xff1a;實習時間&#xff1a;20XX-XX-XX—20XX-XX-XX2019年XX月XX日t8in6Ay8Cw7c HuktN6ttTE12V7A eZu9g e7W1Y Dxqx…

Python之裝飾器

裝飾器功能有兩點&#xff1a;1.首先自動執行裝飾器后面跟的這個函數&#xff0c;并將裝飾器修飾的那個函數名作為參數帶入裝飾器后面函數&#xff1b;2.將裝飾器后面函數的返回值&#xff0c;賦值給裝飾器所修飾的那個函數。舉個例子說明&#xff1a; 1 def outer(func):2 …

在獨立Java應用程序中使用Tomcat JDBC連接池

這是從我們的客人文章W4G伙伴克拉倫斯豪的作者臨春3從A按。 您可能會在文章結尾找到本書的折扣券代碼&#xff0c;僅適用于Java Code Geeks的讀者&#xff01; 請享用&#xff01; 在需要數據訪問權限的獨立Java應用程序中使用JDBC連接池時&#xff0c;大多數開發人員將使用com…

Python之路【目錄】 2

http://www.cnblogs.com/wupeiqi/articles/4938499.html轉載于:https://www.cnblogs.com/cp-miao/p/5750211.html

vs2019 缺android sdk,VS2019由于缺少NuGet Microsoft.NET.Sdk.Functions程序包而無法加載項目,但也無法添加此程序包(示例代碼)...

我在解決方案中擁有的一個項目未在VSE2019中加載。它將引發此錯誤&#xff1a;C:MyProgramsrcMyProgram.Functions.csproj : error : The project file cannot be opened by the project system, because it is missing some critical imports or the referenced SDK cannot be…

數據庫事物操作

事務 什么是事務?轉賬&#xff1a;1. 給wc賬戶減1000元2. 給wcxf賬戶加1000元 當給wc賬戶減1000元后&#xff0c;拋出了異常&#xff01;這會怎么樣呢&#xff1f;我相信從此之后&#xff0c;wc再也不敢轉賬了。 使用事務就可以處理這一問題&#xff1a;把多個對數據庫的操作綁…

通過OpenShift超越云技術

您是否厭倦了為您的應用程序請求新的開發機器&#xff1f; 您是否為應用程序設置新的測試環境感到煩惱&#xff1f; 您是否只想專注于和平開發應用程序而不會一直“沉迷于堆棧”&#xff1f; 我們聽到你的聲音。 我們也去過那里。 不用擔心&#xff0c;OpenShift就在這里&#…

android+4.4+穩定性,新系統新UI!臺電A10h四核安卓4.4.2性能測試

國內著名商標&#xff0c;數碼用戶首選品牌的臺電科技在12月20日全國首發了安卓4.4.2系統&#xff0c;并且運行臺電全新tUI同時&#xff0c;支持從安卓4.2系統OTA一鍵升級至安卓4.4.2系統&#xff01;作為國內首款升級到目前全球最新的Android4.4.2系統之后&#xff0c;整體性能…

網絡知識點小結

VMware虛擬機三種聯網方法及原理一、Brigde——橋接&#xff1a;默認使用VMnet0 1、原理&#xff1a; Bridge 橋"就是一個主機&#xff0c;這個機器擁有兩塊網卡&#xff0c;分別處于兩個局域網中&#xff0c;同時在"橋"上&#xff0c;運行著程序&#xff0c;讓…

在JUnit中超越核心Hamcrest

在通過JUnit和Hamcrest改進對assertEquals的文章中&#xff0c;我介紹了將Hamcrest與JUnit一起使用 。 然后&#xff0c;我查看了JUnit的內置Hamcrest Core Matcher支持 。 在本文中&#xff0c;我將介紹如何將Hamcrest的非核心匹配器與JUnit一起應用。 這些非核心匹配器默認情…

4pics1word android,4 Pics 1 Word

4 Pics 1 Word是一款非常有意思的看圖猜詞游戲&#xff0c;這款游戲中會給我們四張圖片&#xff0c;玩家需要通過圖片給出的信息來猜出是哪個詞&#xff0c;看西西的介紹你可能以為這是一款千篇一律的看圖猜詞游戲&#xff0c;不過這里猜的不是中文而是英語單詞。4 Pics 1 Word…

頁面內錨點定位及跳轉方法總結

接著上一篇&#xff0c;其實是一個功能&#xff0c;本來感覺挺簡單的一個問題&#xff0c;沒想到遇到兩個坎兒&#xff0c;無語。。。 上一篇是關于scroll事件綁定的問題&#xff0c;這一篇的問題是&#xff1a;點擊錨點跳轉到相應DIV的問題。 最簡單的方法是錨點用<a>標…