ssm:spring +springmvc+mybatis:
springmvc整合mybatis:
出现这个错误:BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the Application
原因:未能扫描到@controller ,配置controller扫描包 的路径,或者是出现相同的controller的控制器(控制器类的名字相同了)
1.导包。
2.配置配置文件
2.1:web.xml
2.2:applicationContext.xml:书写spring的配置文件
2.3springmvc-servlert.xml:springmvc的配置文件
2.4sqlMapConfig.xml:mybatis的核心的配置文件
2.5db.properties:数据库的配置
2.6mapper映射xml
其实在springmvc的模块也是spring的配置文件的一部分,这里分开书写是为了进行方便管理可以说是比较方便管理
2.1web.xml需要做以下配置:加载spring的配置文件,spring上下的监听器,配置前端控制器并读取springmvc配置文件,配置映射及拦截规则;
<!-- 加载spring的配置文件 -->
<context-param>
<param-name>contextConfigLocationn</param-name>
<param-value>classpath*:/applicationContext.xml</param-value>
</context-param>
<!-- spring 的上下文的监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 配置前端控制器 -->
<servlet>
<servlet-name>springmvc-mybatis</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置读取springmvc配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<!-- 配置映射的及请求设置拦截规则 -->
<servlet-mapping>
<servlet-name>springmvc-mybatis</servlet-name>
<!-- 设置请求拦截规则
1./*:不能进行对其访问:No mapping found for HTTP request with URI [/spring-mvc/WEB-INF/jsp/hello.jsp] in DispatcherServlet with name 'spring-mvc'
拦截所有,jsp,js,css都会拦截,不建议
2./:拦截所有不包括jsp,肯定可以用
3.*.action,*.do,拦截do,action的结尾请求,一般用于前台,面向消费者的
-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
2.2:applicationContext.xml :
读取指定的数据源,配置连接池,注册mybatis工厂读取mybatis核心配置文件,mapper代理扫描包,注解事务开启aop事务,注入各个bean;
<!-- 指定spring读取db.properties配置 -->
<context:property-placeholder location="classpath:db.properties" />
<!-- 1.将连接池 -->
<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" >
<property name="jdbcUrl" value="${jdbc.jdbcUrl}" ></property>
<property name="driverClass" value="${jdbc.driverClass}" ></property>
<property name="user" value="${jdbc.user}" ></property>
<property name="password" value="${jdbc.password}" ></property>
</bean>
<!-- mybatis工厂 -->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<!-- 核心的配置的文件 -->
<property name="configLocation" value="classpath:sqlMapConfig.xml"></property>
</bean>
<!--使用mapper动态代理 扫描的方式:-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 指定基本包 在这里dao层的接口相当于动态代理mapper-->
<property name="basePackage" value="com.leo.springmvc.dao"></property>
</bean>
<!--注解事务,封装了所有事务操作. 依赖于连接池 -->
<bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
<property name="dataSource" ref="dataSource" ></property>
</bean>
<!-- 开启使用注解管理aop事务 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- 注入bean -->
<bean id="itemService" class="com.leo.springmvc.service.impl.ItemServiceImpl">
<property name="itemdao" ref="itemdao"></property>
</bean>
<bean id="itemdao" class="com.leo.springmvc.dao.impl.ItemDaoImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactoryBean"></property>
</bean>
</beans>
2.3springmvc-servlert.xml
主要用于扫描控制器,注解驱动,配置视图解析器。
<!-- 配置controller扫描包 ,多个包调用用","隔开
扫描@Controller,@Service
在不配置处理器映射器,和处理器适配器,会使用默认的,可以不配置
-->
<context:component-scan base-package="com.leo.springmvc"></context:component-scan>
<!-- 废除了:配置处理器映射器
<bean class="org.springframework.web.servlet.mvc.annotation.RequestMappingHandlerMapping"></bean>
配置处理器配置器
<bean class="org.springframework.web.servlet.mvc.annotation.RequestMappingHandlerAdapter"></bean> -->
<!-- 注解驱动 ,配置这个就相当于配置了上面的两个-->
<mvc:annotation-driven></mvc:annotation-driven>
<!--配置视图解析器
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
逻辑视图的前缀,后缀 ,逻辑视图名在controller中返回ModelView指定
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
最终的jsp物理地址:前缀+逻辑视图+后缀
</bean> -->
</beans>
2.4sqlMapConfig.xml:
mybatis的配置文件,其实不用配置只需要相应的头文件就可以
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 设置别名 -->
<typeAliases>
<!--指定的包内的所有的类都设置别名,别名的名称就是类名大小写不敏感 -->
<package name="com.leo.springmvc"/>
</typeAliases>
<!-- 已经扫秒的包了,所以不用配置mapper的路径了 -->
</configuration>
2.5db.properties:配置数据库的属性
2.6mapper映射xml:书写sql的配置文件,
3. 在controller中调用其他各层,由于在这里用了接口的方式所以自动装配注解@Autowired就不可以使用,在controller中需要使用service层时就
指定这个属性去读取相应bean的id;用下面的方式实现属性的注入。
@Resource(name="itemService")
private ItemService itemService;
在这里说下 @Resource(name="itemService")和 @Autowired的区别:
@Resource默认按照名称方式进行bean匹配, j2EE的。可以指定读取按哪个名称的装配方法。
@Autowired默认按照类型方式进行bean匹配,spring的。默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。
@Resource可以减少代码和Spring之间的耦合
@Resource默认按照ByName自动注入,由J2EE提供,需要导入包javax.annotation.Resource。
@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。
所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略。
@Resource装配顺序:
①如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。
②如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。
③如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。
④如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。
@Resource的作用相当于@Autowired,只不过@Autowired按照byType自动注入。
4.运行项目并访问就可以拿到你想要的结果及页面。