一步一步教你用IntelliJ IDEA 搭建SSM框架(1)
1.基本概念
SSM框架指:Spring MVC + Spring + MyBatis
Spring MVC是一种web层mvc框架,用于替代servlet,处理|响应请求,获取表单参数,表单校验等
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。 (摘自百度百科)。
2.开发环境
安装java jdk,MySQL,IntelliJ IDEA,Tomcat,Maven
这是我电脑上的java和MySQL版本
Tomcat 我用的
IntelliJ IDEA我用的
Maven我用的3.6.0
3.搭建SSM框架
打开IntelliJ IDEA,选择 File》Project》New Project ,左侧栏选择 Maven ,右侧Project SDK 会是默认的java,选择Create from archetype,选择下图中的2
点击上图Next,进入下图,GroupId和ArtifactId是Maven项目的坐标,保证项目的唯一性。如果项目上传到了maven本地仓库去,必须根据这两个id去查找项目。
GroupId 一般分为多段,这里只说两段,第一段为域,第二段为公司名称。域包括:org、com、cn等,其中org为非营利组织,com为商业组织。
ArtifactId实际对应项目的名称,就是项目根目录的名称。这样说起来比较抽象,下面举例说明:
例如下图中:GroupId是cn.only,它的域是cn(因为cn表示中国),个人项目所以为only,ArtifactId是helloworld。 GroupId实际对应JAVA的包的结构,是main目录里java的目录结构。ArtifactId实际对应项目的名称。
点击上图Next,进入下图,选择本地Maven的位置,我的Maven版本是3.6.0
点击上图Next,进入下图,选择项目的存放地址,如下图,注意Project location中一定要有项目名字,项目名称默认
点击上图Finish,IntelliJ IDEA右下角弹窗如下图:
点击Enable Auto-Import,以后更改pom文件后就会自动下载依赖包了,所以点击Enable Auto-Import。
等待几分钟,项目正在下载相关依赖包,下载完毕以后,项目的目录结构如下图:
.idea:IntelliJ IDEA 在本项目中的配置,可以删掉,删掉后打开项目要重新配置。
src:存放项目代码
pom.xml:maven的配置文件,需要什么jar包,在里面添加依赖,maven会自动下到本地仓库。
现在构建SSM项目结构:
在src下建test文件夹,用来放测试文件,在test文件夹下建java和resources文件夹:
选择test的下的java文件夹,鼠标右键选择Mark Directory as》Test Sources Root
选择test的下的resources文件夹,鼠标右键选择Mark Directory as》Test Resources Root
在main文件夹下建java和resources文件夹:
选择main的下的java文件夹,鼠标右键选择Mark Directory as》Sources Root
选择main的下的resources文件夹,鼠标右键选择Mark Directory as》Resources Root
在src》main》java文件夹下建package,鼠标选择java文件夹,右键选择New》Package,建Package,名字就是上面GroupId,为cn.only
在cn.only下建4个Package:controller:用来放前台url映射文件,dao用来放与数据库的接口文件,entity用来放实体类文件,service用来放自己定义的接口
鼠标选择java,右键选择New》Package,建Package,名字为cn.only.controller,controller Package添加成功如下图
继续鼠标选择java,右键选择New》Package,建Package,名字为cn.only.dao,dao Package添加成功如下图
entity和service的添加方法一样如上,名字为cn.only.entity和cn.only.service,添加成功,如下图
src》main》resources下添加两个文件夹: spring和sqlmap,spring下添加spring的配置文件applicationContext.xml
src》main》resources下再添加四个配置文件:generator.properties ,generatorConfig.xml ,jdbc.properties 和 log4j.properties
generator.properties和generatorConfig.xml :用来配置mybatis
jdbc.properties :配置数据库相关信息
log4j.properties:配置日志
resources的目录结构如下图:
src》main》webapp下新建文件夹:js ,css,images 用来存放前端资源
src》main》webapp》WEB-INF下新建views文件夹,jsp页面放在这里。
webapp 的目录结构如下图:
整个项目的目录已经构建好,如下图:
下面开始配置项目
根目录下的pom.xml:POM是项目对象模型(Project Object Model)的简称,它是Maven项目中的文件,使用XML表示,名称叫做pom.xml。该文件用于管理:源代码、配置文件、开发者的信息和角色、问题追踪系统、组织信息、项目授权、项目的url、项目的依赖关系等。在Maven中,project可以什么都没有,甚至没有代码,但是必须包含pom.xml文件。
打开pom.xml,会发现已经默认有一些配置了,下面是我的pom.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0modelVersion> <groupId>cn.onlygroupId> <artifactId>helloworldartifactId> <version>1.0-SNAPSHOTversion> <packaging>warpackaging> <name>helloworld Maven Webappname> <url>http://www.example.comurl> <properties> <project.build.sourceEncoding>UTF-8project.build.sourceEncoding> <maven.compiler.source>1.7maven.compiler.source> <maven.compiler.target>1.7maven.compiler.target> <spring.version>4.2.5.RELEASEspring.version> <mybatis.version>3.2.4mybatis.version> <slf4j.version>1.6.6slf4j.version> <log4j.version>1.2.12log4j.version> properties> <dependencies> <dependency> <groupId>junitgroupId> <artifactId>junitartifactId> <version>4.11version> <scope>testscope> dependency> <dependency> <groupId>org.springframeworkgroupId> <artifactId>spring-coreartifactId> <version>${spring.version}version> dependency> <dependency> <groupId>org.springframeworkgroupId> <artifactId>spring-webartifactId> <version>${spring.version}version> dependency> <dependency> <groupId>org.springframeworkgroupId> <artifactId>spring-oxmartifactId> <version>${spring.version}version> dependency> <dependency> <groupId>org.springframeworkgroupId> <artifactId>spring-txartifactId> <version>${spring.version}version> dependency> <dependency> <groupId>org.springframeworkgroupId> <artifactId>spring-jdbcartifactId> <version>${spring.version}version> dependency> <dependency> <groupId>org.springframeworkgroupId> <artifactId>spring-webmvcartifactId> <version>${spring.version}version> dependency> <dependency> <groupId>org.springframeworkgroupId> <artifactId>spring-aopartifactId> <version>${spring.version}version> dependency> <dependency> <groupId>org.springframeworkgroupId> <artifactId>spring-context-supportartifactId> <version>${spring.version}version> dependency> <dependency> <groupId>org.springframeworkgroupId> <artifactId>spring-testartifactId> <version>${spring.version}version> dependency> <dependency> <groupId>org.mybatisgroupId> <artifactId>mybatisartifactId> <version>${mybatis.version}version> dependency> <dependency> <groupId>org.mybatisgroupId> <artifactId>mybatis-springartifactId> <version>1.2.2version> dependency> <dependency> <groupId>mysqlgroupId> <artifactId>mysql-connector-javaartifactId> <version>5.0.8version> dependency> <dependency> <groupId>javax.servletgroupId> <artifactId>jstlartifactId> <version>1.2version> dependency> <dependency> <groupId>javax.servlet.jspgroupId> <artifactId>jsp-apiartifactId> <version>2.2.1-b03version> <scope>providedscope> dependency> <dependency> <groupId>javax.servletgroupId> <artifactId>servlet-apiartifactId> <version>2.5version> <scope>providedscope> dependency> <dependency> <groupId>com.fasterxml.jackson.coregroupId> <artifactId>jackson-coreartifactId> <version>2.7.1version> dependency> <dependency> <groupId>com.fasterxml.jackson.coregroupId> <artifactId>jackson-annotationsartifactId> <version>2.7.1version> dependency> <dependency> <groupId>com.fasterxml.jackson.coregroupId> <artifactId>jackson-databindartifactId> <version>2.7.1version> dependency> <dependency> <groupId>net.sf.json-libgroupId> <artifactId>json-libartifactId> <version>2.4version> <classifier>jdk15classifier> dependency> <dependency> <groupId>commons-langgroupId> <artifactId>commons-langartifactId> <version>2.4version> dependency> <dependency> <groupId>commons-logginggroupId> <artifactId>commons-loggingartifactId> <version>1.1version> dependency> <dependency> <groupId>commons-poolgroupId> <artifactId>commons-poolartifactId> <version>1.5.6version> dependency> <dependency> <groupId>commons-dbcpgroupId> <artifactId>commons-dbcpartifactId> <version>1.4version> dependency> <dependency> <groupId>commons-beanutilsgroupId> <artifactId>commons-beanutilsartifactId> <version>1.8.3version> dependency> <dependency> <groupId>commons-httpclientgroupId> <artifactId>commons-httpclientartifactId> <version>3.1version> dependency> <dependency> <groupId>commons-collectionsgroupId> <artifactId>commons-collectionsartifactId> <version>3.1version> dependency> <dependency> <groupId>commons-codecgroupId> <artifactId>commons-codecartifactId> <version>1.9version> dependency> <dependency> <groupId>javax.annotationgroupId> <artifactId>jsr250-apiartifactId> <version>1.0version> dependency> <dependency> <groupId>net.sf.ezmorphgroupId> <artifactId>ezmorphartifactId> <version>1.0.6version> dependency> <dependency> <groupId>javax.activationgroupId> <artifactId>activationartifactId> <version>1.1version> dependency> <dependency> <groupId>taglibsgroupId> <artifactId>standardartifactId> <version>1.1.2version> dependency> <dependency> <groupId>log4jgroupId> <artifactId>log4jartifactId> <version>${log4j.version}version> dependency> <dependency> <groupId>org.slf4jgroupId> <artifactId>slf4j-apiartifactId> <version>${slf4j.version}version> dependency> <dependency> <groupId>org.slf4jgroupId> <artifactId>slf4j-log4j12artifactId> <version>${slf4j.version}version> dependency> <dependency> <groupId>commons-fileuploadgroupId> <artifactId>commons-fileuploadartifactId> <version>1.3.1version> dependency> <dependency> <groupId>commons-iogroupId> <artifactId>commons-ioartifactId> <version>2.4version> dependency> dependencies> <build> <finalName>hellofinalName> <pluginManagement> <plugins> <plugin> <artifactId>maven-clean-pluginartifactId> <version>3.1.0version> plugin> <plugin> <artifactId>maven-resources-pluginartifactId> <version>3.0.2version> plugin> <plugin> <artifactId>maven-compiler-pluginartifactId> <version>3.8.0version> plugin> <plugin> <artifactId>maven-surefire-pluginartifactId> <version>2.22.1version> plugin> <plugin> <artifactId>maven-war-pluginartifactId> <version>3.2.2version> plugin> <plugin> <artifactId>maven-install-pluginartifactId> <version>2.5.2version> plugin> <plugin> <artifactId>maven-deploy-pluginartifactId> <version>2.8.2version> plugin> plugins> pluginManagement> <plugins> <plugin> <groupId>org.mybatis.generatorgroupId> <artifactId>mybatis-generator-maven-pluginartifactId> <version>1.3.2version> <configuration> <configurationFile>src/main/resources/generatorConfig.xmlconfigurationFile> <verbose>trueverbose> <overwrite>trueoverwrite> configuration> <executions> <execution> <id>Generate MyBatis Artifactsid> <goals> <goal>generategoal> goals> execution> executions> <dependencies> <dependency> <groupId>org.mybatis.generatorgroupId> <artifactId>mybatis-generator-coreartifactId> <version>1.3.2version> dependency> dependencies> plugin> plugins> build> project>
配置applicationContext.xml,我的配置如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd" > <context:component-scan base-package="cn.only"/> <mvc:annotation-driven /> <mvc:resources location="/images/" mapping="/images/**"/> <mvc:resources location="/css/" mapping="/css/**"/> <mvc:resources location="/js/" mapping="/js/**"/> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="mappingJacksonHttpMessageConverter"/> list> property> bean> <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>application/json;charset=UTF-8value> list> property> bean> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/WEB-INF/views/" /> <property name="suffix" value=".jsp" /> bean> <bean id = "propertyConfigurer" class = "org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:jdbc.propertiesvalue> list> property> bean> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${username}"/> <property name="password" value="****"/> <property name="initialSize" value="1"/> <property name="maxActive" value="100"/> <property name="maxIdle" value="5"/> <property name="maxWait" value="80000"/> bean> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> bean> <mvc:interceptors> <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" /> mvc:interceptors> beans>
配置jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver #test为我本地的数据库名 jdbc.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC username=root #下面输入自己数据库的密码 password=***** #定义初始连接数 initialSize=0 #定义最大连接数 maxActive=20 #定义最大空闲 maxIdle=20 #定义最小空闲 minIdle=1 #定义最长等待时间 maxWait=60000
注意:上面的代码中如果没有serverTimezone=UTC,代码运行会报错
配置log4j.properties
### set log levels ###
log4j.rootLogger = INFO,D
###输出到控制台###
log4j.logger.toConsole=debug,stdout
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern =%d{yyyy-MM-dd HH\:mm\:ss} [%5p] - %c -%F(%L) -%m%n
### 输出到日志文件 ###
## 其中File 可以采用绝对路径 亦可以采用相对路径 catalina.home 是tomcat目录 如果没有logs文件夹 将会报错 ##
## 更加倾向于将日志文件放在 tomcat的日志目录下${catalina.home}/logs/salesmanb2bError.log ##
## 绝对路径如:e:/salesmanb2bError.log ##
log4j.logger.daily=INFO,D
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = ${catalina.home}/logs/helloworld/helloworld.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = INFO
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern =%d{yyyy-MM-dd HH\:mm\:ss} [%5p] - %c -%F(%L) -%m%n
##log4j.logger.org.apache.ibatis=debug,stdout
##log4j.logger.java.sql=debug,stdout
配置web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <display-name>helloworlddisplay-name> <filter> <filter-name>encodingFilterfilter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class> <init-param> <param-name>encodingparam-name> <param-value>UTF-8param-value> init-param> <init-param> <param-name>forceEncodingparam-name> <param-value>trueparam-value> init-param> filter> <filter-mapping> <filter-name>encodingFilterfilter-name> <url-pattern>/*url-pattern> filter-mapping> <servlet> <servlet-name>springServletservlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class> <init-param> <param-name>contextConfigLocationparam-name> <param-value> classpath:spring/applicationContext.xmlparam-value> init-param> <load-on-startup>1load-on-startup> servlet> <servlet-mapping> <servlet-name>springServletservlet-name> <url-pattern>/url-pattern> servlet-mapping> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener listener-class> listener> <servlet-mapping> <servlet-name>defaultservlet-name> <url-pattern>*.mdurl-pattern> servlet-mapping> <context-param> <param-name>contextConfigLocationparam-name> <param-value> classpath:spring/applicationContext.xmlparam-value> context-param> <welcome-file-list> <welcome-file>/WEB-INF/index.jspwelcome-file> welcome-file-list> <session-config> <session-timeout>600session-timeout> session-config> web-app>
最后配置Tomcat,配置好Tomcat代码就可以跑起来了。选择Add Configuration...》弹出配置窗口,如下图
点击上图红框中的+,选择Tomcat Server》Local,弹出窗口,如下图,
配置Application server,在上图中选择红框中的configure...,弹出窗口如下图,选择Tomcat的安装路径,配置好Tomcat。
配置Deployment,如下图,
上图中,点击+,选择Artifact...,弹窗如下图,
上图中选择红框中内容,点击OK,如下图:
点击上图OK,Tomcat配置完毕。
如上图,点击绿色三角形,运行程序。
运行结果如下:
程序正常启动,spring mvc已经搭建好,下一篇文章配置mybatis-geneator,这是一款mybatis自动代码生成工具。
本文参照这篇文章写的:https://www.cnblogs.com/toutou/p/9015126.html#_nav_0,