打造易于部署的WEB应用项目

[b][size=x-large]概述[/size][/b]
很多WEB应用的配置文件位于项目的类路径下(如WEB-INF\classes\conf\conf.properties),数据源也直接采用DBCP,C3P0等数据源,在Spring配置文件中定义。这种项目结构的部署性存在很大问题,其一,部署人员需要到WAR包中去更改配置信息,其二,新版本的WAR包不能直接覆盖生产环境下的WAR包,否则原有配置文件会被覆盖。也即这个WAR包是有状态的,它既包含了程序代码还包含了生产环境的配置信息,因此配置性,便携性将大大弱化。本文将给出一种优化的项目结构,解决项目部署性问题。

[b][size=x-large]"传统的"WEB项目属性文件[/size][/b]

以下是一个传统的WEB项目,在其Spring配置文件中通过<context:property-placeholder/>引用一个基于类路径的属性文件,如下所示:

<context:property-placeholder location="classpath:conf/conf.properties"/>
<rop:annotation-driven
core-pool-size="${rop.corePoolSize}"
max-pool-size="${rop.maxPoolSize}"
queue-capacity="${rop.queueCapacity}"
keep-alive-seconds="${rop.keepAliveSeconds}"
thread-ferry-class="${rop.threadFerryClass}"
sign-enable="${rop.signEnable}"
ext-error-base-names="${rop.customErrorBasenames}"
service-timeout-seconds="${rop.serviceTimeoutSeconds}"
session-manager="sessionManager"
app-secret-manager="appSecretManager"
formatting-conversion-service="conversionService"/>


这个WEB项目打成WAR包后,在生产环境下如果要更改conf.properties配置文件中的参数,必须在WAR包中更改,虽然大部分WEB应用都会解开WAR到一个文件目录。即使如此,对于开发人员及实施人员都是头疼的。

对于开发人员来说,每次打WAR包时需要使用生产环境的conf.properties替换开发环境的conf.properties,而往往开发人员并不清楚生产环境的具体情况,此时,开发人员只能请求实施人员不要用这个WAR包直接覆盖生产环境下的WAR包。

对于实施人员来说,他得战战兢兢地升级WAR包,先将生产环境下WAR包的conf.properties拷贝出来,覆盖升级版的WAR包中的conf.properties,以免生产环境的conf.properties被覆盖了。当然,平常要更改配置参数也很麻烦,需要到每个WAR包中去更改。

[b][size=x-large]便于部署的WEB项目如何规划属性文件[/size][/b]
为了方便WEB项目的部署,必须将属性文件和WAR包解耦,即WAR包中不包含配置文件。但这样问题又来了,难不成开发环境下,需要将配置文件放到一个项目之外的目录下,那项目的团队开发岂不是又很麻烦,需要每个成员都手工拷贝项目的配置文件,而无法使用SVN同步即可。

为了使项目既具有开发便携性(SVN一同步,mvn jetty:run即可启动项目),又具有部署便携性(上传覆盖升级的WAR包即可,无需其它动作)。我们只需要通过一个系统参数定义配置文件的位置即可完美满足开发便携性和部署便携性了。


<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.5</version>
<configuration>
<webDefaultXml>src/resources/dev/webdefault.xml</webDefaultXml>
<systemProperties>
<!-- ①注意这里,我们用一个JVM系统属性指定配置文件的路径 -->
<systemProperty>
<name>CONFFILE_PATH</name>
<value>classpath:conf/conf.properties</value>
</systemProperty>
</systemProperties>
<webAppSourceDirectory>src/main/webapp</webAppSourceDirectory>
<scanIntervalSeconds>0</scanIntervalSeconds>
<contextPath>/</contextPath>
<connectors>
<connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
<port>7100</port>
</connector>
</connectors>
</configuration>
</plugin>

在①处,我们用一个JVM系统参数指定配置文件的路径,此处是开发环境,我们将配置文件放在项目的类路径下,可通过项目的SVN同步,项目团队所有成员都可共享之。
上面的Spring配置文件调整下,通过这个系统参数CONFFILE_PATH引用属性配置文件

<!-- ① 注意这儿,通过SpringEL表示式访问系统参数的值 -->
<context:property-placeholder location="#{systemProperties.CONFFILE_PATH}"/>
<rop:annotation-driven
core-pool-size="${rop.corePoolSize}"
max-pool-size="${rop.maxPoolSize}"
queue-capacity="${rop.queueCapacity}"
keep-alive-seconds="${rop.keepAliveSeconds}"
thread-ferry-class="${rop.threadFerryClass}"
sign-enable="${rop.signEnable}"
ext-error-base-names="${rop.customErrorBasenames}"
service-timeout-seconds="${rop.serviceTimeoutSeconds}"
session-manager="sessionManager"
app-secret-manager="appSecretManager"
formatting-conversion-service="conversionService"/>

