0%

SSM 框架基本配置详解:从 Web 到事务的完整搭建

SSM(Spring + SpringMVC + MyBatis)是 Java 企业级开发的经典框架组合,通过 Spring 的 IOC 容器管理对象,SpringMVC 处理 Web 请求,MyBatis 简化数据库操作,三者协同实现高效开发。本文基于提供的配置文件,详细解析 SSM 框架的核心配置与工作流程。

Web.xml 配置:Web 应用的入口

web.xml是 Web 应用的部署描述符,负责配置 Servlet、过滤器、监听器等 Web 组件,是 SSM 框架与 Web 容器(如 Tomcat)交互的入口。

核心配置解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

<!-- 1. 错误页面配置 -->
<error-page>
<error-code>404</error-code>
<location>/error404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error500.jsp</location>
</error-page>

<!-- 2. 加载Spring容器 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<!-- 指定Spring配置文件路径(支持通配符) -->
<param-value>WEB-INF/classes/spring/applicationContext-*.xml</param-value>
</context-param>
<listener>
<!-- Spring的上下文加载监听器,启动时初始化Spring容器 -->
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!-- 3. 配置SpringMVC前端控制器 -->
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<!-- SpringMVC配置文件路径 -->
<param-value>WEB-INF/classes/spring/springmvc.xml</param-value>
</init-param>
<!-- 可选:设置启动顺序(1表示Web容器启动时立即加载) -->
<!-- <load-on-startup>1</load-on-startup> -->
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<!-- 拦截所有请求(除JSP外),由DispatcherServlet处理 -->
<url-pattern>/</url-pattern>
</servlet-mapping>

<!-- 4. 解决POST请求乱码的过滤器 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<!-- 对所有请求生效 -->
<url-pattern>/*</url-pattern>
</filter-mapping>

<!-- 5. 欢迎页配置 -->
<welcome-file-list>
<welcome-file>welcome.jsp</welcome-file>
</welcome-file-list>
</web-app>

关键作用:

阅读全文 »

Spring 框架核心构成与模块解析:从核心容器到企业级集成

Spring 框架是 Java 企业级开发的 “基石”,其设计理念是 “模块化、松耦合、可扩展”,通过分层的模块架构覆盖从 “核心 IOC 容器” 到 “Web 开发”“数据访问”“AOP 切面” 等全场景需求。从 “核心容器→数据访问→Web 开发→AOP 与扩展” 四大维度,详细拆解每个模块的职责、核心组件及实际应用场景,并梳理模块间的协作关系。

Spring 框架整体架构图

模块

核心容器层(Core Container):Spring 的 “地基”

核心容器是 Spring 框架的基础核心,提供 IOC(控制反转)DI(依赖注入) 核心能力,所有其他模块均依赖于此层。其核心目标是 “管理对象的生命周期与依赖关系”,降低代码耦合度。

1. Spring Core:核心工具类与 IOC 基础

  • 核心职责:提供 Spring 框架的底层核心工具类,是 IOC 容器的 “骨架”。
  • 核心组件:
    • BeanFactory:IOC 容器的顶层接口,采用工厂模式管理 Bean,负责 Bean 的创建、依赖注入与生命周期控制。
      • 特点:延迟初始化(容器实例化时不创建 Bean,仅在调用 getBean() 时才实例化并装配依赖),适合内存敏感场景。
      • 常用实现:DefaultListableBeanFactory(Spring 内部默认实现,支持 XML / 注解配置)。
    • BeanDefinition:描述 Bean 的 “元数据”(如类名、属性、依赖、作用域等),是容器创建 Bean 的依据。
  • 关键作用:定义 IOC 容器的基本规范,为其他模块提供基础支持(如 Bean 注册、依赖解析)。
阅读全文 »

Spring MVC 核心流程与配置详解:从请求到响应的完整链路

Spring MVC 是基于 MVC 设计模式的 Web 框架,其核心是通过 DispatcherServlet(前端控制器) 统一调度所有请求,配合 HandlerMapping、HandlerAdapter、ViewResolver 等组件完成 “请求处理→业务逻辑→视图渲染” 的全流程。,从 “执行流程拆解→核心组件职责→Java 配置方式” 三个维度,彻底讲透 Spring MVC 的工作原理。

Spring MVC 核心执行流程(图文解析)

执行流程

Spring MVC 的执行流程围绕 DispatcherServlet 展开,共 8 个关键步骤,每个步骤由特定组件协作完成,确保请求按规范流转:

步骤 1:用户发送请求,DispatcherServlet 接收请求

  • 触发点:用户通过浏览器 / 客户端发送 HTTP 请求(如 GET /user/list),请求首先到达 Web 容器(如 Tomcat);
  • DispatcherServlet 角色:作为 Spring MVC 的 “前端控制器”,是所有请求的统一入口,负责全局流程控制,自身不处理具体业务逻辑;
  • 底层机制:Web 容器通过 web.xml 或 Java 配置,将所有请求(或指定 URL 模式)映射到 DispatcherServlet(如配置 url-pattern: / 拦截所有请求)。

步骤 2:DispatcherServlet 调用 HandlerMapping,获取 HandlerExecutionChain

  • HandlerMapping 职责:根据请求 URL 找到对应的 “处理器(Handler,通常是 Controller 的方法)”,并返回 HandlerExecutionChain 对象;
  • HandlerExecutionChain 组成:包含两部分:
    1. Handler:具体的业务处理器(如 UserControllergetUserList() 方法);
    2. HandlerInterceptor 数组:请求处理前后的拦截器(如日志拦截器、权限拦截器);
  • 核心设计模式策略模式。Spring 提供多种 HandlerMapping 实现(如 RequestMappingHandlerMapping 用于注解式 Controller),可灵活切换映射策略(如按 URL 路径、按请求参数映射)。
阅读全文 »

Java 字符串详解:String、StringBuilder 与 StringBuffer

字符串是 Java 中最常用的数据类型之一,Java 提供了 StringStringBuilderStringBuffer 三个类用于处理字符串,但它们的特性和适用场景有显著差异。本文将深入解析这三个类的底层实现、核心特性及最佳实践。

String 类:不可变的字符串

String 类是 Java 中最基础的字符串类,其核心特性是不可变性,这一特性深刻影响了它的使用方式和性能表现。

不可变性的底层实现

String 类被 final 修饰,且其底层存储字符的数组 value 也被 final 修饰,因此字符串对象一旦创建,其内容不可修改。

1
2
3
4
public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
private final char value[]; // 存储字符串的字符数组(final修饰)
// ... 其他代码
}
  • 不可变性的含义:字符串的任何修改操作(如拼接、替换)都会创建新的String对象,原对象内容保持不变。

    1
    2
    String s = "hello";
    s += " world"; // 生成新对象"hello world",原对象"hello"仍存在

字符串常量池:优化内存占用

为减少重复字符串的内存消耗,Java 引入了字符串常量池(位于方法区),用于存储编译期确定的字符串常量。

两种创建字符串的方式对比:
创建方式 原理 示例
直接赋值(字面量) 优先从常量池查找,若存在则返回引用;否则创建常量并放入池,再返回引用。 String s = "abc";
new String() 构造器 始终在堆中创建新对象,若常量池无对应常量则同时创建并放入池。 String s = new String("abc");
字节码分析:new String("xyz") 的对象创建
阅读全文 »

线程简介

进程与线程的核心区别

进程和线程是操作系统中两个核心的执行单元,二者的区别主要体现在资源分配和执行方式上:

对比维度 进程 线程
资源分配 操作系统分配资源的基本单位(拥有独立的堆、方法区等) 进程内的执行单元,共享进程的资源(堆、方法区),但有私有栈和程序计数器
独立性 独立运行环境,一个进程崩溃不影响其他进程 依赖进程存在,同一进程内线程崩溃可能导致整个进程崩溃
调度单位 操作系统调度资源的单位,但调度成本高 CPU 调度的基本单位,调度成本低(上下文切换开销小)
数量关系 一个进程可包含多个线程 线程是进程的一部分,不能独立存在

线程的内存结构

当 JVM 创建一个线程时,会为其分配特殊的内存区域,包含以下关键部分:

  • 程序计数器:记录线程下一条要执行的 JVM 字节码指令,确保线程在 CPU 时间片切换后能恢复执行(线程私有)。
  • Java 栈:跟踪 Java 方法的调用关系,每个方法调用对应一个栈帧,存储局部变量、参数、返回值等(线程私有)。
  • 本地方法栈:支持 native 代码的执行,与 Java 栈类似但用于本地方法调用(线程私有)。
  • 线程本地存储(Thread Local):存储线程私有变量,避免多线程共享带来的并发问题(线程私有)。
  • 状态管理变量:控制线程的生命周期(如状态标记、中断标志等)。

注意:线程的栈帧中,基本类型变量直接存储在栈上,而对象引用存储在栈上,对象本身存储在堆中(堆为进程共享资源)。

线程的创建方式

Java 提供了 4 种创建线程的方式,各有适用场景:

阅读全文 »