现在都流行springboot了,大部分都给你配合了了,可以快速开发。但是今天我们回顾一下ssm的搭建,其实也挺简单的,比刚入门那会觉得简单多了。
这个先讲几点:
1.开始搭建前,idea 自己要配置maven 和tomcat和jdk ,这里就不讲了。
2.为了简化配置,我们按照“约定优于配置”的原则(这种原则在sprigboot项目里面特别明显),启动项目时,项目有个文件”web.xml”,这个加载时,会在classpath目录下默认加载一些特定文件名的文件然后把他们配置到项目里面去:
比如spring的xml配置文件 (除了applicationContext的路径在classpath的WEB-INF 下,其他都是classpath 下,只要放在这些路径下,就不用再web.xml 里面引入了):‘applicationContext.xml’; 日志配置文件:’logback.xml’;
还有配置mybatis 逆向工程时,maven
的generator插件会默认加载classpath下的‘generatorConfig.xml’
文件;所以我们就在classpath新建这些文件名的文件就好了,不然另外新建文件夹放这些配置文件又要多了一些配置。
3.在xml里面配置文件是最后不要复制粘贴,自己多写几遍然后弄明白他的作用,写配置的时候 先写标签会出现提示,然后在写相关类名或者属性就会出现提示,如果没有出现就是2中情况,一种xml里面标签没有引入相关xmlns和xsi的文件,一个就是pom里面没有引入相关的依赖,有遇到一些情况命名有依赖了直接写类名也没显示,就要从包名开始写了。。不懂为什么。
4.配置的时候会出现填写路径的,会有个‘classpath’,这个是什么意思呢,项目启动的时候会把项目里面的java文件编译成’.class’文件和资源文件放在一个‘classes’里面,这个就是’classpath’ 路径:
比如,下图我们的项目里面 java和resources 就是’classpath’路径,前提java文件夹被设置为根目录,resources被设置为资源目录,这个下面会讲:
从项目生产的编译文件来看:
配置里面所有的包名,类名地址也是在classpath 下。
接下来开始搭一个有日志系统的项目,其他有用到在自己加进去,这样才能织带哪些功能要配什么:
**一.新建ssm项目**
1.左上角:File–new–Project:
如果有配置maven了那一路next 就可以了
原始的项目结构如下,只有一个webapp的包:
所以我们要在main包下新建java和resources的包:main包右键–new -Directory
接下来把java文件设置为根目录,resources设置为资源目录,这样这2个文件夹下面的文件才能被项目识别,然后以后配置文件中出现’classpath’ ,这个就是java和resources的路径了:
看变颜色了就对了。然后在java里面新建包com.ssm,然后在这个包下面在新建Controller,Service,Model,Dao 包,resources 新建mapper包,如下:
二.配置web.xml和springmvc 文件
项目开始运行是执行web.xml 文件的,根据里面的配置再去加载相关配置,所以我们先配置这个文件,这个比较简单:
在开始之前先打开pom.xml 文件把maven编译的jdk版本改成1.8,我们项目依赖1.8,不懂这边为什么默认1.7,然后设置spring和mybatis的版本,我们下面的依赖要引用,(jar包版本的搜索可以上这个网站:http://mvnrepository.com/):
然后我们要新建spring的xml文件就要引入一个‘spring-context’依赖不然没选项出现:
`
<!--//导入这个包,新建spring的xml文件是才有会选择项:spring config,这个就是spring的xml格式-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>`
这里${}这里就是引入properties里面的版本
这样就可以新建spring的xml文件了
其他spring包也导进来,不然配置xml文件时导入不了相关类:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
下面遇到其他spring包,我们在导入。
打开webapp–WEB-INF–web.xml
便签加载顺序是这样的:
context-param->Listener->filter->Servlet(同类级别按照顺序执行)
所以一开始进来会默认先加载 classpath 下的applicationContext.xml文件去构造sping容器 和和去读日志文件’logback.xml’, 文件名是固定的, 这2个都在标签和 下所以会先加载
`
所以看下面,web.xml 加载时先加载spring的配置文件。
contextConfigLocation
classpath:applicationContext.xml
<!--2.spring的监听器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--3.过滤器,编码格式-->
<filter>
<filter-name>Encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--4.springMVC的核心控制-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>`
最后设置个欢迎页面,这个就是项目一打开会显示的,不用填路径。这样等下可以直接在这个页面做测试了
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
这里我们要新建’springmvc.xml’文件,这里基本就配置好了,很简单。
接下来就要配置springmvc的文件。
跟新建applicationContext.xml和logback.xml一样,在resources 下新建文件springmvc.xml 文件:
springmvc.xml
为了能显示便签,需要先在 里面计入一个xmlns 和xsi的地址如(注意:xsi 里面只有一个引号”“,所有的http地址都要放在里面,并用逗号隔开):
xmlns:mvc="http://www.springframework.org/schema/mvc"
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
完整的如下:
<?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:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd">
这个文件里面就配置4个东西
1..前端请求链接进来后,第一件事情就是分发请求给对应的Controller,所以我们要让注解生效,这里需要让Controller层的注解生效,如@Controller等,所以配置扫描Controller层的包,这样这个包下所有的注解就会被扫描然后注入到bean:
2.前端请求链接进来后,第一件事情就是分发请求给对应的Controller,请求到达具体哪里@RequestMapping的方法里面处理,这个时候就要处理参数绑定,提供处理数据的相关功能如:@NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持读写XML的支持(JAXB)和读写JSON的支持(默认Jackson)等功能:
所以我们在配置文件里面加入 mvc的注解驱动:
<mvc:annotation-driven/>
这个的具体作用如下,了解下即可:
Spring
3.0.x中使用了mvc:annotation-driven后,默认会帮我们注册默认处理请求,参数和返回值的类,其中最主要的两个类:DefaultAnnotationHandlerMapping
和 AnnotationMethodHandlerAdapter
,分别为HandlerMapping的实现类和HandlerAdapter的实现类,从3.1.x版本开始对应实现类改为了RequestMappingHandlerMapping和RequestMappingHandlerAdapter。HandlerMapping的实现类的作用
实现类RequestMappingHandlerMapping,它会处理@RequestMapping 注解,并将其注册到请求映射表中。HandlerAdapter的实现类的作用
实现类RequestMappingHandlerAdapter,则是处理请求的适配器,确定调用哪个类的哪个方法,并且构造方法参数,返回值,并提供了相关处理数据的支持:@NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持读写XML的支持(JAXB)和读写JSON的支持(默认Jackson)等功能
所以这个配置的作用具体如下:
主要的作用如下:可配置的ConversionService(方便进行自定义类型转换) 支持用@NumberFormat格式化数字类型字段
支持用@DateTimeFormat格式化Date,Calendar以及Joda Time字段( 如果classpath有Joda
Time的话 ) 支持@Valid的参数校验( 如果JSR-303相关provider有在classpath的话 )
支持@RequestBody/@ResponseBody注解的XML读写( 如果JAXB在classpath的话 )
支持@RequestBody/@ResponseBody注解的JSON读写( 如果Jackson在classpath的话
3.请求的文件分为2种,一个是处理逻辑的,一直是响应静态文件的,刚才我们在web.xml ,springmvc种 里面设置了拦截了所有的请求,这种符合restful风格的url,不会出现类似于’.html’,’.do’这样的请求。但是这里我们请求静态文件,比如前端图片 src 里面要请求我们的图片信息,这样就会进入到我们的Controller里面,但是我们要直接返回静态文件给他们,这个时候我们要配个个东西类响应静态文件:
<mvc:default-servlet-handler/>
4.最后一种情况可以配置也可以不用配置,配置是为了方便。
请求进来处理完后,如果不是ajax请求的话,一般我们都要返回一个页面,返回页面我们要写完整的页面路径,一般页面都放在WEB-INF 里面(这样链接不能直接访问,等先进来Controller 里面在跳转,我们的欢迎页面index.jsp 就是放在外面所以可以直接写链接读取),比如有个页面result.jsp ,放在WEB-FIN 包下的view包里面,那我们在Controller里面要 ‘return “/WEB-INF/view/result.jsp” ’ ,如果每个页面返回都这样写就很麻烦,所以我们可以把固定的路径和格式设置为前后缀,这样 每次返回文件名就行了,如: ‘return “result” ‘就行了,这个就要配置视图解析器了。
那首先我们在项目里面WEB-INF 下新建一个包‘view’,里面新建一个jsp文件,result.jsp 。如下:
然后配置视图解析器
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/"/>
<property name="suffix" value=".jsp"/>
</bean>
所以完整的spring.mvc 如下:
<?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:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd">
<!--扫描Controller层的包-->
<context:component-scan base-package="com.ssm.Controller"/>
<!--处理请求和开启mvc相关注解,如@resquestmapping,@RequestBody和@ResponseBody,@Validb@DateTimeFormat-->
<mvc:annotation-driven/>
<!-- 如果是rest风格的请求,请求后面是没有后缀的比如.html,.do等,默认拦截所有如下:在web.xml配置
<servlet-mapping>
<servlet-name>graduation</servlet-name>
//拦截所有请求,静态资源也会被拦截
<url-pattern>/</url-pattern>
</servlet-mapping> ,这样也会把静态文件拦截了,请求不到了,所有配置这个,一般拦截的请求,页面跳转是放在WEB-INF ,这个文件夹的文件是不能通过链接直接访问的,
所有静态文件不能放在WEB-INF 里面-->
<mvc:default-servlet-handler/>
<!--配置视图解析器,Controller 里面跳转页面链接,设置下文件的前缀和后缀,这样就只要写页面文件名就行了-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
三. 配置applicationContext.xml 文件
最后这个配置完就行了,这个文件名是固定的,会默认加载这个文件.
1.加入xmlns 和xsi一些http地址标签,这样我们的配置标签才能起作用。添加后完整的属性如下:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:http="http://www.springframework.org/schema/c"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
2.好接下来 只要配置2个就可以了,其中重点是spring整合mybatis .
同样的spring的配置,我们要扫描所有注解的包,把这些注入到bean里面,component-scan 包扫描会扫描只要标注了@Controller,@Service,@Repository,@Component,@Autowired,@Resource等注解都会被扫描到容器中,所以我们扫描最外层的包:
<context:component-scan base-package="com.ssm"/>
spring整合mybaits, 我们在学习mybatis 的时候就学习过操作数据库使用sqlsession ,靠操作这个来crud,那这个的生成,就是靠sqlSessionFactory ,所有我们要在这个里面配置数据源,还有mapper 的xml地址,不然它找不到对应的sql语句。
最后应该我们在上面配置了component-scan要扫描所有注解,但是mapper的接口是没有写注解的,这个就要在配置一个扫描的扫描写这个接口的包就行了:
先配置个数据源,用的的dbcp的数据库连接池:
在配置前,我们要先引入dbcp的jar包,mysql包和spring整合mybatis的包如下:
<!--配置dbcp连接池的包,和spring,mybatis 整合包-->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.2.2</version>
</dependency>
<!--mysql 数据库-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.30</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.verson}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
1) 首先配置数据源我们要在mysql新建一个数据库ssmtest 和表user.这个我们留着测试的时候在建.
先配置个dbcp的数据源,用户名和密码改成你自己的其他医院就行:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/ssmtest"></property>
<property name="username" value="root"></property>
<property name="password" value="19868111211"></property>
<property name="initialSize" value="3"></property>
<property name="maxActive" value="50"></property>
<property name="maxIdle" value="20"></property>
<property name="minIdle" value="5"></property>
<property name="maxWait" value="10"></property>
</bean>
2). 然后我们需要在sqlSessionFactory 引入数据源生成操作数据库的对象sqlSession:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath:mapper/*.xml"/>
</bean>
里面的属性值mapperLocations,填的就是mapper.xml 的地址了,*.xml 就是选择所以的xml后缀的文件。这样sqlSession就能找到我们的sql语句了。
3) 最后我们的mapper接口要扫描注入bean,所以这个要另外配置:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<property name="basePackage" value="com.ssm.Dao"/>
</bean>
这样就可以了。接下来我们用mybatis generator 生成逆向工程,然后测试一下就可以了。
1.mysql 数据表新建数据库:‘ ssmtest ‘,数据表:‘user’,如下:
在resources 下新建文件:‘generatorConfig.xml’;
如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="testTables" targetRuntime="MyBatis3">
<commentGenerator>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!--1.数据库连接的信息:驱动类、连接地址、用户名、密码 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://127.0.0.1:3306/ssmtest"
userId="root"
password="19868111211">
</jdbcConnection>
<!--1.如果是其他数据库,只要改driverClass 和connectionURL就可以了-->
<!-- <jdbcConnection driverClass="oracle.jdbc.OracleDriver"
connectionURL="jdbc:oracle:thin:@127.0.0.1:1521:yycg"
userId="yycg"
password="yycg">
</jdbcConnection> -->
<!-- 2.默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
NUMERIC 类型解析为java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- 3.targetProject:生成PO类的位置 -->
<javaModelGenerator targetPackage="com.ssm.Model"
targetProject="src/main/java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- 4.targetProject:mapper映射文件生成的位置 -->
<sqlMapGenerator targetPackage="mapper"
targetProject="src/main/resources">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- 5.targetPackage:mapper接口生成的位置 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.ssm.Dao"
targetProject="src/main/java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<!-- 6.指定数据库表,tableName就是数据库的表名,domainObjectName就是pojo类的名称,设置为User 则会生产 User.java,UserMapper.java,UserMapper.xml 的文件
这里下面几个方法要设为false,不然会多生产Example 类和相应方法,这里目前用不到,默认是true,所以设置为false-->
<table tableName="user" domainObjectName="User"
enableCountByExample="false"
enableUpdateByExample="false"
enableDeleteByExample="false"
enableSelectByExample="false"
selectByExampleQueryId="false"></table>
</context>
</generatorConfiguration>
第一步的数据库密码和用户名 改成自己的
pom里面安装插件:
<!--mybatis-generator 插件-->
<plugin>
<!--
用maven mybatis插件
如果不在plugin里面添加依赖包得引用的话,会找不到相关得jar包,
在plugin外部得jar包,他不会去找到并执行,
所以要把plugin运行依赖得jar配置都放在里面
-->
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.30</version>
</dependency>
</dependencies>
</plugin>
设置下启动:
命令是:‘mybatis-generator:generate -e’ ;
接下来启动就行了:
成功了就生成了文件:
然后我们在Service 下 新建2个文件,一个接口‘UserService’ 和实现类 'UserServiceImpl' ,如下:
UserService:
package com.ssm.Service;
import com.ssm.Dao.UserMapper;
import com.ssm.Model.User;
import org.springframework.beans.factory.annotation.Autowired;
/**
* @author: Mr.Zzw
* @modified by:
* @description:
* @create: 2018-09-07 13:55
**/
public interface UserService {
void insertUser(User user);
}
UserServiceImpl:
package com.ssm.Service.impl;
import com.ssm.Dao.UserMapper;
import com.ssm.Model.User;
import com.ssm.Service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @author: Mr.Zzw
* @modified by:
* @description:
* @create: 2018-09-07 13:57
**/
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public void insertUser(User user) {
userMapper.insertSelective(user);
}
}
然后在Controller 里面新建UserController:
package com.ssm.Controller;
import com.ssm.Model.User;
import com.ssm.Service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author: Mr.Zzw
* @modified by:
* @description:
* @create: 2018-09-10 08:37
**/
@Controller
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/user")
public String user(User user){
userService.insertUser(user);
return "result";
}
}
最后配置下tomcat启动下就行了:
查看数据库已经有数据了。