一、数据库设计  

create table book(
bookid int auto_increment primary key,
bookname varchar(16),
bookprice double,
bookauthor varchar(10),
bookdate date ); insert into book(bookname,bookprice,bookauthor,bookdate) values('java1',88.01,'akr1','2018-6-1');
insert into book(bookname,bookprice,bookauthor,bookdate) values('java2',88.02,'akr2','2018-6-2');
insert into book(bookname,bookprice,bookauthor,bookdate) values('java3',88.03,'akr3','2018-6-3');
insert into book(bookname,bookprice,bookauthor,bookdate) values('java4',88.04,'akr4','2018-6-4');
insert into book(bookname,bookprice,bookauthor,bookdate) values('java5',88.05,'akr5','2018-6-5');

二、显示书籍demo

  2.1 新建一个web项目

  2.2 导入所需要的jar包

  2.3 book实体类

package edu.aeon.booksys.entity;

import java.util.Date;
/**
* [说明]:book实体类
* @author qq1584875179
*
*/
public class Book {
private int bookId;
private String bookName;
private double bookPrice;
private String bookAuthor;
private Date bookDate;
public Book() {
} public Book(String bookName, double bookPrice, String bookAuthor, Date bookDate) {
super();
this.bookName = bookName;
this.bookPrice = bookPrice;
this.bookAuthor = bookAuthor;
this.bookDate = bookDate;
} public Book(int bookId, String bookName, double bookPrice, String bookAuthor, Date bookDate) {
super();
this.bookId = bookId;
this.bookName = bookName;
this.bookPrice = bookPrice;
this.bookAuthor = bookAuthor;
this.bookDate = bookDate;
} public int getBookId() {
return bookId;
}
public void setBookId(int bookId) {
this.bookId = bookId;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public double getBookPrice() {
return bookPrice;
}
public void setBookPrice(double bookPrice) {
this.bookPrice = bookPrice;
}
public String getBookAuthor() {
return bookAuthor;
}
public void setBookAuthor(String bookAuthor) {
this.bookAuthor = bookAuthor;
}
public Date getBookDate() {
return bookDate;
}
public void setBookDate(Date bookDate) {
this.bookDate = bookDate;
} }

