Spring-SSM的整合

不管现实多么惨不忍睹,都要持之以恒地相信,这只是黎明前短暂的黑暗而已。不要惶恐眼前的难关迈不过去,不要担心此刻的付出没有回报,别再花时间等待天降好运。真诚做人,努力做事!你想要的,岁月都会给你。Spring-SSM的整合,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

SSM整合到底整合什么?

1、spring和mybaits整合(数据源》sessionFactory》session)

2、spirng和springMVC整合

为什么要整合到一起?

统一指挥、让两个框架中用到的类和对象,都让spring管理。好处:无缝衔接、用到spring提供的很多工具。

由谁来整合?

mybatis的主配置文件

spring的配置文件

springMVC的配置文件

web.xml

、mybatis配置文件

这个文件中没有必须添加的内容。因为他的主要内容:数据源连接信息和子配置文件Mapper信息都会在Spring的配置文件中体现

但是我们一般配置以下内容

<configuration>
    <!--配置mybatis的log实现为LOG4J-->
    <settings>
        <setting name="logImpl" value="LOG4J"></setting>
    </settings>
</configuration>

二 、SpringMVC配置文件

这个配置文件的内容要怎么记忆?首先我们要清楚SpringMVC的作用是什么。因为SpringMVC就是用来做页面之间的跳转和数据传递的。所以它的主配置文件的内容都是和这两方面相关的。

另外SpringMVC是Spring的一个子框架 ,所以SpringMVC和Spring之间不需要整合

<!--扫描业务逻辑层的注解-->
    <context:component-scan base-package="xinmiao.controller,xinmiao.service"></context:component-scan>


    <mvc:annotation-driven>
        <mvc:message-converters>
            <!-- 这是一个消息转换器 如果返回的值是文本类型的 解决控制层到视图层的中文乱码问题-->
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>application/json;charset=UTF-8</value>
                        <value>text/html;charset=UTF-8</value>
                    </list>
                </property>
            </bean>
            <!-- 这是一个消息转换器 如果返回的是实体类或者集合 解决控制层到视图层的中文乱码问题-->
            <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>text/html;charset=UTF-8</value>
                        <value>application/json</value>
                    </list>
                </property>
                <property name="features">
                    <list>
                        <!-- Date的日期转换器 -->
                        <value>WriteDateUseDateFormat</value>
                    </list>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

<!--    配置多视图解析管理器-->
    <bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
<!--        是否启用format参数支持,默认为true-->
        <property name="favorParameter" value="true"/>
<!--        是否支持.html,.json,.xml等扩展名,默认为true-->
        <property name="favorPathExtension" value="true"/>
<!--        默认ContentType-->
        <property name="defaultContentType" value="text/html"/>
<!--        配置映射关系-->
        <property name="mediaTypes">
            <value>
                json=application/json
                xml=application/xml
                html=text/html
            </value>
        </property>
    </bean>
<!--    View解析定义,内容协商视图解析器;根据contentNegotiationManager使用的不同mediaTypes 决定不同的view进行响应 默认使用-->
    <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<!--        内容协商管理器 用于决定media type-->
        <property name="contentNegotiationManager" ref="contentNegotiationManager"/>
<!--        默认视图-->
        <property name="defaultViews">
            <list>
                <bean class="com.alibaba.fastjson.support.spring.FastJsonJsonView">
                    <property name="charset" value="UTF-8"/>
                </bean>
            </list>
        </property>
        <property name="viewResolvers">
            <list>
                <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                    <property name="prefix" value="/WEB-INF/jsp/"/>
                    <property name="suffix" value=""/>
                </bean>
            </list>
        </property>
    </bean>


<!--    解决静态资源加载的问题-->
    <mvc:resources mapping="/static/**" location="/static/"></mvc:resources>


    <!-- 配置MultipartResolver,用于上传文件,使用spring的CommonsMultipartResolver -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="5000000"/>
        <property name="defaultEncoding" value="UTF-8"/>
    </bean>

三、spring的配置文件

之前我们已经明白了,spirngMVC不需要spring刻意的去整合,所以spirng中最主要的内容就是整合mybatis。那mybatis我们到底是要整合哪些内容呢?

首先我们要明白mybatis的最根本的目的是要执行sql语句。而sql语句写在Mapper子配置文件中,sql语句最终要再数据库中执行,并且有些sql是需要有事务管理的。

所以spring中首先要把数据源管理起来,还需要把mybaits的主配置文件和子配置文件Mapper管理起来,管理这两样用的Ioc。

接下来我们需要使用AOP在业务逻辑层切入自带的事务管理器。

最后就是把业务逻辑层的bean也加入进来。

