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 ⼀样是⼀种编程思想,并不是某⼀种技术。
我们再来打个⽐⽅,在编程的时候,我们为了满⾜某个业务逻辑流程,通常需要⼀系列步骤。请看下⾯3 个具体业务的流程图:
图上可以看到,⽤户不管是查询余额、办理业务还是⼿机充值,都需要经过鉴权这个步骤,有没有想过可以把这个鉴权的代码是提取出来,不放到主流程⾥去呢,这就是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,源码如下:
del;
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 :im();
}
publicString getPassword() {
returnpassword;
}
publicvoidsetPassword(String password) {
this.password =password == null ? null :im();
}
}
主要作⽤就是数据的临时存储,这个 User 对象⼀般和数据库中的 User 表结构保持⼀致。
视图(View)
这就是⼀个普通的 HTML 页⾯,index.jsp,源码如下:
<html>
<head>
<title>HelloWorld</title>
</head>
<body>
欢迎${user.userName}!
</body>
</html>
需要说明的是,这⾥⽤到了EL 表达式,如:${userName}表⽰的就是由 Spring 控制器推送过来的变量。
控制器(Controller)
这就是 Spring 控制器,UserController.java,源码如下:
ller;
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;
del.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;
del.User;
public interfaceUserDAO {
int deleteByPrimaryKey(Integer id);
…
…
…
}
⾸先需要注意的是,这并不是⼀个 Class,⽽是⼀个 Interface,源码⾮常简单,主要作⽤通过⽅法名称就能理解:selectByPrimaryKey,通过关键字获取⽤户姓名。
那么,他是怎么做到的呢?
数据库映射(Mapper)
这时候就需要 MyBatis 的数据库映射配置,我们看下源码:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-////DTD Mapper 3.0//EN" "/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.hello.dao.UserDAO" >
<resultMap id="BaseResultMap" type="del.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 框架中最基本的应⽤,如果需要增加不同的表或者业务,这⼏个⽂件⼀个都不能少。当然,如果你打算从头开始搭建框架,你就必须关注以下⼏个配置⽂件:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论