首先引入三大框架所用jar包
结构如下:
准备数据库连接所需配置jdbc.properties
jdbc.user=root
jdbc.password=aini1314
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql:///springmvc
以及hibernate所需配置hibernate.properties
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
hibernate.hbm2ddl.auto=update
在web.xml中进行Spring的配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<!-- 配置SpringMVC -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!-- 用哪种容器类 -->
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</init-param>
<init-param>
<!-- 入口配置 -->
<param-name>contextConfigLocation</param-name>
<param-value>cn.qblank.AppConfig</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
在AppConfig类代替xml进行hibernate的配置
package cn.qblank;
import javax.sql.DataSource;
import org.hibernate.SessionFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.hibernate5.HibernateTransactionManager;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;
@Configuration
@ComponentScan("cn.qblank")
@PropertySource("classpath:jdbc.properties") //引入外部属性文件到Enviroment
@EnableTransactionManagement
@EnableWebMvc
public class AppConfig extends WebMvcConfigurerAdapter{
/**
* 负责将控制器方法返回的字符串映射到某个JSP
*/
@Bean
public ViewResolver viewResolver(){
//创建对象
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
// 支持jsp及标准taglib
viewResolver.setViewClass(JstlView.class);
//设置前后缀
viewResolver.setPrefix("/WEB-INF/jsp/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
/**
* 扫描实体类
*/
@Bean
public LocalSessionFactoryBean sessionFactory(DataSource dataSource){
LocalSessionFactoryBean factoryBean = new LocalSessionFactoryBean();
//加载数据源
factoryBean.setDataSource(dataSource);
//自动扫描实体类
factoryBean.setPackagesToScan("cn.qblank.entity");
return factoryBean;
}
/**
* 配置数据源
* 依赖Environment
*/
@Bean
public DataSource dataSource(Environment env){
DriverManagerDataSource ds = new DriverManagerDataSource();
ds.setDriverClassName(env.getProperty("jdbc.driverClass"));
ds.setUrl(env.getProperty("jdbc.jdbcUrl"));
ds.setUsername(env.getProperty("jdbc.user"));
ds.setPassword(env.getProperty("jdbc.password"));
return ds;
}
/**
* 创建事务类
* @param sessionFactory
* @return
*/
@Bean
public PlatformTransactionManager transactionManager(SessionFactory sessionFactory){
HibernateTransactionManager transactionManager = new HibernateTransactionManager();
transactionManager.setSessionFactory(sessionFactory);
return transactionManager;
}
/**
* bootstrap映射路径
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/assets/**").addResourceLocations("/public/");
}
}
书写dao层接口
package cn.qblank.dao;
import java.util.List;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import cn.qblank.entity.Book;
public interface IBookDao {
/**
* 查询所有
* @return
*/
List<Book> findAll();
/**
* 添加图书
*/
void addBook(Book book);
/**
* 修改图书
*/
void updateBook(Book book);
/**
* 删除图书
*/
void deleteBook(Long id);
/**
* 通过id查找
*/
Book findById(long id);
}
实现类BookDaoImpl
package cn.qblank.dao.impl;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import cn.qblank.dao.IBookDao;
import cn.qblank.entity.Book;
@Repository
@Transactional
public class BookDaoImpl implements IBookDao{
@Autowired
private SessionFactory sessionFactory;
@SuppressWarnings("unchecked")
@Override
public List<Book> findAll() {
return sessionFactory.getCurrentSession().createQuery("from Book").list();
}
@Override
public void addBook(Book book) {
Session session = sessionFactory.getCurrentSession();
session.save(book);
}
@Override
public void updateBook(Book book) {
sessionFactory.getCurrentSession().update(book);
}
@Override
public void deleteBook(Long id) {
Session session = sessionFactory.getCurrentSession();
//通过id查询到对象
Book book = session.get(Book.class, id);
session.delete(book);
}
@Override
public Book findById(long id) {
return sessionFactory.getCurrentSession().get(Book.class, id);
}
}
同样的实现service层接口
package cn.qblank.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import cn.qblank.dao.IBookDao;
import cn.qblank.entity.Book;
import cn.qblank.service.IBookService;
@Service
@Transactional
public class BookServiceImpl implements IBookService{
@Autowired
private IBookDao bookDao;
@Override
public List<Book> findAll() {
return bookDao.findAll();
}
@Override
public void addBook(Book book) {
bookDao.addBook(book);
}
@Override
public void updateBook(Book book) {
System.out.println("service:" + book);
bookDao.updateBook(book);
}
@Override
public void deleteBook(Long id) {
bookDao.deleteBook(id);
}
@Override
public Book findById(Long id) {
return bookDao.findById(id);
}
}
书写控制类BookController
package cn.qblank.control;
import java.util.List;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import cn.qblank.entity.Book;
import cn.qblank.service.IBookService;
@Controller //控制器注解
public class BookController {
@Autowired
private IBookService bookService;
@RequestMapping(method = RequestMethod.POST, value = "/add")
public String add(@ModelAttribute @Valid Book book,BindingResult bindingResult){
//调用业务
//添加图书
bookService.addBook(book);
if (bindingResult.hasErrors()) {
return "add";
}
//跳转
return "redirect:/list";
}
/**
* 展示图书列表
* @param model
* @return
*/
@RequestMapping(method = RequestMethod.GET, value = "/list")
public String list(Model model){
//调用service处理业务
List<Book> books = bookService.findAll();
//存入model中
model.addAttribute("books", books);
return "list";
}
/**
* 删除功能
* @param book
* @return
*/
@RequestMapping(value = "/delete")
public String delete(@ModelAttribute Book book){
bookService.deleteBook(book.getId());
return "redirect:/list";
}
/**
* 跳转到修改页面
* @param model
* @param book
* @return
*/
@RequestMapping(value = "/update/{id}")
public String update(@PathVariable long id,Model model){
Book book = bookService.findById(id);
System.out.println(book);
model.addAttribute("book",book);
return "update";
}
/**
* 跳转到主页
*/
@RequestMapping(value = "/updateJsp")
public String updateJsp(Model model,@Valid Book book, BindingResult bindingResult){
// if (bindingResult)
book = bookService.findById(book.getId());
//进行修改操作
bookService.updateBook(book);
return "redirect:/list";
}
/**
* 跳转到jsp页面
* @return
*/
@RequestMapping(method = RequestMethod.GET , value = "/addJsp")
public String addJsp(@ModelAttribute @Valid Book book,BindingResult bindingResult){
return "add";
}
}
访问项目页面list.jsp
<%@ page language="java" contentType="text/html; charset=GBK"
pageEncoding="GBK"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}"></c:set>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>图书列表</title>
<style type="text/css">
table{
text-align:center;
margin: 0 auto;
}
</style>
<link rel="stylesheet" href="${contextPath}/assets/bootstrap/css/bootstrap.css">
</head>
<body>
<div class="container">
<table border="1" class="table">
<tr>
<th>编号</th>
<th>书名</th>
<th>作者</th>
<th>出版社</th>
<th>简介</th>
<th>类别</th>
<th>出版日期</th>
<th>操作</th>
</tr>
<!-- 书名 作者 出版社 出版年份 简介 类别 -->
<c:forEach items="${books}" var="book" varStatus="b">
<tr>
<td>${book.id}</td>
<td>${book.bookname}</td>
<td>${book.author}</td>
<td>${book.publishConpany}</td>
<td>${book.info}</td>
<td>${book.booktype}</td>
<td>${book.publishDate}</td>
<td><a href="${contextPath}/update/${book.id}">修改</a> <a href="${contextPath}/delete?id=${book.id}">删除</a></td>
</tr>
</c:forEach>
<tr>
<td colspan="8" align="center"><a href="${contextPath}/addJsp">【添加】</a></td>
</tr>
</table>
</div>
</body>
</html>
add.jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}"></c:set>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>提交数据</title>
<link rel="stylesheet" href="${contextPath}/assets/css/form-validation.css">
<link rel="stylesheet" href="${contextPath}/assets/bootstrap/css/bootstrap.css">
<style type="text/css">
.form-error{
color:red;
margin-left:50px;
}
</style>
</head>
<body>
<h2>添加数据</h2>
<div class="container">
<form:form action="${contextPath}/add" method="POST" commandName="book" >
<div class="form-group">
<label for="exampleInputEmail1">书名</label>
<form:input path="bookname" cssClass="form-control" /><br/>
<form:errors path="bookname" cssClass="form-error"></form:errors>
</div>
<div class="form-group">
<label for="exampleInputEmail1">作者</label>
<form:input path="author" cssClass="form-control" /><br/>
<form:errors path="author" cssClass="form-error"></form:errors>
</div>
<div class="form-group">
<label for="exampleInputEmail1">出版社</label>
<form:input path="publishConpany" cssClass="form-control" /><br/>
<form:errors path="publishConpany" cssClass="form-error"></form:errors>
</div>
<div class="form-group">
<label for="exampleInputEmail1">出版年份</label>
<form:input path="publishDate" cssClass="form-control" /><br/>
<form:errors path="publishDate" cssClass="form-error"></form:errors>
</div>
<div class="form-group">
<label for="exampleInputEmail1">简介</label>
<form:input path="info" cssClass="form-control" /><br/>
<form:errors path="info" cssClass="form-error"></form:errors>
</div>
<div class="form-group">
<label for="exampleInputEmail1">类别</label>
<form:input path="booktype" cssClass="form-control" /><br/>
<form:errors path="booktype" cssClass="form-error"></form:errors>
</div>
<input type="submit" class="btn btn-primary" value="提交">
</form:form>
</div>
</body>
</html>
update.jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>提交数据</title>
<link rel="stylesheet" href="${pageContext.request.contextPath}/assets/css/form-validation.css">
<link rel="stylesheet" href="${contextPath}/assets/bootstrap/css/bootstrap.css">
</head>
<body>
<div class="container">
<form:form action="${pageContext.request.contextPath }/updateJsp"
method="post" commandName="book">
<div class="form-group">
<label for="exampleInputEmail1">书名</label>
<form:input path="bookname" cssClass="form-control" value="${book.bookname}"/>
<form:errors path="bookname"></form:errors>
</div>
<div class="form-group">
<label for="exampleInputEmail1">作者</label>
<form:input path="author" cssClass="form-control" value="${book.author}"/>
<form:errors path="author"></form:errors>
</div>
<div class="form-group">
<label for="exampleInputEmail1">出版社</label>
<form:input path="publishConpany" cssClass="form-control" value="${book.publishConpany}"/>
<form:errors path="publishConpany"></form:errors>
</div>
<div class="form-group">
<label for="exampleInputEmail1">出版年份</label>
<form:input path="publishDate" cssClass="form-control" value="${book.publishDate}"/>
<form:errors path="publishDate"></form:errors>
</div>
<div class="form-group">
<label for="exampleInputEmail1">简介</label>
<form:input path="info" cssClass="form-control" value="${book.info}"/>
<form:errors path="info"></form:errors>
</div>
<div class="form-group">
<label for="exampleInputEmail1">类别</label>
<form:input path="booktype" cssClass="form-control" value="${book.booktype}"/>
<form:errors path="booktype"></form:errors>
</div>
<input type="submit" class="btn btn-primary" value="提交">
</form:form>
</div>
</body>
</html>
各个页面的结果如下:
完整项目地址:
https://github.com/qblank/SSHPro02