版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)
这篇我们来实现添加一个图书功能,前面一篇是显示图书列表。一般的逻辑是,在添加页面,提供用户输入的表单,用户确认填写,点击提交,然后返回到列表,列表可以显示多了一条数据进来了。ddd
1.图书添加功能的思路分析
分析一下,思路应该是这样的。
主要是提醒,在BookAddServlet中应该往BookListServlet跳,而不是直接往list.jsp跳。
2.完成添加图书代码
在前面一篇代码基础上,我们先看看Dao层的接口中方法定义和具体实现类的方法
package com.anthony.dao;
import java.sql.SQLException;
import java.util.List;
import com.anthony.domain.Book;
public interface BookDao {
/**
* 查询所有书
* @return
* @throws SQLException
*/
public List<Book> findAllBooks() throws SQLException;
/**
* 添加图书
* @throws SQLException
*/
public void addBook(Book book) throws SQLException;
}
实现类中方法,也就是两三行代码。
package com.anthony.dao;
import java.sql.SQLException;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import com.anthony.datasource.C3P0Utils;
import com.anthony.domain.Book;
public class BookDaoImpl implements BookDao {
public List<Book> findAllBooks() throws SQLException {
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
List<Book> query = qr.query("select * from book", new BeanListHandler<Book>(Book.class));
return query;
}
public void addBook(Book book) throws SQLException {
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
qr.update("INSERT INTO book VALUES(?,?,?,?,?,?)", book.getId(),book.getName(),book.getPrice(),book.getPnum(),book.getCategory(),book.getDescription());
}
}
在看看service层
package com.anthony.service;
import java.util.List;
import com.anthony.domain.Book;
public interface BookService {
public List<Book> findAllBooks();
public void addBook(Book book);
}
package com.anthony.service;
import java.sql.SQLException;
import java.util.List;
import com.anthony.dao.BookDao;
import com.anthony.dao.BookDaoImpl;
import com.anthony.domain.Book;
public class BookServiceImpl implements BookService {
//创建一个Dao对象
BookDao bd = new BookDaoImpl();
public List<Book> findAllBooks() {
try {
return bd.findAllBooks();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
public void addBook(Book book) {
try {
bd.addBook(book);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
接下来,我们打开admin/product/add.jsp页面,修改成如下代码。
<body>
<form id="userAction_save_do" name="Form1"
action="${pageContext.request.contextPath}/addBookServlet" method="post">
<table cellSpacing="1" cellPadding="5" width="100%" align="center"
bgColor="#eeeeee" style="border: 1px solid #8ba7e3" border="0">
<tr>
<td class="ta_01" align="center" bgColor="#afd1f3" colSpan="4"
height="26"><strong><STRONG>添加商品</STRONG> </strong>
</td>
</tr>
注意在method后面删除了一行代码,这行代码是uoload文件用的,数据传输都是二进制。主要就是在action中添加跳转到servlet层,所以下面我们来创建一个AddBookServlet的类,在web.xml中配置如下。
<servlet>
<description></description>
<servlet-name>addBookServlet</servlet-name>
<servlet-class>com.anthony.web.servlet.AddBookServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>addBookServlet</servlet-name>
<url-pattern>/addBookServlet</url-pattern>
</servlet-mapping>
由于我们新插入图书有一个id,这个id不是用户提供,页面也没让用户输入这个图书id, 这里我们引入一个工具类,得到一个UUID,而且是随机得到,所以在utils包下新建一个UUIDUtil.java
package com.anthony.utils;
import java.util.UUID;
public class UUIDUtil {
public static String getUUID() {
return UUID.randomUUID().toString(); // 随机得到一个uuid字符串
}
}
新创建的AddBookServlet.java如下代码
package com.anthony.web.servlet;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.beanutils.BeanUtils;
import com.anthony.domain.Book;
import com.anthony.service.BookService;
import com.anthony.service.BookServiceImpl;
import com.anthony.utils.UUIDUtil;
public class AddBookServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
//获取用户表单数据
Book book = new Book();
try {
BeanUtils.populate(book, request.getParameterMap());
book.setId(UUIDUtil.getUUID());
} catch (Exception e) {
e.printStackTrace();
}
//调用业务逻辑
BookService bs = new BookServiceImpl();
bs.addBook(book);
//分发转向
request.getRequestDispatcher("bookListServlet").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
测试,打开浏览器,打开add.jsp页面,开始输入数据,提交测试下。
点击提交之后,应该里面跳转list.jsp页面