在开发环境下,使用Maven的Jetty插件,Jetty插件指定的CONFFILE_PATH系统参数为类路径下的conf/conf.properties。
在部署环境下,我们在WEB应用服务器中定义JVM的系统参数,拿Websphere来说,定义JVM系统参数如下所示:

[img]http://dl2.iteye.com/upload/attachment/0110/5117/68a3c923-9f49-3c4f-a2f7-b7f1edfe0ceb.png[/img]
[quote] 操作步骤:
服务器->应用程序服务器(选择对应的应用程序服务器)->服务器基础结构(Java 和进程管理/进程定义)->其它属性(Java虚拟机)->其他属性(定制属性)[/quote]
在此,我们将配置文件放在file:/D:/framework/conf/framework.properties文件中。
(注:对于Tomcat,Jetty都可在应用服务器的配置文件中定义JVM参数,大家请自行网上找下)

这样,部署时直接覆盖旧版的项目WAR包即可,由于配置文件已经放在独立于WAR包的外部操作系统的文件目录下,就不用考虑WAR升级对配置文件的影响了。

[b][size=x-large]数据源的配置[/size][/b]

WEB应用基本上都有数据源,传统的WEB项目很多采用DBCP,C3P0等数据源在Spring配置文件中定义,这样会给部署带来问题:
[list]
[*]无法共享数据源,如果一个Server中存在多个WAR项目,这些WAR项目都访问同一个数据库时,由于在各自项目中独立配置数据源,会造成有多少个项目就有多少个数据源的问题,无法实现数据源的共享。
[*]数据源的优化不方便,如果通过Spring配置文件中配置DBCP,C3P0等数据源,数据源的优化参数抽取到配置文件中。由于数据源优化参数很多,往往并不是每个参数都抽取配置文件中,使数据源的优化受限。
[/list]
因此,应该让Spring引用JNDI的数据源,而不应该在Spring配置文件中通过DBCP,C3P0自行定义数据源。
当然,一个很现实的问题是,你如何在开发环境下使用JNDI数据源,其实这已经不是问题了,Jetty很早就可以定义JNDI数据源了,并不是只有Websphere,Weblogic才能定义JNDI数据源。
下面是使用Maven的maven-jetty-plugin插件定义JNDI数据源的配置:

<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.5</version>
<configuration>
<webDefaultXml>src/resources/dev/webdefault.xml</webDefaultXml>
<!--①添加一个jetty的额外配置文件 -->
<jettyEnvXml>src/resources/jetty.xml</jettyEnvXml>
<systemProperties>
<systemProperty>
<name>CONFFILE_PATH</name>
<value>classpath:conf/conf.properties</value>
</systemProperty>
</systemProperties>
<webAppSourceDirectory>src/main/webapp</webAppSourceDirectory>
<scanIntervalSeconds>0</scanIntervalSeconds>
<contextPath>/</contextPath>
<connectors>
<connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
<port>7100</port>
</connector>
</connectors>
</configuration>
</plugin>


在①处添加了一个额外的jetty配置文件jetty.xml,其配置内容如下:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN"
"http://jetty.mortbay.org/configure.dtd">
<Configure class="org.mortbay.jetty.webapp.WebAppContext">

<New id="myds" class="org.mortbay.jetty.plus.naming.Resource">
<Arg>jdbc/myds</Arg>
<Arg>
<New class="org.apache.commons.dbcp.BasicDataSource">
<Set name="driverClassName">oracle.jdbc.driver.OracleDriver</Set>
<Set name="url">jdbc:oracle:thin:@127.0.0.1:1521:orcl</Set>
<Set name="username">test</Set>
<Set name="password">test</Set>
</New>
</Arg>
</New>
</Configure>

这里定义了一个名为jdbc/myds的JNDI数据源,这样项目的Spring配置文件就可直接引用这个JNDI数据源了:

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.2.xsd">
...
<jee:jndi-lookup id="frameworkDS" jndi-name="java:comp/env/jdbc/myds"/>
</beans>

由于JNDI的数据源名称不是固定的,比如在部署环境下,可能就叫"jdbc/yourds"了,因此需要将jndi的名字属性化。结合上面我们所说的配置文件,可以在配置文件中添加一个属性,暂且我们将该属性命名为ds.jndi:


conf/conf.properties
ds.jndi=java:comp/env/jdbc/yourds

