Tổng Quan Các Thành Phần Chính
Hệ thống ứng dụng doanh nghiệp thường kết hợp ba lớp công nghệ cốt lõi để xử lý logic nghiệp vụ, giao diện và lưu trữ:
- Spring Core: Một khung làm việc nền tảng cung cấp cơ chế Kiểm soát Đảo ngược (IoC) và Lập trình Hướng khía cạnh (AOP), giúp quản lý vòng đời đối tượng và giảm thiểu sự phụ thuộc.
- Spring MVC: Mô hình kiến trúc điều khiển yêu cầu HTTP, tách biệt rõ ràng giữa Controller, Model và View, giúp đơn giản hóa quy trình xử lý luồng dữ liệu web.
- MyBatis: Công cụ truy xuất dữ liệu hỗ trợ ánh xạ trực tiếp từ SQL đến các đối tượng Java (POJO), loại bỏ nhu cầu viết mã JDBC thủ công rườm rà.
Lộ Trình Kiến Trúc Tích Hợp
Mục tiêu của mô hình SSM là sử dụng Spring làm trung tâm liên kết tất cả các tầng chức năng:
- Tầng Dữ Liệu (DAO/Mapper): Spring chịu trách nhiệm khởi tạo và quản lý các Mapper tương tác với cơ sở dữ liệu.
- Tầng Nghiệp Vụ (Service): Các phương thức nghiệp vụ được đăng ký trong Spring Container, có thể gọi tới Mapper để thực thi truy vấn.
- Tầng Điều Khiển (Handler/Controller): Controller nhận yêu cầu từ client, gọi Service để xử lý và trả về phản hồi view hoặc dữ liệu.
Các thành phần trên đều hoạt động như các JavaBean được Spring quản lý, bao gồm cả cơ chế kiểm soát giao dịch (transaction) tự động qua AOP.
Chuẩn Bị Môi Trường Phát Triển
Bạn cần đảm bảo các yếu tố sau trước khi bắt đầu:
- Hệ CSDL: Oracle 11g trở lên, sẵn sàng bảng thông tin người dùng cho xác thực.
- Ngôn ngữ: JDK phiên bản 1.6 hoặc cao hơn.
- Các thư viện cần thiết: Bản quyền Spring Framework, driver Oracle (ojdbc), gói tích hợp MyBatis-Spring, bộ đệm DBCP, công cụ log Log4j, và JSTL.
Thiết Kế Cấu Hình Tích Hợp
1. Kết Nối MyBatis Với Spring
Phần này tập trung cấu hình nguồn dữ liệu (DataSource) và máy tạo Session (SqlSessionFactory) để MyBatis có thể hoạt động dưới sự quản lý của Spring.
<!-- File: application-context-dao.xml -->
<context:property-placeholder location="classpath:db_config.properties"/>
<!-- Cấu hình Nguồn Đưa Dữ Liệu -->
<bean id="dataSourceMain" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driver.class}" />
<property name="url" value="${jdbc.connect.url}" />
<property name="username" value="${db.username}" />
<property name="password" value="${db.password}" />
<property name="maxActive" value="10" />
</bean>
<!-- Khởi Tạo SqlSessionFactory -->
<bean id="factoryBeanSession" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:mybatis_main.xml"/>
<property name="dataSource" ref="dataSourceMain"/>
</bean>
<!-- Quét Tự Động Các Mapper Interface -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="vn.portal.system.mapper"/>
<property name="sqlSessionFactoryBeanName" value="factoryBeanSession"/>
</bean>
File cấu hình MyBatis riêng lẻ (mybatis_main.xml) chỉ cần định nghĩa alias, không cần liệt kê mapper vì đã dùng Scanner.
2. Quản Lý Tầng Service
Sử dụng Annotation @Service để đánh dấu service impl. Cần cấu hình thêm quản lý giao dịch (Transaction Manager) để đảm bảo tính nhất quán của dữ liệu.
Giao Diện Service
<code style="display:block;background:#eee;padding:10px;">
public interface SystemUserService {
UserEntity verifyUser(UserEntity inputQuery) throws Exception;
}
</code>
Cấu Hình Giao Thức (Transaction)
<!-- File: application-context-trans.xml -->
<tx:annotation-driven transaction-manager="txManager"/>
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSourceMain"/>
</bean>
<aop:config proxy-target-class="true">
<aop:pointcut id="servicePointcut" expression="execution(* vn.portal.system.service.*.*(..))"/>
<aop:advisor advice-ref="defaultAdvice" pointcut-ref="servicePointcut"/>
</aop:config>
3. Tích Hợp Spring MVC
Spring MVC sẽ xử lý các request HTTP và định tuyến về Controller thích hợp.
File Cấu Hình MVC
<!-- File: springmvc-config.xml -->
<mvc:annotation-driven/>
<context:component-scan base-package="vn.portal.system.controller"/>
<mvc:resources mapping="/static/**" location="/static/" />
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
Ví Dụ Controller Xử Lý Đăng Nhập
<code style="display:block;background:#eee;padding:10px;">
@Controller
@RequestMapping("/system")
public class AuthController {
private UserService userService;
@RequestMapping("/doLogin")
public String processLogin(String accountInput, HttpServletRequest req) {
try {
UserEntity userInfo = userService.validate(accountInput);
req.getSession().setAttribute("currentUser", userInfo);
return "redirect:/main/success";
} catch (Exception e) {
req.setAttribute("errorMsg", "Thông tin không hợp lệ");
return "/error/auth_fail";
}
}
}
</code>
4. Cấu Hình Web.xml
Đây là điểm vào chính của ứng dụng Java Web, nơi khởi chạy Spring Container và Dispatcher Servlet.
<servlet>
<servlet-name>portal-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/spring/mvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>portal-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- Bộ Lọc Chuyển Mã UTF-8 -->
<filter>
<filter-name>encodingFilter</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>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
5. Lưu Trữ Thông Số Kết Nối
Tập tin db_config.properties cần đặt trong thư mục Resources để Spring đọc giá trị biến môi trường:
jdbc.driver.class=oracle.jdbc.driver.OracleDriver
jdbc.connect.url=jdbc:oracle:thin:@localhost:1521:xepdb1
db.username=sysman
db.password=securePass123