学完了三个框架,现在来整合一下SSM,并且实现一个图书馆增删改查的简单项目。
这个整合就是实现简单的CRUD,整合的过程中多复习有关于之前的一些知识和思想,本身并不难,只是可能再配置的过程中会出现很多问题,在SSM框架学完就立刻整合项目也算是锻炼自己的能力了。
之后还会再整合一个搜索的功能,这个功能会在本次的实战基础上修改代码,待更新中…
创建一个存放书籍数据的数据库表:
CREATE DATABASE `ssmbuild`;USE `ssmbuild`;CREATE TABLE `books` (`bookID` INT(10) NOT NULL AUTO_INCREMENT COMMENT '书id',`bookName` VARCHAR(100) NOT NULL COMMENT '书名',`bookCounts` INT(11) NOT NULL COMMENT '数量',`detail` VARCHA`books`R(200) NOT NULL COMMENT '描述',KEY `bookID` (`bookID`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;INSERT INTO `books`(`bookID`,`bookName`,`bookCounts`,`detail`)VALUES
(1,'Java',1,'从入门到放弃'),
(2,'MySQL',10,'从删库到跑路'),
(3,'Linux',5,'从进门到进牢');DROP TABLE IF EXISTS `books`;
除了最后一句其他都运行,成功建表:
1、新建一个普通的maven项目
2、添加web的支持,且给web手动添加lib依赖
3、导入相关的pom依赖
junit junit 3.8.2 mysql mysql-connector-java 8.0.11 com.mchange c3p0 0.9.5.2 javax.servlet servlet-api 2.5 javax.servlet.jsp jsp-api 2.2 javax.servlet jstl 1.2 org.mybatis mybatis 3.5.2 org.mybatis mybatis-spring 2.0.2 org.springframework spring-webmvc 5.1.9.RELEASE org.springframework spring-jdbc 5.1.9.RELEASE
4、添加Maven的资源过滤设置
src/main/resources **/*.properties **/*.xml src/main/java **/*.properties **/*.xml true
5、连接数据库(记得Driver调整为5.0版本的,具体看之前的有关于mybatis的文章)
6、构建基本结构和框架:
(1)载java包下创建4个package
com.wang.pojo
com.wang.service
com.wang.dao
com.wang.controller
(2)在resources下创建applicationContext.xml、mybatis-config.xml并配置
applicationContext.xml:
mybatis-config.xml:
1、在resources包下创建数据库配置文件database.properties:
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssmbuild?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
jdbc.username=root
jdbc.password=123456
如果你的MySQL是5.7版本的,那么就需要把cj给去掉
2、在pojo包下新建实体类,这个实体类对照数据库,即Books,里面的属性要和数据库上的属性名完全一样,否则有时候可能会报空指针异常。
当然,类里面也是需要构造函数的,可以自己写构造方法,也可以利用Lombok,然后用注解进行参数的构造,先导入相应的pom依赖:
lombok依赖:
org.projectlombok lombok 1.18.10
Books类:
package com.wang.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@AllArgsConstructor
@NoArgsConstructor
public class Books {private int bookID;private String bookName;private int bookCounts;private String detail;
}
3、接下来该写接口了,在dao层下接口BookMapper,分别封装增删改查的方法:
package com.wang.dao;import com.wang.pojo.Books;
import org.apache.ibatis.annotations.Param;import java.util.List;public interface BookMapper {//增加一本书int addBook(Books books);//删除一本书int deleteBookById(@Param("bookID") int id);//更新一本书int updateBook(Books books);//查询一本书Books queryBookById(@Param("bookID") int id);//查询全部的书List queryAllBooks();
}
4、学了mybatis以后,实现这些接口的方法直接用Mapper.xml来做,在dao包下面新建BooksMapper.xml:
insert into ssmbuild.books (bookName, bookCounts, detail)values (#{bookName},#{bookCounts},#{detail}) delete from ssmbuild.bookswhere bookID=#{bookID} update ssmbuild.booksset bookName=#{bookName},bookCounts=#{bookCounts},detail=#{detail}where bookID=#{bookID}
5、编写mybatis的核心配置文件,取别名,并进行mapper的注册:
6、开始写service层,新建接口和Impl实现类,把dao注入到其中,然后调用方法,具体如下:
(1)BookService接口:
package com.wang.service;import com.wang.pojo.Books;import java.util.List;public interface BookService {//增加一本书int addBook(Books books);//删除一本书int deleteBookById(int id);//更新一本书int updateBook(Books books);//查询一本书Books queryBookById(int id);//查询全部的书List queryAllBooks();
}
(2)BookServiceImpl类:
package com.wang.service;import com.wang.dao.BookMapper;
import com.wang.pojo.Books;import java.util.List;public class BookServiceImpl implements BookService{//service层调dao层,组合daoprivate BookMapper bookMapper;public void setBookMapper(BookMapper bookMapper) {this.bookMapper = bookMapper;}@Overridepublic int addBook(Books books) {return bookMapper.addBook(books);}@Overridepublic int deleteBookById(int id) {return bookMapper.deleteBookById(id);}@Overridepublic int updateBook(Books books) {return bookMapper.updateBook(books);}@Overridepublic Books queryBookById(int id) {return bookMapper.queryBookById(id);}@Overridepublic List queryAllBooks() {return bookMapper.queryAllBooks();}
}
到这里,终于把Mybatis层配完了
1、在resources下新建spring-dao.xml:
2、整合service层,因为service层有个很重要的东西:事务。
在resources下新建spring-service.xml:
3、最后再applicationContext.xml中导入两个配置:
1、首先这已经是一个有web框架支持的项目了,那么我们就直接在web.xml中配置DispatchServlet以及解决乱码的过滤:
springmvc org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:applicationContext.xml 1 springmvc / encodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding utf-8 encodingFilter /* 15
2、在resources下新建spring-mvc.xml:
最后记得在applicationContext.xml中导入这个resource:
3、最后一步只需要在WEB-INF下面新建一个jsp的包即可,整个项目的配置到现在构建完毕。
这个最好能够保存下来,以后这个就可以作为做项目的底层了!
我认为这是很重要的一部分,要锻炼自己的纠错能力,那么我们需要进行一下测试:
(1)在controller包下新建BookController类:
package com.wang.controller;import com.wang.pojo.Books;
import com.wang.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;import java.util.List;@Controller
@RequestMapping("/book")
public class BookController {//controller层调用service层@Autowired@Qualifier("BookServiceImpl")private BookService bookService;//查询全部的书籍,并且返回到一个书籍展示页面@RequestMapping("/allBook")public String list(Model model){List list = bookService.queryAllBooks();model.addAttribute("list",list);return "allBook";}}
(2)直接在WEB-INF下新建jsp的包,新建allBook.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
书籍展示页面
书籍展示
(3)修改一下index.jsp的内容,这个页面即为首页,我们用页面跳转来访问allBook.jsp的内容:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
首页 进入书籍页面
正确的运行结果应该为:
点击链接后,页面成功跳转:
1、查看有没有lib包且导入全部依赖
2、查看bean是否注入成功
3、Junit测试单元,看我们的代码能否查询出结果:
在test-java中新建MyTest类:
import com.wang.pojo.Books;
import com.wang.service.BookService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class MyTest{@Testpublic void test(){ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");BookService bookServiceImpl = (BookService) context.getBean("BookServiceImpl");for (Books books : bookServiceImpl.queryAllBooks()) {System.out.println(books);}}
}
4、那么可以知道出问题的是Spring,因为底层的东西并没有报错,正常返回正确的结果,接下来只需要检查web.xml文件中的servlet初始化是否有问题,init-param标签内的value值改为:classpath:applicationContext.xml即可。
我们接着要开始写各个功能,并且要返回出好看的让客户看的可视化界面,那么首先先修改一下首页的样式,我们可以修改h3和a的style样式:
接着我们要开始编写allBook.jsp页面,利用BootStrap来优化界面,并且真正实现显示全部书籍。
该代码为:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
书籍展示页面 <%--BootSrap美化界面--%>
书籍列表 —— 显示所有书籍
书籍编号 书籍名称 书籍数量 书籍详情 <%-- 书籍从数据库中查询出来,从这个list中遍历出来,利用foreach --%>${book.bookID} ${book.bookName} ${book.bookCounts} ${book.detail}
后序的功能和之前的原理差不多,首先我们的首页都必须含有各功能的链接的跳转,要跳转的内容我们在controller层进行编程,即面向controller层编程。
(1)先向allBook.jsp内加上代码:
<%--toAddBook--%>新增书籍
2、直接面向controller层编程,既要能够实现新增书籍,还需要增加书籍以后要能够跳转回全部书籍页面,利用重定向即可实现:
//跳转到增加书籍页面:@RequestMapping("/toAddBook")public String toAddPaper(){return "addBook";}//添加书籍的请求@RequestMapping("/addBook")public String addBook(Books books){//System.out.println();bookService.addBook(books);return "redirect:/book/allBook";//重定向到我们的@RequestMapping("/allBook")}
3、我们只需要在addBook.jsp中写一个表单,提交写的请求即可。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
书籍展示页面 <%--BootSrap美化界面--%>
书籍列表 —— 显示所有书籍
<%--toAddBook--%>新增书籍书籍编号 书籍名称 书籍数量 书籍详情 <%-- 书籍从数据库中查询出来,从这个list中遍历出来,利用foreach --%>${book.bookID} ${book.bookName} ${book.bookCounts} ${book.detail}
功能简单,也就是加了一本书而已,页面重定向成功且数据库中的表确实有新增的书籍,成功。
也就是在总的页面的table控件中新增一下修改和删除的选项,但是我们需要注意的是,当我们在修改额删除书籍的时候,由于书的ID是隐藏的,也就是说并没有这么一个传值的过程,那么我们就需要利用到隐藏域的知识,用隐藏域的手段来实现传入ID值,最后实现功能。
BookController.java:
//跳转到修改页面@RequestMapping("/toUpdateBook")public String toUpdateBook(Model model, int id) {Books books = bookService.queryBookById(id);//System.out.println(books);model.addAttribute("QBook",books);return "updateBook";}//响应修改的请求@RequestMapping("/updateBook")public String updateBook(Books books) {//System.out.println(book);bookService.updateBook(books);return "redirect:/book/allBook";}//删除的代码使用了RestFul风格@RequestMapping("/deleteBook/{bookID}")public String deleteBook(@PathVariable("bookID") int id){bookService.deleteBookById(id);return "redirect:/book/allBook";}
allbook.jsp的table将会写入操作的连接:
更改 |<%--这里将使用RestFul风格--%>删除
别忘了表头tr也得在前面写上。
updateBook.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
修改书籍 <%--BootSrap美化界面--%>
修改书籍
<%--书籍表单--%>
图书馆系统增删改查
下一篇:0092 图