SpringMVC学习笔记(三)
ssm框架整合
使用Intelij Idear 进行ssm整合,javaweb项目通常采用三层架构,表现层、业务层、持久层,表现层对应的式SpringMVC框架、业务层对应的是Spring框架、持久层对应的是Mybatis框架。而业务层Spring框架是表现层和持久层中间不可缺少,所以通常是spring和springmvc整合,spring和mybatis整合。
整合我们可以使用xml的方式,也可以使用注解的方式。
整合思路
- 先搭建整合的环境
- 先把Spring的配置搭建完成
- 再使用Spring整合SpringMVC框架 4. 最后使用Spring整合MyBatis框架
一、Spring整合
1、创建工程,选择maven的webapp工程
2、创建包结构
- 在src目录下分别创建
java
和resource
两个包,分别设置成根目录。
image - 在java目录下我们根据三层架构创建包
domain
包下通常是实体类、javabean等
dao
包下是实体类的接口,通常是我们对SQL语句处理
service
包下是业务处理相关,包含接口和实现类,通常和业务逻辑相关
controller
包下是前端控制器,处理请求和页面跳转。
test
包下通常是我们的单元测试类 - 创建一个
Account
类
public class Account implements Serializable {
private Integer id;
private String name;
private double money;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
@Override
public String toString() {
return "Account{" +
"id=" + id +
", name='" + name + '\'' +
", money=" + money +
'}';
}
}
- 在
dao
包下创建account接口,创建findAll()
和saveAccount
方法
public interface AccountDao {
//查询所有
public List<Account> findAll();
//保存账户
public void saveAccount(Account account);
}
- 在
service
包下创建AccountService
接口,和impl.AccountServiceImpl
实现类
public interface AccountService {
//查询所有
public List<Account> findAll();
//保存账户
public void saveAccount(Account account);
}
public class AccountServiceImpl implements AccountService {
@Override
public List<Account> findAll() {
System.out.println("业务层:查询所有账户");
return null;
}
@Override
public void saveAccount(Account account) {
System.out.println("业务层:保存账户");
accountDao.saveAccount(account);
}
}
- 在
controller
包下创建AccountController
类
3、在resource资源包下,我们创建spring的配置文件,取名applicationContext.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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
spring中业务层中由于使用注解开发,所以我们需要开启注解扫描,由于我们只希望处理service和dao,而Controller有SpringMVC框架帮我们处理,所以这里我们可以将Controller的注解过滤掉。
<!-- 开启注解扫描,希望处理service和dao,controller不需要处理 -->
<context:component-scan base-package="com.fanyang">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
Spring框架这一步完成
二、springmvc框架整合
1、首先我们需要在web.xml
中配置servlet前端控制器,在初始化中加载在springmvc的配置文件,代码如下:
<!-- 配置前端控制器 -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 解决中文乱码的过滤器 -->
<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、由于初始化加载了springmvc.xml文件,所以我们在
resource
目录下创建springmvc框架的配置文件:
设置约束
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
开启注解的扫面,只需要扫面Controller注解,代码如下:
<!-- 开启注解扫描,只扫描Controller注解 -->
<context:component-scan base-package="com.fanyang">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- 开启SpringMVC注解的支持 -->
<mvc:annotation-driven></mvc:annotation-driven>
配置视图解析器
<!-- 配置视图解析器对象 -->
<bean id="internalResourceViewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
过滤静态资源,由于Servlet会拦截所有的资源文件,所以在页面加载过程中需要过滤静态资源
<!-- 过滤静态资源 -->
<mvc:resources location="/css/" mapping="/css/**"></mvc:resources>
<mvc:resources location="/js/" mapping="/js/**"></mvc:resources>
<mvc:resources location="/images/" mapping="/images/**"></mvc:resources>
如何整合Spring和SpringMVC
我们在Controller中由于使用到了service层处理的数据,但是我们的applictionContext.xml
文件并没有随着我们的服务器启动而加载,所以我们唯一要做的是,需要在服务启动后,我们的spring配置文件能够加载,这里就用到了spring-web
这个jar包。
我们在启动tomcat
服务器时,会创建一个ServletContext的唯一的域对象,这个对象随着服务器开启创建,随着服务器关闭消失,这一过程都是有一个监听器在操作,监听ServletContext域对象创建和销毁。所以我们可以使用监听器去加载Spring配置文件。
<!-- 配置Spring的监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
三、Mybatis配置
我们使用注解的方式配置Mybatis,在到dao接口方法中进行sql语句处理,查询和保存操作!
//查询所有
@Select("select * from account")
public List<Account> findAll();
//保存账户
@Insert("insert into account(name,money) values(#{name},#{money})")
public void saveAccount(Account account);
在service
包下,进行业务处理相关代码
@Service("accountService")
public class AccountServiceImpl implements AccountService {
@Autowired
private AccountDao accountDao;
@Override
public List<Account> findAll() {
System.out.println("业务层:查询所有账户");
List<Account> accounts = accountDao.findAll();
for (Account account : accounts) {
System.out.println(account);
}
return accounts;
}
@Override
public void saveAccount(Account account) {
System.out.println("业务层:保存账户");
accountDao.saveAccount(account);
}
}
controller
包下进行页面控制
@Controller
@RequestMapping("/account")
public class AccountController {
@Autowired
private AccountService accountService;
@RequestMapping("/findAll")
public String findAll(Model model){
//调用业务层方法
List<Account> list = accountService.findAll();
model.addAttribute("list",list);
return "success";
}
@RequestMapping("/save")
public void save(Account account, HttpServletRequest request,
HttpServletResponse response) throws Exception {
accountService.saveAccount(account);
response.sendRedirect(request.getContextPath()+"/account/findAll");
}
这里基本代码写完,如何进行spring和mybatis的整合
在applicationContext.xml
中进行配置
- 配置数据库连接池:
<!-- 配置连接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl"
value="jdbc:mysql://localhost:3306/ssm?characterEncoding=utf8"/>
<property name="user" value="root"/>
<property name="password" value="1234"/>
</bean>
- 配置SqlSessionFactory,这里使用注解方式
<!-- 配置SqlSessionFactory工程 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
</bean>
- 扫描dao包,添加映射文件
<bean id="mapperScanner"
class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.fanyang.dao"></property>
</bean>
- 配置事务相关
<!-- 配置Spring框架声明式事务管理 -->
<!-- 配置事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置事务通知-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="find*" read-only="true"/>
<tx:method name="*" isolation="DEFAULT" />
</tx:attributes>
</tx:advice>
<!-- 配置AOP增强 -->
<aop:config>
<aop:advisor advice-ref="txAdvice"
pointcut="execution(* com.fanyang.service.impl.*ServiceImpl.*(..))" />
</aop:config>
mybatis和spring的整合完成