000610 spring系笔记-SSM框架搭建
idea + maven + ssm( spring-framework( spring基础组件(spring-core spring-beans等)+ springMVC ) + 第三方ORM: mybatis)
一 准备工作:
1. idea安装, maven安装
2. idea集成maven
idea界面下, File-Settings-Build, Execution, Deployment-Build Tools-Maven, 右边只勾选 Execute goals recursively, 并设置你的Maven home directory为本地目录
,然后进入Maven home directory指向的目录, 按我的是"D:/idea/plugins/maven/lib/maven3", 在这个目录下有一个conf目录,里面有settings.xml, 找到<mirros>标签,写入如下配置并保存
<mirror> <id>nexus-aliyun</id> <mirrorOf>central</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror> <mirror> <id>maven-net-cn</id> <name>Maven China Mirror</name> <url>http://mvnrepository.com/</url> <mirrorOf>central</mirrorOf> </mirror> <mirror> <id>CN</id> <name>OSChina Central</name> <url>http://maven.oschina.net/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror>
三个镜像点,阿里作为主力,后面两个作为补充
这样一来,File-Settings-Build, Execution, Deployment-Build Tools-Maven-Repository下面的远程地址地址是否"Update"也无所谓了,不过是顶部的是Local本地的仓库地址,有时候如果版本异常,可以尝试选中后,右边"Update"一下
二 下面我们构建第一个以ssm框架人底板的rbac系统,主体以imooc.com中jimin老师的企业级权限系统为主体:
课程地址: https://coding.imooc.com/learn/list/149.html
其中 ssm框架的集成在第5章,而权限系统的开发前设计分析在第4章.这里, 我们先按第5章搭建ssm
idea-create new project-Maven-上方选择jdk版本,勾选Create from archetype-选中下方maven-archetype-webapp-点击next
然后是设置GroupId(相当于包名), ArtifactId(相当于项目名)
设置Maven home directory
下一步,修改默认生成的项目名称和地址(注,目录需要提前建好,而且,先改地址,再改项目名称)
点击Finish,这时候idea开始建立maven新项目,会在右下角提示是否自动导入,选择自动导入
BUILD SUCCESS,Maven执行完成.下面我们先从pom.xml的依赖配置入手,开始配置工作
在pom.xml中写入
<properties> <springframework.verion>4.3.10.RELEASE</springframework.verion> </properties> <dependencies> <!--dependency> <groupId>com.mine</groupId> <artifactId>[the artifact id of the block to be mounted]</artifactId> <version>1.0-SNAPSHOT</version> </dependency--> <dependency> <!-- spring核心 --> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${springframework.verion}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${springframework.verion}</version> </dependency> <!-- springMVC + spring web --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${springframework.verion}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${springframework.verion}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${springframework.verion}</version> </dependency>
这里是定义spring-framework的版本, 然后引入本项目的核心模块.接下来,加入数据库相关的依赖:
<!-- mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.0</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.0</version> </dependency> <!-- druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.20</version> </dependency> <!-- mysql --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.30</version> </dependency>
然后我们加入便利代码编写的辅助依赖:
<!-- lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.12</version> </dependency> <!-- jackson --> <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-guava</artifactId> <version>2.5.3</version> </dependency>
下面我们进行web.xml的配置,首先,清空原有的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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>Archetype Created Web Application</display-name> </web-app>
然后在<web-app></web-app>中间开始写配置:
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
然后写入,并在 resources 目录下建立 applicationContext.xml , 并在 WEB-INF 下建立 spring-servlet.xml (注意,这里的中横线前的名字spring是与<servlet-name>中的值是对应的) (图片要是看不清, 就下载图片看,是大的):
<!-- spring beans 配置文件所在目录 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!-- spring mvc 配置文件所在目录 --> <servlet> <servlet-name>spring</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>spring</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
最后,我们在web.xml中写入:
<!-- encoding 配置 --> <filter> <filter-name>encodingFilter</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> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 项目未明确指定加载文件时,使用以下配置 --> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list>
现在我们在main目录下建立java目录,把java目录右键 Mark Direcotory As, 选择 source root,并参照下图建立好各级目录:
下面我们来配置spring-servlet.xml, 内容如下,注释清楚,注意阅读
<!-- 启动注解驱动的spring mvc 功能 --> <mvc:annotation-driven/> <!-- 启动包扫描功能 --> <context:component-scan base-package="com.mine.controller" /> <!-- 作用:为 我们定义好的RequestMapping注解 指定 对应的处理代码 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" /> <!-- 作用:当来一个请求之后,我该以什么样的数据返回,可以返回.pdf .css .js json等 --> <bean class="org.springframework.web.servlet.view.BeanNameViewResolver" /> <!-- 作用:如果RequestMapping对应代码处理后以json返回,则以下面的这个类来处理. 注意,这个id必须是 jsonView --> <bean id="jsonView" class="org.springframework.web.servlet.view.json.MappingJackson2JsonView" /> <!-- 作用:如果RequestMapping对应代码处理后以jsp返回,则以下面的这个类来处理. 注意,这个id必须是 jsonView --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 目标返回文件的父目录 --> <property name="prefix" value="/views/" /> <!-- 目标返回文件的后缀,即文件格式 --> <property name="suffix" value=".jsp" /> </bean>
下面进行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:tx="http://www.springframework.org/schema/tx" 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.alibaba.com/schema/stat http://www.alibaba.com/schema/stat.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config /> <!-- 启动包扫描功能 --> <context:component-scan base-package="com.mine.service" /> <!-- 读取properties文件,给dataSource使用 --> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" > <property name="ignoreUnresolvablePlaceholders" value="true"/> <property name="locations"> <list> <value>classpath:settings.properties</value> </list> </property> </bean> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close" > <property name="driverClassName" value="${db.driverClassName}" /> <property name="url" value="${db.url}" /> <property name="username" value="${db.username}" /> <property name="password" value="${db.password}" /> <property name="initialSize" value="3" /> <property name="minIdle" value="3" /> <property name="maxActive" value="20" /> <property name="maxWait" value="60000" /> <property name="filters" value="stat" /> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 指定mybatis的配置文件 --> <property name="configLocation" value="classpath:mybatis-config.xml" /> <!-- 指定数据连接 --> <property name="dataSource" ref="dataSource" /> <!-- 指定mapper地址为 resources/mapper/目录下所有的.xml文件 --> <property name="mapperLocations" value="classpath:mapper/*.xml" /> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.mine.dao" /> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /> </bean> <!-- 上面的是核心配置,下面先配置事务 tx --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <tx:annotation-driven transaction-manager="transactionManager" /> <!-- druid 配置 --> <bean id="stat-filter" class="com.alibaba.druid.filter.stat.StatFilter"> <property name="slowSqlMillis" value="3000" /> <property name="logSlowSql" value="true" /> <!-- 使用换行的sql写成一行,方便查看 --> <property name="mergeSql" value="true" /> </bean> <bean id="wall-filter" class="com.alibaba.druid.wall.WallFilter"> <property name="dbType" value="mysql" /> </bean> </beans>
同时要在resources目录下建立setttings.properties文件,内容写入以下,密码和数据库名根据自己的情况来写,同时也在mysql中建立数据库,我这里是 spring-base-ssm-permission
db.driverClassName=com.mysql.jdbc.Driver db.url=jdbc:mysql://localhost:3306/spring-base-ssm-permission?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true db.username=root db.password=123456
同时要在resources目录下建立mapper文件夹,并在mapper下随便先放一个空的test.xml
下面,我们进行 druid 的配置,打开web.xml, 添加:
<!-- durid监控界面访问配置 --> <servlet> <servlet-name>DruidStatServlet</servlet-name> <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class> <init-param> <param-name>loginUsername</param-name> <param-value>druid</param-value> </init-param> <init-param> <param-name>loginPassword</param-name> <param-value>druid</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>DruidStatServlet</servlet-name> <url-pattern>/sys/druid/*</url-pattern> </servlet-mapping> <filter> <filter-name>DruidStatFilter</filter-name> <filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class> <!-- 过滤掉我们不需要拦截的请求,比如 .css .js等 --> <init-param> <param-name>exclusions</param-name> <param-value>*.js,*.css,*.jpg,*.png,*.gif,*.ico,/sys/druid/*</param-value> </init-param> </filter> <filter-mapping> <filter-name>DruidStatFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
下面来配置mybatis, 打开mybatis-config.xml, 清空内容,写入以下配置:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <settings> <setting name="safeRowBoundsEnabled" value="true"/> <setting name="cacheEnabled" value="false" /> <setting name="useGeneratedKeys" value="true" /> </settings> <!--<typeAliases>--> <!----> <!--</typeAliases>--> <!--<plugins>--> <!--<plugin interceptor=""></plugin>--> <!--</plugins>--> <!--<typeHandlers>--> <!----> <!--</typeHandlers>--> </configuration>
接下来,我们加入logback日志管理, 打开pom.xml,加入logback的依赖:
<!-- logback (是log4j的改进版) --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.2.1</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.1</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version> </dependency>
然后,我们在resources目录下建立logback.xml,并写入以下内容
<?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="60 seconds"> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern> </encoder> </appender> <!--<appender name="permission" class="ch.qos.logback.core.rolling.RollingFileAppender">--> <!--<file>${catalina.home}/logs/permission.log</file>--> <!--<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">--> <!--<FileNamePattern>${catalina.home}/logs/permission.%d{yyyy-MM-dd}.log.gz</FileNamePattern>--> <!--</rollingPolicy>--> <!--<layout class="ch.qos.logback.classic.PatternLayout">--> <!--<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>--> <!--</layout>--> <!--</appender>--> <!----> <!--<logger name="xxx" level="INFO">--> <!--<appender-ref ref="permission"/>--> <!--</logger>--> <!-- 追踪日志的等级: TRACE < DEBUG < INFO < WARN < ERROR --> <root level="INFO"> <appender-ref ref="STDOUT" /> </root> </configuration>
下面进行配置的测试:
首先,在Controller目录下新建class, 名字叫 TestController,内容如下:
package com.mine.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/test")
@Slf4j
public class TestController {
@RequestMapping("/hello")
@ResponseBody
public String hello() {
log.info("hello");
return "hello, permission";
}
}
然后在Dao目录下新建一个接口TestDao, 内容如下:
package com.mine.dao;
public interface TestDao {
}
然后在mapper.xml下建立TestMapper.xml,并配置如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.mine.dao.TestDao"> </mapper>
然后对工程进行配置(这部分细节可以看视频 5-8 https://coding.imooc.com/lesson/149.html#mid=7937,也可以看下面的文本图片说明):
首先是tomcat配置,我这里是配置本地的tomcat7
然后选择deployment,点击绿色加号按钮,点击 Artifact, 选择 spring-base-ssm-permission:war exploded, 点击下方的Apply,再点击OK保存.
再进行project的配置
File-Project Structure, 点击Project, 把Project language level设置为 8, 如图
点击Modules,在右边的Sources下设置language level为8, 点击Dependencies,把Module SDK选定为本地的java 1.8,如下两图
选择OK保存
打开项目目录下的.idea/compiler.xml,把 target="1.5" 改成 target="1.8"
然后,我们重要编译项目, 菜单Build-Build Project, 编译完成后,浏览器访问 http://localhost:8080/test/hello, 输出 hello, permission, 控制台也打印logback日志
------------------------------
下面进入实际的编码阶段