博主声明:
转载请在开头附加本文链接及作者信息,并标记为转载。本文由博主 威威喵 原创,请多支持与指教。
1、前言
由于博主之前写的这篇文章太水了,其实也是用处不大,所以我决定把这篇文章内容改了。改的内容是 ssm 框架的基本搭建与使用,由于博主毕业设计中需要做后台服务器的处理,我做的是 Android 端 app 的,但是需要数据交互,所以就当顺便学一下服务器的知识吧。
好吧,话不多说,我们自己开始整合 ssm 框架,建议你最好会先使用 Idea,因为我使用的是 Maven 的方式进行构建的,比较简单,容易上手。
2、正文
首先,我们需要创建一个新的 Maven Project
以下就随便填写吧,做一个简单的 demo
下面这个属性最要添加一个 archetypeCatalog = internal,如果不加这个参数,Maven 构建时会很慢,有时候直接卡住。
最后就创建出了一个空的 Maven 项目了,如下图:
到这里呢,你已经迈出了第一步。接下来,我们可以开始加入 Spring、SpringMVC、Mybatis、Json、Logger等依赖,这样才能够正常使用这些工具包。你只需要在 pom.xml 文件中添加如下的依赖即可(打开 pom.xml 文件,将里面的 <dependencies> 标签替换成下面的内容,具体依赖的作用以下都有注释):
<dependencies>
<!-- 单元测试(选择版本大于 4.0 ,使用注解的方式) -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- Java Web 相关依赖 -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<!-- 日志工具:slf4j + logback -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.7</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.1.7</version>
</dependency>
<!-- 添加fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.1.41</version>
</dependency>
<!-- 数据库:mysql + c3p0 连接池 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.29</version>
</dependency>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<!-- DAO 层:mybatis + mybatis-spring 整合 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.2</version>
</dependency>
<!-- Spring 核心依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<!-- Spring dao依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<!-- Spring web相关 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<!-- Spring test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<!-- 使用 redis 优化接口并发(优化‘地址暴露接口’) -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.7.3</version>
</dependency>
<!-- 使用 protostuff 来序列化存储对象 -->
<dependency>
<groupId>com.dyuproject.protostuff</groupId>
<artifactId>protostuff-core</artifactId>
<version>1.0.8</version>
</dependency>
<dependency>
<groupId>com.dyuproject.protostuff</groupId>
<artifactId>protostuff-runtime</artifactId>
<version>1.0.8</version>
</dependency>
</dependencies>
替换代码之后,会弹出这样的窗口,选择 import 即可。
这样我们的 ssm 框架所需的依赖库就已经引入成功了,下面开始编写配置文件进行框架的整合。在整合之前呢,我们先创建几个文件夹,用于存放配置文件。创建文件夹后,工程目录结构图如下:
我这里就写了一个简单的业务逻辑,一个使用 ssm 框架来写的用户登录功能。上图就是所有的类与配置文件,下面我来简单地介绍一下这些类的主要功能以及配置文件的作用。
- dao 包,这里是与数据库访问的接口,对应的 spring-dao.xml 就是操作数据库相关的配置信息,如 jdbc、c3p0 等等。
- service 包,与主要业务逻辑相关,spring-service.xml 的主要是扫描 service 包下的接口,方便注入到其它类中使用。
- web 包,就是 srpingMVC 相关的用于请求访问处理,spring-web.xml 主要是配置 controller 的相关属性。
- logback.xml 是日志的配置文件
- jdbc.properties 表示使用 jdbc 连接数据库驱动时要用的连接属性
- mybatis-config.xml 是与 mybatis 整合时所需的配置信息
- web.xml 需要配置请求的相关属性,比如 servlet 与 servlet-mapping 等。
- mapper 包下主要存放与业务相关的 sql 语句
大致就这些,接下来我们从 jdbc.properties 文件先开始,它的代码如下(是类似与 key - value 的方式存储):
jdbc.driverClasss=com.mysql.jdbc.Driver
jdbc.Url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&autoReconnect=true
jdbc.username=root
jdbc.password=xww0826
在 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: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-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 加载 jdbc 属性文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 配置 c3p0 数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<!-- 配置 jdbc 连接基本属性 -->
<property name="driverClass" value="${jdbc.driverClasss}"/>
<property name="jdbcUrl" value="${jdbc.Url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<!-- 配置 c3p0 连接池属性 -->
<property name="initialPoolSize" value="5"/>
<property name="checkoutTimeout" value="20000"/>
<property name="maxPoolSize" value="40"/>
<property name="minPoolSize" value="10"/>
<!-- 关闭连接后是否自动提交 -->
<property name="autoCommitOnClose" value="false"/>
<!-- 获取连接失败重试次数 -->
<property name="acquireRetryAttempts" value="2"/>
</bean>
<!-- 配置 sqlSessionFactory 对象-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注入数据库连接池 -->
<property name="dataSource" ref="dataSource"/>
<!-- 自动扫描 mapper包下的所有 xml 文件 -->
<property name="mapperLocations" value="classpath:mapper/*.xml"/>
<!-- 配置 mybatis-config 文件 -->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<!-- 扫描包下的 entity 类 -->
<property name="typeAliasesPackage" value="com.xww.demo.entity"/>
</bean>
<!-- 配置扫描 dao 包,动态的实现 dao 接口,注入 spring 容器-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 注入 sqlSessionFactory -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!-- 扫描 dao 包下的接口,并实现它 -->
<property name="basePackage" value="com.xww.demo.dao"/>
</bean>
<!-- 配置事物管理 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入数据库连接池 -->
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 默认使用注解来管理事物 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
接下来是 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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 自动扫描 service 包 -->
<context:component-scan base-package="com.xww.demo.service"/>
</beans>
然后是 spring-web.xml 文件,与 SpringMVC 相关的配置属性
<?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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 扫描 web 包(如:Controller) -->
<context:component-scan base-package="com.xww.demo.web"/>
<!-- springMVC 配置文件,开启注解,并提供一系列功能进行数据绑定(如:xml、Json,时间戳等数据支持) -->
<mvc:annotation-driven/>
<!-- 配置默认处理,允许使用 / 做整体映射,如静态资源的处理(jpg,png,js等) -->
<mvc:default-servlet-handler/>
<!--避免IE执行AJAX时,返回JSON出现下载文件 -->
<bean id="mappingJacksonHttpMessageConverter"
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
然后是 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>
<!-- 设置获取自增主键值 id -->
<setting name="useGeneratedKeys" value="true"/>
<!-- 自动将列名转为 entity 属性名 -->
<setting name="useColumnLabel" value="true"/>
<!-- 使用驼峰命名法来转换 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
</configuration>
最后是 logback.xml 文件,配置日志相关设置:
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoders are assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
以上就是 ssm 框架的所有配置文件代码,接下来我们来看 java 代码。首先是 dao 包下的 LoginDao 接口,代码如下:
package com.xww.demo.dao;
import com.xww.demo.entity.User;
import org.apache.ibatis.annotations.Param;
public interface LoginDao {
// 用户登录
User queryUser(@Param("username") String username, @Param("password") String password);
}
接下来是 mapper 包下的 LoginDao.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.xww.demo.dao.LoginDao">
<select id="queryUser" parameterType="com.xww.demo.entity.User" resultType="com.xww.demo.entity.User">
select user_name, pass_word from user where user_name = #{username} and pass_word = #{password}
</select>
</mapper>
那么 entity 类就不用多说了,提供 getter 和 setter 方法,不过一定要加一个空的构造函数,否则会出错,代码如下:
package com.xww.demo.entity;
public class User {
private String username;
private String password;
public User() {
}
public User(String username, String password) {
this.username = username;
this.password = password;
}
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;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
接着是 service 包,这里就是业务逻辑处理相关的代码,包括业务逻辑的接口与实现类。
package com.xww.demo.service;
import com.xww.demo.entity.User;
public interface LoginService {
User doLogin(String username, String password);
}
package com.xww.demo.service.impl;
import com.xww.demo.dao.LoginDao;
import com.xww.demo.entity.User;
import com.xww.demo.service.LoginService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class LoginImpl implements LoginService {
@Autowired
LoginDao loginDao;
@Override
public User doLogin(String username, String password) {
return loginDao.queryUser(username, password);
}
}
然后是 web 包的代码,这里是请求相关的逻辑代码,配置请求 url 、请求方式、请求参数等。代码如下:
package com.xww.demo.web;
import com.alibaba.fastjson.JSONObject;
import com.xww.demo.entity.User;
import com.xww.demo.service.LoginService;
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 org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/test")
public class LoginController {
@Autowired
LoginService loginService;
@ResponseBody
@RequestMapping(value = "/login", method = RequestMethod.POST)
public String doLoginAction(@RequestParam("username") String username, @RequestParam("password") String password) {
User user = null;
try {
user = loginService.doLogin(username, password);
} catch (RuntimeException e) {
//如果用户为null,在此处理异常
}
return JSONObject.toJSONString(user);
}
}
到这里还没结束,最关键的是需要把 servlet 添加到 web.xml 文件中去,否则你无论怎么请求,都是无法接收到响应的,代码如下:
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!-- 编码过滤器 -->
<filter>
<filter-name>encodingFilter</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>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 配置 SpringMVC DispatcherServlet -->
<servlet>
<servlet-name>demo-LoginServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-*.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>demo-LoginServlet</servlet-name>
<!-- 配置请求 url 模式 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- session配置 -->
<session-config>
<session-timeout>15</session-timeout>
</session-config>
</web-app>
最后是我们的前端 jsp 代码,就是简单的使用 bootstrap 框架写的一个登录界面,index.jsp 代码如下:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
<!DOCTYPE html>
<html>
<head>
<title>用户登录</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- 引入 Bootstrap -->
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<!-- HTML5 Shiv 和 Respond.js 用于让 IE8 支持 HTML5元素和媒体查询 -->
<!-- 注意: 如果通过 file:// 引入 Respond.js 文件,则该文件无法起效果 -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
<![endif]-->
</head>
<body>
<!-- 登录表单 -->
<form style="margin-left:500px;margin-top:200px;" action="test/login" method="post" target="_blank">
<div class="form-group">
<label for="user" stype="display:inline;">账户:</label>
<input type="text" class="form-control" id="user" name="username" style="display:inline;width:200px;"
autocomplete="off"/>
</div>
<div class="form-group">
<label for="password" style="display:inline;">密码:</label>
<input type="password" class="form-control" id="password" name="password" style="display:inline;width:200px;"
autocomplete="off"/>
</div>
<button type="submit" class="btn btn-primary" style="margin-top: 10px">登录</button>
</form>
</body>
<!-- jQuery文件。务必在bootstrap.min.js 之前引入 -->
<script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
</html>
接下来就是如何运行的问题了。使用 IDEA 添加 Local Tomcat,如下图:
添加项目,就是我们刚刚创建的这个项目名,如下图:
然后应用一下,直接运行 Tomcat 即可。那么你就会看到如下的 jsp 页面:
登录成功时,就会显示当前的登录名和密码,以 json 数据返回,登录失败则返回为 null,如下图:
数据库驱动使用的是 mysql,用到的 sql 命名如下:
# 创建数据库
CREATE DATABASE test;
# 创建用户表
CREATE TABLE `user` (
`id` INT NOT NULL auto_increment,
`user_name` VARCHAR (16) NOT NULL,
`pass_word` VARCHAR (16) NOT NULL,
PRIMARY KEY (id, user_name)
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4;
# 插入数据
INSERT INTO USER (user_name, pass_word)
VALUES
('xww', '0826'),
('user1', '123456');
好了,本文所有代码就这些,一个简单的 ssm 框架就整合完成了。