- 创建web maven工程
- 导入依赖
<dependency>
<!--创建普通java工程:只需导入spring-contex
创建web工程:只需导入spring-webmvc
springcontext底层依赖了spring-core、spring-beans、spring-expression、spring-aop
spring-webmvc底层依赖了spring-web、springcontext、springaop等
spirng-jdbc底层依赖了spring-tx
-->
<!-- sping、springmvc-->
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!--spirng-jdbc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!--配置数据库连接池,主流数据库连接池:DBCP、c3p0,我们采用DBCP
commons-dbcp包含了commons-pool-->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<!--数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!--mybaits对spring框架的整合-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<!--分页插件的依赖包-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.0.1</version>
</dependency>
<!--面向切面编程:需要AspectJ Aop方式切面编程时才配置,如@PointCut等-->
<!-- <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>-->
<!-- JSTL标签库 -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!--servlet:通过scope标签的provided告诉spring,tomcat服务器已经提供了-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<!--返回json字符串的支持-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.8</version>
</dependency>
<!--测试-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--代码生成器的jar包-->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<!--有了mybatis的代码生成器的插件,就可以直接用插件生成代码,不用写代码来生成-->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<configuration>
<!--
代码生成器的核心配置文件默认放在:【classpath:generatorConfig.xml】
代码生成器的核心配置文件默认必须用:generatorConfig.xml
(1)代码生成器核心配置文件的存放路径可以通过configurationFile标签进行自定义
(2)代码生成器的核心配置文件也可以自定义,不一定要用generatorConfig1.xml
告诉mybatis到指定路径下找指定名称的代码生成器核心配置文件
-->
<configurationFile>src\main\resources\generatorConfig.xml</configurationFile>
<!--是否在控制台显示代码生成器的执行信息-->
<verbose>true</verbose>
<!--重新生成代码时,覆盖原有java文件。
但映射配置文件【domainMapper.xml】不会覆盖,只会往原配置文件中再添一次相同的sql语句
因此,重新生成时需要删除原有的xml配置文件-->
<overwrite>true</overwrite>
</configuration>
</plugin>
-
配置web.xml
注:spring的配置文件applicationContext.xml文件和、SpringMVC的配置文件applicationContext-mvc.xml先创建,但内容不写。
- 配置spring配置文件的位置、spring启动监听器ContextLoaderListener
- 配置springmvc的核心控制器DispatcherServlet,springmvc配置文件的位置、核心控制拦截的路径
- 配置字符编码过滤器CharacterEncodingFilter
- 配置springmvc的配置文件:applicationContext-mvc.xml
- 配置springmvc需要扫描的包
- 配置视图解析器:InternalResourceViewResolver
- 配置上传解析器:CommonsMultipartResolver
- 静态资源放行,将其交给服务器的servlet处理 mvc:default-servlet-handler/
- 开启springMVC注解的支持:mvc:annotation-driven/
- 配置spring的配置文件
- 配置spring需要扫描的包
- 配置数据库配置文件db.properties的位置
- 一般在classpath下创建db.properties,配置数据库的driverClassName、url、username、password
- 配置数据源:数据源的各属性通过spring表达式从数据配置库文件中引入
- 配置SqlSessionFactoryBean类,其创建的SQLSession对象与数据库进行交互,操作增删改查
- 通过属性配置mybatis配置文件的位置:classpath:mybatis.xml
- Mapper接口映射文件的位置:classpath*:top/onething/ssm/mapper/*Mapper.xml
- 引入已经配置的数据源
- 配置MapperScannerConfigurer类(Mapper接口扫描器的配置器),指定需要扫描哪些包的mapper接口
- 配置事务管理器TransactionManager
- 开启基于注解进行事务管理或配置xml形式的事务管理【xml需要在这里指点切点和增强】
- 配置mybaits配置文件
-
配置mybatis的日志
<!--指定 MyBatis所用日志的具体实现:mybatis内置有多种日志实现方式,这里选择STDOUT_LOGGING, 不需要配置任何日志相关的依赖即可看到sql语句--> <settings> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings>
-
配置二级缓存:不配置时,默认false关闭-----------一般不配置一级和二级缓存
- 注意:配置一级缓存,只需配置mapper接口的映射文件中mapper标签下添加标签即可
<settings> <setting name="cacheEnabled" value="true"/> </settings>
-
配置类的别名,方便mapper映射配置文件中使用
-
配置分页插件PageInterceptor
- 配置mybatis的代码生成器
-
在pom文件中导入依赖:mybatis-generator-core和插件包mybatis-generator-maven-plugin
-
插件中可配置代码生成器的位置,默认为src\main\resources\generatorConfig.xml【不配置时】
src\main\resources\generatorConfig.xml
-
-
配置代码生成器配置文件,默认文件名为:generatorConfig.xml
- 配置代码生成器连接数据时需要的数据库驱动:一般为数据库驱动jar包在mvn仓库的绝对位置
- 生成domain、mapper接口、mapper接口的映射文件后的存放位置
- 配置表名和类名、列名和类的属性名之间映射关系
-
IDEA的Maven Project运行插件生成代码
- 注意:如果生成后想重新生成,mapper.xml映射文件必须先删掉,否则会在原文件中添加新生成的,而java代码则可以直接覆盖
- mapper接口映射文件的配置,注意单个mapper接口映射文件的namespace命名空间必须指向该接口【配置完全限定名】
- 代码生成器生成mapper接口的映射文件,自动生成了namespace指向的接口
- 配置分页功能
-
在pom文件中导入依赖:com.github.pagehelper
<!--分页插件的依赖包--> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.2</version> </dependency>
-
在mybatis的配置文件中配置分页拦截器:
<!-- pom.xml中需要先引入依赖:com.github.pagehelper-->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!--3.3.0版本可用 - 分页参数合理化,默认false禁用
启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页
禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据-->
<property name="reasonable" value="true"/>
</plugin>
如果mybatis的配置是直接在applicationContext.xml中SqlSessionFactoryBen中配置的,则配置属性
<property name="plugins">
<array>
<!--mybatis分页插件过滤器的配置-->
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<value>
<!--3.3.0版本可用 - 分页参数合理化,默认false禁用
启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页
禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据-->
reasonable=true
</value>
</property>
</bean>
</array>
</property>
- 在severice层的分页查询代码之前编写代码:PageHelper.startPage(当前页数, 每页显示条数);
查询出来的当前页数据装在List集合中,PageInfo可将查询结果进行封装, 使其包含了非常全面的分页属性,如总页数、总条数、页面导航多少页【默认8页】等。
PageInfo pageinfo=new PageInfo(查询出来的当前页数据List集合,页面导航显示几页)
PageInfo pageinfo=new PageInfo(查询出来的当前页数据List集合)//默认页面导航显示8页
PageInfo对属性提供了toString方法和geter/seter方法
public PageInfo<Dept> selectAll() {
PageHelper.startPage(1, 5);
List<Dept> depts = deptMapper.selectAll();
PageInfo<Dept> pageInfo = new PageInfo<>(depts,5);
return pageInfo;
}
Shiro与Spring的整合
- 导入依赖shiro-all
- web.xml中Shiro的相关配置:DelegatingFilterProxy【Shiro过滤器的代理类】
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<param-name>targetFilterLifecycle</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
理解:
-
DelegatingFilterProxy实现了Filter接口,是一个过滤器,同时它也是一个代理类
-
权限过滤实际是ShiroFilterFactoryBean创建的权限过滤器来完成的,但tomcat不支持ShiroFilterFactoryBean的方式创建过滤器的方式,只能交由Spring来完成。
-
tomcat将所有请求先发给DelegatingFilterProxy这个过滤器,然后该过滤器会按照配置文件中的“filter-name”委派到Spring容器中ShiroFilterFactoryBean创建的权限过滤器
-
web.xml中DelegatingFilterProxy配置的filter-name,必须与Spring配置文件的ShiroFilterFactoryBean的id相同,这样DelegatingFilterProxy才能将请求委派给ShiroFilterFactoryBean创建的权限过滤器
-
ShiroFilterFactoryBean创建的过滤器,其整个生命周期是由Spring容器进行管理。如果设置"targetFilterLifecycle"为True,则spring来管理Filter.init()和Filter.destroy(),即过滤器的初始化和销毁;
如果为false,则这两个方法无效
另外一种配置方式:
<filter>
<filter-name>permission</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<param-name>targetBeanName</param-name>
<param-value>Spring-bean-name</param-value>
</init-param>
</filter>
targetBeanName是实际进行权限过滤的过滤器名,必须与spring中ShiroFilterFactoryBean创建的过滤器名一致。此时filter-name与spring配置文件中ShiroFilterFactoryBean创建的权限过滤器可以不同名
- Spring配置文件applicationContext.xml中配置Shiro
- 配置SecurityManager接口实现类DefaultWebSecurityManager的Bean对象
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="CustomRealm"/>
</bean>
DefaultWebSecurityManager类是SecurityManager接口的实现类
- 配置Realm的Bean对象,并将Matcher绑定到Realm接口的实现类对象上
<!-- 自定义的Realm,其继承了抽象列AuthorizingRealm,AuthorizingRealm是Reaml接口的实现类 -->
<bean id="CustomRealm" class="自定义的Realm接口实现类完全限定名">
<!-- 给自定义的Realm绑定Hash匹配器,该匹配器设置了密码的加密规则-->
<property name="credentialsMatcher">
<bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
<!--设置加密算法类型:MD5和SHA-1二选一,一般用MD5-->
<property name="hashAlgorithmName" value="MD5"/>
<!--设置加密次数-->
<property name="hashIterations" value="10" />
</bean>
</property>
</bean>
<!-- shiro中的bean的对象的生命周期 -->
<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
<!-- 支持注解的权限判断,又必需要上面的Bean:LifecycleBeanPostProcessor -->
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
depends-on="lifecycleBeanPostProcessor"/>
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
<property name="securityManager" ref="securityManager"/>
</bean>