Spring配置文件中通过参数名引用JNDI的数据源:

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.2.xsd">
...
<context:property-placeholder location="#{systemProperties.CONFFILE_PATH}"/>
<jee:jndi-lookup id="frameworkDS" jndi-name="${ds.jndi}"/>
</beans>


Prefect!至此,开发人员和部署人员都皆大欢喜了,部署环境下定义好JNDI数据源后,各WAR包即可利用之。
是不是发现Maven和Spring真的无所不能呢? :D
《Web 应用项目开发:从构思到上线的全过程》 Web 应用项目开发是一个集系统性、复杂性于一体的过程,贯穿多个关键阶段且涉及多领域技术。从项目启动时的需求分析,到设计、开发、测试、部署和维护,每个环节都如同一颗颗精密的齿轮,紧密咬合,缺一不可。通过科学合理的项目管理、精准的技术选型和高效的团队协作,能够打造出高品质、高性能、高安全性的 Web 应用,全方位满足用户和业务的多元需求。在实际开发过程中,不断汲取新技术、新方法,是持续提升 Web 应用开发质量和效率的关键所在。 阅读详情

相关推荐

2025-03-21(DS复习): Databricks 的技术架构

Databricks 的技术架构以 ​为核心,构建了一套高度集成、可扩展且支持多云环境的统一分析平台。其架构设计注重存储与计算的深度融合,并通过丰富的服务层功能简化了数据工程、机器学习和数据科学的工作流。

baidu_24377669的博客 1428

tomcat部署web项目的问题

1:启动窗口乱码 原因 Tomcat默认都是UTF-8的,但是控制台是GBK的,要保持一致 解决办法 打开tomcat目录下的conf/目录下logging.properties 找到 java.util.logging.ConsoleHandler.encoding = utf-8这行 更改为 java.util.logging.ConsoleHandler.encoding = GBK 2:启动时候报这样的警告: 警告 [main] org.apache.catalina.webresources.Ca

祁梦@ 992

第二十届全国大学生智能汽车竞赛极速光电组:MicroPython与恩智浦RT1021的硬件编程实战指南

本文为参加第二十届全国大学生智能汽车竞赛极速光电组的同学提供了一份详尽的MicroPython与恩智浦RT1021硬件编程实战指南。文章深入剖析了选择MicroPython与RT1021这对组合的优势,详细讲解了从开发环境搭建、基础硬件控制(如GPIO、PWM、编码器、CCD)到系统集成(平衡控制、循迹算法)与多任务调试的全过程,旨在帮助参赛者降低嵌入式开发门槛,高效备赛。

wdx0123456的博客 843

海港物流-能源协同优化调度与Matlab实现

物流-能量协同优化(LECS)是提升港口运营效率的关键技术,通过建立物流设备与能源系统的动态耦合模型,实现全局最优调度。该技术基于混合整数非线性规划(MILP)建模,结合多时间尺度决策和并行计算加速,显著降低能耗与碳排放。在Matlab实现中,采用多线程加速、内存优化和可视化监控等技术,解决大规模优化问题。典型应用场景显示,LECS可使港口作业能耗降低17.9%,碳排放减少19.7%。本文深入解析了物流-能源协同优化的核心算法与工程实践,为智能港口建设提供技术参考。

weixin_33875839的博客 321

MiniMax H3本地部署与ComfyUI集成实战:从环境配置到提示词优化

文本到视频生成是AI内容创作领域的关键技术,它基于扩散模型等深度学习原理,将自然语言描述转化为连贯的动态视觉序列。这项技术的核心价值在于大幅降低了视频制作的门槛,为短视频创作、概念可视化、教育内容生成等场景提供了高效工具。在实际工程实践中,成功部署和运行此类模型,如近期备受关注的MiniMax H3,需要精准处理环境配置、显存优化和提示词工程等环节。其中,解决“CUDA error: no kernel image is available”等版本兼容性问题,以及针对“8G显存”等有限资源进行参数调优,是确

weixin_33674976的博客 478

CentOS 7下rsyslog日志服务器搭建全攻略:从安装到避坑

本文详细介绍了在CentOS 7系统上搭建rsyslog日志服务器的完整流程,从基础安装到高级配置,包括协议设置、日志模板设计、安全加固和性能优化。特别分享了生产环境中的实战技巧和常见问题解决方案,帮助用户高效构建可靠的日志管理系统。

happy2的博客 687

rop 入门(五)

