1. 程式人生 > >以進銷存管理系統為例的SSM框架整合

以進銷存管理系統為例的SSM框架整合

本篇部落格講的是SpringSpringMVCMyBatis三個框架的整合,以Maven為構建工具。

至於SSM三大框架及Maven的概述這裡不再述說。

本例子前端介面已經準備好,只以進銷存管理系統的登入操作為例來整合SSM框架。

大家也可以自己寫一個簡單的表格登入介面來驗證該例項。
以Maven為專案構建工具。
下面是建立好Maven Web專案後,並根據我們所需建立的一些檔案目錄,在下面會講解各個目錄分別會放置哪些檔案。


從上往下依次是:

com.invoicing.controller:此包放置與前端頁面進行互動的Java程式碼。
com.invoicing.dao:此包放置與資料庫進行資料增刪改查操作的Dao層Java程式碼。
com.invoicing.entity:此包放置對應資料庫表格的實體類物件Java程式碼。
com.invoicing.service:此包放置將controller包和dao包的資料資訊進行業務邏輯處理的控制層Java程式碼。
mabatis:用來放置與Mybatis相關的配置檔案和對映檔案。
other:用來放置其他的一些配置檔案,如jdbc.properties,logback.xml檔案等。
spring:用來放置spring框架的相關配置檔案。
sql:用來放置建表的sql語句檔案。
css:用來放置前端頁面的css檔案。
html:用來放置準備好的前端頁面html檔案。
images:用來放置前端頁面所需的圖片。
js:用來放置javascript程式碼檔案。
jsp:用來放置jsp頁面檔案。
pom.xml:用來依賴注入專案所需的jar包。

接下來我們就開始整合SSM框架了。


一.首先把SSM框架所需要的jar包依賴進入pom.xml檔案中。

pom.xml程式碼如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>yuyang</groupId>
  <artifactId>InvoicingManager</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>InvoicingManager Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    
<dependency>
     <!-- junit4使用註解的方式 -->
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    
    <!-- 補全專案依賴 -->
    
    <!-- 1. 日誌,java日誌 slf4j,log4j,logback,common-logging
    slf4j 是規範/介面
    日誌實現: log4j,logback,common-logging
    使用:slf4j + logback
    -->
    <!-- slf4j -->
    <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.12</version>
    </dependency>   
    <!-- logback -->
    <dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.1.1</version>
    </dependency>
    <!-- 實現slf4j介面並整合 -->
    <dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.1.1</version>
    </dependency>
    
    <!-- 2. 資料庫相關依賴 -->
    <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.35</version>
    <!-- 依賴範圍:執行時依賴 -->
    <scope>runtime</scope>
    </dependency>
    <!-- 資料庫連線池 -->
    <dependency>
    <groupId>c3p0</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.1.2</version>
    </dependency>
    
    <!-- 3. DAO框架:MyBatis依賴 -->
    <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.3.0</version>
    </dependency>
    <!-- mybatis自身實現的spring整合依賴 -->
    <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.2.3</version>
    </dependency>
    
    <!-- 4. Servlet web相關依賴 -->
    <!-- 標籤庫依賴 -->
    <dependency>
    <groupId>taglibs</groupId>
    <artifactId>standard</artifactId>
    <version>1.1.2</version>
    </dependency>
    <dependency>
    <groupId>jstl</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
    </dependency>
    <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.5.4</version>
    </dependency>
    <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    </dependency>
    
<!-- 4.spring依賴 -->
<!-- spring核心依賴 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<!-- spring dao層依賴 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<!-- tx:transaction 事務依賴 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<!-- spring web相關依賴 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<!-- spring test相關依賴 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
      
  </dependencies>
  <build>
    <finalName>InvoicingManager</finalName>
  </build>
</project>


二.我們需要在web.xml裡面配置SpringMVC的核心Servlet:

web.xml程式碼如下:

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1" metadata-complete="true">
<!-- 修改servlet版本為3.1 -->

