写在前面,之前由于种种原因博客好久没有更新。最近打算重拾JavaWeb,所以从头开始,先用servlet+jdbc+bootstrap最基础的代码实现一个图书系统。考虑有管理员端+用户端,项目完成后会上传至github,后期会升级ssh/ssm等,毕竟是温故学习,一点一点来,项目会一直更新补充!

  github地址——https://github.com/vi3nty/BookSystem

  2018.04.16更新,管理端进一步完善,页面优化调整

  2018.03.29更新,管理端实现了过滤功能(管理端大部分功能已经完善,只剩下JS/JQ的还没有,等用户端写完了再说)

  2018.03.26更新,管理端添加图书编辑页面(book.jsp),并采用了jquery的ajax技术

  2018.03.22更新,管理端采用EL&JSTL进行了页面重构,并且添加分页功能

1.项目结构


│ .classpath
│ .gitignore
│ .project
│ LICENSE
│ README.md

├─.settings
│ .jsdtscope
│ org.eclipse.core.resources.prefs
│ org.eclipse.jdt.core.prefs
│ org.eclipse.wst.common.component
│ org.eclipse.wst.common.project.facet.core.xml
│ org.eclipse.wst.css.core.prefs
│ org.eclipse.wst.html.core.prefs
│ org.eclipse.wst.jsdt.ui.superType.container
│ org.eclipse.wst.jsdt.ui.superType.name

├─build
│ └─classes
│ ├─biz
│ │ │ AdminBiz.class
│ │ │ bookBiz.class
│ │ │
│ │ └─impl
│ │ AdminBizImpl.class
│ │ bookBizImpl.class
│ │
│ ├─dao
│ │ │ AdminDao.class
│ │ │ bookDao.class
│ │ │
│ │ └─impl
│ │ AdminDaoImpl.class
│ │ bookDaoImpl.class
│ │
│ ├─pojo
│ │ admin.class
│ │ book.class
│ │ PageBean.class
│ │
│ ├─servlet
│ │ AdminServlet.class
│ │ BookServlet.class
│ │ LogFilter.class
│ │ LoginServlet.class
│ │
│ └─utils
│ myDB.class

├─src
│ ├─biz
│ │ │ AdminBiz.java
│ │ │ bookBiz.java
│ │ │
│ │ └─impl
│ │ AdminBizImpl.java
│ │ bookBizImpl.java
│ │
│ ├─dao
│ │ │ AdminDao.java
│ │ │ bookDao.java
│ │ │
│ │ └─impl
│ │ AdminDaoImpl.java
│ │ bookDaoImpl.java
│ │
│ ├─pojo
│ │ admin.java
│ │ book.java
│ │ PageBean.java
│ │
│ ├─servlet
│ │ AdminServlet.java
│ │ BookServlet.java
│ │ LogFilter.java
│ │ LoginServlet.java
│ │
│ └─utils
│ myDB.java

└─WebContent
├─css
│ bootstrap-theme.css
│ bootstrap-theme.css.map
│ bootstrap-theme.min.css
│ bootstrap-theme.min.css.map
│ bootstrap.css
│ bootstrap.css.map
│ bootstrap.min.css
│ bootstrap.min.css.map

├─fonts
│ glyphicons-halflings-regular.eot
│ glyphicons-halflings-regular.svg
│ glyphicons-halflings-regular.ttf
│ glyphicons-halflings-regular.woff
│ glyphicons-halflings-regular.woff2

├─img
│ │ duzhe.jfif
│ │ qingnian.jfif
│ │ s28350186.jpg
│ │ s29643861.jpg
│ │ s29672551.jpg
│ │ s29686001.jpg
│ │
│ └─readme
│ admin.PNG

├─js
│ bootstrap.js
│ bootstrap.min.js
│ jquery-3.3.1.js
│ npm.js

├─META-INF
│ MANIFEST.MF

├─web
│ admin.jsp
│ AdminLogin.jsp
│ book.jsp

└─WEB-INF
│ web.xml

