书城项目第五阶段-图书模块
1.编写图书模块的数据库表
#1.创建表
CREATE TABLE t_book(
`id` INT PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(100),
`price` DECIMAL(11,2),
`author` VARCHAR(100),
`sales` INT,
`stock` INT,
`img_path` VARCHAR(200)
);
#2.插入初始化数据
INSERT INTO t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , 'java 从入门到放弃' , '国哥' , 80 , 9999 , 9 , 'static/img/default.jpg');
INSERT INTO t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , '数据结构与算法' , '严敏君' , 78.5 , 6 , 13 , 'static/img/default.jpg');
INSERT INTO t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , '怎样拐跑别人的媳妇' , '龙伍' , 68, 99999 , 52 , 'static/img/default.jpg');
INSERT INTO t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , '木虚肉盖饭' , '小胖' , 16, 1000 , 50 , 'static/img/default.jpg');
INSERT INTO t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , 'C++编程思想' , '刚哥' , 45.5 , 14 , 95 , 'static/img/default.jpg');
INSERT INTO t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , '蛋炒饭' , '周星星' , 9.9, 12 , 53 , 'static/img/default.jpg');
INSERT INTO t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , '赌神' , '龙伍' , 66.5, 125 , 535 , 'static/img/default.jpg');
INSERT INTO t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , 'Java 编程思想' , '阳哥' , 99.5 , 47 , 36 , 'static/img/default.jpg');
INSERT INTO t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , 'JavaScript 从入门到精通' , '婷姐' , 9.9 , 85 , 95 , 'static/img/default.jpg');
INSERT INTO t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , 'cocos2d-x 游戏编程入门' , '国哥' , 49, 52 , 62 , 'static/img/default.jpg');
INSERT INTO t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , 'C 语言程序设计' , '谭浩强' , 28 , 52 , 74 , 'static/img/default.jpg');
INSERT INTO t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , 'Lua 语言程序设计' , '雷丰阳' , 51.5 , 48 , 82 , 'static/img/default.jpg');
INSERT INTO t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , '西游记' , '罗贯中' , 12, 19 , 9999 , 'static/img/default.jpg');
INSERT INTO t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , '水浒传' , '华仔' , 33.05 , 22 , 88 , 'static/img/default.jpg');
INSERT INTO t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , '操作系统原理' , '刘优' , 133.05 , 122 , 188 , 'static/img/default.jpg');
INSERT INTO t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , '数据结构 java 版' , '封大神' , 173.15 , 21 , 81 , 'static/img/default.jpg');
INSERT INTO t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , 'UNIX 高级环境编程' , '乐天' , 99.15 , 210 , 810 , 'static/img/default.jpg');
INSERT INTO t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , 'javaScript 高级编程' , '国哥' , 69.15 , 210 , 810 , 'static/img/default.jpg');
INSERT INTO t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , '大话设计模式' , '国哥' , 89.15 , 20 , 10 , 'static/img/default.jpg');
INSERT INTO t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , '人月神话' , '刚哥' , 88.15 , 20 , 80 , 'static/img/default.jpg');
#3.查询数据
SELECT * FROM t_book ;
2.编写图书模块的javaBean对象
3.编写图书模块的DAO和对其进行测试
3.1编写接口
public interface BookDao {
/**
* 添加书
* @param book
* @return
*/
int addBook(Book book);
/**
* 根据id编号删除书
* @param id
* @return
*/
int deleteBookById(Integer id);
/**
* 修改图书
* @param book
* @return
*/
int updateBook(Book book);
/**
* 根据id查询书籍
* @param id
* @return
*/
Book queryBookById(Integer id);
/**
* 查询数据库中的所有书籍
* @return
*/
List<Book> queryBooks();
}
3.2编写实现类
public class BookDaoImpl extends BaseDao implements BookDao {
@Override
public int addBook(Book book) {
String sql = "insert into t_book(`id`,`name`,`author`,`price`,`sales`,`stock`,`img_path`) values(?,?,?,?,?,?,?)";
return update(sql,book.getId(),book.getName(),book.getAuthor(),book.getPrice(),book.getSales(),book.getStock(),book.getImgPath());
}
@Override
public int deleteBookById(Integer id) {
String sql = "delete from t_book where `id`=?";
return update(sql,id);
}
@Override
public int updateBook(Book book) {
String sql = "update t_book set name=?,author=?,price=?,sales=?,stock=?,img_path=? where id=?";
return update(sql,book.getName(),book.getAuthor(),book.getPrice(),book.getSales(),book.getStock(),book.getImgPath(),book.getId());
}
@Override
public Book queryBookById(Integer id) {
String sql = "select `id`,`name`,`author`,`price`,`sales`,`stock`,`img_path` from t_book where id=?";
return queryforOne(sql,Book.class,id);
}
@Override
public List<Book> queryBooks() {
String sql = "select `id`,`name`,`author`,`price`,`sales`,`stock`,`img_path` from t_book";
return queryforList(sql,Book.class);
}
}
3.3进行测试
public class BookDaoTest {
BookDao bookDao = new BookDaoImpl();
@Test
public void addBook() {
bookDao.addBook(new Book(null,"时间简史","霍金",new BigDecimal(29.4),100,200,null));
}
@Test
public void deleteBookById() {
bookDao.deleteBookById(21);
}
@Test
public void updateBook() {
bookDao.updateBook(new Book(20,"时间简史","霍金",new BigDecimal(29.4),100,200,null));
}
@Test
public void queryBookById() {
Book book = bookDao.queryBookById(1);
System.out.println(book);
}
@Test
public void queryBooks() {
List<Book> books = bookDao.queryBooks();
for (Book book : books) {
System.out.println(book);
}
}
}
4.编写图书模块的service并进行测试
4.1编写接口
public interface BookService {
/**
* 实现添加图书的服务操作
* @param book
*/
void addBook(Book book);
/**
* 实现删除图书的操作
* @param id
*/
void deleteBookById(Integer id);
/**
* 修改图书的操作
* @param book
*/
void updateBook(Book book);
/**
* 根据id查询图书的操作
* @param id
* @return
*/
Book queryBookById(Integer id);
/**
* 查询所有书籍
*/
List<Book> queryBooks();
}
4.2编写接口实现类
public class BookServiceImpl implements BookService {
BookDao bookDao = new BookDaoImpl();
@Override
public void addBook(Book book) {
bookDao.addBook(book);
}
@Override
public void deleteBookById(Integer id) {
bookDao.deleteBookById(id);
}
@Override
public void updateBook(Book book) {
bookDao.updateBook(book);
}
@Override
public Book queryBookById(Integer id) {
return bookDao.queryBookById(id);
}
@Override
public List<Book> queryBooks() {
return bookDao.queryBooks();
}
}
4.3进行测试
public class BookServiceTest {
BookService bookService = new BookServiceImpl();
@Test
public void addBook() {
bookService.addBook(new Book(null,"时间简史2","霍金",new BigDecimal(29.4),100,200,null));
}
@Test
public void deleteBookById() {
bookService.deleteBookById(22);
}
@Test
public void updateBook() {
bookService.updateBook(new Book(20,"时间简史2","霍金",new BigDecimal(29.4),100,200,null));
}
@Test
public void queryBookById() {
System.out.println(bookService.queryBookById(2));
}
@Test
public void queryBooks() {
System.out.println(bookService.queryBooks());
}
}
5.编写图书模块的web层,和页面联调测试
5.1 图书列表功能的实现
5.1.1 首先展示图书列表的流程图
5.1.2 然后根据图书列表流程图在BookServlet程序中编写程序,同时注意配置web.xml文件
protected void list(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.首先调用bookservice查询全部书籍
List<Book> books = bookService.queryBooks();
//2.将查询得到的List集合整体放入request域中
req.setAttribute("books",books);
//3.请求转发到book manager页面,注意这是一次请求。
req.getRequestDispatcher("/pages/manager/book_manager.jsp").forward(req,resp);
}
5.1.3 修改图书管理的请求地址
<a href="manager/bookServlet?action=list">图书管理</a>
5.1.4 修改pages/manager/book_manager.jsp 页面的数据遍历输出
<c:forEach items="${requestScope.books}" var="book">
<tr>
<td>${book.name}</td>
<td>${book.price}</td>
<td>${book.author}</td>
<td>${book.sales}</td>
<td>${book.stock}</td>
<td><a href="book_edit.jsp">修改</a></td>
<td><a href="#">删除</a></td>
</tr>
</c:forEach>
5.2 添加图书功能的实现
5.2.1 画出添加功能的流程图
5.2.2 然后根据添加流程图在BookServlet程序中编写程序,同时注意配置web.xml文件
注意问题:重定向的使用。
当用户提交完请求,浏览器会记录下最后一次请求的全部信息。当用户按下功能键 F5,就会发起浏览器记录的最后一次请求。
首先在表单提交中增加提交方法和隐藏域。
<form action="manager/bookServlet" method="get">
<input type="hidden" name="action" value="add">
编写bookServlet中的add方法对应的程序。
protected void add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//根据提交的表单获取信息
String book_name = req.getParameter("book_name");
String book_price = req.getParameter("book_price");
String book_author = req.getParameter("book_author");
String book_sales = req.getParameter("book_sales");
String book_stock = req.getParameter("book_stock");
//生成新的对象
Book book = new Book(null, book_name, book_author, new BigDecimal(book_price), Integer.parseInt(book_sales), Integer.parseInt(book_stock), null);
//调用bookservice.addBook方法,将其添加到数据库
bookService.addBook(book);
//重定向到表单显示
// 转发中“/”表示”localhost:8080/projectname(项目名称)/“,但是在重定向中使用“/”,这个表示的是
// localhost:8080/,也就是到达webapp。
resp.sendRedirect(req.getContextPath()+"/manager/bookServlet?action=list");
}
关于表单提交中method = "post"提交出现中文乱码问题的解决方法:
摘要:中文乱码主要是根据 get,post请求的不同,处理方式没选对引起的,当然也有小可能是tomcat的版本不同引起的
form表单提交中文乱码问题:
首先 get,和 post 的区别:
1> get 请求的请求参数附在地址栏的url之后,post请求是通过http post 机制将表单各个字段及其内容放在Html header 里面发送到所请求的action中
2>get 请求的数据量小,要小于2kb,
3>因为get 请求会将请求参数以及内容附在地址栏后面,所以不安全性会更高。
针对get 请求和post请求乱码分析:
如果是get请求,服务器是由tomcat默认的编码格式,或者你设定的编码格式去重新编码,也就是说,这个编码是由tomcat容器完成的。至于tomcat 是用那种编码,分情况
1>.如果是tomcat7 以及以下版本,默认的编码格式是ISO- 8859-1,如果想改变默认的编码格式,在tomcat/conf/server.xml里面,修改为,如果你不想改这里,或者项目不允许动配置,那么你只能在代码中每次都要对请求参数自己进行重新编码了
2>.如果是tomcat8,那么默认的编码格式是urf-8,你如果页面也是使用的utf-8(这个格式 是取决于你浏览器怎样提交)提交,那么你完全什么都不用干
如果是post请求,你的请求参数是由request.setCharacterEncoding(“UTF-8”)来设置重新编码格式的。也就是我们需要用代码去解决。你可以在你的每个servlet中或者每个action中将这段代码加进去。为了方便,你可以写个过滤器,让每个请求都走一下过滤器。当然,如果你用的是springMvc,或者struct2等框架,他们都有自带的过滤器,直接在web.xml中进行配置就好了。
————————————————
版权声明:本文为CSDN博主「Kind丶King」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jixinhuluwa/article/details/51496183
5.3 删除图书功能的实现
5.3.1 画出删除功能的流程图
5.3.2 然后根据删除流程图在BookServlet程序中编写程序
首先配置删除地址
<td><a class="deletebook" href="manager/bookServlet?action=delete&id=${book.id}">删除</a></td>
绑定单击事件,提示用户是否删除
<script type="text/javascript">
$(function () {
$("a.deletebook").click(function () {
return confirm("你确定要删除["+$(this).parent().parent().find("td:first").text()+"]吗?");
})
})
</script>
该方法用于将字符串转化为数字
public class WebUtils {
public static int parseInt(String strInt,int defaultValue){
try {
return Integer.parseInt(strInt);
} catch (Exception e) {
e.printStackTrace();
}
return defaultValue;
}
}
删除功能的演示:
protected void delete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String id = req.getParameter("id");
bookService.deleteBookById(WebUtils.parseInt(id,0));
//重定向到表单显示
// 转发中“/”表示”localhost:8080/projectname(项目名称)/“,但是在重定向中使用“/”,这个表示的是
// localhost:8080/,也就是到达webapp。
resp.sendRedirect(req.getContextPath()+"/manager/bookServlet?action=list");
}
5.4 修改图书功能的实现
5.4.1 画出修改功能的流程图
5.4.2 然后根据修改流程图在BookServlet程序中编写程序
1.编写地址并加入要修改的书的id:
<td><a href="manager/bookServlet?action=getBook&id=${book.id}">修改</a></td>
2.编写servlet程序,得到书的对应信息
protected void getBook(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String id = req.getParameter("id");
//查询完成之后保存到request域中
Book book = bookService.queryBookById(WebUtils.parseInt(id, 0));
req.setAttribute("book",book);
//请求转发到book_edit页面
req.getRequestDispatcher("/pages/manager/book_edit.jsp").forward(req,resp);
}
3.根据getbook程序,实现edit中的表单回显
<form action="manager/bookServlet" method="post">
<%-- value值--%>
<input type="hidden" name="action" value="${empty param.id? "add":"update"}">
<input type="hidden" name="bookId" value="${requestScope.book.id}">
<table>
<tr>
<td>名称</td>
<td>价格</td>
<td>作者</td>
<td>销量</td>
<td>库存</td>
<td colspan="2">操作</td>
</tr>
<tr>
<td><input name="book_name" type="text" value="${requestScope.book.name}"/></td>
<td><input name="book_price" type="text" value="${requestScope.book.price}"/></td>
<td><input name="book_author" type="text" value="${requestScope.book.author}"/></td>
<td><input name="book_sales" type="text" value="${requestScope.book.sales}"/></td>
<td><input name="book_stock" type="text" value="${requestScope.book.stock}"/></td>
<td><input type="submit" value="提交"/></td>
</tr>
</table>
</form>
注意点1:在信息回显过程中,还需要传递id信息,供bookservice中的update使用
<input type="hidden" name="bookId" value="${requestScope.book.id}">
注意点2:为了区别add和 update,进行如下操作
注意这个传递的id值指的是一开始传递过来的id。如果id存在,那么就是update,反之是add。因为添加图书是不会传递id值的。
<input type="hidden" name="action" value="${empty param.id? "add":"update"}">
4.编写update程序,完成操作:
protected void update(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String bookId = req.getParameter("bookId");
int numberId = WebUtils.parseInt(bookId, 0);
//进行修改操作操作
//根据提交的表单获取信息
String book_name = req.getParameter("book_name");
String book_price = req.getParameter("book_price");
String book_author = req.getParameter("book_author");
String book_sales = req.getParameter("book_sales");
String book_stock = req.getParameter("book_stock");
//生成新的对象
Book book = new Book(numberId, book_name, book_author, new BigDecimal(book_price), Integer.parseInt(book_sales), Integer.parseInt(book_stock), null);
//调用bookservice.update修改
bookService.updateBook(book);
//重定向操作:
resp.sendRedirect(req.getContextPath()+"/manager/bookServlet?action=list");
}