这是一个使用Java Web相关的知识做出来的网页图书管理系统,使用的数据库为mysql。
程序中实现了登录功能和对图书表、图书类别表的增删查改功能。
因为我对Java Web相关的知识的了解还非常有限,所以这个程序的功能和实现上都还有着很多需要完善的地方。
使用到的知识:
java、servlet、jsp、jdbc
html、css、js、jquery、bootstrap
运行环境:
Windows JDK9 IDEA2020 MySQL5.7.29
问题:
编写程序期间我遇到了很多问题,其中有两个大问题困扰了我很久,在此我将其记录下来:
第一个问题是,(idea)java web项目无法正常使用 项目/lib路径下的项目依赖,需要将其添加到web/WEB-INF/lib路径下才可以。因为这个问题我耽误了很久的时间,因为这个问题在搜索引擎上搜不到答案,而且它也不是一个逻辑上的问题,让别人看别人也看不出来。最终我还是在csdn上胡乱搜索的时候,碰巧看到了这个问题的答案。在此我非常感谢提供了该问题答案的那一位博主。
第二个问题是,在jsp页面上,我始终不知道怎么用jstl标签和el表达式获取从servlet传来的信息,这个问题是我对相关知识不熟悉导致的。最终我选择了使用<%%>最原始的方式实现了相关功能。
其他:
以后在开始动手写一个项目之前,尤其是以后的web项目这样的前端和后端都有的项目时,一定要保证自己已经熟悉了所学的知识,最好能跟着别人先做一个类似的项目,不然会面临自己没有见过的困难,而且开发效率也会很低。
对jdbc封装的类我是从另一位博主的文章上找的 链接,非常感谢这位博主。
代码:
下面放出部分代码,如果您想要查看该程序的完整代码,请前往我的个人网站http://150.158.165.239/#/resource以免费获取完整代码资源
LoginServlet.java
package main.java.controler;
import main.java.entity.User;
import main.java.service.UserService;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet("/public/login")
public class LoginServlet extends HttpServlet {
// 处理登录jsp提交的表单
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().println("登录servlet post");
// 获取提交来的数据
String userName = request.getParameter("username");
String password = request.getParameter("password");
UserService service = new UserService();
User user = new User();
user.setUserName(userName);
user.setUserPassword(password);
// 判断用户是否存在
if(service.isUserInfo(user)) {
// 设置该用户的session
HttpSession session = request.getSession();
session.setAttribute("username", userName);
session.setMaxInactiveInterval(60 * 60);
// 存在登录成功 跳转到首页
// request.getRequestDispatcher("/").forward(request, response);
response.sendRedirect(request.getContextPath() + "/"); //重定向
}
else {
// 不存在则重新跳转到登录界面
request.getRequestDispatcher("/webapps/Login.jsp").forward(request, response);
}
}
// 跳转到登录jsp界面
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("登录界面");
//请求转发的路径的默认路径为web/,且在路径最前边要加上/
request.getRequestDispatcher("/webapps/Login.jsp").forward(request, response);
}
}
BookDaoImpl.java
package main.java.dao;
import main.java.entity.Book;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
public class BookDaoImpl implements BookDao {
@Override
public void add(Book book) {
String sql = "insert into `book` (book_name,book_author,book_price,book_desc,book_type_id) values(?,?,?,?,?)";
MyJDBC.insert(sql, true, book.getBookName(), book.getBookAuthor(), book.getBookPrice(), book.getBookDesc(), book.getBookTypeId());
}
@Override
public void update(Book book) {
String sql = "update `book` set `book_name`=?, book_author=?, book_price=?, book_desc=?, book_type_id=? WHERE book_id=?";
MyJDBC.execute(sql,book.getBookName(), book.getBookAuthor(), book.getBookPrice(), book.getBookDesc(), book.getBookTypeId(), book.getBookId());
}
@Override
public List<Book> queryAll() {
return whereQuery("select * from `book`");
}
@Override
public void delete(String id) {
String SQL = "delete from `book` where book_id=?";
MyJDBC.execute(SQL, id);
}
/**
* 根据sql参数查找全部结果
*/
@Override
public List<Book> whereQuery(String sql) {
ResultSet result = MyJDBC.query(sql);
List<Book> bookList = new ArrayList<>();
try {
while (result.next()) {
Book book = new Book();
book.setBookId(result.getInt(1) + "");
book.setBookName(result.getString(2));
book.setBookAuthor(result.getString(3));
book.setBookPrice(result.getString(4));
book.setBookDesc(result.getString(5));
book.setBookTypeId(result.getInt(6) + "");
bookList.add(book);
}
}
catch (Exception e) {
e.printStackTrace();
}
return bookList;
}
}
index.jsp
<%--
Created by IntelliJ IDEA.
User: ASUS
Date: 2020/9/18
Time: 19:59
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.io.*,java.util.*,java.sql.*"%>
<%@ page import="javax.servlet.http.*,javax.servlet.*" %>
<%@ page import="main.java.entity.BookType" %>
<%@ page import="main.java.service.BookTypeService" %>
<%@ page import="main.java.service.BookService" %>
<%@ page import="main.java.entity.Book" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>
<!-- 登录界面 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>首页</title>
<link rel="stylesheet" type="text/css" href="/webapps/css/bootstrap-theme.css"/>
<link rel="stylesheet" type="text/css" href="/webapps/css/bootstrap.css"/>
<link rel="stylesheet" type="text/css" href="/webapps/css/index.css"/>
</head>
<body>
<sql:setDataSource var="snapshot" driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/books_management?useUnicode=true&characterEncoding=utf-8"
user="root" password="123456"/>
<div class="topbar">
<div class="title col-lg-2 col-lg-offset-5">图书管理系统</div>
</div>
<div class="content">
<div class="sidebar">
<ul>
<li style="background-color: #4c7bd2; box-shadow:0px 0px 6px black inset;"><span>图书管理</span></li>
<li><span>图书类别管理</span></li>
</ul>
</div>
<ul class="win-ul">
<li style="display: block;" id="win-1">
<div class="top" style="width: 860px;">
<div class="top-content">
<form action="" method="get">
<input type="text" class="form-control" name="bookName" placeholder="图书名称"
style="width:260px;"/>
<input type="text" class="form-control" name="bookAuthor" placeholder="图书作者"
style="width:260px; margin-left: 30px;"/>
<sql:query dataSource="${snapshot}" var="result_bookTypeId">
SELECT * from books_type;
</sql:query>
<select class="form-control" style="width: 100px; margin-left: 30px;" name="bookTypeId">
<option>全部</option>
<c:forEach var="row" items="${result_bookTypeId.rows}">
<option>${
row.book_type_id}</option>
</c:forEach>
</select>
<button type="submit" class="btn btn-primary query-but" style="margin-left: 60px;"> 查询 </button>
</form>
</div>
</div>
<div class="win-table table-responsive">
<!-- 添加界面 -->
<div class="table-add-back"> <!-- 背景 -->
<div class="table-add-content"> <!-- 内容 -->
<div class="close-but btn btn-default">X</div>
<label class="title">图书添加</label>
<form class="input-box" action="/bookAddServlet" method="get">
<input type="text" name="bookNameAdd" class="table-add-text form-control text-flag" placeholder="图书名称"/>
<input type="text" name="bookAuthorAdd" class="table-add-text form-control text-flag" placeholder="图书作者"/>
<input type="text" name="bookPriceNameAdd" class="table-add-text form-control text-flag" placeholder="图书价格"/>
<sql:query dataSource="${snapshot}" var="result_bookTypeId">
SELECT * from books_type;
</sql:query>
<select class="form-control" style="width: 100px; margin-left: 22px;" name="bookTypeIdAdd">
<c:forEach var="row" items="${result_bookTypeId.rows}">
<option>${
row.book_type_id}</option>
</c:forEach>
</select>
<textarea class="table-add-text form-control text-flag" rows="6" name="bookDesc" placeholder="图书描述"></textarea>
<button type="submit" class="table-add-but btn btn-primary">添加</button>
</form>
</div>
</div>
<input type="button" name="table_add" value=" 添加 " class="btn btn-success add-button" style="font-weight: bold;"/>
<table class="table table-striped table-bordered table-hover" style="width: inherit;">
<thead>
<tr>
<td>图书id</td>
<td>图书名称</td>
<td>图书作者</td>
<td>图书价格</td>
<td>图书描述</td>
<td>图书类别id</td>
<td class="oper-cell-book">操作</td>
</tr>
</thead>
<%-- 图书表格内容 --%>
<sql:query dataSource="${snapshot}" var="result_book">
SELECT * from `book`;
</sql:query>
<tbody class="table-tbody">
<%
String bookName = request.getParameter("bookName");;
String bookAuthor = request.getParameter("bookAuthor");
String bookTypeId = request.getParameter("bookTypeId");
//要执行的sql语句前部分
StringBuilder sqlBuilder = new StringBuilder("SELECT * FROM book");
boolean flag_WHERE = false; //是否添加WHERE标记
//图书名文本区不为空
if (!(bookName == null)) {
sqlBuilder.append(" WHERE " + "book_name LIKE '%"+ bookName +"%'");
flag_WHERE = true;
}
//图书作者文本区不为空
if (!(bookAuthor == null)) {
if(!flag_WHERE) {
sqlBuilder.append(" WHERE ");
flag_WHERE = true;
}
else
sqlBuilder.append(" AND ");
sqlBuilder.append("book_author LIKE '%"+ bookAuthor +"%'");
}
if(bookTypeId != null) {
//不为全部时
if (!bookTypeId.equals("全部")) {
if(!flag_WHERE) {
sqlBuilder.append(" WHERE ");
flag_WHERE = true;
}
else
sqlBuilder.append(" AND ");
sqlBuilder.append("book_type_id = '"+ bookTypeId +"'");
}
}
String bookSQL = sqlBuilder.toString(); //得到需要执行的sql语句
System.out.println(bookSQL);
BookService bookService = new BookService();
List<Book> bookList = bookService.whereQueryBook(bookSQL);
for(Book book : bookList) {
out.print("");
out.print("" + book.getBookId() + " ");
out.print("" + book.getBookName() + " ");
out.print("" + book.getBookAuthor() + " ");
out.print("" + book.getBookPrice() + " ");
out.print("" + book.getBookDesc() + " ");
out.print("" + book.getBookTypeId() + " ");
out.print("" +
" + request.getContextPath() + "/webapps/bookUpdate.jsp?id=" + book.getBookId() + "\">修改"+
" + request.getContextPath() + "/BookDeleteServlet?id=" + book.getBookId() + "\">删除"+
" ");
out.print(" ");
}
%>
</tbody>
</table>
<%-- 暂时不做分页--%>
<%-- <div class="bottom-but">--%>
<%-- <ul class="bottom-but-ul">--%>
<%-- <li>1</li>--%>
<%-- </ul>--%>
<%-- </div>--%>
</div>
</li>
<!-- 图书类别管理界面 -->
<li id="win-2">
<div class="top">
<div class="top-content">
<form action="" method="get">
<input type="text" class="form-control query-text" name="bookTypeName" placeholder="图书类别名称"
style="width:400px;"/>
<button type="submit" class="btn btn-primary query-but" style="margin-left: 50px;"> 查询 </button>
</form>
</div>
</div>
<div class="win-table table-responsive">
<!-- 添加界面 -->
<div class="table-add-back"> <!-- 背景 -->
<div class="table-add-content"> <!-- 内容 -->
<div class="close-but btn btn-default">X</div>
<label class="title">图书类别添加</label>
<form class="input-box" action="/BookTypeAddServlet" method="get">
<input type="text" name="bookTypeNameAdd" class="table-add-text form-control text-flag" placeholder="图书类别名称"/>
<textarea class="table-add-text form-control text-flag" rows="6" name="bookTypeDesc" placeholder="图书类别描述"></textarea>
<button type="submit" class="table-add-but btn btn-primary">添加</button>
</form>
</div>
</div>
<input type="button" name="table_add" value=" 添加 " class="btn btn-success add-button" style="font-weight: bold;"/>
<table class="table table-striped table-bordered table-hover" style="width: inherit;">
<thead>
<tr>
<td>图书类别id</td>
<td>图书类别名称</td>
<td>图书类别描述</td>
<td class="oper-cell">操作</td>
</tr>
</thead>
<tbody class="table-tbody">
<%
String bookTypeName = request.getParameter("bookTypeName");
String sql1 = "SELECT * FROM books_type WHERE book_type_name LIKE \"%"+ bookTypeName +"%\"";
if(bookTypeName == null || bookTypeName.equals("")) {
sql1 = null;
}
String sql = sql1;
System.out.println(sql + "sql");
if(sql == null) {
sql = "select * from `books_type`";
}
System.out.println(sql + "sql");
BookTypeService service = new BookTypeService();
List<BookType> bookTypeList = service.whereQueryBookType(sql);
for(BookType type : bookTypeList) {
out.print("");
out.print("" + type.getTypeId() + " ");
out.print("" + type.getTypeName() + " ");
out.print("" + type.getTypeDesc() + " ");
out.print("" +
" + request.getContextPath() + "/webapps/bookTypeUpdate.jsp?id=" + type.getTypeId() + "\">修改"+
" + request.getContextPath() + "/BookTypeDeleteServlet?id=" + type.getTypeId() + "\">删除"+
" ");
out.print(" ");
}
%>
</tbody>
</table>
<%-- 暂时不做分页--%>
<%-- <div class="bottom-but">--%>
<%-- <ul class="bottom-but-ul">--%>
<%-- <li>1</li>--%>
<%-- </ul>--%>
<%-- </div>--%>
</div>
</li>
</ul>
</div>
<script type="text/javascript" src="/webapps/javascript/jquery.js"></script>
<script type="text/javascript" src="/webapps/javascript/index.js"></script>
</body>
</html>
如果您有什么问题,也欢迎提出,感谢支持。