首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

SSM 框架整合實戰:Spring + Spring MVC + MyBatis 完整商品管理系統

     編輯:Java 綜合教學

專案概覽

SSM = Spring (業務對象管理) + Spring MVC (請求分發與視圖) + MyBatis (持久層)。優點:輕量、自由度高、Spring 生態契合度佳。本文通過商品管理系統 (CRUD、分頁、校驗、文件上傳、FreeMarker/JSP 雙視圖) 完整演示整合過程。

技術棧

  • Spring 4.3.0, Spring MVC, MyBatis 3.4.1, MyBatis-Spring 1.3.0
  • C3P0 連接池, JSR-303 (Hibernate Validator), JSTL, Log4j2
  • Maven 多模組結構, Tomcat 7+ (Servlet 3.0 文件上傳)

核心配置

1. applicationContext.xml (Spring 容器)

  • C3P0 DataSource + SqlSessionFactoryBean + MapperScannerConfigurer (掃描 com.zhangguo.ssmall.mapper)
  • DataSourceTransactionManager + <tx:annotation-driven/> 註解事務
  • <context:component-scan> + <aop:aspectj-autoproxy>

2. springmvc-servlet.xml (MVC 容器)

  • <mvc:annotation-driven>, <mvc:default-servlet-handler> 靜態資源
  • 雙視圖解析器:FreeMarker (order=1, .html) + JSP/JSTL (order=2, .jsp)
  • FreeMarker 詳細配置 (編碼、日期/數字格式、locale、macro)
  • StandardServletMultipartResolver (Servlet 3.0 原生上傳)

3. web.xml

  • ContextLoaderListener 載入 applicationContext.xml
  • DispatcherServlet 載入 springmvc-servlet.xml, load-on-startup=1, <multipart-config> 上傳限制
  • CharacterEncodingFilter UTF-8 強制編碼

持久層

實體

public class Goods implements Serializable {
    private int id;
    @NotNull @Pattern(regexp="^[^><&#]{1,50}$") private String name;
    @Min(1) private double price;
    private String picture;
    // getter/setter/toString
}

Mapper 接口 + XML

public interface GoodsDAO {
    List<Goods> getGoodsPager(@Param("skip")int skip, @Param("size")int size);
    Goods getGoodsById(int id);
    int getGoodsCount();
    int insert(Goods entity);
    int delete(int id);
    int update(Goods entity);
}
<mapper namespace="com.zhangguo.ssmall.mapper.GoodsDAO">
  <select id="getGoodsPager" resultType="Goods">select * from goods limit #{skip},#{size}</select>
  <select id="getGoodsById" resultType="Goods">select * from goods where id=#{id}</select>
  <select id="getGoodsCount" resultType="int">select count(*) from goods</select>
  <insert id="insert">insert into goods(name,price,picture) values(#{name},#{price},#{picture})</insert>
  <delete id="delete">delete from goods where id=#{id}</delete>
  <update id="update">update goods set name=#{name},price=#{price},picture=#{picture} where id=#{id}</update>
</mapper>

服務層

@Service
public class GoodsServiceImpl implements GoodsService {
    @Resource GoodsDAO goodsdao;
    // 分頁、CRUD 直接委託 DAO
    public List<Goods> getGoodsPager(int pageNO, int size) {
        return goodsdao.getGoodsPager((pageNO-1)*size, size);
    }
    // ... 其他方法
}

控制器層

@Controller @RequestMapping("/goods")
public class GoodsController {
    @Resource GoodsService goodsService;

    @GetMapping("/list")
    public String list(Model model, @RequestParam(defaultValue="1") int pageNO) {
        int size = 5;
        model.addAttribute("goods", goodsService.getGoodsPager(pageNO, size));
        model.addAttribute("count", goodsService.getGoodsCount());
        model.addAttribute("pageNO", pageNO);
        model.addAttribute("size", size);
        return "goods/list"; // JSP 視圖
    }

    @GetMapping("/add") public String add(Model m) { m.addAttribute("entity", new Goods()); return "goods/add"; }
    @PostMapping("/addSave") public String addSave(@Valid @ModelAttribute("entity") Goods e, BindingResult br) {
        if (!br.hasErrors() && goodsService.insert(e) > 0) return "redirect:/goods/list";
        return "goods/add";
    }
    // edit, delete, deletes, upPicture (文件上傳) 同理...
}

前端亮點

  • JSP + JSTL + jQuery Pagination 插件實現無刷新感分頁
  • Spring Form 標籤 + JSR-303 校驗錯誤顯示 (<form:errors>)
  • 文件上傳:MultipartFile + UUID 重命名 + transferTo()
  • 圖片加載失敗 fallback 到 default.jpg
  • 統一 CSS 風格、Log4j2 控制台彩色日誌

測試與構建

  • JUnit 測試 MyBatis 映射 (獨立於 Spring)
  • Maven 打包 WAR 部署 Tomcat
  • GitHub 原碼可下載運行

避坑指南

  1. 路徑問題:重定向用 redirect:/goods/list,表單提交用 <c:url> 或 <base>。
  2. @Valid 需配合 @ModelAttribute 才能觸發 BindingResult 綁定錯誤。
  3. FreeMarker 與 JSP 共存需正確設置 order 與 suffix。
  4. Servlet 3.0 上傳需在 DispatcherServlet 配置 <multipart-config>。

擴展方向

  • 前端校驗 (jQuery Validate) 減少後端壓力
  • AJAX 異步交互提升體驗
  • 完整 Spring Boot 遷移簡化配置
  • 引入 Swagger2 自動生成 API 文檔

這個 Demo 涵蓋了 SSM 開發 90% 的常見場景,適合作為專案骨架快速啟動新業務。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved