SSM项目搭建及源码

SSM 框架简介
SSM 框架,是 Spring + Spring MVC + MyBatis 的缩写,这个是继 SSH 之后,目前比较主流的 Java EE 企业级框架,适用于搭建各种大型的企业级应用系统。

Spring 简介
Spring 是一个开源框架,Spring 是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作 Expert One-On-One J2EE Development and Design 中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。Spring 使用基本的 JavaBean 来完成以前只可能由 EJB 完成的事情。然而,Spring 的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何 Java 应用都可以从 Spring 中受益。 简单来说,Spring 是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

控制反转
即本来你该做的事情 你不去做了,让系统去做,比如,你获取一个对象的时候,往往需要new出实例来,如果用了控制反转,那这件事情 就不需要你做了,你只需要在配置文件xml中配置好,系统就帮你new,控制反转也叫依赖注入,就是把该用到的东西提前注入进去,下次直接用 而不是每次都new

打个比方,你晚上想约个妹子去看电影,假设这个妹子是一个类(温柔、善良、小鸟依人),那么你需要实例化她,在 JAVA 中,通常的做法就是 new 一个类,让她变成一个实体的对象。然后,你跟她约了时间、地点,说要请客吃饭,然后用尽你浑身解数,妹子终于答应要和你去看电影了。看完电影之后,你还要送妹子回家,确保安全。当然,这一个步骤一般是由 JVM 的垃圾回收机制来处理,如果你没有主动及时送妹子回家,当妹子数量很多的时候,有可能会导致内存溢出,系统宕机。
而如果你用了 Spring,过程将会是这样的,你告诉 Spring框架你晚上 7 点要和一个温柔、善良、小鸟依人般的妹子去看电影,那么你 7 点准时来到电影院,此时,你会发现,Spring 已经帮你把妹子送来了,完全就是你定义的那个类型。你们愉快地看完电影,然后你可以直接回家,Spring 又会帮你把妹子接走。你完全不用关心后续的事情。
面向切面
首先,需要说明的一点,AOP 只是 Spring 的特性,它就像OOP 一样是一种编程思想,并不是某一种技术。
我们再来打个比方,在编程的时候,我们为了满足某个业务逻辑流程,通常需要一系列步骤。请看下面个具体业务的流程图:

图上可以看到,用户不管是查询余额、办理业务还是手机充值,都需要经过鉴权这个步骤,有没有想过可以把这个鉴权的代码是提取出来,不放到主流程里去呢,这就是AOP 的作用了,有了 AOP,你写代码时不要把这个验证用户步骤写进去,即完全不考虑用户鉴权,你写完之后,在另一个地方,写好验证用户的代码,然后告诉Spring 你要把这段代码加到哪几个地方,Spring 就会帮你加过去,而不要你自己 Copy 过去,这里还是两个地方,如果你有多个控制流呢,这个写代码的方法可以大大减少你的时间,不过 AOP 的目的不是这样,这只是一个副作用,真正目的是,你写代码的时候,事先只需考虑主流程,而不用考虑那些不重要的流程,懂 C 的都知道,良好的风格要求在函数起始处验证参数,如果在 C 上可以用AOP,就可以先不管校验参数的问题,事后使用 AOP 就可以隔山打牛的给所有函数一次性加入校验代码,而你只需要写一次校验代码。不知道 C 的没关系,举一个通用的例子,经常在 debug 的时候要打 log 吧,你也可以写好主要代码之后,把打log 的代码写到另一个单独的地方,然后命令 AOP 把你的代码加过去,注意 AOP 不会把代码加到源文件里,但是它会正确的影响最终的机器代码。就像在上帝视角的高纬度空间,把你需要的步骤像切面般的插入到特定的时空里面

Spring MVC 
Spring MVC 属于 SpringFramework 的后续产品,已经融合在 Spring Web Flow 里面,它原生支持的 Spring 特性,让开发变得非常简单规范。SpringMVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。

MyBatis 简介
MyBatis 本是apache 的一个开源项目 iBatis, 2010 年这个项目由 apache software foundation 迁移到了 google code,并且改名为 MyBatis 。MyBatis是一个基于 Java 的持久层框架。iBATIS 提供的持久层框架包括 SQL Maps 和Data Access Objects(DAO)MyBatis 消除了几乎所有的JDBC 代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的POJOs(PlainOld Java Objects,普通的 Java 对象)映射成数据库中的记录。可以这么理解,MyBatis 是一个用来帮你管理数据增删改查的框架。

源码解析
我们建了一个 helloSSM 工程,这个工程整合了 SSM 框架,用了 MySQL 数据库(当然如果要改成其他数据库,只是一条配置语句的问题)

项目结构

