链接地址:https://segmentfault.com/a/1190000008711738
本文参考:SSM框架-详细整合教程
主要记录了我的整合过程以及整合过程中遇到的错误,并增加了项目配置和部署的过程
刚开始接触到后端开发是在大二过后的暑假,那时候使用的框架搭配还是Spring+SpringMVC+iBitis(MyBitis的前身)。最近在准备面试看Spring的原理,由于以前的项目代码不在了,于是新建一个项目,参考教程重新整合了一遍SSM框架,并在这里进行一些记录。
1. 基本概念
1.1 Spring
Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。 简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
1.2 SpringMVC
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。
1.3 MyBitis
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(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
2. 开发环境
JDK1.8.0_111
Tomcat8
Intellij IDEA
本次整合的框架版本为
Spring 4.0.2 RELEASE
Spring MVC 4.0.2 RELEASE
MyBatis 3.2.6
3. 创建项目开整
3.1创建maven javaweb项目
File->New Project,勾选Create ...选择相应选项,点击Next
填写GroupId、ArtifactId和Version,这里的ArtifactId记住后面要用到。点击Next
点击Next
输入项目名称和目录,Project Format我选择的是.ipr ,点击Finish
至此一个maven web项目就创建成功了,会自动生成如下几个文件
3.2 Maven引入项目需要的JAR包
pom.xml
4.0.0pw.greatxiaohansimplessmwar1.0-SNAPSHOT4.0.2.RELEASE3.2.61.7.71.2.15junitjunit4.11testorg.springframeworkspring-core${spring.version}org.springframeworkspring-web${spring.version}org.springframeworkspring-oxm${spring.version}org.springframeworkspring-tx${spring.version}org.springframeworkspring-jdbc${spring.version}org.springframeworkspring-webmvc${spring.version}org.springframeworkspring-aop${spring.version}org.springframeworkspring-context-support${spring.version}org.springframeworkspring-test${spring.version}org.mybatismybatis${mybatis.version}org.mybatismybatis-spring1.2.2javaxjavaee-api7.0mysqlmysql-connector-java5.1.30commons-dbcpcommons-dbcp1.2.2jstljstl1.2log4jlog4j${log4j.version}com.alibabafastjson1.1.41org.slf4jslf4j-api${slf4j.version}org.slf4jslf4j-log4j12${slf4j.version}org.codehaus.jacksonjackson-mapper-asl1.9.13commons-fileuploadcommons-fileupload1.3.1commons-iocommons-io2.4commons-codeccommons-codec1.9simplessmorg.apache.maven.pluginsmaven-compiler-plugin3.5.11.71.7UTF-8
这里要注意一定要有war, 且simplessm以及simplessm这两个参数应当与之前填写的保持一致
3.3 Spring、SpringMVC与MyBitis整合
所有需要的Jar包引入之后,开始框架的整合。首先看一下按照我个人习惯建立的项目结构图:
3.3.1 新建JDBC属性文件
jdbc.properties
driver=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/simplessm?useUnicode=true&characterEncoding=utf-8username=rootpassword=111111#定义初始连接数initialSize=0#定义最大连接数maxActive=20#定义最大空闲maxIdle=20#定义最小空闲minIdle=1#定义最长等待时间maxWait=60000
3.3.2 新建log4j属性文件
log4j.properties
#定义LOG输出级别log4j.rootLogger=INFO,Console,File#定义日志输出目的地为控制台log4j.appender.Console=org.apache.log4j.ConsoleAppenderlog4j.appender.Console.Target=System.out#可以灵活地指定日志输出格式,下面一行是指定具体的格式log4j.appender.Console.layout = org.apache.log4j.PatternLayoutlog4j.appender.Console.layout.ConversionPattern=[%c] - %m%n#文件大小到达指定尺寸的时候产生一个新的文件log4j.appender.File = org.apache.log4j.RollingFileAppender#指定输出目录log4j.appender.File.File = logs/springmvcMybist/ssm.log#定义文件最大大小log4j.appender.File.MaxFileSize = 10MB#输出所以日志,如果换成DEBUG表示输出DEBUG以上级别日志log4j.appender.File.Threshold = ALLlog4j.appender.File.layout = org.apache.log4j.PatternLayoutlog4j.appender.File.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n
3.3.3 新建Spring和MyBitis整合所需的配置文件
spring-mybitis.xml
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-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
3.3.4 新建整合SpringMVC所需的配置文件
spring-mvc.xml
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">text/html;charset=UTF-8-->
-->
3.3.5 配置web.xml文件
web.xml
Archetype Created Web ApplicationcontextConfigLocationclasspath:spring-mybatis.xmlencodingFilterorg.springframework.web.filter.CharacterEncodingFiltertrueencodingUTF-8encodingFilter/*org.springframework.web.context.ContextLoaderListenerorg.springframework.web.util.IntrospectorCleanupListenerSpringMVCorg.springframework.web.servlet.DispatcherServletcontextConfigLocationclasspath:spring-mvc.xml1trueSpringMVC//index.html/index.jsp
至此已经完成了ssm框架的整合,接下来是一些测试代码,完成后进行项目的配置和部署
3.3.6 相关测试文件源码
1.数据库建表,在数据库中执行。文件放在src/main/java/SQL下备忘,可以不保存
user_t.sql
DROPTABLEIFEXISTS`user_t`;CREATETABLE`user_t`(`id`int(11)NOTNULLAUTO_INCREMENT,`user_name`varchar(40)NOTNULL,`password`varchar(255)NOTNULL,`age`int(4)NOTNULL,PRIMARYKEY(`id`)) ENGINE=InnoDB AUTO_INCREMENT=2DEFAULT CHARSET=utf8;/*Data for the table `user_t` */insertinto`user_t`(`id`,`user_name`,`password`,`age`)values(1,'测试','sfasgfaf',24);
2.新建index.jsp欢迎页和"User"页面,这里的User.jsp页面通过SpringMVC与后面要提到的Controller中的对象绑定
index.jsp
Hello World!23333
User.jsp
<%@pagelanguage="java"contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>测试${user.userName}
3.建立实体类、MyBitis映射文件以及Dao接口
User.java
packagepriv.xiaohan.ssm.model;importjava.util.Date;publicclassUser{privateInteger id;privateString userName;privateString password;privateInteger age;publicIntegergetId(){returnid; }publicvoidsetId(Integer id){this.id = id; }publicStringgetUserName(){returnuserName; }publicvoidsetUserName(String userName){this.userName = userName ==null?null: userName.trim(); }publicStringgetPassword(){returnpassword; }publicvoidsetPassword(String password){this.password = password ==null?null: password.trim(); }publicIntegergetAge(){returnage; }publicvoidsetAge(Integer age){this.age = age; }}
UserDao.java
packagepriv.xiaohan.ssm.dao;importpriv.xiaohan.ssm.model.User;publicinterfaceUserDao{intdeleteByPrimaryKey(Integer id);intinsert(User record);intinsertSelective(User record);UserselectByPrimaryKey(Integer id);intupdateByPrimaryKeySelective(User record);intupdateByPrimaryKey(User record);}
UserMapper.xml
id, user_name, password, ageselectfrom user_t where id = #{id,jdbcType=INTEGER}delete from user_t where id = #{id,jdbcType=INTEGER}insert into user_t (id, user_name, password, age) values (#{id,jdbcType=INTEGER}, #{userName,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR},
#{age,jdbcType=INTEGER})insert into user_tid,user_name,password,age,#{id,jdbcType=INTEGER},#{userName,jdbcType=VARCHAR},#{password,jdbcType=VARCHAR},#{age,jdbcType=INTEGER},update user_tuser_name = #{userName,jdbcType=VARCHAR},password = #{password,jdbcType=VARCHAR},age = #{age,jdbcType=INTEGER},where id = #{id,jdbcType=INTEGER}update user_t set user_name = #{userName,jdbcType=VARCHAR},
password = #{password,jdbcType=VARCHAR},
age = #{age,jdbcType=INTEGER}where id = #{id,jdbcType=INTEGER}
4.建立Service接口和实现类
IUserService.java
packagepriv.xiaohan.ssm.service;importpriv.xiaohan.ssm.model.User;/**
* Created by xiaohan on 2017/3/15.
*/publicinterfaceIUserService{publicUsergetUserByID(intid);}
UserService.java
packagepriv.xiaohan.ssm.service.impl;importorg.springframework.stereotype.Service;importpriv.xiaohan.ssm.dao.UserDao;importpriv.xiaohan.ssm.model.User;importjavax.annotation.Resource;importjava.util.List;importpriv.xiaohan.ssm.service.IUserService;@Service("userService")publicclassUserServiceimplementsIUserService{@ResourceprivateUserDao userdao;publicUsergetUserByID(intid){returnthis.userdao.selectByPrimaryKey(id); }}
5.建立Controller类和测试类
UserController.java
packagepriv.xiaohan.ssm.controller;importorg.springframework.web.bind.annotation.ResponseBody;importpriv.xiaohan.ssm.model.User;importorg.apache.log4j.Logger;importorg.springframework.stereotype.Controller;importorg.springframework.ui.Model;importorg.springframework.web.bind.annotation.RequestMapping;importjavax.annotation.Resource;importjavax.servlet.http.HttpServletRequest;importjava.util.List;importpriv.xiaohan.ssm.service.IUserService;@Controller@RequestMapping("/user")publicclassUserController{@ResourceprivateIUserService userService;@RequestMapping("/showUser")publicString toIndex(HttpServletRequest request, Model model) { int userId = Integer.parseInt(request.getParameter("id")); User user =this.userService.getUserByID(userId);//绑定对象到User.jspmodel.addAttribute("user", user);return"User"; }}
TestMyBatis.java
importjavax.annotation.Resource;importorg.apache.log4j.Logger;importorg.junit.Before;importorg.junit.Test;importorg.junit.runner.RunWith;importorg.springframework.test.context.ContextConfiguration;importorg.springframework.test.context.junit4.SpringJUnit4ClassRunner;importcom.alibaba.fastjson.JSON;importpriv.xiaohan.ssm.model.User;importpriv.xiaohan.ssm.service.IUserService;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations = {"classpath:spring-mybatis.xml"})publicclassTestMyBatis{privatestaticLoggerlogger =Logger.getLogger(TestMyBatis.class); @ResourceprivateIUserServiceuserService = null; @Testpublicvoid test() {Useruser = userService.getUserByID(1);System.out.println(user.getUserName());// logger.info("值:"+user.getUserName());logger.info(JSON.toJSONString(user)); }}
到这里项目的测试文件源码都已经完成了
4.项目配置和部署
4.1 File -> Project Structure,进入创建项目配置窗口
按下图方式配置项目
4.2 创建Tomcat容器实例,部署项目
点击右上角的三角角标Edit Configuration
点击左上角的”+“号,添加Tomcat Server ,Local
然后按下图配置
切换到Deployment,左下角添加Artifact...
至此项目的配置完成,启动Tomcat进行部署
启动成功后输入地址http://localhost:8080
看到首页,
输入地址:http://localhost:8080/user/sh...
看到”测试“表示项目整合成功!
5.整合中遇到的问题及解决办法
错误1 java.lang.IllegalStateException: Failed to load ApplicationContext
报这个异常java.lang.IllegalStateException: Failed to load ApplicationContext的时候,通常是因为applicationContent.xml里面的bean初始化失败的原因。
检查代码后发现是Mapper出现的错误导致,源码中已修正
进阶1 Controller直接输出,不经过User.jsp输出内容
1.修改Controller类,使用@ResponseBody注解
//直接在网页输出内容,适合写接口@ResponseBody@RequestMapping("/showUser")publicString toIndex(HttpServletRequest request, Model model) { int userId = Integer.parseInt(request.getParameter("id")); User user =this.userService.getUserByID(userId);//绑定对象到User.jspmodel.addAttribute("user", user);//return "User";return"这里直接输出:"+user.getUserName().toString(); }
这时候发现中文出现了乱码的情况,应该是编码的问题,查阅资料后发现只需在spring-mvc.xml配置文件内添加如下内容:
text/html;charset=UTF-8
放在下面这段代码的前面即可
(转载请注明出处:https://segmentfault.com/a/11...)
3月16日发布