前言
目前流行两款基于JavaEE的企业级MVC开源框架SSH和SSM。这两个框架中SSH出来的时间比较久远,也相对比较笨拙。SSM出来的时间相对比较晚,相较于SSH来说更加的轻量和简单易学。所以有很多近些年从事JavaEE开发的工作者更倾向于使用SSM框架。今天我就SSM框架的整合做一个简单的整理。
1、开发环境
jdk7.0+tomcat7.0+MyEclipse2014+MySql5.7
2、数据库表结构
/*
Navicat MySQL Data Transfer
Source Host : localhost:3306
Source Database : mybatis
Target Host : localhost:3306
Target Database : mybatis
Date: 2017-06-08 16:30:11
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(32) NOT NULL COMMENT '用户名称',
`password` varchar(32) NOT NULL DEFAULT '',
`birthday` date DEFAULT NULL COMMENT '生日',
`sex` char(1) DEFAULT NULL COMMENT '性别',
`address` varchar(256) DEFAULT NULL COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', '小明', '123', '2017-06-08', '2', '陕西省西安市碑林区');
INSERT INTO `user` VALUES ('10', '小红', '123', '2017-06-08', '1', '陕西省西安市长安区');
INSERT INTO `user` VALUES ('16', '小花', '123', '2017-06-08', '1', '陕西省西安市未央区');
INSERT INTO `user` VALUES ('22', '小苗', '123', '2017-06-08', '1', '陕西省西安市新城区');
INSERT INTO `user` VALUES ('24', '小丽', '123', '2017-06-08', '1', '陕西省宝鸡市凤县');
INSERT INTO `user` VALUES ('25', '小娟', '123', '2017-06-08', '1', '陕西省宝鸡市岐山县');
3、工程结构
在MyEclipse中新建JavaWeb工程“SSM_”,并进行如下配置:
1. 工程配置:
2. jar包管理:
开发所涉及的jar,大家需要去官网下载,要求将下载的jar拷贝进工程的WEB-INF/lib文件夹下:
3. 配置说明:
src:该目录下主要存放java代码,其中:
- com.byzx.ssm.bean:管理java实体类;
- com.byzx.ssm.dao:持久层代码管理,主要完成对数据库的CRUD;
- com.byzx.ssm.service:业务层代码管理,主要完成相关的业务处理;
- com.byzx.ssm.action:控制层代码管理,主要完成模型跟视图之间的交互;
- com.byzx.ssm.test:一般用来进行单元测试;
config:该目录下主要存放配置文件,其中:
- db.properties:配置数据库的driver、url、username、password;
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc\:mysql\://localhost\:3306/mybatis?characterEncoding\=utf-8
jdbc.username=root
jdbc.password=root
- log4j.properties:配置框架日志输出;
# Global logging configuration
# developer-->DEBUG productor-->INFO or ERROR
log4j.rootLogger=DEBUG, stdout
# MyBatis logging configuration...
6
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
- mybatis-config.xml:主要进行mybatis框架的配置,我们一般会配置别名、mapper映射等。
<?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">
<!-- 这是mybatis的主配置文件,跟spring整合后,dataSources交给spring配置 文件管理 -->
<configuration>
<!-- 配置访问别名-->
<typeAliases>
<package name="com.byzx.ssm.bean" />
</typeAliases>
<!-- 配置mappers映射文件 -->
<mappers>
<package name="com.byzx.ssm.dao" />
</mappers>
</configuration>
- spring-beans.xml:spring框架配置文件,主要用来配置dataSource、sqlSessionFactory、MapperScannerConfigurer等。
<?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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<context:annotation-config></context:annotation-config>
<!-- 配置service中的bean -->
<context:component-scan base-package="com.byzx.ssm.service"></context:component-scan>
<!-- spring配置文件,跟mybaits整合后,DataSource需要在这里配置 -->
<!-- 加载外部db.properties -->
<context:property-placeholder location="classpath:db.properties" />
<!-- 数据库连接池,两种方式,可以使用c3p0,这里我们使用的是dbcp -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="maxActive" value="10" />
<property name="maxIdle" value="5" />
</bean>
<!-- mapper配置 -->
<!-- 将mybatis中的写在代码中的sqlsessionfactory配置在 Spring配置文件中,交由spring管理,从而简化操作 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 数据库连接池 -->
<property name="dataSource" ref="dataSource" />
<!-- 加载mybatis的全局配置文件 -->
<property name="configLocation" value="classpath:mybatis-config.xml" />
</bean>
<!-- 这里主要配置mapper扫描器,我们只需要在使用的时候通过
@AutoWired直接访问dao层的接口就行 -->
<bean
class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.byzx.ssm.dao"></property>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>
</beans>
- spring-mvc.xml:springmvc框架配置文件,主要用来配置我们自身的Controller和视图解析器等。
<?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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 使用 mvc:annotation-driven代替注解映射器和注解适配器配置
mvc:annotation-driven默认加载很多的参数绑定方法,
比如json转换解析器就默认加载了,如果使用mvc:annotation-driven不用配置上边的RequestMappingHandlerMapping和RequestMappingHandlerAdapter
实际开发时使用mvc:annotation-driven
-->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 扫描所有的Controller -->
<context:component-scan base-package="com.byzx.ssm.action"></context:component-scan>
<!-- 配置视图解析器 进行jsp解析,默认使用jstl标签,classpath下得有jstl的包 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver" />
<!-- 视图解析器
解析jsp解析,默认使用jstl标签,classpath下的得有jstl的包
-->
<!-- <bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
配置jsp路径的前缀
<property name="prefix" value="/WEB-INF/jsp/"/>
配置jsp路径的后缀
<property name="suffix" value=".jsp"/>
</bean> -->
</beans>
最后我们再来配置一下工程WEB-INF下的web.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name>ssm-demo</display-name>
<!-- 项目默认的欢迎界面 -->
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
<!-- 配置spring容器,也就是配置:spring-beans.xml等 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 配置前端控制器,也就是配置:springmvc.xml进来 -->
<servlet>
<servlet-name>ssm-demo</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<!-- 配置拦截器 -->
<servlet-mapping>
<servlet-name>ssm-demo</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
<!-- 解决数据库响应中文乱码的问题 -->
<filter>
<filter-name>characterEncodingFilter</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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
写到这里,文件配置算是完成了,接下来我们将进入到编码阶段。
- User.java
在com.byzx.ssm.bean下新建User.java,要求跟数据库表字段一一对应(我们案例中使用的是resultType),示例如下:
package com.byzx.ssm.bean;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable{
private static final long serialVersionUID = -6384316775494692203L;
private int id;//用戶ID
private String username;//用户名称
private Date birthday;//生日
private String sex;//性别
private String address;//住址
private String password;//密码
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", birthday="
+ birthday + ", sex=" + sex + ", address=" + address
+ ", password=" + password + "]";
}
}
- UserDao.xml
在com.byzx.ssm.dao下新建UserDao.xml,主要用来配置对数据的操作,示例如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 映射文件:这里就是对user表进行crud -->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.byzx.ssm.dao.UserDao">
<!-- 通过用户名模糊查询用户信息 -->
<select id="findListByName" parameterType="User"
resultType="User">
select * from user
<where>
<choose>
<when test="username!=null and username!=''">
username like concat(concat('%',#{username}),'%')
</when>
</choose>
</where>
</select>
<!-- 登录 -->
<select id="login" parameterType="User"
resultType="User">
select * from user where username=#{username} and password=#{password}
</select>
</mapper>
- UserDao.java
在com.byzx.ssm.dao下新建UserDao.java,主要对外提供操作数据库的接口,示例如下:
package com.byzx.ssm.dao;
import java.util.List;
import com.byzx.ssm.po.User;
public interface UserDao {
/**
* 通过用户名模糊查询用户信息
* @param u
* @return
*/
public List<User> findListByName(User u);
/**
* 登录
* @param user
* @return
*/
public List<User> login(User user);
}
dao层的配置完成了,这一层就是对数据库进行相应的增删改查操作,并提供相关的接口给外部使用。接下来我们来完成service层中代码的设计。
- IUserService.java
在com.byzx.ssm.service下新建IUserService.java,主要用来提供service对外访问接口,示例代码如下:
package com.byzx.ssm.service;
import java.util.List;
import com.byzx.ssm.po.User;
public interface IUserService {
/**
* 通过用户名查询用户信息
* @param u
* @return
*/
public List<User> findListByName(User u);
/**
* 登录
* @param user
* @return
*/
public List<User> login(User user);
}
- UserService.java
在com.byzx.ssm.service.impl下新建UserService.java,实现IUserService接口,主要完成对dao层的访问以及对相关业务的处理,示例代码如下:
package com.byzx.ssm.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.byzx.ssm.bean.User;
import com.byzx.ssm.dao.UserDao;
import com.byzx.ssm.service.IUserService;
/**
* 业务类
* @author Administrator
*
*/
@Service
public class UserService implements IUserService {
@Autowired
private UserDao userDao;
@Override
public List<User> findListByName(User u) {
return userDao.findListByName(u);
}
@Override
public List<User> login(User user) {
// TODO Auto-generated method stub
return userDao.login(user);
}
}
service层到这里就完成了,service层主要负责跟dao层进行交互,并进行相关业务逻辑的处理。同时提供接口给controller层进行访问,那么接下来我们进行controller层代码的设计。
- UserController.java
在com.byzx.ssm.controller下新建UserController.java,主要负责模型(service)和视图(jsp)的交互,代码示例如下:
package com.byzx.ssm.action;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import com.byzx.ssm.bean.User;
import com.byzx.ssm.service.IUserService;
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private IUserService userService;
/**
* 根据用户名称做模糊查询
* @param request
* @return
*/
@RequestMapping("/findlist")//这个就是设置的action。完整写法为:/findlist.action
public String findListByName(Model model,User u) {
List<User> users = userService.findListByName(u);
model.addAttribute("users", users);
return "userList.jsp";
}
/**
* 登录
* @param u
* @param session
* @return
* return "redirect:queryItems.action";//重定向,地址栏发生变化
* return "forward:queryItems.action";//转发,地址栏不变
*/
@RequestMapping("/login")
public String login(User u,HttpSession session,Model model){
List<User> users = userService.login(u);
if(users!=null && users.size()>0){//登录成功
//通过session存储起来
session.setAttribute("username", u.getUsername());
return "redirect:findlist.action";
}else{
return "login.jsp";//直接跳转jsp界面
}
}
}
所有的代码设计到这里就完成了,接下来我们来看下jsp界面的设计。
- login.jsp
这是关于登录界面的设计,示例代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>登录</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/user/login.action"
method="post">
<table>
<tr>
<th colspan="2" align="center">登录</th>
</tr>
<tr>
<td>用户名:</td>
<td><input type="text" name="username" id="username"/></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password" id="username"/></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="登录" /></td>
</tr>
</table>
</form>
</body>
</html>
- userList.jsp
这是关于用户信息展示界面的设计,示例代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib
uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib
uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<!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>
<form
action="${pageContext.request.contextPath }/user/findlist.action"
method="post">
<h2>当前登录的用户是:${sessionScope.username}</h2>
查询条件:
<table width="100%" border=1>
<tr>
<td>
<input type="text" name="username" />
</td>
<td>
<input type="submit" value="查询" />
</td>
</tr>
</table>
用户列表:
<table width="100%" border=1>
<tr>
<td>名称</td>
<td>生日</td>
<td>性别</td>
<td>住址</td>
</tr>
<c:forEach items="${users }" var="item">
<tr>
<td>${item.username }</td>
<td>
<fmt:formatDate value="${item.birthday }"
pattern="yyyy-MM-dd" />
</td>
<td>
<c:if test="${item.sex==2}">男</c:if>
<c:if test="${item.sex==1}">女</c:if>
</td>
<td>${item.address}</td>
</tr>
</c:forEach>
</table>
</form>
</body>
</html>
好了,到了这里ssm框架的整合就算完成了,后续我们还可以加上对于事物的整合等。
4、部署项目
输入地址:http:// localhost:8080/ssm_demo