從Maven到Spring Boot實(shí)戰(zhàn)教程
Java后端核心技術(shù)全解析:從Maven到Spring Boot實(shí)戰(zhàn)
在Java后端開(kāi)發(fā)領(lǐng)域,Maven、Spring、MyBatis等技術(shù)構(gòu)成了核心技術(shù)棧。本文將系統(tǒng)梳理這些關(guān)鍵技術(shù)的核心概念與實(shí)戰(zhàn)技巧,結(jié)合項(xiàng)目開(kāi)發(fā)場(chǎng)景補(bǔ)充實(shí)用細(xì)節(jié),助力開(kāi)發(fā)者快速構(gòu)建高效穩(wěn)定的后端應(yīng)用。
一、項(xiàng)目管理利器:Maven核心詳解
Maven作為Apache旗下的開(kāi)源項(xiàng)目管理工具,以標(biāo)準(zhǔn)化的構(gòu)建流程和依賴管理能力成為Java開(kāi)發(fā)的標(biāo)配。
1.1 核心功能與優(yōu)勢(shì)
Maven的核心價(jià)值體現(xiàn)在兩大維度:
- 標(biāo)準(zhǔn)化構(gòu)建流程:通過(guò)
clean、compile、test、package、install等生命周期命令,實(shí)現(xiàn)從代碼編譯到項(xiàng)目部署的全流程自動(dòng)化,避免團(tuán)隊(duì)開(kāi)發(fā)中的流程混亂。 - 精細(xì)化依賴管理:統(tǒng)一管理項(xiàng)目所需的Jar包,自動(dòng)解決依賴傳遞問(wèn)題,減少"Jar包地獄"的困擾。
1.2 倉(cāng)庫(kù)體系與POM核心配置
Maven通過(guò)三級(jí)倉(cāng)庫(kù)實(shí)現(xiàn)依賴的高效獲?。?/p>
- 本地倉(cāng)庫(kù):默認(rèn)位于用戶目錄
.m2/repository,存儲(chǔ)下載的依賴包,優(yōu)先從本地獲取。 - 遠(yuǎn)程倉(cāng)庫(kù):企業(yè)內(nèi)部搭建的私有倉(cāng)庫(kù)(如Nexus),用于管理內(nèi)部共享組件。
- 中央倉(cāng)庫(kù):Maven官方維護(hù)的公共倉(cāng)庫(kù),包含絕大多數(shù)開(kāi)源組件。
pom.xml作為Maven項(xiàng)目的核心配置文件,關(guān)鍵配置項(xiàng)包括:
<!-- 項(xiàng)目坐標(biāo):唯一標(biāo)識(shí)一個(gè)Maven項(xiàng)目 -->
<groupId>com.company.project</groupId>
<artifactId>demo-service</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging> <!-- 打包類型:jar/war/pom -->
<!-- 依賴管理 -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>3.2.0</version>
</dependency>
</dependencies>1.3 依賴沖突解決方案
- 依賴沖突是Maven開(kāi)發(fā)中的常見(jiàn)問(wèn)題,可通過(guò)以下策略解決:
- 短路徑優(yōu)先原則:Maven默認(rèn)選擇依賴路徑最短的版本,直接在
pom.xml中聲明所需版本可覆蓋傳遞依賴。 - 排除依賴:通過(guò)
<exclusions>標(biāo)簽排除沖突的依賴項(xiàng):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>logback-classic</groupId>
<artifactId>ch.qos.logback</artifactId>
</exclusion>
</exclusions>
</dependency>使用Maven Helper插件:在IDEA中安裝插件可直觀查看依賴樹(shù),快速定位沖突源頭。
二、Spring生態(tài)核心:IOC與AOP
Spring框架以IOC(控制反轉(zhuǎn))和AOP(面向切面編程)為核心,極大簡(jiǎn)化了JavaEE開(kāi)發(fā)。
2.1 IOC容器與Bean管理
IOC容器是Spring的靈魂,負(fù)責(zé)Bean的創(chuàng)建、裝配與生命周期管理。
2.1.1 Bean的配置方式對(duì)比
| 配置方式 | 實(shí)現(xiàn)方式 | 適用場(chǎng)景 |
|---|---|---|
| XML配置 | <bean id="" class="" /> | 早期項(xiàng)目或復(fù)雜配置場(chǎng)景 |
| 注解配置 | @Component、@Service等 | 主流開(kāi)發(fā)模式,簡(jiǎn)化配置 |
| Java配置類 | @Configuration + @Bean | 第三方組件集成 |
2.1.2 Bean的生命周期(完整版)
- 實(shí)例化:調(diào)用無(wú)參構(gòu)造器創(chuàng)建Bean對(duì)象
- 屬性填充:注入依賴的Bean(setter方法)
- 初始化前置:
BeanPostProcessor.postProcessBeforeInitialization - 初始化:
- 執(zhí)行
@PostConstruct注解方法 - 調(diào)用
InitializingBean.afterPropertiesSet() - 執(zhí)行
init-method配置的方法
- 執(zhí)行
- 初始化后置:
BeanPostProcessor.postProcessAfterInitialization - 使用階段:從容器中獲取并使用Bean
- 銷毀階段:
- 執(zhí)行
@PreDestroy注解方法 - 調(diào)用
DisposableBean.destroy() - 執(zhí)行
destroy-method配置的方法
- 執(zhí)行
2.1.3 循環(huán)依賴解決方案
Spring通過(guò)三級(jí)緩存機(jī)制解決單例Bean的循環(huán)依賴問(wèn)題:
- 一級(jí)緩存(SingletonObjects):存儲(chǔ)完全初始化的Bean
- 二級(jí)緩存(EarlySingletonObjects):存儲(chǔ)提前暴露的未初始化Bean
- 三級(jí)緩存(SingletonFactories):存儲(chǔ)Bean工廠,用于生成早期Bean引用
注意:構(gòu)造器注入的循環(huán)依賴無(wú)法解決,需改用字段注入或Setter注入;原型Bean的循環(huán)依賴也不被支持。
2.2 依賴注入(DI)的實(shí)現(xiàn)方式
Setter注入:通過(guò)setXxx()方法注入,支持可選依賴
<bean id="userService" class="com.demo.service.UserService">
<property name="userMapper" ref="userMapper"/>
</bean>構(gòu)造器注入:通過(guò)帶參構(gòu)造器注入,強(qiáng)制依賴必須存在
@Service
public class UserService {
private final UserMapper userMapper;
@Autowired // Spring 4.3+可省略
public UserService(UserMapper userMapper) {
this.userMapper = userMapper;
}
}注解注入:@Autowired(按類型)、@Resource(按名稱)、@Value(字面值)
2.3 AOP核心概念與實(shí)踐
AOP(面向切面編程)用于解決系統(tǒng)橫切關(guān)注點(diǎn)(如日志、事務(wù)、權(quán)限)的復(fù)用問(wèn)題。
2.3.1 核心術(shù)語(yǔ)
- 切面(Aspect):橫切關(guān)注點(diǎn)的模塊化,如日志切面
- 連接點(diǎn)(JoinPoint):程序執(zhí)行的某個(gè)點(diǎn),如方法調(diào)用
- 切入點(diǎn)(Pointcut):匹配連接點(diǎn)的表達(dá)式,如
execution(* com.demo.service.*.*(..)) - 通知(Advice):切面的執(zhí)行邏輯,包括前置、后置、環(huán)繞、異常、最終通知
2.3.2 注解式AOP實(shí)現(xiàn)
導(dǎo)入依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>編寫(xiě)切面類:
@Aspect
@Component
public class LogAspect {
// 切入點(diǎn):匹配所有service方法
@Pointcut("execution(* com.demo.service.*.*(..))")
public void servicePointcut() {}
// 前置通知
@Before("servicePointcut()")
public void before(JoinPoint joinPoint) {
String method = joinPoint.getSignature().getName();
System.out.println("方法" + method + "開(kāi)始執(zhí)行");
}
// 環(huán)繞通知
@Around("servicePointcut()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
long start = System.currentTimeMillis();
Object result = pjp.proceed(); // 執(zhí)行目標(biāo)方法
long time = System.currentTimeMillis() - start;
System.out.println("方法執(zhí)行耗時(shí):" + time + "ms");
return result;
}
}三、Spring Boot實(shí)戰(zhàn):約定大于配置
Spring Boot簡(jiǎn)化了Spring應(yīng)用的搭建與開(kāi)發(fā),通過(guò)自動(dòng)配置和 starter 依賴實(shí)現(xiàn)"開(kāi)箱即用"。
3.1 自動(dòng)配置原理深度解析
@SpringBootApplication是核心注解,包含三個(gè)關(guān)鍵子注解:
- @SpringBootConfiguration:標(biāo)識(shí)配置類,等同于
@Configuration - @ComponentScan:掃描主類所在包及其子包的組件
- @EnableAutoConfiguration:開(kāi)啟自動(dòng)配置,核心是
@Import(AutoConfigurationImportSelector.class)
自動(dòng)配置流程:
- 掃描
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件 - 根據(jù)類路徑下的依賴(starter)按需加載自動(dòng)配置類
- 通過(guò)
@Conditional系列注解判斷是否需要配置 - 綁定配置文件(application.yml)中的屬性值
3.2 配置文件詳解與讀取
3.2.1 YAML配置示例
# 服務(wù)器配置
server:
port: 8080
servlet:
context-path: /demo
# 數(shù)據(jù)庫(kù)配置
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?useSSL=false
username: root
password: 123456
# 自定義配置
app:
name: demo-app
version: 1.0.0
features:
- log
- security3.2.2 配置讀取方式
@Value注解:讀取單個(gè)配置值
@RestController
public class AppController {
@Value("${app.name}")
private String appName;
}
Environment對(duì)象:動(dòng)態(tài)獲取配置
@Autowired
private Environment env;
public String getAppVersion() {
return env.getProperty("app.version");
}@ConfigurationProperties:批量綁定配置
@Component
@ConfigurationProperties(prefix = "app")
public class AppConfig {
private String name;
private String version;
private List<String> features;
// getter/setter
}3.3 多環(huán)境配置與切換
- 創(chuàng)建環(huán)境配置文件:
- 開(kāi)發(fā)環(huán)境:
application-dev.yml - 測(cè)試環(huán)境:
application-test.yml - 生產(chǎn)環(huán)境:
application-prod.yml
- 開(kāi)發(fā)環(huán)境:
- 激活指定環(huán)境:
- 配置文件方式:
spring.profiles.active=dev - 命令行方式:
java -jar demo.jar --spring.profiles.active=prod - IDE啟動(dòng)參數(shù):
--spring.profiles.active=test
- 配置文件方式:
3.4 定時(shí)任務(wù)實(shí)現(xiàn)與Cron表達(dá)式
3.4.1 定時(shí)任務(wù)配置
- 主類添加
@EnableScheduling注解 - 編寫(xiě)定時(shí)任務(wù)方法:
@Service
public class ScheduledService {
// 每5秒執(zhí)行一次
@Scheduled(fixedRate = 5000)
public void fixedRateTask() {
System.out.println("固定頻率任務(wù)執(zhí)行:" + new Date());
}
// 每天凌晨2點(diǎn)執(zhí)行
@Scheduled(cron = "0 0 2 * * ?")
public void cronTask() {
System.out.println("定時(shí)任務(wù)執(zhí)行:" + new Date());
}
}3.4.2 Cron表達(dá)式驗(yàn)證工具
Cron表達(dá)式易出錯(cuò),可通過(guò)代碼驗(yàn)證:
public class CronValidator {
public static void main(String[] args) throws ParseException {
String cron = "0 0 2 * * ?";
CronExpression exp = new CronExpression(cron);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date now = new Date();
// 打印未來(lái)5次執(zhí)行時(shí)間
for (int i = 0; i < 5; i++) {
now = exp.getNextValidTimeAfter(now);
System.out.println(sdf.format(now));
}
}
}
四、MyBatis持久層實(shí)戰(zhàn)
MyBatis是優(yōu)秀的半自動(dòng)化ORM框架,支持XML和注解兩種映射方式。
4.1 核心配置與開(kāi)發(fā)規(guī)范
4.1.1 Mapper代理開(kāi)發(fā)規(guī)范
- Mapper接口的全路徑與Mapper.xml的
namespace一致 - 接口方法名與XML中
sql標(biāo)簽的id一致 - 方法參數(shù)類型與
parameterType一致 - 方法返回值類型與
resultType/resultMap一致
4.1.2 分頁(yè)實(shí)現(xiàn)(PageHelper)
導(dǎo)入依賴(2025年最新穩(wěn)定版):
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>分頁(yè)查詢代碼:
public PageInfo<User> getUserPage(int pageNum, int pageSize) {
// 設(shè)置分頁(yè)參數(shù)
PageHelper.startPage(pageNum, pageSize);
// 執(zhí)行查詢
List<User> users = userMapper.selectAll();
// 封裝分頁(yè)結(jié)果
return new PageInfo<>(users);
}4.2 動(dòng)態(tài)SQL與SQL片段
動(dòng)態(tài)SQL解決了SQL拼接的繁瑣問(wèn)題,常用標(biāo)簽包括if、where、foreach、choose等。
4.2.1 動(dòng)態(tài)SQL示例(條件查詢)
<select id="selectUserByCondition" resultType="User">
SELECT * FROM user
<where>
<if test="name != null and name != ''">
AND name LIKE concat('%', #{name}, '%')
</if>
<if test="age != null">
AND age = #{age}
</if>
<if test="ids != null and ids.size() > 0">
AND id IN
<foreach collection="ids" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</if>
</where>
</select>4.2.2 SQL片段復(fù)用
<!-- 定義SQL片段 -->
<sql id="userColumns">
id, name, age, create_time, update_time
</sql>
<!-- 引用SQL片段 -->
<select id="selectUserById" resultType="User">
SELECT <include refid="userColumns"/> FROM user WHERE id = #{id}
</select>4.3 #{}與${}的核心區(qū)別
| 特性 | #{} | ${} |
|---|---|---|
| 本質(zhì) | 預(yù)編譯參數(shù)占位符 | 字符串替換 |
| SQL注入 | 可防止 | 有風(fēng)險(xiǎn) |
| 類型轉(zhuǎn)換 | 自動(dòng)轉(zhuǎn)換 | 需手動(dòng)處理 |
| 使用場(chǎng)景 | 傳遞參數(shù)值(如條件值) | 動(dòng)態(tài)表名、列名(可信場(chǎng)景) |
示例:
SELECT * FROM user WHERE name = #{name}→ 安全SELECT * FROM ${tableName} WHERE id = #{id}→ 表名動(dòng)態(tài)拼接
五、Spring MVC與Web開(kāi)發(fā)
Spring MVC是Spring生態(tài)的Web框架,基于MVC模式實(shí)現(xiàn)請(qǐng)求處理。
5.1 請(qǐng)求處理核心組件
- DispatcherServlet:前端控制器,統(tǒng)一接收請(qǐng)求并分發(fā)
- HandlerMapping:映射請(qǐng)求到處理器(Controller方法)
- HandlerAdapter:適配處理器執(zhí)行
- ViewResolver:解析視圖(已被前后端分離模式弱化)
- HandlerExceptionResolver:處理異常
5.2 常用請(qǐng)求注解詳解
| 注解 | 作用 | 示例 |
|---|---|---|
| @RequestMapping | 映射請(qǐng)求路徑和方法 | @RequestMapping(“/user”, method = RequestMethod.GET) |
| @GetMapping | 處理GET請(qǐng)求(派生注解) | @GetMapping(“/user/{id}”) |
| @PostMapping | 處理POST請(qǐng)求(派生注解) | @PostMapping(“/user”) |
| @PathVariable | 獲取路徑參數(shù) | public User getById(@PathVariable Long id) |
| @RequestParam | 獲取請(qǐng)求參數(shù) | public List list(@RequestParam(required = false) String name) |
| @RequestBody | 接收J(rèn)SON請(qǐng)求體 | public void save(@RequestBody User user) |
5.3 全局異常處理
@RestControllerAdvice // 全局異常處理器
public class GlobalExceptionHandler {
// 處理業(yè)務(wù)異常
@ExceptionHandler(BusinessException.class)
public Result<?> handleBusinessException(BusinessException e) {
return Result.fail(e.getCode(), e.getMessage());
}
// 處理系統(tǒng)異常
@ExceptionHandler(Exception.class)
public Result<?> handleSystemException(Exception e) {
log.error("系統(tǒng)異常", e);
return Result.fail(500, "系統(tǒng)繁忙,請(qǐng)稍后再試");
}
}
// 自定義業(yè)務(wù)異常
public class BusinessException extends RuntimeException {
private Integer code;
public BusinessException(Integer code, String message) {
super(message);
this.code = code;
}
// getter
}
// 統(tǒng)一響應(yīng)結(jié)果
public class Result<T> {
private Integer code;
private String message;
private T data;
// 成功/失敗靜態(tài)方法
public static <T> Result<T> success(T data) {
Result<T> result = new Result<>();
result.setCode(200);
result.setMessage("success");
result.setData(data);
return result;
}
public static <T> Result<T> fail(Integer code, String message) {
// 實(shí)現(xiàn)省略
}
}5.4 跨域問(wèn)題解決方案
5.4.1 局部跨域(@CrossOrigin)
@RestController
@RequestMapping("/user")
@CrossOrigin(origins = "http://localhost:8081", maxAge = 3600)
public class UserController {
// 接口實(shí)現(xiàn)
}
5.4.2 全局跨域(配置類)
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") // 所有路徑
.allowedOrigins("http://localhost:8081") // 允許的源
.allowedMethods("GET", "POST", "PUT", "DELETE") // 允許的方法
.allowedHeaders("*") // 允許的請(qǐng)求頭
.allowCredentials(true) // 允許攜帶cookie
.maxAge(3600); // 預(yù)檢請(qǐng)求緩存時(shí)間
}
}
六、項(xiàng)目開(kāi)發(fā)全流程與最佳實(shí)踐
6.1 標(biāo)準(zhǔn)開(kāi)發(fā)流程
- 需求分析與設(shè)計(jì):
- 業(yè)務(wù)需求梳理
- 數(shù)據(jù)庫(kù)表設(shè)計(jì)(ER圖)
- 接口文檔編寫(xiě)(Swagger)
- 項(xiàng)目初始化:
- 創(chuàng)建Spring Boot項(xiàng)目(選擇starter:web、mybatis、mysql等)
- 配置多環(huán)境(dev/test/prod)
- 集成常用工具(Lombok、PageHelper、Swagger)
- 分層開(kāi)發(fā):
- Entity層:與數(shù)據(jù)庫(kù)表映射(使用
@Data簡(jiǎn)化代碼) - Mapper層:數(shù)據(jù)訪問(wèn)接口+XML映射文件
- Service層:業(yè)務(wù)邏輯處理(接口+實(shí)現(xiàn)類)
- Controller層:請(qǐng)求處理與響應(yīng)
- Entity層:與數(shù)據(jù)庫(kù)表映射(使用
- 測(cè)試與部署:
- 單元測(cè)試(JUnit5 + Mockito)
- 集成測(cè)試(
@SpringBootTest) - 打包部署(Jar包 + Docker)
6.2 常用開(kāi)發(fā)工具集成
6.2.1 Lombok簡(jiǎn)化實(shí)體類
導(dǎo)入依賴:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>使用注解:
@Data // 包含getter、setter、toString、equalsAndHashCode、RequiredArgsConstructor
@NoArgsConstructor
@AllArgsConstructor
@TableName("user") // MyBatis-Plus表名注解
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}6.2.2 Swagger接口文檔
導(dǎo)入依賴:
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.3.0</version>
</dependency>配置類:
@Configuration
public class SwaggerConfig {
@Bean
public OpenAPI customOpenAPI() {
return new OpenAPI()
.info(new Info()
.title("Demo API")
.version("1.0")
.description("接口文檔"));
}
}訪問(wèn)地址:http://localhost:8080/swagger-ui/index.html
七、總結(jié)
本文系統(tǒng)梳理了Java后端開(kāi)發(fā)的核心技術(shù)棧,從Maven項(xiàng)目管理到Spring Boot實(shí)戰(zhàn),從MyBatis持久層到Spring MVC Web開(kāi)發(fā),涵蓋了項(xiàng)目開(kāi)發(fā)的全流程與關(guān)鍵知識(shí)點(diǎn)。掌握這些技術(shù)不僅能提高開(kāi)發(fā)效率,更能構(gòu)建出高可維護(hù)、高擴(kuò)展性的后端系統(tǒng)。
在實(shí)際開(kāi)發(fā)中,應(yīng)注重以下幾點(diǎn):
- 遵循"約定大于配置"原則,減少重復(fù)配置
- 善用設(shè)計(jì)模式解決共性問(wèn)題(如單例、工廠、代理)
- 重視代碼規(guī)范與測(cè)試,提高代碼質(zhì)量
- 持續(xù)學(xué)習(xí)新技術(shù)(如Spring Cloud微服務(wù)、響應(yīng)式編程)
希望本文能為Java后端開(kāi)發(fā)者提供有價(jià)值的參考,助力大家在技術(shù)道路上不斷進(jìn)階!
到此這篇關(guān)于從Maven到Spring Boot實(shí)戰(zhàn)的文章就介紹到這了,更多相關(guān)maven到springboot內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot使用Maven打包后運(yùn)行失敗的問(wèn)題解決詳解
- 使用Maven和SpringBoot搭建客戶數(shù)據(jù)清洗項(xiàng)目框架
- 使用proguard對(duì)maven構(gòu)建的springboot項(xiàng)目進(jìn)行混淆方式
- Springboot 使用 maven-resources-plugin 打包變量替換jar沒(méi)有打包進(jìn)去、Jar包沒(méi)有被使用的解決方法
- 使用Maven和遠(yuǎn)程Docker基于Dockerfile構(gòu)建SpringBoot應(yīng)用鏡像
- Springboot程序在使用Maven下載依賴時(shí)失效的解決方法
- SpringBoot使用maven指定依賴包的版本(解決示例)
- SpringBoot 使用 Maven 打包方式
- springboot使用maven實(shí)現(xiàn)多環(huán)境運(yùn)行和打包問(wèn)題
相關(guān)文章
java微信開(kāi)發(fā)API第一步 服務(wù)器接入
這篇文章主要為大家分享了java微信開(kāi)發(fā)API的第一步操作服務(wù)器接入,感興趣的小伙伴們可以參考一下2016-05-05
java實(shí)現(xiàn)簡(jiǎn)單聊天室單人版
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單聊天室的單人版,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
Java語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單FTP軟件 FTP軟件效果圖預(yù)覽之上傳功能(3)
這篇文章主要為大家詳細(xì)介紹了Java語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單FTP軟件,F(xiàn)TP軟件效果圖預(yù)覽之上傳功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
Java FileInputStream讀中文亂碼問(wèn)題解決方案
這篇文章主要介紹了Java FileInputStream讀中文亂碼問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10
Spring Boot 如何解決富文本上傳圖片跨域問(wèn)題
這篇文章主要介紹了Spring Boot 如何解決富文本上傳圖片跨域問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
JFinal使用ajaxfileupload實(shí)現(xiàn)圖片上傳及預(yù)覽
這篇文章主要為大家詳細(xì)介紹了JFinal使用ajaxfileupload實(shí)現(xiàn)圖片上傳及預(yù)覽,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09
springboot整合mybatis分頁(yè)攔截器的問(wèn)題小結(jié)
springboot整合mybatis分頁(yè)攔截器,分頁(yè)攔截實(shí)際上就是獲取sql后將sql拼接limit,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-07-07

