使用Intellij IDEA整合Spring+Spring MVC+MyBitis

链接地址: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日发布

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容