<!-- 配置DispatcherServlet -->
<servlet>
<servlet-name>invoicing-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置springMVC需要載入的配置檔案
spring-dao.xml,spring-service.xml,spring-web.xml
整合順序:MyBatis ->Spring ->SpringMVC
-->
<init-param>
<param-name>contextConfigLocation</param-name>
<!-- 系統將會自動在resources/spring/目錄下面搜尋匹配spring-*.xml檔案 -->
<param-value>classpath:spring/spring-*.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>invoicing-dispatcher</servlet-name>
<!-- 預設匹配所有的請求 -->
<url-pattern>/</url-pattern>
</servlet-mapping>

</web-app>


三.用sql語句建立一個員工Staff表,基於mysql資料庫。

sql語句如下:

drop table if exists staff;
create table staff(
stid int(6) not null auto_increment primary key,
    username varchar(20) not null comment '使用者名稱',
    password varchar(20) not null comment '密碼',
    name varchar(10) not null comment '姓名',
    email varchar(20) comment '郵箱',
    telephone varchar(11) comment '手機號碼',
    address varchar(40) comment '家庭地址',
    gender varchar(6) not null comment '性別',
    birthday date comment '出生日期',
    depName varchar(30) not null comment '部門名字',
    lastLoginTime date comment '最後一次登入的時間',
    lastLoginIp varchar(30) comment '最後一次登入的Ip地址'
)DEFAULT CHARSET=utf8 COLLATE=utf8_bin

並在com.invoicing.entity包下建立 Staff 實體類。

Staff.java程式碼如下:

package com.invoicing.entity;
import java.util.Date;
/**
 * @author 
 * 2017年8月26日
 * 員工的基本資訊
 */