前边几章已经对rop做了大概的讲解,本章节我们一起来搭建rop框架 1、首先我们创建一个maven web项目(这里就不详细介绍了) 2、在maven的配置文件pom.xml中引入rop 和 spring(rop依赖于spring)的相关依赖文件 <dependencies> <dependency> <groupId>javax.servlet</

李永亮的专栏 4131

【低空经济】多源异构数据融合的低空智能感知系统设计与实现

本文探讨了低空智能感知系统在多源异构数据融合中的设计与实现,重点解决无人机等低空飞行器的安全监测问题。通过雷达、光学和红外传感器的数据融合,系统识别准确率提升至92%,并实现120ms的低延迟处理。文章详细介绍了时空对齐、特征级融合和动态权重自适应等关键技术,为低空经济发展提供可靠技术支持。

weixin_29065659的博客 342

Yii实战开发大型商城项目-传智-专题视频课程

Yii是一个适用于开发Web2.0应用程序的高性能PHP框架,免费、开源,基于PHP5的Web应用程序开发,代码简洁,DRY设计并且鼓励开发。它的工作可以简化您的应用程序开发,并有助于确保一个非常高效的,可扩展和可维护的终端产品。具有极其优化的性能,Yii对于任何规模的项目都是不错的选择。 ...

CZ-001的博客 253

40、5G NR射频要求解析

本文详细解析了5G NR射频相关要求,包括参考灵敏度与动态范围的定义、接收机对干扰信号的抗扰性要求(如阻塞、邻道选择性等)、辐射射频要求在FR1和FR2频段的差异,以及多标准无线电基站(MSR)的发展及其对射频要求的影响。内容涵盖测试模型、干扰场景、具体指标和实现挑战,为理解和应用5G NR射频规范提供了全面指导。

qsc901234的博客 245

基于Simulink进行步进电机的重复控制仿真建模

重复控制概述目的:通过引入一个周期延迟环节来补偿系统的周期性误差,从而提高系统对周期性参考信号或扰动的跟踪性能。方法内部模型原理:在控制器中嵌入一个与周期性信号相关的模型(例如周期延迟环节),以实现对周期性误差的零稳态误差控制。滤波器设计:为了避免高频噪声放大,通常会在重复控制器中加入低通滤波器。优势对周期性信号具有良好的跟踪性能。不需要精确的数学模型即可实现高性能控制。挑战:需要合理设计重复控制器的参数以避免系统不稳定。

amy_mhd的博客 267

探索未来前端构建新纪元:深度解析Flow-Web-X

探索未来前端构建新纪元:深度解析Flow-Web-X 随着前端开发的日益复杂化,组件化的概念已经深入人心。在这一背景下,Flow-Web-X作为一款由FlowCI团队精心打造的web组件,正以其独特魅力进入我们的视野。本文旨在深入剖析Flow-Web-X的卓越特性,展示其技术架构,探索应用场景,并强调其作为开源项目的核心优势。 1. 项目介绍 Flow-Web-X,简而言之,是面向未来前端生态的...

gitblog_00190的博客 358

【制作100个unity游戏之22】3DRPG游戏开发07——其他详细的设计

我们会有有很多单例,如果每个单例都去写会很麻烦,所以我们定义泛型单例模式 Singleton,我们将所有的单例都继承这个泛型单例,就省略很多重复的工作定义一个GameManager类,继承Singleton,控制整个游戏的进度,比如如果主角死了,广播,游戏结束调用。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2577

nextjs-boilerplate:开启高效Next.js项目开发之旅

nextjs-boilerplate:开启高效Next.js项目开发之旅 项目介绍 在现代Web开发中,Next.js 与 TypeScript 和 Tailwind CSS 结合使用,已经成为构建高效、响应式和易于维护的Web应用的主流技术组合。nextjs-boilerplate 是一个为开发者量身打造的启动项目,集成了Next.js 15+、Tailwind CSS 3 和 TypeScri...

gitblog_01087的博客 964

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

用Coze打造你的专属AI应用:从智能体到Web部署指南

摘要: Coze(扣子)是字节跳动推出的低代码AI开发平台,支持快速创建智能体(Bot)、集成插件/知识库/工作流,并部署到Web、微信等场景。核心功能包括:通过自然语言生成Bot角色、扩展插件能力、上传知识库实现RAG、可视化编排工作流,以及自定义应用界面。提供三种Web部署方式:嵌入网页的Chat SDK、独立Web应用和API调用。典型应用场景包括写作助手、客服系统、简历分析等,适合个人与企业快速构建AI工具。(149字)

likuoelie的博客 3968

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Web 应用项目开发全攻略

