下面是代码实现:
1. 编写视图层JSP代码,页面提供表单
```jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>新增图书</title>
</head>
<body>
<h2>新增图书</h2>
<form action="addBook" method="post">
<label>图书名称:</label>
<input type="text" name="bookName" required><br>
<label>出版社:</label>
<input type="text" name="press" required><br>
<label>出版日期:</label>
<input type="date" name="pressDate" required><br>
<label>作者:</label>
<input type="text" name="author" required><br>
<label>定价:</label>
<input type="number" name="price" required><br>
<label>ISBN:</label>
<input type="text" name="ISBN" required><br>
<input type="submit" value="提交">
</form>
</body>
</html>
```
2. 编写控制层Java代码,获取视图层提交的表单请求,控制方法注入表单项参数,控制层完成JavaBean封装和业务层代码调用。
```java
@Controller
public class BookController {
@Autowired
private BookService bookService;
@RequestMapping("/addBook")
public ModelAndView addBook(@RequestParam("bookName") String bookName,
@RequestParam("press") String press, @RequestParam("pressDate") Date pressDate,
@RequestParam("author") String author, @RequestParam("price") BigDecimal price,
@RequestParam("ISBN") String ISBN) {
Book book = new Book();
book.setBookName(bookName);
book.setPress(press);
book.setPressDate(pressDate);
book.setAuthor(author);
book.setPrice(price);
book.setISBN(ISBN);
String result = bookService.addBook(book);
ModelAndView modelAndView = new ModelAndView();
if(result == null) {
modelAndView.setViewName("add_result");
modelAndView.addObject("result", "添加成功");
} else {
modelAndView.setViewName("add_result");
modelAndView.addObject("result", "添加失败,原因:" + result);
}
return modelAndView;
}
}
```
3. 编写业务层Java代码,将控制层传输的JavaBean进行非空校验然后调用持久层代码。
```java
@Service
public class BookService {
@Autowired
private BookDao bookDao;
public String addBook(Book book) {
if(book.getBookName() == null || book.getBookName().equals("")) {
return "图书名称不能为空";
}
if(book.getPress() == null || book.getPress().equals("")) {
return "出版社不能为空";
}
if(book.getPressDate() == null || book.getPressDate().after(new Date())) {
return "出版日期不能为空且不能晚于当前时间";
}
if(book.getAuthor() == null || book.getAuthor().equals("")) {
return "作者不能为空";
}
if(book.getPrice() == null || book.getPrice().compareTo(BigDecimal.ZERO) <= 0) {
return "定价不能为空且必须大于0";
}
if(book.getISBN() == null || book.getISBN().equals("")) {
return "ISBN不能为空";
}
try {
bookDao.addBook(book);
return null;
} catch(Exception e) {
e.printStackTrace();
return "数据库异常";
}
}
}
```
4. 编写持久层Java代码,将经过控制层校验的JavaBean转换成SQL语句并向MySQL数据库Test的book表插入一条新增记录。
```java
@Repository
public class BookDao {
@Autowired
private JdbcTemplate jdbcTemplate;
public void addBook(Book book) {
String sql = "insert into book(bookName, press, pressDate, author, price, ISBN) values (?, ?, ?, ?, ?, ?)";
jdbcTemplate.update(sql, book.getBookName(), book.getPress(), book.getPressDate(), book.getAuthor(), book.getPrice(), book.getISBN());
}
}
```
5. 编写视图层JSP代码,显示新增成功或者失败及失败原因。
```jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>新增结果</title>
</head>
<body>
<h2>${result}</h2>
<a href="addBookPage">返回</a>
</body>
</html>
```
注意事项:
1. 页面表单不需要填写图书编号,而交给数据库自增长生成编号。
2. 持久层代码使用JDBC完成,允许使用ORM框架。
3. 必须使用SpringMVC框架,可以使用Spring的IoC。
提交要求:
1. 使用eclipseForJavaEE进行开发。
2. 将代码打包成war包并上传至服务器,提供war包下载链接。
3. 提供MySQL数据库Test的book表结构及插入数据的SQL语句。
MySQL数据库Test的book表结构及插入数据的SQL语句如下:
```sql
CREATE TABLE `book` (
`bookId` int(11) NOT NULL AUTO_INCREMENT COMMENT '图书编号',
`bookName` varchar(30) NOT NULL COMMENT '图书名称',
`press` varchar(20) NOT NULL COMMENT '出版社',
`pressDate` date NOT NULL COMMENT '出版日期',
`author` varchar(10) NOT NULL COMMENT '作者',
`price` decimal(10,2) NOT NULL COMMENT '定价',
`ISBN` char(13) NOT NULL COMMENT 'ISBN',
PRIMARY KEY (`bookId`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='图书';
```