1.搭建数据库环境:MySQL数据库中创建一个名称为ssm的数据库,在该数据库中创建一个名称为tb_book的表
CREATE DATABASE ssm;
USE ssm;
CREATE TABLE `tb_book` (
`id` int(11) ,
`name` varchar(32) ,
`press` varchar(32) ,
`author` varchar(32) );
INSERT INTO `tb_book` VALUES
(1, 'Java EE企业级应用开发教程', '人民邮电出版社', '黑马程序员');
2.引入项目SSM依赖库
3.创建实体类:创建名称为Book的实体类
package com.javaweb.domain;
public class Book {
private Integer id; //图书id
private String name; //图书名称
private String press; //出版社
private String author; //作者
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 String getPress() {
return press;
}
public void setPress(String press) {
this.press = press;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
}
4.创建名称为BookMapper的持久层接口,在BookMapper接口中定义findBookById()方法,通过图书id获取对应的图书信息。
package com.javaweb.dao;
import com.javaweb.domain.Book;
public interface BookMapper {
public Book findBookById(Integer id);
}
5.创建BookMapper接口对应的映射文件BookMapper.xml。
<?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="com.javaweb.dao.BookMapper">
<!--根据id查询图书信息 -->
<select id="findBookById" parameterType="int" resultType="com.javaweb.domain.Book">
select * from tb_book where id = #{id}
</select>
</mapper>
6.创建名称为BookService的业务层接口,在BookService接口中定义findBookById()方法,通过id获取对应的Book信息。
package com.javaweb.service;
import com.javaweb.domain.Book;
public interface BookService {
public Book findBookById(Integer id);
}
7.建BookService接口的业务层实现类BookServiceImpl。BookServiceImpl类实现BookService接口的findBookById()方法。
package com.javaweb.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.javaweb.dao.BookMapper;
import com.javaweb.domain.Book;
import com.javaweb.service.BookService;
@Service
public class BookServiceImpl implements BookService {
@Autowired
private BookMapper bookMapper;
@Override
public Book findBookById(Integer id) {
return bookMapper.findBookById(id);
}
}
8.创建名称为BookController的类。在BookController类中注入一个BookService对象,并且定义一个名称为findBookById()的方法。
package com.javaweb.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.javaweb.domain.Book;
import com.javaweb.service.BookService;
@Controller
public class BookController {
@Autowired
private BookService bookService;
@RequestMapping("/book")
public String findBookById(Integer id,Model model) {
Book book = bookService.findBookById(id);
model.addAttribute("book", book);
return "book";
}
}
9.在src/main/java下面创建application.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"
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">
<!-- 1.开启注解扫描, 扫描包 -->
<context:component-scan base-package="com.javaweb" />
<!-- 2.引入属性文件 -->
<context:property-placeholder location="classpath:jdbc.properties" />
<!-- 3.数据源 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!--4.创建SqlSessionFactory对象 -->
<bean id="sqlSessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 数据源 -->
<property name="dataSource" ref="dataSource" />
</bean>
<!--5.扫描Dao包,创建动态代理对象, 会自动存储到spring IOC容器中 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--指定要扫描的dao的包 -->
<property name="basePackage" value="com.javaweb.dao" />
</bean>
</beans>
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false
jdbc.username=root
jdbc.password=root
11.在项目的web.xml文件中配置Spring的监听器来加载Spring容器及Spring的配置文件。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
id="WebApp_ID" version="4.0">
<display-name>ssm</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.jsp</welcome-file>
<welcome-file>default.htm</welcome-file>
</welcome-file-list>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:application.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<filter>
<filter-name>encoding</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>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
12.在项目的src\main\resources目录下创建Spring MVC的配置文件spring-mvc.xml。spring-mvc.xml文件配置完成之后,在web.xml中配置Spring MVC的前端控制器,并在初始化前端控制器时加载Spring MVC的配置文件。
<?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:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan
base-package="com.javaweb.controller" /> <!-- 声明注解扫描 -->
<mvc:default-servlet-handler /> <!-- 启用默认Servlet处理静态资源 -->
<mvc:annotation-driven /> <!-- 开启 SpringMVC 的注解模式 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 视图解析器 -->
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
13.整合测试
(1)在webapps/WEB-INF/jsp下创建名称为book.jsp的文件,用于展示处理器返回的图书信息。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><head><title>图书信息查询</title></head><body>
<table border="1">
<tr><th>图书id</th><th>图书名称</th>
<th>出版社</th><th>作者</th></tr>
<tr><td>${book.id}</td><td>${book.name}</td>
<td>${book.press}</td>
<td>${book.author}</td></tr>
</table></body>
</html>
将项目部署到Tomcat中,启动项目,在浏览器中访问地址http://localhost:8080/ssm/book?id=1来进行图书查询,页面显示效果如图所示。
从图中所示的信息可以看出,程序成功查询到了id为1的图书信息。表明Controller层成功将Service层获取的图书信息返回给页面了,由此可以得出SSM框架整合成功。
接下来,将项目中的XML配置文件删除,使用纯注解的配置类依次替换对应的XML文件内容,以完成
纯注解的SSM框架整合。具体实现步骤如下所示。
创建名称为JdbcConfig的类,用于获取数据库连接信息并定义创建数据源的对象方法,并定义getDataSource()方法,用于创建DruidDataSource对象。
@PropertySource("classpath:jdbc.properties")
public class JdbcConfig {
// 下面为使用注入的形式。定义dataSource的bean,省略
@Value("${jdbc.driverClassName}") private String driver;
@Value("${jdbc.url}") private String url;
@Value("${jdbc.username}") private String userName;
@Value("${jdbc.password}") private String password;
}
在这里插入代码片
创建名称为MyBatisConfig的类,在MyBatisConfig类中定义getSqlSessionFactoryBean()方法,用于创建SqlSessionFactoryBean对象并返回。
public class MyBatisConfig {
// 定义MyBatis的核心连接工厂bean
@Bean
public SqlSessionFactoryBean getSqlSessionFactoryBean(
@Autowired DataSource dataSource){
SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
ssfb.setDataSource(dataSource); return ssfb; }
// 定义MyBatis的映射扫描,省略
}
创建名称为SpringConfig的类作为项目定义Bean的源头,并扫描Service层对应的包。
@Configuration
@Import({MyBatisConfig.class,JdbcConfig.class})
// 等同于<context:component-scan base-package="com.itheima.service">
@ComponentScan(value = "com.itheima.service")
// 将MyBatisConfig类和JdbcConfig类交给Spring管理
public class SpringConfig {
}
创建名称为SpringMvcConfig的类作为Spring MVC的配置类,在配置类中指定Controller层的扫描路径。
package com.javaweb.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
@Configuration
//等同于<context:component-scan base-package="com.itheima.controller"/>
@ComponentScan("com.javaweb.controller")
//等同于<mvc:annotation-driven/>,还不完全相同
@EnableWebMvc
public class SpringMvcConfig {
}
创建名称为ServletContainersInitConfig的类,继承AbstractAnnotationConfigDispatcherServletInitializer抽象类,重写抽象类的方法。用于替代之前web.xml文件配置的信息 ,初始化Servlet容器时加载指定初始化的信息。
public class ServletContainersInitConfig extends
AbstractAnnotationConfigDispatcherServletInitializer {
// 加载Spring配置类中的信息,初始化Spring容器
protected Class<?>[] getRootConfigClasses() {
return new Class[]{SpringConfig.class}; }
// 加载Spring MVC配置类中的信息,初始化Spring MVC容器
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class}; }
// 配置DispatcherServlet的映射路径
protected String[] getServletMappings() { return new String[]{"/"}; }}
启动chapter14项目,在浏览器中访问图书信息查询地址,地址为http://localhost:8080/book?id=1,页面显示效果如图所示。
从图中所示的信息可以看出,程序成功查询到了id为1的图书信息。表明Controller将Service获取的图书信息成功返回给页面了,由此可以得出纯注解的SSM框架整合成功。