  2.4 DBUtils工具类

package edu.aeon.utils;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties; /**
* [说明]:jdbc工具类
* 封装了jdbc里面的重复步骤:数据库的连接和数据库资源的释放
* @author qq1584875179
* @version 1.2(该版本将连接数据库的各种数据库配置信息(用户名、密码、驱动及url)单独提取到配置文件中)
*/
public class DBUtils {
private static String username;
private static String password;
private static String driverClass;
private static String url;
private Connection connection;
private PreparedStatement preparedStatement;
private ResultSet resultSet;
/**
* 静态代码块处理读取之前的数据
*/
static{
InputStream inputStream = DBUtils.class.getClassLoader().getResourceAsStream("config/database/database.properties");
Properties properties=new Properties();
try {
properties.load(inputStream);
username = properties.getProperty("username");
password = properties.getProperty("password");
driverClass = properties.getProperty("driverClass");
url = properties.getProperty("url");
} catch (IOException e) {
System.out.println("初始化读取数据库配置文件--->database.properties失败!");
e.printStackTrace();
}
}
/**
* 连接数据库
* @throws ClassNotFoundException
* @throws SQLException
*/
public void getMySqlConnection(){
try {
Class.forName(driverClass);
connection=DriverManager.getConnection(url, username, password);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* [说明]:更新:(增加、删除、改)
* @param sql sql语句
* @param objects 可变参数数组
* @return updateNum:所更新后影响的行数
*/
public int executeUpdate(String sql,Object...objects){
this.getMySqlConnection();
int updateNum = 0;
try {
preparedStatement=connection.prepareStatement(sql);
if(objects!=null){
for(int i=0;i<objects.length;i++){
preparedStatement.setObject((i+1), objects[i]);
}
}
updateNum=preparedStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
this.closeDB(resultSet, preparedStatement, connection);
}
return updateNum;
} public ResultSet getAll(String sql,Object...objects){
this.getMySqlConnection();
try {
preparedStatement=connection.prepareStatement(sql);
if(objects!=null){
for(int i=0;i<objects.length;i++){
preparedStatement.setObject((i+1), objects[i]);
}
}
resultSet=preparedStatement.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}/*finally {//为什么不能关掉:因为关掉之后查不到数据了
this.closeDB(resultSet, preparedStatement, connection);
}*/
return resultSet;
}
/**
* 释放数据库资源
* @param resultSet 结果集
* @param statement 执行sql语句的对象
* @param connection 数据库连接对象
*/
public static void closeDB(ResultSet resultSet,Statement statement,Connection connection){
if(null!=resultSet){
try {
resultSet.close();
} catch (SQLException e) {
System.out.println("释放数据库资源失败!--->resultSet");
e.printStackTrace();
}
}
if(null!=statement){
try {
statement.close();
} catch (SQLException e) {
System.out.println("释放数据库资源失败!--->statement");
e.printStackTrace();
}
}
if(null!=connection){
try {
connection.close();
} catch (SQLException e) {
System.out.println("释放数据库资源失败!--->connection");
e.printStackTrace();
}
}
}
}

  2.5database.properties  

username=root
password=root
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/booksys

  2.6 BookDao  

package edu.aeon.booksys.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import edu.aeon.booksys.entity.Book;
import edu.aeon.utils.DBUtils;
/**
* [说明]:dao
* @author qq:1584875179
*
*/
public class BookDao extends DBUtils{
public List<Book> getAll(){
List<Book> bookList=new ArrayList<Book>();
ResultSet resultSet=this.getAll("select * from book");
try {
while(resultSet.next()){
bookList.add(new Book(resultSet.getInt(1), resultSet.getString(2), resultSet.getDouble(3), resultSet.getString(4), resultSet.getDate(5)));
}
} catch (SQLException e) {
e.printStackTrace();
}
return bookList;
}
//测试
public static void main(String[] args) {
BookDao bookDao=new BookDao();
List<Book> bookList=bookDao.getAll();
for (Book book : bookList) {
System.out.println(book.getBookId()+"\t"+book.getBookName());
}
}
}

  2.7 显示书籍列表的servlet:ListBookServlet  

package edu.aeon.booksys.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import edu.aeon.booksys.dao.BookDao;
import edu.aeon.booksys.entity.Book;
/**
* [说明]:查询书籍列表的servlet
* @author qq:1584875179
*
*/
public class ListServlet extends HttpServlet { @Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
BookDao bookDao=new BookDao();
List<Book> bookList=bookDao.getAll();
response.setContentType("text/html;charset=utf-8");
PrintWriter printWriter=response.getWriter();
printWriter.print("<html>");
printWriter.print("<head><title>显示书籍列表</title></head>");
printWriter.print("<body>");
printWriter.print("<table border='1' align='center' width='60%'>");
printWriter.print("<th>书籍号</th>");
printWriter.print("<th>书籍名</th>");
printWriter.print("<th>书籍价格</th>");
printWriter.print("<th>书籍作者</th>");
printWriter.print("<th>书籍出版日期</th>");
for(int i=0;i<bookList.size();i++){
printWriter.print("<tr>");
printWriter.print("<td>"+bookList.get(i).getBookId()+"</td>");
printWriter.print("<td>"+bookList.get(i).getBookName()+"</td>");
printWriter.print("<td>"+bookList.get(i).getBookPrice()+"</td>");
printWriter.print("<td>"+bookList.get(i).getBookAuthor()+"</td>");
printWriter.print("<td>"+bookList.get(i).getBookDate()+"</td>");
printWriter.print("</tr>");
}
printWriter.print("</table");
printWriter.print("</body>");
printWriter.print("</html>");
}
}

  2.8 在web.xml中配置servlet

  

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>booksys</display-name>
<servlet>
<servlet-name>listServlet</servlet-name>
<servlet-class>edu.aeon.booksys.servlet.ListServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>listServlet</servlet-name>
<url-pattern>/listBookServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>

  2.9测试结果

    

三、添加书籍

  3.1 添加书籍页面addBook.jsp

  

<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>添加书籍</title>
</head>
<body>
<form action="addBookServlet">
<table border="1" align="center">
<tr><td colspan="2" align="center">添加书籍</td></tr>
<tr>
<td>书名:</td><td><input type="text" name="bookName"/></td>
</tr>
<tr>
<td>价格:</td><td><input type="text" name="bookPrice"/></td>
</tr>
<tr>
<td>作者:</td><td><input type="text" name="bookAuthor"/></td>
</tr>
<tr>
<td>日期:</td><td><input type="text" name="bookDate"/></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="提交"><input type="reset" value="全部撤销"></td>
</tr>
</table>
</form>
</body>
</html>

