SSM

Posted on 2022-03-19 14:46  夜雨初凉  阅读(57)  评论(0编辑  收藏  举报

一、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&amp;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>

Copyright © 2024 夜雨初凉
Powered by .NET 9.0 on Kubernetes