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