public class Staff {
private Long stid;
private String username;
private String password;
private String name;
private String email;
private String telephone;
private String address;
private String gender;
private Date birthday;
//部門名字
private String depName;
//最後一次登入的時間
private Date lastLoginTime;
//最後一次登入的Ip地址
private String lastLoginIp;

public Long getStid() {
return stid;
}
public void setStid(Long stid) {
this.stid = stid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getDepName() {
return depName;
}
public void setDepName(String depName) {
this.depName = depName;
}
public Date getLastLoginTime() {
return lastLoginTime;
}
public void setLastLoginTime(Date lastLoginTime) {
this.lastLoginTime = lastLoginTime;
}
public String getLastLoginIp() {
return lastLoginIp;
}
public void setLastLoginIp(String lastLoginIp) {
this.lastLoginIp = lastLoginIp;
}
}

四.配置MyBatis框架

在mybatis資料夾裡面新建一個mybatis-config.xml配置檔案。

mybatis-config.xml程式碼如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 配置全域性屬性 -->
<settings>
<!-- 使用jdbc的getGeneratedKeys 獲取資料庫自增主鍵值 -->
<setting name="useGeneratedKeys" value="true"/>
<!-- 使用列別名替換列名 預設:true
select name as title from table
-->
<setting name="useColumnLabel" value="true"/>
<!-- 開啟駝峰命名轉換:Table(create_time) -> Entity(createTime) -->
<setting name="mapUnderscoreToCamelCase" value="true"/>

</settings>
</configuration>


五.配置spring-dao檔案,spring與mybatis整合。

在配置spring-dao檔案之前,首先先在other資料夾裡面新建一個jdbc.properties檔案,在裡面放置一些與資料庫連線的相關資訊。

jdbc.properties程式碼如下:

jdbc.driverClass=com.MySQL.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/invoicing?useUnicode=true&characterEncoding=utf-8&useSSL=false
jdbc.username=root
jdbc.password=123456

這是與資料庫相關的資訊,包括Mysql的連線驅動,資料庫的路徑,資料庫的使用者名稱和密碼。

然後我們在spring包裡面新建一個spring-dao.xml檔案,裡面配置dao層和與mybatis相關的配置。

spring-dao.xml程式碼如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd"
xmlns:tx="http://www.springframework.org/schema/tx">

<!-- 配置整合MyBatis過程 -->
<!-- 1.配置資料庫相關引數 properties屬性:${url} -->
<context:property-placeholder location="classpath:other/jdbc.properties"/>

<!-- 2.資料庫連線池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<!-- 配置連線池屬性 -->
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="user" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>

<!-- c3p0連線池的私有屬性 -->
<property name="maxPoolSize" value="30"></property>
<property name="minPoolSize" value="10"></property>
<!-- 關閉連線後不自動commit -->
<property name="autoCommitOnClose" value="false"></property>
<!-- 獲取連線超時時間 -->
<property name="checkoutTimeout" value="1000"></property>
<!-- 當獲取連線失敗重試次數 -->
<property name="acquireRetryAttempts" value="2"></property>
</bean>

<!-- 約定大於配置 -->
<!-- 3.配置SqlSessionFactory物件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注入資料庫連線池 -->
<property name="dataSource" ref="dataSource"></property>
<!-- 配置MyBatis全域性配置檔案:mybatis-config.xml -->
<property name="configLocation" value="classpath:mybatis/mybatis-config.xml"></property>
<!-- 掃描entity包,使用別名 com.invoicing.entity.Staff->Staff -->
<property name="typeAliasesPackage" value="com.invoicing.entity"></property>
<!-- 掃描sql配置檔案:mybatis對映需要的*-mapper.xml檔案 -->
<property name="mapperLocations" value="classpath:mybatis/*-mapper.xml"></property>
</bean>

<!-- 4.配置掃描Dao介面包,動態實現Dao介面,注入到spring容器中 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 注入SqlSessionFactory 後初始化-->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
<!-- 給出需要掃描的Dao介面包 -->
<property name="basePackage" value="com.invoicing.dao"></property>
</bean>

</beans>

六.配置spring-service檔案

在spring目錄下新建spring-service.xml檔案,此配置檔案用來注入service層的Java類,並配置事務的相關功能。

spring-service.xml程式碼如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd"
>

<!-- 掃描service包下所有使用註解的型別 -->
<context:component-scan base-package="com.invoicing.service"/>

<!-- 配置事務管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
<!-- 注入資料庫的連線池-->
<property name="dataSource" ref="dataSource"></property>
</bean>

<!-- 配置基於註解的宣告式事務
預設使用註解來管理事務行為 -->
<tx:annotation-driven transaction-manager="transactionManager"/>

</beans>


七.配置spring-controller.xml檔案

在spring目錄下面新建spring-controller.xml檔案,用來整合Spring和SpringMVC。

spring-controller.xml程式碼如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc" 
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

<!-- 配置SpringMVC -->
<!-- 1:開啟SpringMVC註解模式 -->
<!-- 簡化配置:
(1)自動註冊DefaultAnnotationHandlerMapping,AnnotationMethodHandlerAdapter
(2)提供一系列:資料繫結,數字和日期的format,@NumberFormat,@DataTimeFormat,
xml,json預設讀寫支援
-->
<mvc:annotation-driven/>
 
<!-- 2:servlet-mapping 對映路徑:"/" -->
<!-- 靜態資源預設servlet配置
(1):加入對靜態資源的處理:js,gif,png
(2):允許使用"/"做整體對映
 -->
 <mvc:default-servlet-handler/>
 
 <!-- 3:配置jsp,顯示ViewResolver -->
 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
  <!-- jsp檔案字首 -->
  <property name="prefix" value="/WEB-INF/jsp/"></property>
  <!-- jsp檔案字尾 -->
  <property name="suffix" value=".jsp"></property>
 </bean>
 