  3.2  DBUtils

  

package edu.aeon.utils;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties; import edu.aeon.booksys.entity.Book; /**
* [说明]:jdbc工具类
* 封装了jdbc里面的重复步骤:数据库的连接、资源的释放及通用操作(增删改查)。
* @author qq:1584875179
* @version 1.3(该版本将连接数据库的各种数据库配置信息(用户名、密码、驱动及url)单独提取到配置文件中)
*/
public class DBUtils {
private static String username;
private static String password;
private static String driverClass;
private static String url;
private Connection connection;
private PreparedStatement preparedStatement;
private ResultSet resultSet;
/**
* 静态代码块处理读取之前的数据
*/
static{
InputStream inputStream = DBUtils.class.getClassLoader().getResourceAsStream("config/database/database.properties");
Properties properties=new Properties();
try {
properties.load(inputStream);
username = properties.getProperty("username");
password = properties.getProperty("password");
driverClass = properties.getProperty("driverClass");
url = properties.getProperty("url");
} catch (IOException e) {
System.out.println("初始化读取数据库配置文件--->database.properties失败!");
e.printStackTrace();
}
}
/**
* 连接数据库
* @throws ClassNotFoundException
* @throws SQLException
*/
public void getMySqlConnection(){
try {
Class.forName(driverClass);
connection=DriverManager.getConnection(url, username, password);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* [说明]:更新:(增加、删除、改)
* @param sql sql语句
* @param objects 可变参数数组
* @return updateNum:所更新后影响的行数
*/
public int executeUpdate(String sql,Object...objects){
this.getMySqlConnection();
int updateNum = 0;
try {
preparedStatement=connection.prepareStatement(sql);
if(objects!=null){
for(int i=0;i<objects.length;i++){
preparedStatement.setObject((i+1), objects[i]);
}
}
updateNum=preparedStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
this.closeDB(resultSet, preparedStatement, connection);
}
return updateNum;
}
/**
*
* @param sql sql语句
* @param objects 可变参数
* @return resultSet 查询结果集
*/
public ResultSet getAll(String sql,Object...objects){
this.getMySqlConnection();
try {
preparedStatement=connection.prepareStatement(sql);
if(objects!=null){
for(int i=0;i<objects.length;i++){
preparedStatement.setObject((i+1), objects[i]);
}
}
resultSet=preparedStatement.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}/*finally {//为什么不能关掉:因为关掉之后查不到数据了
this.closeDB(resultSet, preparedStatement, connection);
}*/
return resultSet;
}
public int addBook(Book book){
this.getMySqlConnection();
int updateNum = 0;
String sql="insert into book(bookName,bookPrice,bookAuthor,bookDate) values(?,?,?,?);";
try {
preparedStatement=connection.prepareStatement(sql);
if(book!=null){
preparedStatement.setObject(1, book.getBookName());
preparedStatement.setObject(2, book.getBookPrice());
preparedStatement.setObject(3, book.getBookAuthor());
preparedStatement.setObject(4, book.getBookDate());
}
updateNum=preparedStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
this.closeDB(resultSet, preparedStatement, connection);
}
return updateNum;
}
/**
* 释放数据库资源
* @param resultSet 结果集
* @param statement 执行sql语句的对象
* @param connection 数据库连接对象
*/
public static void closeDB(ResultSet resultSet,Statement statement,Connection connection){
if(null!=resultSet){
try {
resultSet.close();
} catch (SQLException e) {
System.out.println("释放数据库资源失败!--->resultSet");
e.printStackTrace();
}
}
if(null!=statement){
try {
statement.close();
} catch (SQLException e) {
System.out.println("释放数据库资源失败!--->statement");
e.printStackTrace();
}
}
if(null!=connection){
try {
connection.close();
} catch (SQLException e) {
System.out.println("释放数据库资源失败!--->connection");
e.printStackTrace();
}
}
}
}

  3.3 AddBookServlet

package edu.aeon.booksys.servlet;

import java.io.IOException;
import java.text.SimpleDateFormat;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import edu.aeon.booksys.dao.BookDao;
import edu.aeon.booksys.entity.Book;
/**
* [说明]:添加书籍servlet
* @author qq:1584875179
*
*/
public class AddBookServlet extends HttpServlet {
private static final long serialVersionUID = 1L; /**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
BookDao bookDao=new BookDao();
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("utf-8");
String bookName=request.getParameter("bookName");
String bookPrice=request.getParameter("bookPrice");
String bookAuthor=request.getParameter("bookAuthor");
String bookDate=request.getParameter("bookDate");
try {
Book book=new Book(bookName, Double.parseDouble(bookPrice), bookAuthor, new SimpleDateFormat("yyyy-MM-dd").parse(bookDate));
int updateNum=bookDao.addBook(book);
if(updateNum>0){
response.getWriter().print("添加成功!");
}else{
response.getWriter().print("添加失败!");
}
} catch (Exception e) {
e.printStackTrace();
}
} /**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
} }

  3.4  BookDao

package edu.aeon.booksys.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import edu.aeon.booksys.entity.Book;
import edu.aeon.utils.DBUtils;
/**
* [说明]:dao
* @author qq:1584875179
*
*/
public class BookDao extends DBUtils{
public List<Book> getAll(){
List<Book> bookList=new ArrayList<Book>();
ResultSet resultSet=this.getAll("select * from book");
try {
while(resultSet.next()){
bookList.add(new Book(resultSet.getInt(1), resultSet.getString(2), resultSet.getDouble(3), resultSet.getString(4), resultSet.getDate(5)));
}
} catch (SQLException e) {
e.printStackTrace();
}
return bookList;
}
public int add(Book book){
int updateNum=this.addBook(book);
return updateNum;
}
//测试
public static void main(String[] args) {
BookDao bookDao=new BookDao();
List<Book> bookList=bookDao.getAll();
for (Book book : bookList) {
System.out.println(book.getBookId()+"\t"+book.getBookName());
}
}
}

  3.5 web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>booksys</display-name>
<servlet>
<servlet-name>listServlet</servlet-name>
<servlet-class>edu.aeon.booksys.servlet.ListServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>listServlet</servlet-name>
<url-pattern>/listBookServlet</url-pattern>
</servlet-mapping> <servlet>
<servlet-name>addBookServlet</servlet-name>
<servlet-class>edu.aeon.booksys.servlet.AddBookServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>addBookServlet</servlet-name>
<url-pattern>/addBookServlet</url-pattern>
</servlet-mapping> <welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>

  3.6 addBook.jsp

  

<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>添加书籍</title>
</head>
<body>
<form action="addBookServlet">
<table border="1" align="center">
<tr><td colspan="2" align="center">添加书籍</td></tr>
<tr>
<td>书名:</td><td><input type="text" name="bookName"/></td>
</tr>
<tr>
<td>价格:</td><td><input type="text" name="bookPrice"/></td>
</tr>
<tr>
<td>作者:</td><td><input type="text" name="bookAuthor"/></td>
</tr>
<tr>
<td>日期:</td><td><input type="text" name="bookDate"/></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="提交"><input type="reset" value="全部撤销"></td>
</tr>
</table>
</form>
</body>
</html>

  3.7 添加页面显示

    

四、重定向

  4.1重定向:由response.sendRendirect("xxxServlet");实现
    当使用重定向时,服务器会将重定向的地址("xxxServlet")交给浏览器。浏览器根据新的url,重新发起一次请求。
  4.2 重定向的简图:

    

  

最新文章

  1. SQL必知必会1-13 读书笔记
  2. 踩个猴尾不容易啊 Canvas画个猴子
  3. git ignore
  4. Jquery 实现 “下次自动登录” 记住用户名密码功能
  5. c# 中get和post的方法
  6. python学习笔记3-celery分布式任务处理器
  7. shell中的大括号和小括号
  8. ionic preparing for ios 9
  9. thttpd的定时器
  10. zigbee智能家居基础扫盲
  11. Ext.Net_1.X_WINDOW遮罩层被GridPanel挡住
  12. 【BZOJ3561】DZY Loves Math VI (数论)
  13. SpringCloud Feign context-path踩到的坑
  14. C# 实现立体图形变换(vs2008)
  15. Spring框架第一天
  16. python 拷贝 深拷贝 浅拷贝 赋值
  17. Summary: difference between public, default, protected, and private key words
  18. java远程下载文件到本地
  19. 此博客不再维护,请移步http://daiweilai.github.io/
  20. CAS单点登录实践(spring cas client配置)

热门文章

  1. wsl 自动配置代理地址
  2. 用Redis实现延迟队列,我研究了两种方案,发现并不简单
  3. Vue过滤案例、按键修饰符、数据双向绑定
  4. voxel体素网络滤波器
  5. jquery(三:jquery的动画)
  6. Vue急速入门-5
  7. 【雅礼联考DAY01】逃跑
  8. day05-mybatis配置文件和SQL映射文件
  9. Vue 关键概念介绍
  10. LeetCode-41 缺失的第一个正整数