zoukankan      html  css  js  c++  java
  • SSM框架搭建教程(从零开始,图文结合)

    1、准备

    IntelliJ IDEA
    Tomcat
    JDK
    Maven
    mysql
    spring、springmvc、mybatis 了解

    现在假设如上条件你都具备,那么通过我这篇博客 你一定可以整合出 SSM 框架,完成如下效果

    这里写图片描述

     整个博客共分为三部分:

    • 建立 基于 Maven 的 WEB 项目,启动 Tomcat ,项目启动
    • 整合 Mybatis+Spring ,进行单元测试 可以完成从数据库查询出数据功能
    • 整合 Mybaits+Spring+SpringMVC,输入Url 完成整个 MVC 的流程

    2、步骤

    因为说的比较细,所以前面第一部分都了解可以跳过。

    2.1 第一部分

    1.新建基于 Maven 的Web工程

    这里写图片描述

    2.填写 GroupId 和 ArtifactId,参考

     groupId一般分为多个段,这里我只说两段,第一段为域,第二段为公司名称。域又分为org、com、cn等等许多,其中org为非营利组织,com为商业组织。举个apache公司的tomcat项目例子:这个项目的groupId是org.apache,它的域是org(因为tomcat是非营利项目),公司名称是apache,artigactId是tomcat。

    这里写图片描述

    3.填写 Maven 配置。

    这里写图片描述

    图片中1、2、3分别: 1:首先你要先配置好 Maven,如果配置好了,去 CMD DOSS 界面下输入mvn --version 命令,如果有显示,则代表已经配置好了,如果没,下载maven,配置环境变量。 maven下载地址

    2:选择我们的 maven 文件夹下的 setting,这里特别要注意,可能因为 “墙”的原因,下载 maven jar 包 很容易卡住,所以建议在 setting.xml 配置国内镜像,比如阿里云。

    1      <!-- 复制如上一段镜像代码配置,添加阿里云镜像 -->
    2      <mirror>
    3       <id>alimaven</id>
    4       <mirrorOf>central</mirrorOf>
    5       <name>aliyun maven</name>
    6       <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    7     </mirror>
    这里写图片描述

    在相应位置填上如上代码即可。

    3.这里为了从头开始,我新建了个仓库地址。这里大家随意,也可以和我一样。

    这里写图片描述

    4.填写工程名,module名,前者是 workspace 后者代表一个项目

    这里写图片描述

    5.建立架构包

    这里写图片描述
     
    如果这里弹出此对话框,记得点击 auto。

    这里写图片描述

    这里写图片描述

    新建文件夹,利用Sources Resources 两个标签分别转化 Java 和 Resources 文件夹

    6.新建tomcat并且配置

    这里写图片描述 这里写图片描述

    7.启动项目

    这里写图片描述

    2.2 第二部分

    **1.添加 maven 依赖。**因为 pom.xml 里面 jar 包太多,太占内容,所以从源码中复制吧。

    2.因为SSM三者整合全部放在一个 .xml 中太杂。所以这里拆成三个 spring-mybaits.xmlspring-servicespring-web 配置 spring-mybatis.xml ,包含如下内容:

    • 数据库配置文件 jdbc.properties。包含数据库地址 密码 库名等等。
    1     <!-- 1.配置数据库相关参数properties的属性:${url} -->
    2     <context:property-placeholder location="classpath:jdbc.properties" />
    • 连接池。这里使用 c3p0。
     1    <!-- 2.数据库连接池 -->
     2     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
     3         <!-- 配置连接池属性 -->
     4         <property name="driverClass" value="${jdbc.driver}" />
     5         <property name="jdbcUrl" value="${jdbc.url}" />
     6         <property name="user" value="${jdbc.username}" />
     7         <property name="password" value="${jdbc.password}" />
     8 
     9         <!-- c3p0连接池的私有属性 -->
    10         <property name="maxPoolSize" value="30" />
    11         <property name="minPoolSize" value="10" />
    12         <!-- 关闭连接后不自动commit -->
    13         <property name="autoCommitOnClose" value="false" />
    14         <!-- 获取连接超时时间 -->
    15         <property name="checkoutTimeout" value="10000" />
    16         <!-- 当获取连接失败重试次数 -->
    17         <property name="acquireRetryAttempts" value="2" />
    18     </bean>
    • 配置SqlSessionFactory对象。专用来获取 sqlSession。
     1     <!-- 3.配置SqlSessionFactory对象 -->
     2     <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
     3         <!-- 注入数据库连接池 -->
     4         <property name="dataSource" ref="dataSource" />
     5         <!-- 配置MyBaties全局配置文件:mybatis-config.xml -->
     6         <property name="configLocation" value="classpath:mybatis-config.xml" />
     7         <!-- 扫描entity包 使用别名 -->
     8         <property name="typeAliasesPackage" value="ssm.entity" />
     9         <!-- 扫描sql配置文件:mapper需要的xml文件 -->
    10         <property name="mapperLocations" value="classpath*:mapper/*.xml" />
    11     </bean>

    在 resources 下新建 mybatis-config.xml ,此文件也称作 mybatis 的核心配置文件。里面内容为空 暂时

    1 <?xml version="1.0" encoding="UTF-8" ?>
    2 <!DOCTYPE configuration
    3         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    4         "http://mybatis.org/dtd/mybatis-3-config.dtd">
    5 <configuration>
    6 
    7 </configuration>

    新建 entity 包,用来放实体类,也就是 pojo。同时在 sqlSession 工厂中扫描整个实体类包。这样在 mapper 中就可以用 类名做别名,不用写整个类的相对位置路径了。

    1   <select id="queryUserListByUsername" parameterType="String" resultType="User">
    2       SELECT
    3             *
    4       FROM
    5             USER
    6       WHERE
    7             username = #{username}
    8   </select>

    比如其中的 User。不然就要写成

    1 ssm.entity.User

    对于 sql 配置文件,我这里放在 resources-->mapper--> 下。

    这里写图片描述

    对于 *mapper.xml 的位置处理有很多中方式。有的放在 mapper 包下。然后在 mapper 下建立两个包,分别放 daomapper

    这里写图片描述

    还有分别根据功能建包,一个功能建一个包,其中包含一组 功能文件,分别是 *Dao *Mapper.xml

    这里写图片描述

    具体怎样做根据实际项目情况来,如果项目系统功能复杂还是建议后面两种,不然到时候会很痛苦(项目多,文件就多,如果第一种方法,则跨度大,屏幕占满 :) )

    <property name="mapperLocations" value="classpath*:mapper/*.xml" /> <property name="configLocation" value="classpath:mybatis-config.xml" /> 根据自己实际情况填写

    • mapper 动态代理开发,扫描 dao 接口。
    1    <!-- 4.配置扫描Dao接口包,动态实现Dao接口,注入到spring容器中 -->
    2     <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    3         <!-- 注入sqlSessionFactory -->
    4         <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
    5         <!-- 给出需要扫描Dao接口包 -->
    6         <property name="basePackage" value="ssm.dao" />
    7     </bean>

    <property name="basePackage" value="ssm.dao" /> 根据自己实际情况填写

    ok!到这里位置,我们的 spring-mybatis 就配置好了。已经可以通过 mybatis 操作数据库了,现在我们来测试下 这一步出问题没。 先往数据库插入一些数据。这里我提供一份我的 sql 文件,如果各位有需要, 直接运行就可以了。

     1 DROP TABLE IF EXISTS `items`;
     2 CREATE TABLE `items` (
     3   `id` int(11) NOT NULL AUTO_INCREMENT,
     4   `name` varchar(32) NOT NULL COMMENT '商品名称',
     5   `price` float(10,1) NOT NULL COMMENT '商品定价',
     6   `detail` text COMMENT '商品描述',
     7   `pic` varchar(64) DEFAULT NULL COMMENT '商品图片',
     8   `createtime` datetime NOT NULL COMMENT '生产日期',
     9   PRIMARY KEY (`id`)
    10 ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
    11 
    12 -- ----------------------------
    13 -- Records of items
    14 -- ----------------------------
    15 INSERT INTO `items` VALUES ('1', '台式机', '3000.0', '该电脑质量非常好!!!!', null, '2016-02-03 13:22:53');
    16 INSERT INTO `items` VALUES ('2', '笔记本', '6000.0', '笔记本性能好,质量好!!!!!', null, '2015-02-09 13:22:57');
    17 INSERT INTO `items` VALUES ('3', '背包', '200.0', '名牌背包,容量大质量好!!!!', null, '2015-02-06 13:23:02');
    18 
    19 -- ----------------------------
    20 -- Table structure for user
    21 -- ----------------------------
    22 DROP TABLE IF EXISTS `user`;
    23 CREATE TABLE `user` (
    24   `id` int(11) NOT NULL AUTO_INCREMENT,
    25   `username` varchar(32) NOT NULL COMMENT '用户名称',
    26   `birthday` date DEFAULT NULL COMMENT '生日',
    27   `sex` char(1) DEFAULT NULL COMMENT '性别',
    28   `address` varchar(256) DEFAULT NULL COMMENT '地址',
    29   PRIMARY KEY (`id`)
    30 ) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;
    31 
    32 -- ----------------------------
    33 -- Records of user
    34 -- ----------------------------
    35 INSERT INTO `user` VALUES ('1', '王五', null, '2', null);
    36 INSERT INTO `user` VALUES ('10', '张三', '2014-07-10', '1', '北京市');
    37 INSERT INTO `user` VALUES ('16', '张小明', null, '1', '河南郑州');
    38 INSERT INTO `user` VALUES ('22', '陈小明', null, '1', '河南郑州');
    39 INSERT INTO `user` VALUES ('24', '张三丰', null, '1', '河南郑州');
    40 INSERT INTO `user` VALUES ('25', '陈小明', null, '1', '河南郑州');
    41 INSERT INTO `user` VALUES ('26', '王五', null, null, null);

    这里写图片描述

    这里写图片描述

    这是整个项目的结构。 在 entity 下建立 User 实体类,注意字段对齐。 在 dao 下建立 UserDao

     1 import org.apache.ibatis.annotations.Param;
     2 import ssm.entity.User;
     3 import java.util.List;
     4 
     5 /**
     6  * Created by guozhaohui628@gmail.com on 2018/5/7
     7  * Description:
     8  */
     9 public interface UserDao {
    10 
    11     public List<User> queryUserListByUsername(String username);
    12 
    13     public List<User> queryUserListByUsername2Sex(@Param("username")String username, @Param("sex") int sex);
    14 
    15 }

    在 mapper 下新建 UserMappper.xml 用来写 sql 语句。因为测试,所以这里写一个简单的 sql 查询。

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE mapper
     3         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     4         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
     5 <mapper namespace="ssm.mapper.UserDao">
     6     <!-- 目的:为dao接口方法提供sql语句配置 -->
     7   <select id="queryUserListByUsername" parameterType="String" resultType="User">
     8       SELECT
     9             *
    10       FROM
    11             USER
    12       WHERE
    13             username = #{username}
    14   </select>
    15 
    16     <select id="queryUserListByUsername2Sex" resultType="User">
    17         SELECT
    18             *
    19         FROM
    20             USER
    21         WHERE
    22             username = #{username}
    23         AND sex = #{sex}
    24     </select>
    25 </mapper>

    其中有一个地方要注意 <mapper namespace="ssm.mapper.UserDao"> 映射位置 换成自己的,可能我们两不一样。

    这里有个小技巧特别要注意,一般开发中,我们都是先在把 sql 写完运行正确才放到这里面来,比如下图中,并且为了美观,复制 sql 语句前都会规范下 sql 语句,避免太乱。

    这里写图片描述

    ok! 写一个测试类 测试下。

     1 import org.junit.Test;
     2 import org.springframework.context.ApplicationContext;
     3 import org.springframework.context.support.ClassPathXmlApplicationContext;
     4 import ssm.dao.UserDao;
     5 import ssm.entity.User;
     6 
     7 import java.util.List;
     8 
     9 /**
    10  * Created by guozhaohui628@gmail.com on 2018/5/7
    11  * Description:
    12  */
    13 public class TestPratice {
    14     @Test
    15     public void A(){
    16         ApplicationContext ac = new ClassPathXmlApplicationContext("spring-mybatis.xml");
    17         UserDao userDao = ac.getBean(UserDao.class);
    18         List<User> userList = userDao.queryUserListByUsername2Sex("王五",1);
    19 //        List<User> userList = userDao.queryUserListByUsername("王五");
    20         System.out.println(userList.toString());
    21     }
    22 }

    这里写图片描述

    好的,到这一步,说明我们的 mybatis 和 spring 整合没问题。

    2.3 第三部分

    现在来写 spring-service.xml ,比较简单,就是扫描下 service 类包和配置事务。

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4        xmlns:context="http://www.springframework.org/schema/context"
     5        xmlns:tx="http://www.springframework.org/schema/tx"
     6        xsi:schemaLocation="http://www.springframework.org/schema/beans
     7     http://www.springframework.org/schema/beans/spring-beans.xsd
     8     http://www.springframework.org/schema/context
     9     http://www.springframework.org/schema/context/spring-context.xsd
    10     http://www.springframework.org/schema/tx
    11     http://www.springframework.org/schema/tx/spring-tx.xsd">
    12     <!-- 扫描service包下所有使用注解的类型 -->
    13     <context:component-scan base-package="ssm.service" />
    14 
    15     <!-- 配置事务管理器 -->
    16     <bean id="transactionManager"
    17           class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    18         <!-- 注入数据库连接池 -->
    19         <property name="dataSource" ref="dataSource" />
    20     </bean>
    21 
    22     <!-- 配置基于注解的声明式事务 -->
    23     <tx:annotation-driven transaction-manager="transactionManager" />
    24 </beans>
    spring + springmvc 整合 建立 spring-web ,里面内容比较少,只是扫描了 controller 用来保证前端控制器 DispatcherServlet 能够找到并进入相关方法中。 同时还配置了试图解析器 ViewResolve, 这样我们跳转视图时直接写 视图名称即可,不用写相对地址路径了。
    1     <!-- 3.配置jsp 显示ViewResolver -->
    2     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    3         <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
    4         <property name="prefix" value="/jsp/" />
    5         <property name="suffix" value=".jsp" />
    6     </bean>
    7 
    8     <!-- 4.扫描web相关的 controller -->
    9     <context:component-scan base-package="ssm.controller" />

    最后就是配置 web.xml。主要作用是 配置 前端控制器 DispatcherServlet 重点是拦截规则处理。这里我们是所有都拦截。其次是 刚才我们 书写的 三个 spring-*.xml 文件在这里配置启动。

     1  <!-- spring mvc servlet-->
     2   <servlet>
     3     <servlet-name>SpringMVC</servlet-name>
     4     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
     5     <init-param>
     6       <param-name>contextConfigLocation</param-name>
     7       <param-value>classpath:/spring-*.xml</param-value>
     8     </init-param>
     9   </servlet>
    10   <servlet-mapping>
    11     <servlet-name>SpringMVC</servlet-name>
    12     <!-- 此处也可以配置成 *.do *.action形式 -->
    13     <url-pattern>/</url-pattern>
    14   </servlet-mapping>

    然后就是日志和编码,对于当前的测试没啥作用,但是还是配置好吧

     1 <context-param>
     2     <param-name>log4jConfigLocation</param-name>
     3     <param-value>classpath:log4j.properties</param-value>
     4   </context-param>
     5 
     6   <!-- 编码过滤器 -->
     7   <filter>
     8     <filter-name>encodingFilter</filter-name>
     9     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    10     <init-param>
    11       <param-name>encoding</param-name>
    12       <param-value>UTF-8</param-value>
    13     </init-param>
    14   </filter>
    15   <filter-mapping>
    16     <filter-name>encodingFilter</filter-name>
    17     <url-pattern>/*</url-pattern>
    18   </filter-mapping>

    好的 终于搞完了,现在可以安心的写代码了。现在准备一个这样的 jsp 文件。

    这里写图片描述

     1 <%@ page language="java" contentType="text/html; charset=UTF-8"
     2     pageEncoding="UTF-8"%>
     3 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
     4 <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix="fmt"%>
     5 <%@ page isELIgnored="false" %>
     6 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     7 <html>
     8 <head>
     9 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    10 <title>查询商品列表</title>
    11 </head>
    12 <body> 
    13 <form action="${pageContext.request.contextPath}/items/queryitem.action" method="post">
    14 查询条件:
    15 <table width="100%" border=1>
    16 <tr>
    17 <td><input type="submit" value="查询"/></td>
    18 </tr>
    19 </table>
    20 商品列表:
    21 <table width="100%" border=1>
    22 <tr>
    23     <td>商品名称</td>
    24     <td>商品价格</td>
    25     <td>生产日期</td>
    26     <td>商品描述</td>
    27     <td>操作</td>
    28 </tr>
    29 <c:forEach items="${itemList }" var="item">
    30 <tr>
    31     <td>${item.name }</td>
    32     <td>${item.price }</td>
    33     <td>${item.createtime}</td>
    34     <td>${item.detail }</td>
    35     <td><a href="${pageContext.request.contextPath }/itemEdit.action?id=${item.id}">修改</a></td>
    36 </tr>
    37 </c:forEach>
    38 </table>
    39 </form>
    40 </body>
    41 
    42 </html>

    我们需要查询所有的 item 数据显示在上面。

    这里写图片描述

    首先写 ItemsDao

     1 import org.springframework.stereotype.Repository;
     2 import ssm.entity.Items;
     3 
     4 import java.util.List;
     5 
     6 /**
     7  * Created by guozhaohui628@gmail.com on 2018/5/8
     8  * Description:
     9  */
    10 @Repository
    11 public interface ItemsDao {
    12     public List<Items> queryAllItemsList();
    13 }

    对应的 ImtesMapper.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE mapper
     3         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     4         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
     5 <mapper namespace="ssm.dao.ItemsDao">
     6     <!-- 目的:为dao接口方法提供sql语句配置 -->
     7     <select id="queryAllItemsList" resultType="Items">
     8          SELECT
     9             *
    10         FROM
    11             items;
    12     </select>
    13 </mapper>

    书写 ItemsService 接口和 其实现类

     1 import ssm.entity.Items;
     2 
     3 import java.util.List;
     4 
     5 /**
     6  * Created by guozhaohui628@gmail.com on 2018/5/8
     7  * Description:
     8  */
     9 public interface ItemsService {
    10 
    11     List<Items> queryAllItemsList();
    12 
    13 }
     1 package ssm.service;
     2 
     3 import org.springframework.beans.factory.annotation.Autowired;
     4 import org.springframework.stereotype.Service;
     5 import ssm.dao.ItemsDao;
     6 import ssm.entity.Items;
     7 
     8 import java.util.List;
     9 
    10 /**
    11  * Created by guozhaohui628@gmail.com on 2018/5/8
    12  * Description:
    13  */
    14 @Service
    15 public class ItemsServiceImpl implements ItemsService {
    16 
    17     // 注入Service依赖
    18     @Autowired
    19     private ItemsDao itemsdao;
    20 
    21     @Override
    22     public List<Items> queryAllItemsList() {
    23         return itemsdao.queryAllItemsList();
    24     }
    25 }

    最后写 ItemsController

     1 import org.springframework.beans.factory.annotation.Autowired;
     2 import org.springframework.stereotype.Controller;
     3 import org.springframework.web.bind.annotation.RequestMapping;
     4 import org.springframework.web.servlet.ModelAndView;
     5 import ssm.entity.Items;
     6 import ssm.service.ItemsServiceImpl;
     7 
     8 import java.util.List;
     9 
    10 
    11 /**
    12  * Created by guozhaohui628@gmail.com on 2018/5/8
    13  * Description:
    14  */
    15 @Controller
    16 public class ItemsController {
    17 
    18 
    19     // 注入Service依赖
    20     @Autowired
    21     private ItemsServiceImpl itemsService;
    22 
    23     @RequestMapping(value = "items/queryitem.action")
    24     public ModelAndView itemsList(){
    25         ModelAndView mav = new ModelAndView();
    26         List<Items> itemsList = itemsService.queryAllItemsList();
    27         System.out.println(itemsList.toString());
    28         mav.addObject("itemList", itemsList);
    29         mav.setViewName("itemList");
    30         return mav;
    31     }
    32 }

    .jsp中的代码已经写好了,直接用就可以了。 我们要测试 要么直接点击这个地址,要么点击查询

    这里写图片描述

    这里写图片描述

    OK, 完事儿,写的比较细,所以比较长。希望对你有帮助~

    参考:
  • 相关阅读:
    WPF一步一脚印系列(1):万事起头难
    php设置时区
    关于我的几个博客
    php如何实现页面跳转
    穷人与富人的区别
    如何抓取关键字在百度搜索的排名
    我的博客园开通了
    在Foxmail中出现SSL连接错误应该如何解决
    javascript实现键盘按下回车时触发
    关于网站分页
  • 原文地址:https://www.cnblogs.com/aishangJava/p/10356153.html
Copyright © 2011-2022 走看看