 <!-- 4:掃描web相關的bean -->
 <context:component-scan base-package="com.invoicing.controller"></context:component-scan>
</beans>

現在框架我們差不多整合完了,但是我們怎麼用呢?

我們依照 controller->service->dao的順序來寫程式碼。

首先我們登入的時候需要驗證員工賬號和密碼的正確性。


八.我們開始編寫controller的程式碼,在controller包裡面新建一個StaffController.java類。

StaffController.java程式碼如下:

package com.invoicing.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.invoicing.entity.Staff;
import com.invoicing.service.StaffService;

/**
 * @author 
 * 2017年8月26日
 */
@Controller //@Service @Component
@RequestMapping("/invoicing") //url:/模組/資源/{id}/細分/seckill/list
public class StaffController {

//自動注入staffService
@Autowired
private StaffService staffService;

@RequestMapping(value="/login",method=RequestMethod.POST)
public String login(Staff staff) {
Staff sta=staffService.queryStaff(staff);
if(sta!=null) {
return "login";
}else {
return null;
}
}

}

九.現在我們在service目錄下建立StaffService介面和它的實現類StaffServiceImpl.java

StaffService介面程式碼如下:

package com.invoicing.service;

import com.invoicing.entity.Staff;

/**
 * @author 
 * 2017年8月27日
 */
public interface StaffService {
/ /查詢Staff是否存在資料庫中
Staff queryStaff(Staff staff);
}

StaffServiceImpl.java實現類程式碼如下:

package com.invoicing.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.invoicing.dao.StaffDao;
import com.invoicing.entity.Staff;
import com.invoicing.service.StaffService;

/**
 * @author
 * 2017年8月27日
 */
@Service
public class StaffServiceImpl implements StaffService{

//注入staffDao依賴
@Autowired
private StaffDao staffDao;

/* (non-Javadoc)
* @see com.invoicing.service.StaffService#queryStaffByUsernameAndPassword(com.invoicing.entity.Staff)
*/
@Transactional
/*
* (non-Javadoc)
* @see org.seckill.service.SeckillService#executeSeckill(long, long, java.lang.String)
* 使用註解控制事務方法的優點:
* 1.開發團隊達成一致約定,明確標註事務方法的程式設計風格
* 2.保證事務方法的執行時間儘可能短,不要穿插其他網路操作 RPC/HTTP請求或者剝離到事務方法外部
* 3.不是所有的方法都需要事務,如只有一條修改操作,只讀操作不需要事務控制。
*/
public Staff queryStaff(Staff staff) {
String username=staff.getUsername();
String password=staff.getPassword();
Staff sta=staffDao.queryStaffByUsernameAndPassword(username,password);
return sta;
}
}


十.我們在dao目錄下建立StaffDao介面,因為MyBatis框架可以在dao層介面中寫出對應的對映配置檔案,所以我們只需要建立介面,不需要寫出它的實現類。

StaffDao介面程式碼如下:

package com.invoicing.dao;

import org.apache.ibatis.annotations.Param;

/**
 * @author
 * 2017年8月27日
 */
public interface StaffDao {

/**
* @param username
* @param password
* @return
*/
//通過使用者名稱和密碼來查詢Staff資料是否存在
Staff queryStaffByUsernameAndPassword(@Param("username") String username, @Param("password") String password);
}


建立了介面之後我們還需要在mybatis目錄下面建立對應的對映檔案staff-mapper.xml。

staff-mapper.xml程式碼如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.invoicing.dao.StaffDao">
<!-- 目的:為DAO介面方法提供sql語句配置 -->

<select id="queryStaffByUsernameAndPassword" resultType="Staff">
select * from invoicing 
where username = #{username} and password = #{password}
</select>

</mapper>


十一.好了,現在後端程式碼我們已經徹底寫好了,SSM三大框架也已經整合完了,剩下的事就是我們在前端頁面呼叫controller就好了。

現在,我們的專案目錄是這樣子的:


我們該怎樣使用框架呢?

我們只需要在前端頁面form表單的action屬性中呼叫相應controller介面就可以了。