图书管理JAVA+JSP的心得
1.编写DBBean部分
为了方便图书在网页部分的增加、修改、删除等工作,我们可以在JavaBean文件里写好相关的对于数据库的操作。
在文件中我们可以首先创建好相关的成员变量:
Connection conn = null;
PreparedStatement ptmt= null;
ResultSet rs = null;
这样可以在一个整体中方便的使用这些常用的参数,这里我考虑的是使用JDBC模式,我们为了加快对数据库的操作,可以建立一个连接池,这样可以减少操作时间,这部分稍后再说。
之后我们就创建一个连接函数 getConn():
private Connection getConn(){
String URL ="jdbc:mysql://localhost:3306/bookserverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false";
Class.forName("com.mysql.cj.jdbc.Driver");//加载驱动
conn = DriverManager.getConnection(URL, USER, PASSWORD);//连接数据库
return conn;}//返回申请到的连接
当然为了释放掉连接的资源创建一个close();
public void close() throws SQLException{
if (rs!=null){
rs.close();
}
if (ptmt!=null){
ptmt.close();
}
if (conn!=null){
conn.close();
}
}
在后为了方便主页能够看见数据库表中的内容并排成表的形式输出我们可以创建一个Book类;
Book类创建完之后,我们就开始对数据进行封装。
我们可以创建一个getBook():
public List<Book> getBook(String sql) throws SQLException{
List<Book> book = new ArrayList<Book>();//创建集合用作把多个Book类传送过去
conn = getConn();
//stmt =con.createStatement();这是创建Statement的写法,两个的区别网上就有
ptmt = conn.prepareStatement(sql);//sql = "select * from bookinfo";
rs = ptmt.executeQuery();//注意和ptmt.execute的区别
while(rs.next()){//这里的rs的取值是一次只能取一条记录然后再开始对下一条记录开始读出,所以我们可以使用rs.get~()相关的函数。
Book book1 = new Book();
book1.setId(rs.getInt("id"));
book1.setBookname(rs.getString("bookname"));
book1.setAuthor(rs.getString("author"));
book1.setPrice(rs.getFloat("price"));
book.add(book1);//一本书写好后存入集合
}
close();
return book;
}
接下来我们就开写入增删改查的各种命令,当然在写之前我们要考虑到图书ID的增加,除非你已经写了个触发器,要不然还是写一个getNewId()函数;
public int getNewId() throws SQLException{
int id = 0;
conn = getConn();
String sql ="select max(id) from bookinfo";
ptmt = conn.prepareStatement(sql);
rs = ptmt.executeQuery();
if(rs.next()){
id = rs.getInt("max(id)");//这里的max(id)是表中搜索出的,若写id则数据库报错
}
return id+1;
}
图书的插入操作insert();
public void insert(String bookname,String author,String price) throws SQLException{
//关于传过来的参数,其实我们可以考虑一个封装,不过若不是都是String类型的在表单的request的操作会有点麻烦,所以我就直接传过来了。
conn = getConn();
int id = getNewId();
String sql = "insert into bookinfo values("+id+",'"+bookname+"','"+author+"',"+price+")";//这里的sql语句要注意数字型的和字符型的不同,既"+id+",'"+bookname+"'的区别。
ptmt = conn.prepareStatement(sql);
ptmt.execute();
close();
}
图书的修改操作update():
public void update(String id,String bookname,String author,String price) throws SQLException{
String sql = "update bookinfo set bookname =?,author = ?,price =? where id = ?";
conn = getConn();
ptmt = conn.prepareStatement(sql);
ptmt.setString(4, id);//这里要注意第一个不是0,而是1,这个和rs.get~()中的一样。
ptmt.setString(1, bookname);
ptmt.setString(2, author);
ptmt.setString(3, price);
ptmt.execute();
close();
}
图书的删除操作delete();
public void delete(String id) throws SQLException{
String sql = "delete from bookinfo where id = "+id;
conn = getConn();
ptmt = conn.prepareStatement(sql);
ptmt.execute();
close();
}
在下来是根据传过来的ID来读出数据库中相关的书籍getBookId();
public ResultSet getBookId(String id) throws SQLException{
String sql = "select * from bookinfo where id = ?";
conn = getConn();
ptmt = conn.prepareStatement(sql);
ptmt.setString(1, id);
ResultSet rs = ptmt.executeQuery();
return rs;
}
2.编写Book类
这个类是为方便一次性的把数据从数据库中全部的取出来,比用rs传递过来的好了许多。下面是相关代码:
public class Book {
private int id;
private String bookname;
private String author;
private float price;
当然还包含无参的构造函数和有参的构造函数两个,和成员变量的相关get、set函数。
3.编写index.jsp
可以考虑一下在头写入error.jsp
<%@ page errorPage="error.jsp"%>//在文件编译错误后能够反馈出网页的效果
还有注意包的引入。接下来就是编写表格部分以及使用数据库的JavaBean文件和一些相关的命令;
<body>
<center><a href=add.jsp>增加图书信息</a></center><p>
<table align=center width=500 border=1>
<tr><td>书名<td>作者<td>价格<td>管理 <!--表格代码的简化-->
<jsp:useBean id="db" class="book.bean.DBBean" scope="page"/> <!--JavaBean文件的引入-->
<%
String sql = "select * from bookinfo";
List<Book> books = db.getBook(sql);<!--接受传过来的列表-->
for (Book book: books) {<!--使用 for(each)函数来遍历book值-->
out.println("<tr><td>" + book.getBookname() + "<td>" + book.getAuthor() + "<td>" + book.getPrice()+"<td><a href=del.jsp?id="+book.getId()+"> 删除</a> <a href=edit.jsp?id="+book.getId()+"> 修改</a>");<!--在输出中使用"”加上jsp语句-->
}<!--!!!这里的超链接带参传输<a href=del.jsp?id="+book.getId()+"> 删除</a>!!!-->
%>
</table>
</body>
4.编写增加图书信息add.jsp
编写图书信息的表格样式;(本来在数据库中增加记录也在这一个界面,可不知道为毛把那些文件嫁过来之后表单就自动提交,没有机会写入图书信息,所以这里就又写了个bookadd.jsp)
<body>
<form action="bookadd.jsp" method="post">
<table width="50%" border="1" align="center">
<CAPTION>添加图书信息</CAPTION>
<tr>
<th width="30%">书名:</th>
<td width="70%"><input name="bookname" type="text"></td>
</tr>
<tr>
<th>作者:</th>
<td><input name="author" type="text"></td>
</tr>
<tr>
<th>价格:</th>
<td><input name="price" type="text">元</td>
</tr>
<tr>
<th colspan="2">
<input type="submit" name="submit" value="添加">
<input type="reset" value="重置">
</th>
</tr>
</table>
</form>
</body>
5.编写bookadd.jsp
<body>
<jsp:useBean id="db" class="book.bean.DBBean" scope="page"/>
<%
request.setCharacterEncoding("UTF-8");//防止传过来的中文字符乱码
String bookname =request.getParameter("bookname");
String author = request.getParameter("author");
String price = request.getParameter("price");
int p = Integer.parseInt(price);//integer的转换主要就是为了判断price>=0
if(p < 0){%>
<script type="text/javascript">alert("价格不能小于0");</script>
<%}
else{
db.insert(bookname,author,price);;%>
<script type="text/javascript">alert("书籍增加完成");</script>
<%}
%>
</body>
6.编写update.jsp
<body>
<jsp:useBean id="db" class="book.bean.DBBean" scope="page"/>
<%
request.setCharacterEncoding("UTF-8");
String id =request.getParameter("id");
String bookname =request.getParameter("bookname");
String author = request.getParameter("author");
String price = request.getParameter("price");
double p = Double.valueOf(price);//一开始我用的int p = Integer.parseInt(price);这个会报错会带有小数点无法编译
if(p < 0){%>
<script type="text/javascript">alert("价格不能小于0");</script>
<%}
else{
db.update(id,bookname,author,price);%>
<script type="text/javascript">alert("书籍修改完成");</script>
<%}
%>
</body>
7.编写del.jsp
<body>
<jsp:useBean id="db" class="book.bean.DBBean" scope="page"/>
<%
String id =request.getParameter("id");//考虑到图书的id是唯一的就使用ID来删除图书
db.delete(id);%>
<script type="text/javascript">alert("书籍删除完成");</script>
<jsp:forward page="index.jsp"></jsp:forward>
</body>
8.编写edit.jsp
这里用来DBBean的getBookId()函数,然后写了表格+表单的操作,之后别忘了释放资源,因为如果在函数里就释放资源rs中的值会失效
<body>
<jsp:useBean id="db" class="book.bean.DBBean" scope="page"/>
<%
String id = request.getParameter("id");//从超链接传过来的值
ResultSet rs = db.getBookId(id);
rs.next();
%>
<form action="update.jsp" method="post">
<table width="50%" border="1" align="center">
<CAPTION>修改图书信息</CAPTION>
<tr>
<th width="30%">书名:</th>
<td width="70%">
<input name="bookname" type="text" value="<%=rs.getString("bookname")%>"></td>
</tr>
<tr>
<th>作者:</th>
<td><input name="author" type="text" value="<%=rs.getString("author")%>"></td>
</tr>
<tr>
<th>价格:</th>
<td><input name="price" type="text" value="<%=rs.getString("price")%>">元</td>
</tr>
<tr>
<th colspan="2">
<input type="hidden" name="id" value="<%=id%>"> <!--这里考虑到了图书的所有属性,还把id作为hidden属性给隐藏起来,优化界面-->
<input type="submit" value="修改">
<input type="reset" value="重置">
</th>
</tr>
</table>
</form>
<%
db.close();//释放资源
%>
</body>
9.编写error.jsp
<%@ page language="java" isErrorPage="true" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>error page</title>
</head>
<body>
错误信息为:
<%=exception.getMessage()%><br>
<%=exception.toString()%>
</body>
</html>
10.注意事项
1.若在调试,请不要把error.jsp文件加上,不然错误的会显示什么不可访问的资源啥的。
2.在调试时,可复制错误上网搜索
3.pageEncoding="UTF-8"这个 要加在全局变量里,不然中文字符放进数据库可能会乱码。