这只是大型软件要求,项目相关的jar包依赖将在Maven中配置。
项目前置技能:MySQL、Mybatis、Spring、JavaWeb、简单的前端知识。
创建一个存放书籍数据的数据库表
CREATE DATABASE `ssmbuild`;
USE `ssmbuild`;
DROP TABLE IF EXISTS `books`;
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` VARCHAR(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, '从进门到进牢');
新建Maven项目,SpringMVC-06-SSM,添加web框架支持。
编写pom.xml,导入依赖
junit
junit
4.12
org.projectlombok
lombok
1.18.32
mysql
mysql-connector-java
8.0.16
com.mchange
c3p0
0.9.5.2
javax.servlet
servlet-api
2.5
javax.servlet.jsp
jsp-api
2.1
javax.servlet
jstl
1.2
org.mybatis
mybatis
3.5.2
org.mybatis
mybatis-spring
2.1.2
org.springframework
spring-webmvc
5.2.12.RELEASE
org.springframework
spring-jdbc
5.2.12.RELEASE
org.aspectj
aspectjweaver
1.9.4
建立基本结构和配置框架
com.moondream.controller 控制层
com.moondream.service 服务层
com.moondream.dao 持久层
com.moondream.pojo 实体类
web/WEB-INF/jsp 视图层
resources
mybatis-config.xml Mybatis核心配置文件
applicationContext.xml Spring全局配置文件
数据库配置文件 db.properties
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/ssmbuild?useSSL=false&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
user=root
password=123456
编写数据库表对应的实体类,使用Lombok依赖减少代码量
package com.moondream.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Book {
private Integer bookID;
private String bookName;
private Integer bookCounts;
private String detail;
}
编写MyBatis的核心配置文件 mybatis-config.xml
编写Mybatis的mapper映射文件 BookMapper.xml
insert into ssmbuild.books
values (#{bookID}, #{bookName}, #{bookCounts}, #{detail});
delete
from ssmbuild.books
where bookID = #{bookID};
update ssmbuild.books
set bookName=#{bookName},
bookCounts=#{bookCounts},
detail=#{detail}
where bookID = #{bookID};
编写mapper映射文件对应的接口,可以更方便的调用Mybatis
package com.moondream.dao;
import com.moondream.pojo.Book;
import java.util.List;
public interface BookMapper {
//增加一个Book
int addBook(Book book);
//根据id删除一个Book
Integer deleteBookById(Integer id);
//更新Book
Integer updateBook(Book Book);
//根据id查询,返回一个Book
Book queryBookById(Integer id);
//查询全部Book,返回list集合
List queryAllBook();
}
编写 spring-dao.xml,把Mybatis整合进Spring
到此,持久层编写完毕!
编写业务接口和接口实现
package com.moondream.service;
import com.moondream.pojo.Book;
import java.util.List;
//BookService: 需要具体实现,调用dao层
public interface BookService {
//增加一个Book
Integer addBook(Book book);
//根据id删除一个Book
Integer deleteBookById(Integer id);
//更新Book
Integer updateBook(Book Book);
//根据id查询,返回一个Book
Book queryBookById(Integer id);
//查询全部Book,返回list集合
List queryAllBook();
}
package com.moondream.service;
import com.moondream.dao.BookMapper;
import com.moondream.pojo.Book;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class BookServiceImpl implements BookService {
//调用dao层
@Autowired
private BookMapper bookMapper;
public Integer addBook(Book book) {
return bookMapper.addBook(book);
}
public Integer deleteBookById(Integer id) {
return bookMapper.deleteBookById(id);
}
public Integer updateBook(Book Book) {
return bookMapper.updateBook(Book);
}
public Book queryBookById(Integer id) {
return bookMapper.queryBookById(id);
}
public List queryAllBook() {
return bookMapper.queryAllBook();
}
}
编写 spring-service.xml ,Spring的service层配置文件
服务层编写完毕!
由于 Controller层 需要不断的与 View层 进行联动,
所以当我们编写完Controller层,其实View层也已经完成的差不多了。
编写 web.xml
DispatcherServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:applicationContext.xml
1
DispatcherServlet
/
EncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
utf-8
EncodingFilter
/*
15
编写 spring-controller.xml ,Spring的Controller层配置
配置文件,暂时结束!现在进行 Controller层 和 View层 编写
BookController 类编写 , 方法一:查询全部书籍
package com.moondream.controller;
@Controller
@RequestMapping("/book")
public class BookController {
@Autowired
private BookService bookService;
@RequestMapping("/allBook")
public String list(Model model) {
List list = bookService.queryAllBook();
model.addAttribute("list", list);
return "allBook";
}
}
编写首页 index.jsp
首页
点击进入列表页
书籍列表页面 allbook.jsp
书籍列表
BookController 类编写 , 方法二:添加书籍
@RequestMapping("/toAddBook")
public String toAddPaper() {
return "addBook";
}
@RequestMapping("/addBook")
public String addPaper(Book book) {
System.out.println(book);
bookService.addBook(book);
return "redirect:/book/allBook";
}
添加书籍 页面:addBook.jsp
新增书籍
新增书籍
BookController 类编写 , 方法三:修改书籍
@RequestMapping("/toUpdateBook")
public String toUpdateBook(Model model, Integer id) {
Book book = bookService.queryBookById(id);
System.out.println(book);
model.addAttribute("book", book);
return "updateBook";
}
@RequestMapping("/updateBook")
public String updateBook(Book book) {
System.out.println(book);
bookService.updateBook(book);
return "redirect:/book/allBook";
}
修改书籍 页面 updateBook.jsp
修改信息
修改信息
BookController 类编写 , 方法四:删除书籍
@RequestMapping("/del/{bookId}")
public String deleteBook(@PathVariable Integer bookId) {
bookService.deleteBookById(bookId);
return "redirect:/book/allBook";
}
Controller层 与 View层 编写完毕!
最后,做一些收尾和辅助性的工作,比如,横切日志提示,表明当前程序执行到哪一步了……
在com.moondream包下,新增log包,编写切面
package com.moondream.log;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.Date;
@Aspect
@Component
public class IndicationLog {
@Around("within(com.moondream.*.*+)")
public Object Indication(ProceedingJoinPoint pjp) throws Throwable {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date = sdf.format(new Date());
System.err.println("[" + date + "] " + pjp.getSignature().toShortString() + " ==>");
Object value = pjp.proceed();
System.err.println("
整合Spring的全局配置文件 applicationContext.xml
到目前为止,这个SSM项目整合已经完全的OK了,可以直接运行进行测试!这个练习十分的重要,大家需要保证,不看任何东西,自己也可以完整的实现出来!
项目结构图
之前,我们是从零开始搭建项目,所有需求都是定好的,
所以可以自下而上搭建,这样不至于在业务和底层接口之间频繁辗转,
而且编写的接口更容易做到复用,进而获得更好的经济性。
那么,如果是项目要新增功能呢?
这个时候,项目的基本框架已经成型,
一般是使用自上而下的方式来开发,这样更容易把握整体性。
编写前端页面
编写查询的Controller方法
@RequestMapping("queryBookByName")
public String queryBook(String queryBookName, Model model) {
//业务逻辑还没有写
return "allBook";
}
编写Service接口
//根据name模糊查询Book
List queryBookByName(String bookName);
编写Mapper接口
//根据name模糊查询Book
List queryBookByName(String bookName);
编写mapper.xml配置文件
编写Service实现类
public List queryBookByName(String bookName) {
return bookMapper.queryBookByName(bookName);
}
补全Controller
@RequestMapping("queryBookByName")
public String queryBook(String queryBookName, Model model) {
List list = bookService.queryBookByName(queryBookName.trim());
if (list.size() == 0) {
model.addAttribute("error", "没有找到本书!");
return "forward:/book/allBook";
}
model.addAttribute("list", list);
return "allBook";
}
前端增加一个显示全部书籍的按钮,方便查询后返回,提高用户体验
显示全部书籍
测试,查询功能OK!
SSM的整合案例到这里就结束了,SSM框架在Java企业级开发中的重要地位不需要多说。
我们通过这个项目已经能够独立的去开发一些小网站了,但是这只是增删改查的基本操作,还远远不够!
敬请期待,新的篇章:
参与评论
手机查看
返回顶部