SSM架构的整合

  1. 创建web maven工程
  2. 导入依赖
<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>
  1. 配置web.xml

    注:spring的配置文件applicationContext.xml文件和、SpringMVC的配置文件applicationContext-mvc.xml先创建,但内容不写。

  • 配置spring配置文件的位置、spring启动监听器ContextLoaderListener
  • 配置springmvc的核心控制器DispatcherServlet,springmvc配置文件的位置、核心控制拦截的路径
  • 配置字符编码过滤器CharacterEncodingFilter
  1. 配置springmvc的配置文件:applicationContext-mvc.xml
  • 配置springmvc需要扫描的包
  • 配置视图解析器:InternalResourceViewResolver
  • 配置上传解析器:CommonsMultipartResolver
  • 静态资源放行,将其交给服务器的servlet处理 mvc:default-servlet-handler/
  • 开启springMVC注解的支持:mvc:annotation-driven/
  1. 配置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需要在这里指点切点和增强】
  1. 配置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

  1. 配置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代码则可以直接覆盖
  1. mapper接口映射文件的配置,注意单个mapper接口映射文件的namespace命名空间必须指向该接口【配置完全限定名】
  • 代码生成器生成mapper接口的映射文件,自动生成了namespace指向的接口
  1. 配置分页功能
  • 在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的整合

  1. 导入依赖shiro-all
  2. 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创建的权限过滤器可以不同名

  1. 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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值