<!-- 加载属性文件-->
    <context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>

    <!--此数据源可以替换-->
    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${driver}"></property>
        <property name="url" value="${url}"></property>
        <property name="username" value="${user}"></property>
        <property name="password" value="${pwd}"></property>
    </bean>

    <!--整合sqlSessionfactory 包涵了数据源(dataSource)配置文件(config)和映射文件(mapper)-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" >
        <property name="dataSource" ref="dataSource"></property> <!--数据源-->
        <property name="configLocation" value="classpath:mybatis.xml"></property>  <!--配置文件-->
        <property name="mapperLocations" value="classpath:mappers/*.xml"></property>  <!--映射文件-->
    </bean>

    <!--扫描mapper接口-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="xinmiao.mapper"></property>
    </bean>

    <!--扫描业务逻辑层的注解-->
    <context:component-scan base-package="xinmiao"></context:component-scan>

    <!--添加声明式的事务管理器  管理指定的数据源-->
    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

    <!--把事务管理器,变成增强(通知),同时指定了方法的事务传播机制-->
    <tx:advice id="txAdvice" transaction-manager="txManager">
        <tx:attributes>
            <tx:method name="add*" propagation="REQUIRED"/>
            <tx:method name="update*" propagation="REQUIRED"/>
            <tx:method name="del*" propagation="REQUIRED"/>
            <tx:method name="get*" propagation="REQUIRED" read-only="true"/>
        </tx:attributes>
    </tx:advice>

    <aop:config>
        <aop:pointcut id="servicePointcut" expression="execution(* xinmiao.service.*.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="servicePointcut"></aop:advisor>
    </aop:config>

    <import resource="springmvc.xml"></import>

四、web.xml配置文件

上面我们配置好了三个框架,框架配置的再好,也得有初始化的地方。自然初始化的地方就是在web.xml中。

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
  
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springContext.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

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

</web-app>

Ajax分页查询

Controller层

注意扫描业务逻辑层的注解是否正确否则SpringMVC无法识别

@Controller
@RequestMapping("/xinmiao/v1/TStorageRecord")
@ResponseBody
public class TStorageRecordController {

    @Autowired
    private TStorageRecordService recordService;

    @RequestMapping("/getlist")
    public String getlist(TStorageRecord record, HttpServletRequest request){
        Page page=new Page();
        String currPageNoStr=request.getParameter("currPageNo");
        if(currPageNoStr==null||"".equals(currPageNoStr)){
            page.setCurrPageNo(1);
        }else{
            page.setCurrPageNo(Integer.parseInt(currPageNoStr));
        }
        String pageSizeStr=request.getParameter("pageSize");
        if (pageSizeStr==null||"".equals(pageSizeStr)){
            page.setPageSize(2);
        }else{
            page.setPageSize(Integer.parseInt(pageSizeStr));
        }
        page.setTotalCount(recordService.getStudentCount());
        page.setStudents(recordService.getStudentList(page.getCurrPageNo(),page.getPageSize()));
        String result= JSON.toJSONString(page);
        return result;
    }

}

Mapper层

注意扫描mapper接口是否正确否则Spring无法识别

public interface TStorageRecordMapper {

    int getStudentCount();

    List<TStorageRecord> getStudentList(@Param("currPageNo") int currPageNo, @Param("pageSize")int pageSize);

}

Service层

注意扫描业务逻辑层的注解是否正确否则SpringMVC无法识别

public interface TStorageRecordService {
    int getStudentCount();

    List<TStorageRecord> getStudentList(@Param("currPageNo") int currPageNo, @Param("pageSize")int pageSize);
}

 Serviceimpl层

@Service
public class TStorageRecordServiceimpl implements TStorageRecordService {

    @Autowired
    private TStorageRecordMapper RecordMapper;

    @Override
    public int getStudentCount() {
        return RecordMapper.getStudentCount();
    }

    @Override
    public List<TStorageRecord> getStudentList(int currPageNo, int pageSize) {
        int num=(currPageNo-1)*pageSize;
        return RecordMapper.getStudentList(num,pageSize);
    }
}

 until层

public class Page {
    private int totalPageCount = 0;     //总页数 计算 根据每页展示记录数和记录总数计算出来的
    private int pageSize = 10;      //每页展示记录数。用户指定,通常有默认值
    private int totalCount;     // 记录总数。 数据库查询
    private int currPageNo = 1;     //当前页码 用户指定,默认显示第一页
    private List<TStorageRecord> records;    //每页微博集合 数据库查询

    public int getTotalPageCount() {
        if (totalCount%pageSize==0){
            return totalCount/pageSize;
        }else {
            return totalCount/pageSize+1;
        }
    }

    public void setTotalPageCount(int totalPageCount) {
        this.totalPageCount = totalPageCount;
    }

    public int getPageSize() {
        return pageSize;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    public int getTotalCount() {
        return totalCount;
    }

    public void setTotalCount(int totalCount) {
        this.totalCount = totalCount;
    }

    public int getCurrPageNo() {
        return currPageNo;
    }

    public void setCurrPageNo(int currPageNo) {
        this.currPageNo = currPageNo;
    }

    public List<TStorageRecord> getStudents() {
        return records;
    }

    public void setStudents(List<TStorageRecord> students) {
        this.records = students;
    }
}

mappers层

<?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="xinmiao.mapper.TStorageRecordMapper">


    <select id="getStudentCount" resultType="java.lang.Integer">
        select count(1) from t_storage_record
    </select>


    <select id="getStudentList" resultType="xinmiao.bean.TStorageRecord">
        SELECT * FROM `t_storage_record`
             limit #{currPageNo},#{pageSize}
    </select>
</mapper>

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/161179.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!