1. 程式人生 > >Maven+SSM框架(Spring+SpringMVC+MyBatis) - Hello World(轉發)

Maven+SSM框架(Spring+SpringMVC+MyBatis) - Hello World(轉發)

... with attr 輕量 過程 logger support 執行 model

[JSP]Maven+SSM框架(Spring+SpringMVC+MyBatis) - Hello World

來源:http://blog.csdn.net/zhshulin/article/details/37956105?utm_source=tuicool&utm_medium=referral(以下博文對原博文有改動和補充)

博文裏紅底白字的,為註意修改的地方,在這裏先聲明

源碼:Maven&SSM框架 - Hello World

開發環境:

Eclipse Java EE IDE for Web Developers. Version: Mars.2 Release (4.5.2)

apache-tomcat-8.0.33

jdk1.8.0_77

MySQL 5.0.11-dev(官網下載需要賬號登錄,故不提供,請自行百度)

1、基本概念

1.1、Spring

Spring是一個開源框架,Spring是於2003 年興起的一個輕量級的Java 開發框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中闡述的部分理念和原型衍生而來。它是為了解決企業應用開發的復雜性而創建的。Spring使用基本的JavaBean來完成以前只可能由EJB完成的事情。然而,Spring的用途不僅限於服務器端的開發。從簡單性、可測試性和松耦合的角度而言,任何Java應用都可以從Spring中受益。 簡單來說,Spring是一個輕量級的控制反轉(IoC)和面向切面(AOP)的容器框架。

1.2、SpringMVC

Spring MVC屬於SpringFrameWork的後續產品,已經融合在Spring Web Flow裏面。Spring MVC 分離了控制器、模型對象、分派器以及處理程序對象的角色,這種分離讓它們更容易進行定制。

1.3、MyBatis

MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,並且改名為MyBatis 。MyBatis是一個基於Java的持久層框架。iBATIS提供的持久層框架包括SQL Maps和Data Access Objects(DAO)MyBatis 消除了幾乎所有的JDBC代碼和參數的手工設置以及結果集的檢索。MyBatis 使用簡單的 XML或註解用於配置和原始映射,將接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。


2、開發環境搭建

參看博文:MyEclipse+Tomcat+MAVEN+SVN項目完整環境搭建(作者:shu_lin)


3、Maven Web項目創建

技術分享圖片

參看博文:使用maven創建web項目(作者:shu_lin)(博文最後一步可以不用設置,Maven->Update Project...會自動設置)

補充:(可跳過)

新建的Maven,Java Resources只有resource

技術分享圖片

可以添加Server Library自動生成

技術分享圖片

右擊項目->Properties->Java Build Path->Add Library...->Server Library

技術分享圖片


4、SSM整合

下面主要介紹三大框架的整合,至於環境的搭建以及項目的創建,參看上面的博文。這次整合我分了2個配置文件,分別是spring-mybatis.xml,包含spring和mybatis的配置文件,還有個是spring-mvc的配置文件,此外有2個資源文件:jdbc.propertis和log4j.properties。

使用框架都是較新的版本:

Spring 4.0.2 RELEASE(PS:無需手動下載,Maven會自動下)

Spring MVC 4.0.2 RELEASE(PS:無需手動下載,Maven會自動下)

