對於 Java EE 初學者,SSM 框架的龐大配置(Jar 包依賴、XML 配置、注解用法)往往令人望而卻步。最有效的學習路徑是:先跑通一個完整 Demo,再逐層拆解源碼,最後從架構高度重構理解。本文將帶你從零搭建一個基於 SSM 的登錄模塊,涵蓋數據庫、實體、DAO、Service、Controller、JSP 及全套配置文件。
經過源碼分析,完整調用鏈路如下:
Database → Entity → Mapper.xml → Mapper.java → DAO → DAOImpl → Service → ServiceImpl → Controller → JSP
| 層級 | 職責 | 關鍵技術 |
|---|---|---|
| Entity | 映射資料表字段,封裝數據 | POJO、Getter/Setter |
| Mapper | 定義 SQL 映射接口,XML 編寫具體 SQL | MyBatis、@Mapper、ResultMap |
| DAO | 數據訪問接口,封裝 Mapper 調用 | @Repository、@Resource 注入 Mapper |
| Service | 業務邏輯、事務控制 | @Service、@Transactional、@Resource 注入 DAO |
| Controller | 接收請求、參數綁定、調用 Service、返回視圖 | @Controller、@RequestMapping、@Scope(prototype) |
| View | 頁面渲染 | JSP、EL 表達式、JSTL |
CREATE DATABASE DB_TEST;
USE DB_TEST;
CREATE TABLE T_USER (
ID INT PRIMARY KEY AUTO_INCREMENT,
USERNAME VARCHAR(16) NOT NULL,
PASSWORD VARCHAR(16) NOT NULL
);
INSERT INTO T_USER (USERNAME, PASSWORD) VALUES ('admin', '123');
public class User {
private int id;
private String username;
private String password;
// 省略 Getter/Setter
}
// UserMapper.java
public interface UserMapper {
User getUserByName(String username);
}
<!-- UserMapper.xml -->
<mapper namespace="com.crm.mapper.UserMapper">
<resultMap type="com.crm.entity.User" id="userMap">
<id property="id" column="id" />
<result property="username" column="username" />
<result property="password" column="password" />
</resultMap>
<select id="getUserByName" parameterType="string" resultMap="userMap">
SELECT * FROM T_USER WHERE username = #{username}
</select>
</mapper>
// UserDao.java
public interface UserDao {
User findUserByName(String username);
}
// UserDaoImpl.java
@Repository("userDao")
public class UserDaoImpl implements UserDao {
@Resource(name = "userMapper")
private UserMapper userMapper;
@Override
public User findUserByName(String username) {
return userMapper.getUserByName(username);
}
}
// UserService.java
public interface UserService {
User checkLogin(String username, String password);
}
// UserServiceImpl.java
@Service("userService")
public class UserServiceImpl implements UserService {
@Resource
private UserDao userDao;
@Override
public User checkLogin(String username, String password) {
User user = userDao.findUserByName(username);
if (user != null && user.getPassword().equals(password)) {
return user;
}
return null;
}
}
@Controller
@Scope("prototype")
@RequestMapping("/user")
public class UserController {
@Resource
private UserService userService;
@RequestMapping(value = "/login", method = RequestMethod.POST)
public String login(User user, Model model) throws Exception {
user = userService.checkLogin(user.getUsername(), user.getPassword());
if (user != null) {
model.addAttribute(user);
return "welcome"; // 對應 /WEB-INF/pages/welcome.jsp
}
return "fail";
}
}
<form action="/ssm/user/login" method="post">
<input type="text" name="username" placeholder="用戶名"/>
<input type="password" name="password" placeholder="密碼"/>
<input type="submit" value="登錄"/>
</form>
database.properties<context:component-scan base-package="com.crm.*"> 排除 Controller(留給 SpringMVC 掃描)SqlSessionFactoryBean 配置數據源、MyBatis 配置文件、Mapper XML 路徑MapperScannerConfigurer 批量註冊 Mapper 接口DataSourceTransactionManager,配合 @Transactional 使用mysql.driver_class=com.mysql.jdbc.Driver
mysql.connection.url=jdbc:mysql://localhost:3306/DB_TEST
mysql.connection.username=root
mysql.connection.password=root
<configuration>
<typeAliases>
<typeAlias type="com.crm.entity.User" alias="user" />
</typeAliases>
</configuration>
關鍵配置點:
ContextLoaderListener 載入 Spring 容器(classpath*:springContext/*Context.xml)DispatcherServlet 載入 SpringMVC 配置(/WEB-INF/springmvc.xml),load-on-startup=1CharacterEncodingFilter 統一 UTF-8 編碼login.jsp<context:component-scan base-package="com.crm.controller"/><mvc:resources .../>/WEB-INF/pages/,後綴 .jspdatabase.properties 中用戶名密碼是否正確ssm),登錄表單 action 路徑需匹配NoSuchBeanDefinitionException,檢查包掃描路徑與注解是否匹配/WEB-INF/pages/ 目錄下,防止直接訪問通過本 Demo 你已掌握 SSM 基礎搭建全流程。建議後續嘗試:
筆耕不輟,碼海無涯。祝你在 Java 之路上越走越遠!