以进销存管理系统为例的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接口就可以了。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值