Web 应用项目开发是一个复杂而充满挑战的过程,需要涉及多个领域的知识和技术。从需求分析到部署上线,每个阶段都需要我们认真对待,精心规划和实施。通过掌握各个阶段的关键知识点和方法,我们可以打造出高质量、高性能、用户满意的 Web 应用项目。同时,我们要不断学习和探索新的技术和方法,提高自己的开发水平和能力,为互联网的发展做出贡献。

2302_79959151的博客 1009

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

使用DjangoVue.js快速构建项目教程:高效打造高质量Web应用程序

使用DjangoVue.js快速构建项目教程:高效打造高质量Web应用程序 【下载地址】使用DjangoVue.js快速构建项目教程 本教程深入讲解了如何利用 Django 和 Vue.js 快速构建功能强大的 Web 应用程序。Django 作为高效的 Python Web 框架,结合 Vue.js 的渐进式前端开发能...

gitblog_06710的博客 968

PaddleOCR Flask Web服务化项目:快速搭建OCR服务

PaddleOCR Flask Web服务化项目:快速搭建OCR服务 【下载地址】PaddleOCRFlaskWeb服务化项目 基于PaddleOCR与Flask框架,该项目打造了一个轻量级的Web服务化解决方案,助力开发者快速实现图像文字识别功能。通过简洁的Web API接口,用户可直接发送HTTP请求,轻松获取图像中...

gitblog_06744的博客 1105

【易售校园二手平台】后端部署、Uniapp项目Web部署上线

本文档详细介绍了如何将基于Uniapp开发的【易售校园二手平台】项目打包并部署为Web应用的过程,以及后端项目的打包部署方法。由于小程序审核严格且需备案,作者选择优先部署Web版本。文中阐述了在打包前针对不同平台(网站与小程序)进行的代码调整要点,包括WebSocket连接、消息发送接收、键盘事件监听及导航条处理等,并提供了具体的配置和代码示例。此外,还介绍了使用宝塔面板进行前端部署的方法,以及基于若依管理系统的后端项目打包部署步骤。

我只管埋头前行,剩下的交给时间。 2862

Web 应用项目开发全流程深度解析

Web 应用项目开发是一个复杂而充满挑战的过程,需要涉及多个领域的知识和技术。从需求分析到部署上线,每个阶段都至关重要,都需要我们精心策划、认真执行。在开发过程中,我们要注重需求分析的准确性、技术选型的合理性、设计的科学性、开发的质量、测试的全面性和部署的稳定性。同时,我们还要不断学习和掌握新的技术和方法,提高自己的开发水平和能力。只有这样,我们才能打造出高质量、高性能、用户满意的 Web 应用项目。

2302_79959151的博客 1461

Alibaba Cloud Web+ Go 示例项目指南

Alibaba Cloud Web+ Go 示例项目指南 1. 项目介绍 本项目旨在演示如何利用阿里巴巴云的Web+服务部署Go语言应用程序。通过一个简单的示例程序,我们将展示从代码到云端运行环境的整个流程。这不仅能够帮助开发者理解如何构建、配置并部署Go应用至阿里云Web+平台,还提供了对常见问题解答及优化建议。 技术栈 Go: 应用的主要编程语言。 Web+: 阿里巴巴云提供的一种PaaS服...

gitblog_00292的博客 789

在快马平台上用 UnoCSS 打造高性能 Web 应用:从零到部署

性能提升明显:最终项目的 CSS 体积缩小了 70% 以上开发效率高:不需要反复编写重复的 CSS,专注业务逻辑维护简单:样式与 HTML/JS 同文件,查找修改更方便平台体验流畅:从开发到部署一气呵成,没有环境配置的烦恼如果你也想尝试这种现代化的前端开发方式,强烈推荐使用InsCode(快马)平台。它让 UnoCSS 这样的前沿技术变得触手可及,即使是前端新手也能轻松上手。我特别喜欢它的一键部署功能,省去了服务器配置的麻烦,让创意可以快速落地。

ThunderstormLynx23的博客 1069

Springboot项目整合JSP页面:打造全栈式Web应用

Springboot项目整合JSP页面:打造全栈式Web应用 去发现同类优质开源项目:https://gitcode.com/ 在当今Web开发领域,Spring Boot因其轻量级、易配置的特点而深受开发者喜爱。然而,对于需要集成JSP页面的项目,Spring Boot并不提供直接的支持。本文将为您详细介绍一个开源项目——Springboot项目整合JSP页面,帮助您在Spring Boot框架...

gitblog_06718的博客 292
上一篇: 介绍一个好用的代码统计工具
下一篇: 如何通过项目配置文件指定Log4J的配置文件
quickselect
博客等级 码龄20年 1粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值