本文章将以一个小项目为例, 在 IntelliJ IDEA 下使用 maven 构建 ssm 框架, 通过体会项目构造基本知道 ssm 框架的作用与效果.
GitHub 地址: https://github.com/giraffecode9668/web_ssm
1. 使用 maven 新建项目
archetype 列表中选择 maven-archetype-webapp 新建 javaweb 项目.
2. 创建测试数据库
我们使用的是 MySQL 数据库, 一般安装 MySQL 数据库的时候是在 doc 命令框安装的, 所以创建数据库我们也直接在 doc 命令框中创建, 操作如下:
进入 MySQL 数据库: 按住 Windows+R 打开运行, 输入 cmd, 输入 MySQL -uroot -p,(root 是用户名, 如果你的用户名不是 root 改为对应用户名), 按照提示输入密码, ok, 进入了 MySQL 了!
创建数据库: 一句句输入以下代码, 输完冒号就回车!
- CREATE DATABASE ssm;
- USE ssm;
- CREATE TABLE user(
- id int(11) NOT NULL AUTO_INCREMENT,
- name varchar(32) DEFAULT NULL,
- password varchar(100) NOT NULL,
- primary key(id)
- ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
- insert into user values(01,'zhangsan','123456');
3. 添加 jar 包
在 pom.xml 文件 dependencies 添加如下 javaee-API,logback-classic,jackson-databind,MySQL-connector-java,c3p0,mybatis,mybatis-spring,spring-core,spring-beans,spring-context,spring-jdbc,spring-tx,spring-Web,spring-webmvc,spring-test,testng 这么多的 jar 包, 哇, 真的好多包... 基本都会用到吧!!!
简单介绍包的作用:
spring 用的包: spring-core,spring-context
springmvc 用的包: spring-webmvc,spring-Web
mybatis 用到包: mybatis
数据库 jdbc 连接:
- MySQL-connector-java
- ,spring-jdbc
HttpServlet 包: javaee-API
连接池: c3p0
spring 的一些注释包: spring-beans,spring-tx
作测试用的包: spring-test,testng
JSON 类传输: jackson-databind
日志输出: logback-classic
修改 pom.xml 里边 < properties > 和 < dependengcies > 标签如下:(老规矩: 记得要 import 一下)
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <maven.compiler.source>1.7</maven.compiler.source>
- <maven.compiler.target>1.7</maven.compiler.target>
- <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
- <!-- spring 版本号 -->
- <spring.version>4.3.5.RELEASE</spring.version>
- <!-- mybatis 版本号 -->
- <mybatis.version>3.4.1</mybatis.version>
- </properties>
- <dependencies>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.11</version>
- <scope>test</scope>
- </dependency>
- <!-- java ee -->
- <!-- 导入 servlet 类 -->
- <dependency>
- <groupId>javax</groupId>
- <artifactId>javaee-API</artifactId>
- <version>7.0</version>
- </dependency>
- <!-- 实现 slf4j 接口并整合 -->
- <!-- 日志 -->
- <!-- 解释: https://www.cnblogs.com/warking/p/5710303.html-->
- <dependency>
- <groupId>ch.qos.logback</groupId>
- <artifactId>logback-classic</artifactId>
- <version>1.2.2</version>
- </dependency>
- <!-- JSON -->
- <!-- 类对象装换: ObjectMapper-->
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-databind</artifactId>
- <version>2.8.7</version>
- </dependency>
- <!-- 数据库 -->
- <dependency>
- <groupId>MySQL</groupId>
- <artifactId>MySQL-connector-java</artifactId>
- <version>8.0.11</version>
- <scope>runtime</scope>
- </dependency>
- <!-- 数据库连接池 -->
- <!--c3p0 连接池, 之前用过阿里的 druid-->
- <dependency>
- <groupId>com.mchange</groupId>
- <artifactId>c3p0</artifactId>
- <version>0.9.5.2</version>
- </dependency>
- <!-- MyBatis -->
- <dependency>
- <groupId>org.mybatis</groupId>
- <artifactId>mybatis</artifactId>
- <version>${mybatis.version}</version>
- </dependency>
- <!-- mybatis/spring 整合包 -->
- <dependency>
- <groupId>org.mybatis</groupId>
- <artifactId>mybatis-spring</artifactId>
- <version>1.3.1</version>
- </dependency>
- <!-- Spring -->
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-core</artifactId>
- <version>${spring.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-beans</artifactId>
- <version>${spring.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-context</artifactId>
- <version>${spring.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-jdbc</artifactId>
- <version>${spring.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-tx</artifactId>
- <version>${spring.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-Web</artifactId>
- <version>${spring.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-webmvc</artifactId>
- <version>${spring.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-test</artifactId>
- <version>${spring.version}</version>
- </dependency>
- <dependency>
- <groupId>org.testng</groupId>
- <artifactId>testng</artifactId>
- <version>RELEASE</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>3.8.1</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>RELEASE</version>
- <scope>compile</scope>
- </dependency>
- </dependencies>
4. 项目结构树
构建以下项目结构, 把一些文件也先建起来
设置一些路径, 按住 ctrl+alt+shift+s, 或者点击文件 - 项目结构, 打开项目结构, 点击模块 (modul), 按照以下提示:
添加 src.main 为源路径, 也就是 package ** 的时候源路径
添加 resources 为项目 Resources
然后点击应用, 再点击确定!
5. 为 resources 的文件添加代码
jdbc.properties 代码:
- jdbc.driver=com.MySQL.cj.jdbc.Driver
- # 数据库地址
- jdbc.url=jdbc:MySQL://localhost:3306/ssm?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC
- # 用户名
- jdbc.username=root
- # 密码
- jdbc.password=8013
- # 最大连接数
- c3p0.maxPoolSize=30
- # 最小连接数
- c3p0.minPoolSize=10
- # 关闭连接后不自动 commit
- c3p0.autoCommitOnClose=false
- # 获取连接超时时间
- c3p0.checkoutTimeout=10000
- # 当获取连接失败重试次数
- c3p0.acquireRetryAttempts=2
log4j.properties 代码:
- log4j.rootLogger=INFO,Console,File
- # 控制台日志
- log4j.appender.Console=org.apache.log4j.ConsoleAppender
- log4j.appender.Console.Target=System.out
- log4j.appender.Console.layout=org.apache.log4j.PatternLayout
- log4j.appender.Console.layout.ConversionPattern=[%p][%t][%d{
- yyyy-MM-dd HH:mm:ss
- }][%C] - %m%n
- # 普通文件日志
- log4j.appender.File=org.apache.log4j.RollingFileAppender
- log4j.appender.File.File=logs/ssm.log
- log4j.appender.File.MaxFileSize=10MB
- # 输出日志, 如果换成 DEBUG 表示输出 DEBUG 以上级别日志
- log4j.appender.File.Threshold=ALL
- log4j.appender.File.layout=org.apache.log4j.PatternLayout
- log4j.appender.File.layout.ConversionPattern=[%p][%t][%d{
- yyyy-MM-dd HH:mm:ss
- }][%C] - %m%n
logback.xml 代码:
- <?xml version="1.0" encoding="UTF-8"?>
- <configuration debug="true">
- <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
- <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>
spring-mvc.xml 代码: 代码添加后 IDEA 会有提示, 点击 create, 然后再点击确认.
- <?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.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-3.0.xsd">
- <!-- 扫描 web 相关的 bean -->
- <context:component-scan base-package="controller"/>
- <!-- 开启 SpringMVC 注解模式 -->
- <mvc:annotation-driven/>
- <!-- 静态资源默认 servlet 配置 -->
- <mvc:default-servlet-handler/>
- <!-- 配置 jsp 显示 ViewResolver -->
- <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
- <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
- <property name="prefix" value="/WEB-INF/views/"/>
- <property name="suffix" value=".jsp"/>
- </bean>
- </beans>
spring-mybatis.xml 代码: 代码添加后 IDEA 会有提示, 点击 create, 然后再点击确认.
- <?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.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">
- <!-- 扫描 service 包下所有使用注解的类型 -->
- <context:component-scan base-package="service"/>
- <!-- 配置数据库相关参数 properties 的属性:${url} -->
- <context:property-placeholder location="classpath:jdbc.properties"/>
- <!-- 数据库连接池 -->
- <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
- <property name="driverClass" value="${jdbc.driver}"/>
- <property name="jdbcUrl" value="${jdbc.url}"/>
- <property name="user" value="${jdbc.username}"/>
- <property name="password" value="${jdbc.password}"/>
- <property name="maxPoolSize" value="${c3p0.maxPoolSize}"/>
- <property name="minPoolSize" value="${c3p0.minPoolSize}"/>
- <property name="autoCommitOnClose" value="${c3p0.autoCommitOnClose}"/>
- <property name="checkoutTimeout" value="${c3p0.checkoutTimeout}"/>
- <property name="acquireRetryAttempts" value="${c3p0.acquireRetryAttempts}"/>
- </bean>
- <!-- 配置 SqlSessionFactory 对象 -->
- <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
- <!-- 注入数据库连接池 -->
- <property name="dataSource" ref="dataSource"/>
- <!-- 扫描 model 包 使用别名 -->
- <property name="typeAliasesPackage" value="model"/>
- <!-- 扫描 sql 配置文件: mapper 需要的 xml 文件 -->
- <property name="mapperLocations" value="classpath:mapper/*.xml"/>
- </bean>
- <!-- 配置扫描 Dao 接口包, 动态实现 Dao 接口, 注入到 spring 容器中 -->
- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
- <!-- 注入 sqlSessionFactory -->
- <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
- <!-- 给出需要扫描 Dao 接口包 -->
- <property name="basePackage" value="dao"/>
- </bean>
- <!-- 配置事务管理器 -->
- <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
- <!-- 注入数据库连接池 -->
- <property name="dataSource" ref="dataSource"/>
- </bean>
- <!-- 配置基于注解的声明式事务 -->
- <tx:annotation-driven transaction-manager="transactionManager"/>
- </beans>
- webapp/Web-INF/Web.xml:
- <?xml version="1.0" encoding="UTF-8"?>
- <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">
- <display-name>ssm</display-name>
- <description>SSM_Alpha_0.0.1</description>
- <!-- 编码过滤器 -->
- <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>
- <!-- 配置 DispatcherServlet -->
- <servlet>
- <servlet-name>SpringMVC</servlet-name>
- <servlet-class>org.springframework.Web.servlet.DispatcherServlet</servlet-class>
- <!-- 配置 springMVC 需要加载的配置文件 -->
- <init-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>classpath:spring-*.xml</param-value>
- </init-param>
- <load-on-startup>1</load-on-startup>
- <async-supported>true</async-supported>
- </servlet>
- <servlet-mapping>
- <servlet-name>SpringMVC</servlet-name>
- <!-- 匹配所有请求, 此处也可以配置成 *.do 形式 -->
- <url-pattern>/</url-pattern>
- </servlet-mapping>
- <welcome-file-list>
- <welcome-file>index.jsp</welcome-file>
- </welcome-file-list>
- </Web-App>
6. 新建代码文件
按照下图新建文件
新建文件
添加代码:
- UserController.java:
- package controller;
- import com.fasterxml.jackson.databind.ObjectMapper;
- import model.User;
- import org.springframework.stereotype.Controller;
- import org.springframework.Web.bind.annotation.RequestMapping;
- import service.IUserService;
- import javax.annotation.Resource;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import java.io.IOException;
- @Controller
- @RequestMapping("/user")
- public class UserController {
- @Resource
- private IUserService asd;
- @RequestMapping("/showUser.do")
- public void selectUser(HttpServletRequest request, HttpServletResponse response) throws IOException {
- request.setCharacterEncoding("UTF-8");
- response.setCharacterEncoding("UTF-8");
- Integer userId = Integer.parseInt(request.getParameter("id"));
- User user = this.asd.selectUser(userId);
- ObjectMapper mapper = new ObjectMapper();
- response.getWriter().write(mapper.writeValueAsString(user));
- }
- }
- IUserDao.java:
- package dao;
- import model.User;
- import java.util.List;
- public interface IUserDao {
- // 对于读取结果集
- // 定义方法 listCategory 同 Category.xml 里面的对应
- // 查询所有的用户, 返回类型为集合
- List<User> listCategory();
- List<User> list();
- // 总记录数
- int total();
- // 查询
- User selectUser(int id);
- // 添加
- void add(User category);
- // 删除
- void delete(int id);
- // 更新
- void update(User category);
- }
- IUserDaoTest.java:
- package dao;
- import model.User;
- import org.junit.Test;
- import org.junit.runner.RunWith;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.test.context.ContextConfiguration;
- import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
- @RunWith(SpringJUnit4ClassRunner.class)
- @ContextConfiguration({"classpath:spring-mybatis.xml"})
- public class IUserDaoTest {
- @Autowired
- private IUserDao dao;
- @Test
- public void testSelectUser(){
- Integer id = 1;
- User user = dao.selectUser(id);
- System.out.println(user);
- }
- }
- User.java:
- package model;
- public class User {
- private Integer id;
- private String username;
- private String password;
- public Integer getId() {
- return id;
- }
- public void setId(Integer id) {
- this.id = id;
- }
- 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{" +
- "id=" + id +
- ", username='" + username + '\'' +
- ", password='" + password + '\'' +
- '}';
- }
- }
- IUserService.java:
- package service;
- import model.User;
- public interface IUserService {
- User selectUser(Integer userId);
- }
- UserServiceImpl.java:
- package service.impl;
- import dao.IUserDao;
- import model.User;
- import org.springframework.stereotype.Service;
- import service.IUserService;
- import javax.annotation.Resource;
- @Service("userService")
- public class UserServiceImpl implements IUserService {
- @Resource
- private IUserDao userDao;
- public User selectUser(Integer userId){
- return this.userDao.selectUser(1);
- }
- }
- UserDao.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">
- <!-- 设置为 IUserDao 接口方法提供 sql 语句配置 -->
- <mapper namespace="dao.IUserDao">
- <select id="selectUser" resultType="User" parameterType="int">
- SELECT * FROM user WHERE id = #{id}
- </select>
- </mapper>
ChatRobots.sql 不用添加...
7. 运行测试
用 IUserDaoTest 测试:
打开 IUserDaoTest.java 文件, 点击运行代码
正常显示
用 Web 测试以下效果
先修改一下 index.jsp:
- <HTML>
- <head>
- <meta charset="UTF-8">
- <title>test</title>
- </head>
- <script>
- function selectUser() {
- var xmlhttp = new XMLHttpRequest();
- xmlhttp.onreadystatechange = function () {
- if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
- document.getElementById("test").innerHTML = xmlhttp.responseText;
- }
- }
- xmlhttp.open("POST", "user/showUser.do", true);
- xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
- xmlhttp.send("id=1");
- }
- </script>
- <body>
- <p id="test">Hello World!</p>
- <button type="button" onclick="selectUser()">onclick test</button>
- </body>
- </HTML>
然后配置 local tomcat 运行吧~~
点击编辑配置
添加 local tomcat
添加 artifact
选择 exploded
点击应用, 再点击确认, 然后点击运行
运行
成功运行
成功使用
8. 出错?
如果报错的话, 一般有可能是 MySQL 连接包版本的问题, 本项目使用的是 mysql6 以上的版本, 在 jdbc.properties 中是相关配置, url 和 com 路径和 mysql5 版本不太一样, 具体操作百度吧!
本项目例子学习自博客:
但是它的代码没有讲创建数据库还有一个类的代码给重复了...
之前我对每个技术都单独写过文章, 它们都是单独使用某项技术创建的小 demo, 而本文是它们的一个集成.
maven 的使用: https://www.jianshu.com/p/d1e994c27748
在 maven 基础下配置 spring:https://www.jianshu.com/p/f3ae5b596b2c
在 maven 基础下配置 springmvc:https://www.jianshu.com/p/4a3c30d8f6c9
在 maven 基础下配置 Mybatis:https://www.jianshu.com/p/3cd4feed6a80
来源: http://www.jianshu.com/p/6f518863e4c6