└─lib
mysql-connector-java-5.1.46-bin.jar
taglibs-standard-impl-1.2.5.jar
taglibs-standard-spec-1.2.5.jar

 

  项目采取最基础的MVC分层架构,全部采用servlet+jdbc方式实现。jsp作为v层,servlet作为controller层与业务层代码关联,整个代码做到最大限度的低耦合。前端主要是jQuery和Bootstrap,毕竟我前端了解的少,仅仅会用几个API,所以整个项目前端不做过多赘述。

2.项目分层概述

  ①dao层主要是处理与数据库交互的逻辑

  AdminDao.java

 public interface AdminDao {
public boolean adminLogin(String admin,String password);
}

  AdminDaoImpl.java

 public class AdminDaoImpl implements AdminDao{
public boolean adminLogin(String admin, String password) {
Connection conn=null;
PreparedStatement st=null;
ResultSet rs=null;
Boolean result=false;
try {
//获取连接
conn=myDB.getConnection();
//编写SQL语句
String adminLoginSql="select * from aduser where adname='"+admin+"' and password='"+password+"'";
//创建语句执行者
st=conn.prepareStatement(adminLoginSql);
//获取结果
rs=st.executeQuery();
if(rs.next())
result=true;
else
result=false;
} catch (Exception e) {
e.printStackTrace();
}
finally {
myDB.closeResource(conn, st, rs);
}
return result;
}
}

  ②biz层主要是业务逻辑的实现

  AdminBiz类似Dao层,所以就不贴代码了

  AdminBizImpl.java

 public class AdminBizImpl implements AdminBiz{
private AdminDao adminDao;
public boolean adminLogin(String admin, String password) {
//实例化接口
adminDao=new AdminDaoImpl();
pojo.admin admin2=new pojo.admin();
admin2.setAdmin(admin);
admin2.setPassword(password);
Boolean result=adminDao.adminLogin(admin2.getAdmin(), admin2.getPassword());
return result;
}
}

  ③utils是工具类,主要有数据库连接的类,这样每次操作数据库不用重写代码

  

  ④pojo层是数据库表的映射实体类

  PageBean.java类主要用于图书分页实现

  

 public class PageBean<T> {
private int currentPage=1;//当前页,默认显示第一页
private int pageCount=5;//每页显示的行数
private int totalCount;//总记录数
private int totalPage;//总页数=总记录数/每页显示的行数+1
private List<T> pageData; //获取总页数
public int getTotalPage() {
if(totalCount%pageCount==0)
totalPage=totalCount/pageCount;//被整除情况
else {
totalPage=totalCount/pageCount+1;
}
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage=totalPage;
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public int getPageCount() {
return pageCount;
}
public void setPageCount(int pageCount) {
this.pageCount = pageCount;
}
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
public List<T> getPageData() {
return pageData;
}
public void setPageData(List<T> pageData) {
this.pageData = pageData;
}
}

  ⑤servlet控制层

  AdminServlet.java类(用于图书管理端分页等功能的实现)

  

 public class AdminServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse rep) throws ServletException, IOException {
int currentPage;//获得当前页
String current=(String) req.getParameter("page");
if(current==null)
currentPage=1;
else
currentPage=Integer.parseInt(current);
//实例化业务层
bookBiz bookbiz=new bookBizImpl();
PageBean pb=new PageBean();
pb.setTotalCount(bookbiz.getTotalCount());
if(currentPage>0)
pb.setCurrentPage(currentPage);
//分页查询
ArrayList<book> books=bookbiz.searchAllBook(pb);
//获得总页数
int pageCount=pb.getTotalPage();
//将book集合和页面数跳转至admin.jsp页面
req.setAttribute("bookslist", books);
req.setAttribute("pagesize", pageCount);
req.getRequestDispatcher("web/admin.jsp").forward(req, rep);
}
}

  BookServlet.java类(用于图书编辑修改等的实现)

  

 public class BookServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse rep) throws ServletException, IOException {
int bookid=Integer.parseInt(req.getParameter("bookid"));
bookBiz bookbiz=new bookBizImpl();
book bk=bookbiz.getBookById(bookid);
if(req.getParameter("method")!=null&&req.getParameter("method").equals("update")) {
int borrow=Integer.parseInt(req.getParameter("borrow"));
String intro=req.getParameter("intro");
if(bookbiz.editBook(bookid, intro, borrow)) {
//req.setAttribute("bk", bk);
//req.getRequestDispatcher("bookServlet?bookid="+bookid).forward(req, rep);
PrintWriter out=rep.getWriter();
out.println("success");
}
}
else {
//将获取到的book数据发送并跳转至book.jsp页面
req.setAttribute("bk", bk);
req.getRequestDispatcher("web/book.jsp?bookid="+bookid).forward(req, rep);
}
}
}

  LogFilter.java类(用于登录过滤实现)

 

 public class LogFilter implements Filter{
private FilterConfig config;
@Override
public void destroy() {
// TODO Auto-generated method stub }
/*
* Filter的核心处理
* */
@Override
public void doFilter(ServletRequest req, ServletResponse rep, FilterChain filc)
throws IOException, ServletException {
HttpServletRequest request=(HttpServletRequest) req;
HttpServletResponse response=(HttpServletResponse) rep;
HttpSession session=request.getSession();
//如果session中有logined,则证明过滤成功
if(session.getAttribute("logined")!=null) {
filc.doFilter(req, rep);
}
else
response.sendRedirect("web/AdminLogin.jsp");
} @Override
public void init(FilterConfig config) throws ServletException {
this.config=config;
} }

3.数据库设计

  aduser表

  

4.前端JSP设计

  ①AdminLogin.jsp页面

  

 <%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>管理员登录页面</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="../css/bootstrap.css">
<script type="text/javascript" src="../js/bootstrap.js"></script>
<script> </script>
</head>
<body>
<div class="continer">
<div style="margin:0 auto">
<h2 class="text-center">图书管理系统</h2>
<form class="form-horizontal" role="form" action="/BookSystem/adminlogin" method="post"> <div class="form-group">
<label for="username" class="col-sm-2 control-label">用户名:</label>
<div class="col-sm-5">
<input type="text" class="form-control" name="adname" id="adname"
placeholder="请输入用户名">
</div>
</div>
<div class="form-group">
<label for="password" class="col-sm-2 control-label">密码:</label>
<div class="col-sm-5">
<input type="password" class="form-control" name="password" id="password"
placeholder="请输入密码">
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<input type="submit" class="btn btn-default" value="登录"/>
</div>
</div> </form>
</div>
</div>
</body>
</html>

  ②admin.jsp页面(管理端)

  

 <%@page import="pojo.PageBean"%>
<%@page import="pojo.book"%>
<%@page import="java.util.ArrayList"%>
<%@page import="biz.impl.bookBizImpl"%>
<%@page import="biz.bookBiz"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>管理页面</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/bootstrap.css">
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/bootstrap-theme.css">
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/bootstrap.min.css">
<script type="text/javascript" src="${pageContext.request.contextPath}/js/bootstrap.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-3.3.1.js"></script>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-sm-12">
<h3 class="text-center">
图书系统管理员端
</h3>
<div class="row">
<div class="col-sm-2">
<div class="btn-group-vertical">
<button class="btn btn-primary" type="button">书籍管理</button> <button class="btn btn-primary" type="button">添加书籍</button> <button class="btn btn-primary" type="button">用户管理</button>
</div>
</div>
<div class="col-sm-8" id="booklist">
<table class="table table-striped">
<thead>
<tr>
<th>书籍封面</th>
<th>书籍名称</th>
<th>是否借出</th>
<th>书籍作者</th>
<th>分类目录</th>
<th>简介</th>
<th>操作</th>
</tr>
</thead>
<!-- 03.22采用EL&JSTL进行页面 重构 -->
<tbody>
<c:forEach items="${requestScope.bookslist}" var="book">
<tr>
<td style="width:12%">
<div class="thumbnail" >
<img src="http://${book['bk_img']}">
</div>
</td>
<td>
<p id="bookname">${book['bk_name']}</p>
</td>
<td>
<p> <c:if test="${book['bk_borrowed']}==1">
<c:out value="已借出"></c:out>
</c:if>
<c:if test="${book['bk_borrowed']}==0">
<c:out value="未借出"></c:out>
</c:if>
</p>
</td>
<td>
<p id="bookname">${book['bk_name']}</p>
</td>
<td>
<p id="bookname">${bk['bk_category']}</p>
</td>
<td>
<p id="bookname">${book['bk_intro']}</p>
</td>
<td>
<div class="btn-group-vertical">
<button class="btn btn-primary" type="button">编辑</button> <button class="btn btn-primary" type="button">删除</button>
</div>
</td>
</tr>
</c:forEach>
</tbody>
</table>
<ul class="pagination">
<li><a href="adminServlet?page=${param.page-1}" <c:if test="${param.page==1}">class="btn disabled"</c:if>>&laquo;</a></li>
<c:forEach var="i" begin="1" end="${pagesize}">
<li id="bookitem"><a href="adminServlet?page=<c:out value='${i}'/>" <c:if test="${i==param.page}">class="btn disabled"</c:if>><c:out value="${i}"/></a></li>
</c:forEach>
<li><a href="adminServlet?page=${param.page+1}" <c:if test="${param.page==pagesize}">class="btn disabled"</c:if>>&raquo;</a></li>
</ul>
</div>
<div class="col-sm-2">
<form class="form-search">
<input class="form-control" type="text" /> <button type="submit" class="btn">查找</button>
</form>
</div>
</div>
</div>
</div>
</div>
</body>
</html>

  ③book.jsp(图书编辑页面)

 <%@ page language="java" contentType="text/html; charset=utf8"
pageEncoding="utf8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf8">
<title>编辑图书</title>
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/bootstrap.css">
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/bootstrap-theme.css">
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/bootstrap.min.css">
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-3.3.1.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/js/bootstrap.js"></script>
<script type="text/javascript">
function edbook(){
$.ajax({
url:"bookServlet?method=update&bookid=${bk['bk_id']}",
type:"post",
data:$("#edit").serialize(),
cache:false,
dataType: "text",
error:function(err){
alert("更新失败!");
},
success:function(msg){
alert("更新成功!");
}
});
} </script>
</head>
<body>
<div class="container">
<h3 class="text-center">
管理员端
</h3>
<div class="col-md-8 col-md-offset-2">
<form method="post" id="edit">
<table class="table table-bordered">
<tr>
<th>书籍名称</th>
<td>${bk['bk_name']}</td>
</tr>
<tr>
<th>是否借出</th>
<td>
<select class="selectpicker show-tick form-control" name="borrow" id="borrow" title="请选择一项" data-live-search="true" data-size="5">
<option role="presentation" <c:if test="${bk['bk_borrowed']==1}">selected</c:if> value="1">已借出</option>
<option role="presentation" <c:if test="${bk['bk_borrowed']==0}">selected</c:if> value="0">未借出</option>
</select>
</td>
</tr>
<tr>
<th>书籍作者</th>
<td>${bk['bk_author']}</td>
</tr>
<tr>
<th>书籍分类</th>
<td>
${bk['bk_category']}
</td>
</tr>
<tr>
<th>书籍介绍</th>
<td><textarea class="form-control" rows="3" id="intro" name="intro">${bk['bk_intro']}</textarea></td>
</tr>
<tr><th></th><td><input type="submit" class="btn default" onclick="edbook()" value="提交" id="editbook" name=""/></td></tr>
</table>
</form>
</div>
</div>
</body>
</html>

5.web.xml等配置文件

Servlet+JSP+JDBC设计实现图书系统——管理功能实现的更多相关文章

  1. servlet+jsp+jdbc实现从数据库查询用户信息到页面

    工程创建这里就不在累述了,直接从显示User信息列表开始. 备注:我用的是servlet3的注解功能实现的,所以不需要配置web.xml 这是我的工程目录: 首先我们创建实体类: public cla ...

  2. Java——分页 Servlet + Jsp+Jdbc 有点瑕疵

    1.创建数据库,插入多条数据 2.java连接DB 3.Person类: package com.phome.po; public class Person { private int id; pri ...

  3. Servlet+JSP+JDBC综合案例

    层级关系: 一.Util包 包里面写一个JDBCTools.java文件 功能:实现数据库连接返回一个Connection对象,并且可以实现数据库相应资源的关闭! 注意事项: 1.定义成员变量 1 p ...

  4. servlet jsp jdbc bootstrarp mvc分层模式实现的第一个项目

    登录注册界面 这是一个注册和登录的界面 用到了前端页面中自带的一点H5的标签和属性---巩固下 邮箱格式 :type="email"  不能为空:  required=" ...

  5. <测试用例设计>用户及权限管理功能常规测试方法

    1)  赋予一个人员相应的权限后,在界面上看此人员是否具有此权限,并以此人员身份登陆,验证权限设置是否正确(能否超出所给予的权限): 2)  删除或修改已经登陆系统并正在进行操作的人员的权限,程序能否 ...

  6. Servlet+JSP+JavaBean开发模式(MVC)介绍

    好伤心...写登陆注册之前看见一篇很好的博文,没有收藏,然后找不到了. 前几天在知乎上看见一个问题,什么时候感觉最无力. 前两天一直想回答:尝试过google到的所有solve case,结果bug依 ...

  7. 基于JSP的学术交流论坛系统的设计与实现

    版权声明:本文为[博主](https://zhangkn.github.io)原创文章.未经博主同意不得转载. https://creativecommons.org/licenses/by-nc-s ...

  8. java语言体系的技术简介之JSP、Servlet、JDBC、JavaBean(Application)

    转自:https://zhangkunnan.iteye.com/blog/2040462 前言 Java语言 Java语言体系比较庞大,包括多个模块.从WEB项目应用角度讲有JSP.Servlet. ...

  9. 简单的员工管理系统(Mysql+jdbc+Servlet+JSP)

    员工管理系统 因为学业要求,需要完成一个过关检测,但是因为检测之前没有做好准备,且想到之前用mysql+jdbc+Struts2+bootstrap做成了一个ATM系统(主要有对数据的增删改查操作), ...

随机推荐

  1. error:Your local changes to the follwing files would be overwritten by merge

  2. php快速获取所有的自定义常量用户常量

    快速获取自定义的常量.用户常量 echo "<pre>"; print_r(get_defined_constants(true)['user']); echo &qu ...

  3. 饮品类App原型制作分享-WineRatingsPlus

    WineRatingsPlus是一款关于红酒的App应用.它帮助你在用餐.聚会或任何场合选择葡萄酒时,都能方便的得到专家意见.同时,它也能帮助鉴赏家和感兴趣的人对葡萄酒更多的了解和选择. 在这款Moc ...

  4. java集成支付宝移动快捷支付时报错java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : algid parse error, not a sequence

    出错原因是代码中的私钥设置错误,不是填原始的私钥,而是转换为PKCS8格式的私钥(Java格式的) ,改成后就会报创建交易异常了

  5. PostgreSQL CPU满(100%)性能分析及优化

    业务场景:大批量更新时,数据库长时间CPU占用超过90,影响其他正常业务流程,参考阿里云上的一篇文章:https://help.aliyun.com/knowledge_detail/43562.ht ...

  6. 在iOS项目中引入MVVM

    本文翻译自:http://www.objc.io/issue-13/mvvm.html.为了方便读者并节约时间,有些不是和文章主题相关的就去掉了.如果读者要看原文的话可以通过前面的url直接访问.作者 ...

  7. 搭建自己的 Docker 私有仓库服务

    关于 Docker 的介绍这里就省了,Docker 在其相关领域的火爆程度不亚于今年汽车行业里的特斯拉,docCloud 甚至把公司名都改成了 Docker, Inc. 好东西总是传播很快,我们现在已 ...

  8. Python实现简单登陆验证(文件操作)

    利用python编写一个简单的登陆验证 代码主要功能: 利用Python实现简单的登陆验证,代码主要有两个部分组成: 第一部分:登陆页面,作用是实现用户名和密码的输入 利用两个输入函数input()来 ...

  9. Java--下载历史版本登录账户

    目前在官网下载低于jdk1.8的java jdk的时候需要登陆,这边分享一个账号,方便下载 2696671285@qq.com 密码:Oracle123 转自-- jdk下载以前版本需要的账号(转) ...

  10. 「HEOI2014」南园满地堆轻絮

    题目链接 戳我 题目出处 菩萨蛮·南园满地堆轻絮                                             温庭筠 南园满地堆轻絮,愁闻一霎清明雨.雨后却斜阳,杏花零落香 ...