遵循了MVC 结构,可以看到有模型(Model)、视图(View,下面的 src 文件夹)、控制器(Controller),而Mapping MyBatis 用来操作数据库的映射文件。

 模型(Model
这是一个普通 JAVA 对象(POJO),User.java,源码如下:

packagecom.hello.model;

publicclass User{
    privateInteger id;
    privateString userName;
    privateString password;
    publicInteger getId() {
        returnid;
    }
    publicvoidsetId(Integer id) {
        this.id =id;
    }
    publicString getUserName() {
        returnuserName;
    }
    publicvoidsetUserName(String userName) {
        this.userName =userName == null ? null :userName.trim();
    }
    publicString getPassword() {
        returnpassword;
    }
    publicvoidsetPassword(String password) {
        this.password =password == null ? null :password.trim();
    }
}

主要作用就是数据的临时存储,这个 User 对象一般和数据库中的 User 表结构保持一致。

视图(View
这就是一个普通的 HTML 页面,index.jsp,源码如下:

<html>
  <head>
    <title>HelloWorld</title>
  </head>
  <body>
   欢迎${user.userName}!
  </body>
</html>

需要说明的是,这里用到了EL 表达式,如:${userName}表示的就是由 Spring 控制器推送过来的变量。

控制器(Controller
这就是 Spring 控制器,UserController.java,源码如下:

packagecom.hello.controller;

importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.stereotype.Controller;
importorg.springframework.web.bind.annotation.PathVariable;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.servlet.ModelAndView;

importcom.hello.dao.UserDAO;
importcom.hello.model.User;

@Controller
@RequestMapping(value="/user")
public classUserController{
    @Autowired
    private UserDAO userDao;
@RequestMapping(value= "/{users}.do")
publicModelAndView findUser(@PathVariable String users){
    int id = Integer.parseInt(users);
    User user = userDao.selectByPrimaryKey(id);
    ModelAndView mv = new ModelAndView();
    mv.setViewName("index");
    mv.addObject("user", user);
    return mv;
    }
}

可以看到,首先它引入了SpringFramework 的一些包,然后用注解的方式在代码中来声明这是一个控制器@Controller,用@RequestMapping来指定了这个控制器的入口,用@Autowired来自动实例化这个 UserDao 的对象(这就是刚才说到的控制反转),而第二个@RequestMapping表示的是这个方法的入口。最后,这个控制器通过返回 ModelAndView 对象到视图(回忆一下刚才的那个 Spring MVC 工作流程图)。

 数据访问对象(DAO
上述控制器源码中,有一条关键语句,用来从数据库读取数据:

User user =userDao.selectByPrimaryKey(id);

这里用到了UserDao 这个接口,我们看下源码:

packagecom.hello.dao;

importcom.hello.model.User;

public interfaceUserDAO {
    int deleteByPrimaryKey(Integer id);
        …
        …
        …
}

首先需要注意的是,这并不是一个 Class,而是一个 Interface,源码非常简单,主要作用通过方法名称就能理解:selectByPrimaryKey,通过关键字获取用户姓名。
那么,他是怎么做到的呢?

数据库映射(Mapper
这时候就需要 MyBatis 的数据库映射配置,我们看下源码:

<?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.hello.dao.UserDAO" >
  <resultMap id="BaseResultMap" type="com.hello.model.User" >
    <id column="id" property="id" jdbcType="INTEGER" />
    <result column="user_name" property="userName" jdbcType="VARCHAR" />
    <result column="password" property="password" jdbcType="VARCHAR" />
  </resultMap>
  <sql id="Base_Column_List" >
    id, user_name, password
  </sql>
  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
    select 
    <include refid="Base_Column_List" />
    from user
    where id = #{id,jdbcType=INTEGER}
  </select>
  …
  …
  …
</mapper>

可以看到,这是一个XML 文件,在<select>标签中我们看到了熟悉的SQL 语句:

    select
    <include refid="Base_Column_List"/>
    from user
    where id = #{id,jdbcType=INTEGER}

这里的#{id,jdbcType=INTEGER}就是由控制器传入的变量。这个映射的作用是,把从数据库中取出的数据,映射到 User 类中,这就是刚才说的为什么 User 对象要和数据库中 user 表的结构保持一致的原因了。

最后

刚才说的这几个文件源码,是 SSM 框架中最基本的应用,如果需要增加不同的表或者业务,这几个文件一个都不能少。当然,如果你打算从头开始搭建框架,你就必须关注以下几个配置文件:


config.properties为基本的配置文件,主要用于配置数据库账号、密码等一些通用的定义
log4j.properties为 Log for J 日志的配置文件,这是一个常用的 Java 日志输出工具,也可以换成其他的
spring-mvc.xml为Spring以及 Spring MVC 的配置文件
spring-mybatis.xml就是 MyBatis 和 Spring 整合的配置文件了,也是必不可少的(其中还整合了数据库连接配置,如有需要,可以单独一个.Xml文件配置)
最后,再说一下,JavaEE 工程中,所有请求的入口来源都是web.xml这个文件,通常,我们使用了 Spring MVC 时,都需要指定把所有的请求丢给 Spring 控制器来处理。
web.xml具体配置可下载源代码查看。


原文出自:https://hacpai.com/article/1470110280017

其中按实际搭建过程略有删改!

项目源码:http://download.csdn.net/download/qq_37303736/10224362

Mybatis实体类生成:http://download.csdn.net/download/qq_37303736/10224328

 

  • 12
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值