MyBatis 3.2.6(下載:https://github.com/mybatis/mybatis-3/releases)

完整目錄結構如下:

技術分享圖片

4.1、Maven引入需要的JAR包

為了方便後面說的時候不需要引入JAR包,我這裏直接給出所有需要的JAR包,這都是基本的JAR包,每個包的是幹什麽的都有註釋,就不再多說了。


pom.xml

按 Ctrl+C 復制代碼 按 Ctrl+C 復制代碼

技術分享圖片

4.2、Spring與MyBatis的整合

所有需要的JAR包都引入以後,首先進行Spring與MyBatis的整合,然後再進行JUnit測試,先看一個項目結構圖:

技術分享圖片

4.2.1、建立JDBC屬性文件

jdbc.properties(文件編碼修改為utf-8)

按 Ctrl+C 復制代碼 按 Ctrl+C 復制代碼

4.2.2、Log4j的配置(跳過此步也沒影響)

為了方便調試,一般都會使用日誌來輸出信息,Log4j是Apache的一個開放源代碼項目,通過使用Log4j,我們可以控制日誌信息輸送的目的地是控制臺、文件、GUI組件,甚至是套接口服務器、NT的事件記錄器、UNIX Syslog守護進程等;我們也可以控制每一條日誌的輸出格式;通過定義每一條日誌信息的級別,我們能夠更加細致地控制日誌的生成過程。
Log4j的配置很簡單,而且也是通用的,下面給出一個基本的配置,換到其他項目中也無需做多大的調整,如果想做調整或者想了解Log4j的各種配置,參看我轉載的一篇博文,很詳細:Log4j配置詳解 (作者:shu_lin)


log4j.properties(文件編碼修改為utf-8)

按 Ctrl+C 復制代碼 按 Ctrl+C 復制代碼

4.2.3、建立spring-mybatis.xml配置文件

這個文件就是用來完成spring和mybatis的整合的。這裏面也沒多少行配置,主要的就是自動掃描,自動註入,配置數據庫。註釋也很詳細,大家看看就明白了。


spring-mybatis.xml

按 Ctrl+C 復制代碼 按 Ctrl+C 復制代碼

4.2.4、JUnit測試

經過以上步驟(log4j不配也沒影響),我們已經完成了Spring和mybatis的整合,這樣我們就可以編寫一段測試代碼來試試是否成功了。

4.2.4.1、創建測試用表

既然我們需要測試,那麽我們就需要建立在數據庫中建立一個測試表,這個表建的很簡單,SQL語句為:

MySQL

技術分享圖片
#
# Structure for table "user_t"
#

DROP TABLE IF EXISTS `user_t`;
CREATE TABLE `user_t` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(40) NOT NULL,
  `password` varchar(255) NOT NULL,
  `age` int(4) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

#
# Data for table "user_t"
#

INSERT INTO `user_t` VALUES (1,‘測試‘,‘123456‘,24);
技術分享圖片

4.2.4.2、利用MyBatis Generator自動創建代碼

技術分享圖片

隨便找個位置建文件夾(路徑最好都是英文),然後在裏面建個src文件夾,下載下面那兩個包,將generatorConfig.xml拷進去,最後打開cmd,進到文件夾,執行下面的命令,代碼就會生成到src文件夾裏

mysql-connector-java.jar

mybatis-generator-core.jar

generatorConfig.xml

按 Ctrl+C 復制代碼 按 Ctrl+C 復制代碼

cmd命令

java -jar mybatis-generator-core-1.3.2.jar -configfile generatorConfig.xml -overwrite

可做成.bat文件備用,放在目錄運行即可

cmd命令

set current_path="%cd%"
java -jar mybatis-generator-core-1.3.2.jar -configfile generatorConfig.xml -overwrite
pause
exit

參考博文:SSM框架——使用MyBatis Generator自動創建代碼(作者:shu_lin)

這個可根據表自動創建實體類、MyBatis映射文件以及DAO接口,完成後將文件復制到工程中。如圖:

技術分享圖片

IUserService.java

技術分享圖片
package com.ssm.service;

import com.ssm.pojo.User;

public interface IUserService {

    public User getUserById(int userId);
}
技術分享圖片

UserService.java

技術分享圖片
package com.ssm.service.impl;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import com.ssm.dao.UserMapper;
import com.ssm.pojo.User;
import com.ssm.service.IUserService;

@Service("userService")
public class UserService implements IUserService {

    @Resource
    private UserMapper userDao;

    public User getUserById(int userId) {
        return this.userDao.selectByPrimaryKey(userId);
    }

}
技術分享圖片

4.2.4.4、建立測試類

測試類在src/test/java中建立,下面測試類中註釋掉的部分是不使用Spring時,一般情況下的一種測試方法;如果使用了Spring那麽就可以使用註解的方式來引入配置文件和類,然後再將service接口對象註入,就可以進行測試了。如果測試成功,表示Spring和Mybatis已經整合成功了。輸出信息使用的是Log4j打印到控制臺。

技術分享圖片

TestMyBatis.java

技術分享圖片
package com.ssm.testmybatis;

import javax.annotation.Resource;

import org.apache.log4j.Logger;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.alibaba.fastjson.JSON;
import com.ssm.pojo.User;
import com.ssm.service.IUserService;

@RunWith(SpringJUnit4ClassRunner.class) // 表示繼承了SpringJUnit4ClassRunner類
@ContextConfiguration(locations = { "classpath:spring-mybatis.xml" })

public class TestMyBatis {
    private static Logger logger = Logger.getLogger(TestMyBatis.class);
    // private ApplicationContext ac = null;
    @Resource
    private IUserService userService = null;

    // @Before
    // public void before() {
    // ac = new ClassPathXmlApplicationContext("applicationContext.xml");
    // userService = (IUserService) ac.getBean("userService");
    // }

    @Test
    public void test() {
        User user = userService.getUserById(1);
        // System.out.println(user.getUserName());
        // logger.info("值:"+user.getUserName());
        logger.info(JSON.toJSONString(user));
    }
}
技術分享圖片

測試:

先clean項目(可跳過),再Maven->Update Project...(重點),就是為了更新項目設置,(右擊項目->Run As->JUnit Test)

技術分享圖片

至此,完成Spring和mybatis這兩大框架的整合,下面在繼續進行SpringMVC的整合。

如測試失敗請參考網友方法,一般clean項目和右擊項目->Maven->Update Project...更新一下項目設置都可以解決:

技術分享圖片

4.3、整合SpringMVC

上面已經完成了2大框架的整合,SpringMVC的配置文件單獨放,然後在web.xml中配置整合。

4.3.1、配置spring-mvc.xml

配置裏面的註釋也很詳細,在此就不說了,主要是自動掃描控制器,視圖模式,註解的啟動這三個。

spring-mvc.xml

按 Ctrl+C 復制代碼 按 Ctrl+C 復制代碼

4.3.2、配置web.xml文件

這裏面對spring-mybatis.xml的引入以及配置的spring-mvc的Servlet就是為了完成SSM整合,之前2框架整合不需要在此處進行任何配置。配置一樣有詳細註釋,不多解釋了。

web.xml

按 Ctrl+C 復制代碼 按 Ctrl+C 復制代碼

4.3.3、測試

至此已經完成了SSM三大框架的整合了,接下來測試一下,如果成功了,那麽恭喜你,如果失敗了,繼續調試吧,作為程序員就是不停的與BUG做鬥爭!

4.3.3.1、新建jsp頁面

User.jsp 此頁面僅輸出一下用戶名,完成一個完整的簡單流程。

技術分享圖片

User.jsp

技術分享圖片
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>測試</title>
</head>
<body>${user.userName}
</body>
</html>
技術分享圖片

4.3.3.2、建立UserController類

UserController.java

技術分享圖片
package com.ssm.controller;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import com.ssm.pojo.User;
import com.ssm.service.IUserService;

@Controller
@RequestMapping("/user")
public class UserController {

    @Resource
    private IUserService userService;

    @RequestMapping("/showUser")
    public String toIndex(HttpServletRequest request, Model model) {
        int userId = Integer.parseInt(request.getParameter("id"));
        User user = this.userService.getUserById(userId);
        model.addAttribute("user", user);
        return "User";
    }
}
技術分享圖片

4.3.3.3、部署項目

再次測試(右擊項目->Run As->Run On Serser),輸入地址:http://localhost:8080/app/user/showUser?id=1

技術分享圖片

技術分享圖片

技術分享圖片

如果成功請不要開心得太早,Maven->Update Project...或將項目拷到其他機上後會立馬出現404!shu_lin與其他博主都沒有為此作出任何後續說明,為此寫出此博文作出補充。

補充:

無論是shu_lin的SSM框架——詳細整合教程(Spring+SpringMVC+MyBatis)還是其他人的博文,都沒有寫明Maven->Update Project...後會導致項目不能運行,會出現關於Spring包的ClassNotFoundException錯誤這個問題,

(對於我這個新手(Java零基礎新手,Eclipse也不熟悉)頭大了。。。花了近一個月來學這個Hello World。就是卡在這個問題上。)

疑問開始,找Maven

帶著這個疑問?就第一時間找到Maven,可是奇怪了,都包含了?!為什麽還是找不到類?

技術分享圖片

從百度裏找了多個答案後,終於找到問題所在,就是編譯時沒有復制依賴包到WEB-INF/lib裏,編譯時也沒有生成lib文件夾

技術分享圖片

臨時方法:(PS:感覺方法不太對,放棄了)

百度裏有個方法就是教你修改.classpath,手動添加/WEB-INF/lib

<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
    <attributes>
        <attribute name="maven.pomderived" value="true"/>
        <attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/lib"/>
    </attributes>
</classpathentry>

臨時方法:

右擊項目->Properties->Deployment Assembly->Add->Java Build Path Entries->Maven Dependencies->Finish完成添加,再點擊OK關閉

技術分享圖片

再次測試(右擊項目->Run As->Run On Serser),輸入地址:http://localhost:8080/app/user/showUser?id=1,運行OK!

完美解決方法:

可是畢竟是臨時方法,Maven->Update Project...後還是會導致項目不能運行,因為配置被Maven還原了!!!不行,這還是沒有解決,還需要再找,幾番周折終於找到了!

打開cmd,定位到項目目錄下,執行下面命令

cmd命令(根據Java Build Path的列表得知,只要不改動包,就不需要再次運行此命令)

mvn eclipse:eclipse -Dwtpversion=2.0

可做成.bat文件備用,放在項目根目錄運行即可

cmd命令

set current_path="%cd%"
mvn eclipse:eclipse -Dwtpversion=2.0
pause
exit

技術分享圖片

執行命令以後,clean項目和Maven->Update Project...後,Deployment Assembly和Java Build Path都有變化

技術分享圖片

技術分享圖片

再次測試(右擊項目->Run As->Run On Serser),輸入地址:http://localhost:8080/app/user/showUser?id=1,運行OK!完美!

技術分享圖片

再看看WEB-INF裏,終於自動生成lib文件夾

技術分享圖片

Maven+SSM框架(Spring+SpringMVC+MyBatis) - Hello World(轉發)