一、SSM(spring 、spring mvc、mybatis)框架整合
1、pom.xml依赖如下
<!--Spring web mvc支持 (里面包含了spring : spring-context)-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
<!--spring aop支持 start-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
<!-- spring aop支持 end -->
<!-- spring jdbc支持 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
<!-- spring事物管理支持 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
<!--jsp的jstl标签库支持-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- jsr 303支持 -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
<!-- jsr 303校验实现 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.4.1.Final</version>
</dependency>
<!-- mybatis框架支持 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!--mysql数据驱动包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!-- spring集成mybatis jar-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
<!-- c3p0连接池 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<!-- mybatis通用mapper插件支持 -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>4.1.5</version>
</dependency>
2、依照以下次序进行配置
2.1、首先配置spring的 MVC
2.1.1、web.xml中加入字符集过滤器
spring很贴心的给我们提供了一个字符集过滤器 -- CharacterEncodingFilter --,我们直接拿来耍即可。
<!--加入字符集过滤器-->
<filter>
<filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>
<!--注意,这里要写 /* 才能拦截所有请求-->
<url-pattern>/*</url-pattern>
</filter-mapping>
2.1.2、web.xml中加入spring MVC的核心servlet配置
DispatcherServlet 是spring MVC核心的servlet,负责控制整个应用的请求分发至对应的控制器
<!--spring web mvc 的核心servlet-->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--spring mvc配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</init-param>
<!--tomcat启动就创建servlet-->
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
2.1.3、编写 applicationContext.xml 配置文件
上面我们的DispatcherServlet进行初始化时,要指定它的配置文件
它的配置文件中可以配置 controller、视图解析器、映射处理器...等
范例如下:
<?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:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
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/tx
http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--启动spring web mvc 的注解-->
<mvc:annotation-driven/>
<!--扫描包-->
<context:component-scan base-package="com.hr.controller"/>
<!--配置一个视图决策器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
2.2、spring 容器配置
2.2.1、web.xml指定监听器
classpath:spring-*.xml 会让spring去加载类路径下的 所有 spring开头的xml文件
<!--全局参数-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-*.xml</param-value>
</context-param>
<!--spring加载配置文件的监听器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
2.2.2、dao层配置
我们的数据访问层要集成MyBatis框架
2.2.2.1、编写spring-dao.xml配置文件,范例如下
将数据源、dao层映射器示例...等交由spring容器来管理
指定mybatis-conf.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:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
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/tx
http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--spring dao层相关配置-->
<!--配置c3p0 连接池管理的数据源-->
<bean id="c3p0DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/px_12?useUnicode=true&characterEncoding=utf8"/>
<property name="user" value="root"/>
<property name="password" value="123456"/>
</bean>
<!--事物交由spring来管理-->
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--注入数据源-->
<property name="dataSource" ref="c3p0DataSource"/>
</bean>
<!--原本mybatis的SqlSessionFactory创建交给spring管理,核心类-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="c3p0DataSource"/>
<!--mybatis核心配置文件-->
<property name="configLocation" value="classpath:mybatis-conf.xml"/>
<!--指定映射器文件-->
<property name="mapperLocations" value="classpath:./mapper/*Mapper.xml"/>
</bean>
<!--mapper(映射器)代理实现对象交给spring管理,核心类
org.mybatis.spring.mapper.MapperScannerConfigurer 是mybatis官方提供的
tk.mybatis.spring.mapper.MapperScannerConfigurer 是通用mapper里面提供的
-->
<bean class="tk.mybatis.spring.mapper.MapperScannerConfigurer">
<!--指定创建映射器代理对象的 sqlSessionFactory-->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
<property name="basePackage" value="com.hr.mapper"/>
</bean>
</beans>
2.2.2.2、编写mybatis-conf.xml ,范例如下
<?xml version="1.0" encoding="UTF-8" ?>
<!--这是引入约束文件,是 DTD的约束-->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--全局设置-->
<settings>
<!--告诉mybatis,给我把sql语句打印出来-->
<setting name="logImpl" value="STDOUT_LOGGING" />
<!--数据库列名转成驼峰命名后映射-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!--别名配置-->
<typeAliases>
<package name="com.hr.entity"/>
</typeAliases>
<!--引入映射器-->
<!--<mappers>
<mapper resource="./mapper/StudentMapper.xml"/>
</mappers>-->
</configuration>
2.2.2.3、这里示例StudentMapper.xml 和 StudentMapper.java
类路径下 mapper/StudentMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!--mybatis 映射器文件的约束-->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zd.mapper.StudentMapper">
<insert id="add2" parameterType="Student"
>
insert into t_student(
stu_name,
stu_age,
stu_score,
stu_birthday,
stu_sex,
c_id
) values(
#{stuName},
#{stuAge},
#{stuScore},
#{stuBirthday},
#{stuSex},
#{cid}
)
</insert>
</mapper>
mapper包下 StudentMapper.java
import tk.mybatis.mapper.common.Mapper;
/**
* 操作学生表的映射的接口
*/
public interface StudentMapper extends Mapper<Student> {
/**
* 添加学生
* @param stu
* @return
*/
int add2(Student stu);
}
2.2.3、service层配置
servcie层主要配置事物
2.2.3.1、编写spring-sevice.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:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
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/tx
http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--我的事物管理配置在这里-->
<!--扫描service包
注意:处理controller,其他的实例最好放在 父容器中
-->
<context:component-scan base-package="com.zd">
<!--排除@controller注解-->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--事物管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--事物管理器使用的数据源-->
<property name="dataSource" ref="c3p0DataSource"/>
</bean>
<!--配置spring事物的传播属性-->
<tx:advice id="advice" transaction-manager="transactionManager">
<!--事物的属性-->
<tx:attributes>
<!--get、query、select开头的方法不打开事物-->
<tx:method name="get*" read-only="true"/>
<tx:method name="query*" read-only="true"/>
<tx:method name="select*" read-only="true"/>
<!--
其他名字开头的方法都打开事物
propagation :事物的传播属性(REQUIRED 必定会有一个事物)
isolation:事物的隔离级别(REPEATABLE_READ 只读)
-->
<tx:method name="*"
read-only="false"
isolation="REPEATABLE_READ"
propagation="REQUIRED"
/>
</tx:attributes>
</tx:advice>
<aop:config>
<!--切入点-->
<aop:pointcut id="transactionPointcut" expression="execution(public * com.zd.service.*.*(..))" />
<!--使用spring提供的事物管理-->
<aop:advisor pointcut-ref="transactionPointcut" advice-ref="advice" />
</aop:config>
</beans>
3、简单集成完毕
最后做一个简单的表单提交,测试框架集成是否有问题
4、静态资源被拦截问题
applicationContext.xml中加入映射规则,下面是范例:
<!--解决静态资源被拦截的问题(不走dispatcherServlet)
mapping : url路径
location: 映射给指定的本地路径
-->
<mvc:resources mapping="/js/**" location="/js/" />
<mvc:resources mapping="/css/**" location="/css/" />
<mvc:resources mapping="/img/**" location="/img/" />
<mvc:resources mapping="/plugins/**" location="/plugins/" />
5、让spring MVC支持文件上传
pom.xml加入依赖如下
<!--spring mvc文件上传支持 start-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<!--spring mvc文件上传支持 end-->
applicationContext.xml中加入文件上传解析器,范例如下:
<!--文件上传解析器
特别要注意: spring 将 CommonsMultipartResolver类注入到相应属性中是根据 id匹配的,
所以这个bean的id必须是 multipartResolver
-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--文件的编码方式-->
<property name="defaultEncoding" value="UTF-8" />
<!--单个文件的大小限制(20 m),单位:字节-->
<property name="maxUploadSizePerFile" value="20971520"/>
<!--上传文件的总大小限制(100 m),单位:字节-->
<property name="maxUploadSize" value="104857600" />
</bean>
6、集成security
额外课题
pom.xml加入security的相关依赖
<!-- spring security 支持 start-->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>4.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>4.2.3.RELEASE</version>
</dependency>
<!-- spring security 支持 end-->
类路径中编写 spring-security.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:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:sec="http://www.springframework.org/schema/security"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security.xsd">
<!--spring security 相关配置-->
<!--
security="none"表示:这个url不做security安全访问控制
-->
<sec:http pattern="/login.jsp" security="none"></sec:http>
<sec:http pattern="/js/**" security="none"></sec:http>
<sec:http pattern="/css/**" security="none"></sec:http>
<sec:http pattern="/img/**" security="none"></sec:http>
<sec:http pattern="/plugins/**" security="none"></sec:http>
<!--后门,系统数据初始化完毕之后,记得把这个代码注释掉-->
<sec:http pattern="/user/initSysData" security="none"></sec:http>
<!--security的 核心标签
use-expressions:如果为true,下面的access就能使用spel表达式
-->
<sec:http use-expressions="true">
<sec:intercept-url pattern="/**"
access="isAuthenticated()" />
<!--身份认证的入口
<form-login> 基于表单登录的身份认证的标签
login-page:登录的表单页面
login-processing-url:登录处理的url,一般是和登录表单页中的action一致
username-parameter:表单用户名的参数key
password-parameter:表单密码的参数key
authentication-failure-url:认证失败跳转的页面
default-target-url:认证成功之后,默认跳转的页面
-->
<sec:form-login
login-page="/login.jsp"
login-processing-url="/user/login"
username-parameter="username"
password-parameter="password"
authentication-failure-url="/login.jsp?error=1"
default-target-url="/pages/main.jsp"
/>
<!--禁用csrf 安全保护-->
<sec:csrf disabled="true" />
<!--登出的配置
invalidate-session:登出后让其session失效
logout-url:调用登出功能的url
-->
<sec:logout invalidate-session="true"
logout-url="/user/logout"/>
<!--
没有权限或出现了其他安全方面错误导致访问失败处理的页面配置
error-page:跳转的错误页面
-->
<sec:access-denied-handler
error-page="/pages/500.jsp"/>
<!--session管理-->
<sec:session-management>
<!--
max-sessions:表示一个用户只能有一个session
error-if-maximum-exceeded:为true表示超过session最大数量限制就报错
expired-url:当session失效的时候跳转的页面
-->
<sec:concurrency-control
max-sessions="1"
error-if-maximum-exceeded="false"/>
</sec:session-management>
<!--记住我
remember-me-parameter:参数key,和前台登录页中的 记住我 复选框的name保持一致
token-validity-seconds:
默认remeber me能记住14天,如果你要自定义记住的时间可以通过这个属性指定,该属性必须是一个数字,单位:秒
-->
<sec:remember-me
token-validity-seconds="604800"
remember-me-parameter="remenberMe"/>
</sec:http>
<!--认证管理器
管理身份认证的各种方式(cas、dao、jaas、....)
-->
<sec:authentication-manager id="authenticationManager">
<!--
今天只做一种,配置dao认证方式,
user-service-ref:bean id,实现获取用户信息对象
-->
<sec:authentication-provider user-service-ref="userDetailService">
<!--dao认证方式,指定密码加密校验的方式-->
<sec:password-encoder ref="pwdEncoder"/>
</sec:authentication-provider>
</sec:authentication-manager>
<!--dao 认证方式中,获取用户信息对象的bean-->
<bean id="userDetailService" class="com.zd.security.UserDetailServiceImpl" />
<!--dao 认证方式中,密码加密校验方式的bean-->
<bean id="pwdEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" />
</beans>