- 浏览: 233620 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
test_lockxxx:
mythal 写道不好意思,StringUtils.split ...
String.split()和StringTokenizer和indexOf()的比较 -
grantbb:
受用,支持!
Javamail 发送附件中文名乱码问题解决 -
kensunhu:
for(File attach:attachments){
...
Javamail 发送附件中文名乱码问题解决 -
Ben.Sin:
liupeng_10408 写道博主,你好!我开发的是andr ...
Javamail读取邮件列表出现OutOfMemery -
liupeng_10408:
博主,你好!我开发的是android版邮件系统。
只写了如下几 ...
Javamail读取邮件列表出现OutOfMemery
Spring Framework开发参考: 14.4. Velocity和 FreeMarker
Velocity 和FreeMarker 是两种模板语言,都可以做为view层技术在Spring MVC 应用中使用。 它们的语言风格和适用对象都很相似,这里把它们放在一起讨论。至于它们语义和语法上的不同,可以参考 FreeMarker 站点。
14.4.1. 需要的资源
使用Velocity或FreeMarker需要包含
velocity-1.x.x.jar
或
freemarker-2.x.jar
。另外Velocity还需要
commons-collections.jar
。一般把这些jar包放在
WEB-INF/lib
下,这样可以保证J2EE Server找到它们并加到web应用的classpath下。这里同样假设你的
'WEB-INF/lib'
目录下已有
spring.jar
!Spring的发布包中已经提供了最新的稳定版本的Velocity、FreeMarker和commons
collections,可以从相应的
/lib/
子目录下得到。如果你想在Velocity中使用Spring的dateToolAttribute或numberToolAttribute,那你还需
要
velocity-tools-generic-1.x.jar
14.4.2. Context 配置
通过在
'*-servlet.xml'
中增加相关的配置bean,可以初始化相应的配置,如下:
<!-- 该bean使用一个存放模板文件的根路径来配置Velocity环境。你也可以通过指定一个属性文件来更精细地控制Velocity,但对基于文件的模板载入来说,默认的方式已相当健全 --> <bean id="velocityConfig"> <property name="resourceLoaderPath" value="/WEB-INF/velocity/"/> </bean> <!-- 也可以把ResourceBundle或XML文件配置到视图解析器中。如果你需要根据Locale来解析不同的视图,就需要使用resource bundle解析器。 --> <bean id="viewResolver"> <property name="cache" value="true"/> <property name="prefix" value=""/> <property name="suffix" value=".vm"/> </bean>
<!-- freemarker config --> <bean id="freemarkerConfig"> <property name="templateLoaderPath" value="/WEB-INF/freemarker/"/> </bean> <!-- 也可以把ResourceBundle或XML文件配置到视图解析器中。如果你需要根据Locale来解析不同的视图,就需要使用resource bundle解析器。 --> <bean id="viewResolver"> <property name="cache" value="true"/> <property name="prefix" value=""/> <property name="suffix" value=".ftl"/> </bean>
注意
对于非web应用,你需要在application context的配置文件中声明
VelocityConfigurationFactoryBean
或者
FreeMarkerConfigurationFactoryBean
14.4.3. 创建模板
模板文件需要存放在配置*Configurer
bean时所指定的目录下,就像上面的例子所示。
这里不准备详细叙述使用这两种语言创建模板的细节,你可以参考相应的站点获取那些信息。
如果你用了我们推荐的视图解析器,你会发现从逻辑视图名到相应模板文件的映射方式与使用
InternalResourceViewResolver
处理JSP时的映射方式类似。比如若你的控制器返回了ModelAndView对象,其中包含一个叫做“welcome”的视图名,则视图解析器将试图查
找
/WEB-INF/freemarker/welcome.ftl
或/WEB-INF/velocity/welcome.vm
作为合适的模板。
14.4.4. 高级配置
以上着重介绍的基本配置适合大部分应用需求,然而仍然有一些不常见的或高级需求的情况,Spring提供了另外的配置选项来满足这种需求。
14.4.4.1. velocity.properties
这个文件是可选的,不过一旦指定,其所包含的值即影响Velocity运行时状态。只有当你要做一些高级配置时才需要这个文件,这时你可以在上面定义的
VelocityConfigurer
中指定它的位置。
<bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer"> <property name="configLocation value="/WEB-INF/velocity.properties"/> </bean>
另一种方法,你可以直接在Velocity config bean的定义中指定velocity属性,来取代“configLocation”属性。
<bean id="velocityConfig"> <property name="velocityProperties"> <props> <prop key="resource.loader">file</prop> <prop key="file.resource.loader.class"> org.apache.velocity.runtime.resource.loader.FileResourceLoader </prop> <prop key="file.resource.loader.path">${webapp.root}/WEB-INF/velocity</prop> <prop key="file.resource.loader.cache">false</prop> </props> </property> </bean>
关于Spring中Velocity的配置请参考
API文档
或者参考Velocity自身文档中的例子和定义来了解如何配置
'velocity.properties'
文件。
14.4.4.2. FreeMarker
FreeMarker的'Settings'和'SharedVariables'配置可以通过直接设置
FreeMarkerConfigurer
的相应属性来传递给Spring管理的FreeMarker
Configuration
对象,其中
freemarkerSettings
属性需要一个java.util.Properties
类型对象,
freemarkerVariables
需要一个
java.util.Map
类型对象。
<bean id="freemarkerConfig"> <property name="templateLoaderPath" value="/WEB-INF/freemarker/"/> <property name="freemarkerVariables"> <map> <entry key="xml_escape" value-ref="fmXmlEscape"/> </map> </property> </bean> <bean id="fmXmlEscape"/>
关于settings和variables如何影响
Configuration
对象的细节信息,请参考FreeMarker的文档。
14.4.5. 绑定支持和表单处理
Spring提供了一个在JSP中使用的标签库,其中包含一个
<spring:bind/>
标签,它主要用来在表单中显示支持对象(译者注:即表单数据传输对象)的数据,并在一个
Validator
(工作在Web层或业务逻辑层)校验失败时显示失败信息。
从1.1版本开始,Spring为Velocity和FreeMarker也提供了同样的功能,而且还另外提供了便于使用的宏,用来生成表单输入元素。
14.4.5.1. 用于绑定的宏
spring.jar
文件为这两种语言维护了一套标准宏,对于正确配置的应用,它们总是可用的。
在Spring库中定义的一些宏被认为是内部的(私有的),但当宏定义中不存在这样的范围界定时,
会使得所有的宏均是可见的,能够任意调用代码和用户模板。下面的一节将集中讨论模板中可以直接调用的宏。
如果希望直接查看宏的代码,它们分别是
org.springframework.web.servlet.view.velocity
包中的spring.vm文件和
org.springframework.web.servlet.view.freemarker
包中的spring.ftl文件。
14.4.5.2. 简单绑定
在扮演Spring表单控制器对应视图的html表单(或vm/ftl模板)里,
你可以模仿下面的代码来绑定表单数据并显示错误信息(和JSP的形式非常相似)。
注意默认情况下命令对象的名字是“command”,你可以在配置自己的表单控制器时通过设置'commandName'属性来覆盖默认值。
例子代码如下(其中的personFormV
和personFormF
是前面定义的视图):
<!-- velocity宏自动可用 --> <html> ... <form action="" method="POST"> Name: #springBind( "command.name" ) <input type="text" name="${status.expression}" value="$!status.value" /><br> #foreach($error in $status.errorMessages) <b>$error</b> <br> #end <br> ... <input type="submit" value="submit"/> </form> ... </html>
<!-- FreeMarker宏必须导入到一个名称空间,这里推荐你定义为'spring'空间 --> <#import "spring.ftl" as spring /> <html> ... <form action="" method="POST"> Name: <@spring.bind "command.name" /> <input type="text" name="${spring.status.expression}" value="${spring.status.value?default("")}" /><br> <#list spring.status.errorMessages as error> <b>${error}</b> <br> </#list> <br> ... <input type="submit" value="submit"/> </form> ... </html>
#springBind
/
<@spring.bind>
需要一个'path'属性,格式为命令对象的名字(默认值为'command',
除非你在配置FormController的属性时改变它)后跟圆点再加上你希望绑定到的命令对象的属性名。
你也可以使用类似“command.address.street”的格式来处理嵌套对象。使用
bind
宏时,HTML转码行为由web.xml中名为
defaultHtmlEscape
的ServletContext参数指定。
上述宏的另一种可选形式是
#springBindEscaped
/
<@spring.bindEscaped>
,它另外接受一个布尔型参数,显式指定了输出值或错误信息这些状态信息时是否使用HTML转码。
附加的表单处理宏简化了HTML转码的使用,只要有可能,你就应该使用它们。关于它们的细节将在下节讲述。
14.4.5.3. 表单输入生成宏
为这两种语言附加的一些很方便的宏同时简化了表单绑定和表单生成(包括显示校验错误信息)。 不需要使用这些宏来生成表单输入域,它们可以被混杂并匹配到简单HTML,或者直接调用前面讲过的spring绑定宏。
下表展示了可用的宏的VTL定义和FTL定义,以及它们需要的参数。
表 14.1. 宏定义表
message (输出一个根据code参数选择的资源绑定字符串) |
#springMessage($code)
|
<@spring.message code/>
|
messageText (输出一个根据code参数选择的资源绑定字符串,找不到的话输出default参数的值) |
#springMessageText($code $text)
|
<@spring.messageText code,
text/>
|
url (在URL相对路径前面添加应用上下文根路径application context root) |
#springUrl($relativeUrl)
|
<@spring.url relativeUrl/>
|
formInput (标准表单输入域) |
#springFormInput($path
$attributes)
|
<@spring.formInput path,
attributes, fieldType/>
|
formHiddenInput * (表单隐藏输入域) |
#springFormHiddenInput($path
$attributes)
|
<@spring.formHiddenInput
path, attributes/>
|
formPasswordInput *(标准表单密码输入域;注意不会为这种类型的输入域装配数据) |
#springFormPasswordInput($path
$attributes)
|
<@spring.formPasswordInput
path, attributes/>
|
formTextarea (大型文本(自由格式)输入域) |
#springFormTextarea($path
$attributes)
|
<@spring.formTextarea path,
attributes/>
|
formSingleSelect (单选列表框) |
#springFormSingleSelect( $path
$options $attributes)
|
<@spring.formSingleSelect
path, options, attributes/>
|
formMultiSelect (多选列表框) |
#springFormMultiSelect($path
$options $attributes)
|
<@spring.formMultiSelect
path, options, attributes/>
|
formRadioButtons (单选框) |
#springFormRadioButtons($path
$options $separator $attributes)
|
<@spring.formRadioButtons
path, options separator,
attributes/>
|
formCheckboxes (复选框) |
#springFormCheckboxes($path
$options $separator $attributes)
|
<@spring.formCheckboxes path,
options, separator,
attributes/>
|
showErrors (简化针对所绑定输入域的校验错误信息输出) |
#springShowErrors($separator
$classOrStyle)
|
<@spring.showErrors
separator, classOrStyle/>
|
* 在FTL(FreeMarker)中,这二种宏实际上并不是必需的,因为你可以使用普通的
formInput
宏,指定fieldType
参数的值为 'hidden
' 或 'password
'即可 。
上面列出的所有宏的参数都具有一致的含义,如下述:
-
path:待绑定属性的名字(如:command.name)
-
选项:一个Map,其中保存了所有可从输入域中选择的值。map中的键值(keys)代表将从表单绑定到命令对象然后提交到后台的实值(values)。 存储在Map中的与相应键值对应的对象就是那些在表单上显示给用户的标签,它们可能与提交到后台的值不同。通常这样的map由控制器以引用数据的方式提 供。你可以根据需求的行为选择一种Map实现。比如对顺序要求严格时,可使用一个
SortedMap
,如一个TreeMap
加上适当的Comparator;对要求按插入顺序返回的情况,可以使用commons-collections提供的LinkedHashMap
或LinkedMap
。 -
分隔符:当使用多选的时候(radio buttons 或者 checkboxes),用于在列表中分隔彼此的字符序列(如 "<br>")。
-
属性:一个附加的以任意标签或文本构成的字符串,出现在HTML标签内。该字符串被宏照原样输出。例如:在一个textarea标签内你可能会提供 'rows="5" cols="60"'这样的属性,或者你会传递'style="border:1px solid silver"'这样的样式信息。
-
classOrStyle:供showErrors宏用来以这种样式显示错误信息,其中错误信息嵌套于使用该CSS类名的span标签内。如果不提供或内 容为空,则错误信息嵌套于<b></b>标签内。
宏的例子在下面描述,其中一些是FTL的,一些是VTL的。两种语言之间的用法差别在旁注中解释。
14.4.5.3.1. 输入域
<!-- 上面提到的Name域的例子,使用VTL中定义的表单宏 --> ... Name: #springFormInput("command.name" "")<br> #springShowErrors("<br>" "")<br>
formInput宏接受一个path参数(command.name)和一个附加的属性参数(在上例中为空)。该宏与所有其他表单生成宏一样,对 path参数代表的属性实施一种隐式绑定,这种绑定保持有效状态直到一次新的绑定开始,所以showErrors宏不再需要传递path参数——它简单地 操作最近一次绑定的属性(field)。
showErrors宏接受两个参数:分隔符(用于分隔多条错误信息的字符串)和CSS类名或样式属性。注意在FreeMarker中可以为属性参数指定 默认值(这点儿Velocity做不到)。上面的两个宏调用在FTL中可以这么表达:
<@spring.formInput "command.name"/> <@spring.showErrors "<br>"/>
上面展示的用于生成name表单输入域的代码片断产生的输出如下,同时还显示了输入值为空的情况下提交表单后产生的校验错误信息(校验过程由Spring 的验证框架提供)。
生成的HTML如下:
Name: <input type="text" name="name" value="" > <br> <b>required</b> <br> <br>
参数(属性)用来向textarea传递样式信息或行列数属性。
14.4.5.3.2. 选择输入域
有四种用于在HTML表单中生成通用选择输入框的宏。
-
formSingleSelect
-
formMultiSelect
-
formRadioButtons
-
formCheckboxes
每个宏都将接受一个由选项值和选项标签的集合构成的Map,其中选项值和其标签可以相同。
下面展示了一个在FTL中使用radio按钮的例子。表单支撑对象(form backing object)提供了一个默认值'London',所以该域不需要校验。当渲染表单时,整个待展现的城市列表由模型对象的'cityMap'属性以引用数 据的方式提供。
... Town: <@spring.formRadioButtons "command.address.town", cityMap, "" /><br><br>
这将产生一行radio按钮——
cityMap
中一个值对应一个按钮,并以""分隔。没有额外的属性,因为宏的最后一个参数不存在。cityMap中所有的key-value都使用String类型
值。map中的key用作输入域的值(将被作为请求参数值提交到后台),value用作显示给用户的标签。上述示例中,表单支撑对象提供了一个默认值以及
三个著名城市作为可选值,它产生的HTML代码如下:
Town: <input type="radio" name="address.town" value="London"> London <input type="radio" name="address.town" value="Paris" checked="spring.framework.ecked"> Paris <input type="radio" name="address.town" value="New York"> New York
如果你希望在应用中按照内部代码来处理城市,你得以适当的键值创建map,如下:
protected Map referenceData(HttpServletRequest request) throws Exception { Map cityMap = new LinkedHashMap(); cityMap.put("LDN", "London"); cityMap.put("PRS", "Paris"); cityMap.put("NYC", "New York"); Map m = new HashMap(); m.put("cityMap", cityMap); return m; }
现在上述代码将产生出以相关代码为值的radio按钮,同时你的用户仍能看到对他们显示友好的城市名。
Town: <input type="radio" name="address.town" value="LDN"> London <input type="radio" name="address.town" value="PRS" checked="spring.framework.ecked"> Paris <input type="radio" name="address.town" value="NYC"> New York
14.4.5.4. 重载HTML转码行为并使你的标签符合XHTML
缺省情况下使用上面这些宏将产生符合HTML 4.01标准的标签,并且Spring的绑定支持使用web.xml中定义的HTML转码行为。为了产生符合XHTML标准的标签以及覆盖默认的HTML 转码行为,你可以在你的模板(或者模板可见的模型对象)中指定两个变量。在模板中指定的好处是稍后的模板处理中可以为表单中不同的域指定不同的行为。
要切换到符合XHTML的输出,你可以设置model/context变量xhtmlCompliant的值为true:
## for Velocity.. #set($springXhtmlCompliant = true) <#-- for FreeMarker --> <#assign xhtmlCompliant = true in spring>
在进行完这些处理之后,由Spring宏产生的所有标签都符合XHTML标准了。
类似地,可以为每个输入域指定HTML转码行为:
<#-- 该句覆盖默认HTML转码行为 --> <#assign htmlEscape = true in spring> <#-- next field will use HTML escaping --> <@spring.formInput "command.name" /> <#assign htmlEscape = false in spring> <#-- all future fields will be bound with HTML escaping off -->
相关推荐
5. **与其他框架的集成**:展示了Velocity如何与Spring、Struts等Java Web框架协同工作,以及在非Web环境中如邮件生成、XML处理的应用。 6. **社区与资源**:提供了Velocity社区的信息,包括邮件列表、文档和API,...
velociy模板引擎介绍,使用example,demo。开发教程。
Gear算法可以处理非线性常微分方程,Velociy-Verlet算法则可以同时得到粒子的位置、速度与加速度,保持计算精度的同时提供了速度的显式表达式。 在分子动力学模拟中,还要考虑宏观可观测量的提取,如温度、压力、热...
Python 查看主机IP及mac地址
全球各国信息化发展指数(IDI指数)是一个衡量国家和地区信息与通信技术发展水平的综合评价指标,由国际电信联盟定期发布。该指数通过三个分指数来评估:ICT接入分指数、ICT使用分指数和ICT技能分指数。ICT接入分指数涵盖了固定电话普及率、移动电话普及率、人均国际出口带宽、电脑家庭普及率和互联网家庭普及率等指标;ICT使用分指数则包括网民普及率、固定宽带人口普及率和移动宽带人口普及率;ICT技能分指数则关注平均受教育年限、中等教育毛入学率和高等教育毛入学率。这些指标共同描绘了一个国家在信息化基础设施、信息化使用、知识水平等方面的发展情况。数据覆盖了2007至2017年的区间,但需要注意的是,2009年的数据在报告中是缺失的。IDI指数为全球、区域、国家或地区信息化发展程度提供了一个综合评价手段,对于研究和比较不同国家和地区的信息化发展水平具有重要意义。
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。
生产现场工艺文件执行检查管理流程说明.docx
全国各省人口密度数据2000-2021年的社科数据内容涵盖了中国31个省、直辖市、自治区的人口分布情况。这些数据通过计算年末常住总人口与地区土地面积的比值来得出人口密度,即单位土地面积上的人口数量,通常以人/平方千米为单位。数据集包含了地区、年份、年末常住总人口(万人)、面积(平方千米)以及计算得出的人口密度(人/平方千米)等关键指标。这些数据不仅反映了人口分布的地理特征,还揭示了人口增长与土地利用之间的关系,对于城市规划、资源管理、环境政策制定等领域具有重要的参考价值。通过分析这些数据,研究者可以深入了解人口变化趋势,评估不同地区的人口承载能力,并为相关政策提供数据支持。
基于PCIe接口的深度学习项目实例的详细介绍3
本数据集提供了2013至2022年间全国328个地级市的空气质量指数(AQI)和PM2.5等大气污染日度数据。数据涵盖了AQI、PM2.5、PM10、CO、SO2、NO2、O3等关键指标,为研究空气质量变化和污染趋势提供了丰富的信息。这些数据不仅包括了空气质量的定量描述,还涉及了空气污染对健康的影响,是评估空气质量的重要工具。数据来源权威,更新至2022年,为科研、政策制定和公众了解提供了宝贵的参考。
全国计算机等级考试(National Computer Rank Examination,简称NCRE),是经原国家教育委员会(现教育部)批准,由教育部教育考试院(原教育部考试中心)主办,面向社会,用于考查应试人员计算机应用知识与技能的全国性计算机水平考试体系。NCRE开考之后,受到社会广泛关注和认可,为我国信息化技术人才的培养做出了重要贡献。 三级:工程师预备级。三级证书考核面向应用、面向职业的岗位专业技能。 报名条件:报名者不受年龄、职业、学历等限制,均可根据自己学习情况和实际能力选考相应的级别和科目。考生可按照省级承办机构公布的流程在网上进行报名。 报名时间:每次考试具体报名时间由各省级承办机构规定,可登录各省级承办机构网站查询。 考试时间:NCRE在全国范围内每年举办两次考试,考试时间一般安排在3月最后一个周六至下周周一、9月倒数第二个周六至下周周一。 考试形式:统一命题,统一考试,考试形式为上机考试。 成绩:NCRE考试实行百分制计分,以等第形式公布成绩。成绩等第分为“优秀”、“良好”、“及格”、“不及格”四等。100-90分为“优秀”,89-80分为
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。
使用VS-studio打开,需要安装Esayx库
CSDNApp_238.apk
免费软件, Postman + Swagger + Mock + JMeter API 文档 API 调试
【Unity3D插件】Unity3D HDRP Outline高亮发光轮廓描边插件教程
本文档主要讲述的是sqlserver内存释放;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
全球干旱数据集【标准化降水蒸发指数SPEI-03】(1901年1月-2023年12月,0.5°×0.5°分辨率)是基于月度降水和潜在蒸散发(PET)数据计算的全球气候数据集,专门用于中期干旱监测和分析。SPEI-03以3个月为时间尺度,更适合评估农业和生态系统的长期干旱风险。 数据集采用NetCDF格式,包含时间、空间坐标和SPEI值(无量纲)。负值表示干旱,正值表示湿润,数据经过插值和偏差矫正,确保高时空一致性。基于全球气象观测和重分析数据,如ERA5。 应用场景: 干旱监测:识别全球干旱事件的强度和持续时间。 气候变化研究:评估干旱风险和气候变化的长期影响。 农业与生态管理:支持农作物种植和生态系统保护。 水资源与灾害防治:优化水资源分配和干旱灾害应对。 该数据集为干旱风险评估和气候变化研究提供重要支持,广泛应用于环境、农业、生态和气候预测领域。
基于java的北关村基本办公管理系统设计与实现
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。