关于与需要的文件下载
字体颜色分类:
黑色 表示正文
蓝色 表示一个超链接,点击可以跳转页面
橙色 表示一级标题或项目的包名
绿色 表示子级内容中含有代码或解释的标题
紫色 表示一个代码块的标题
红色 表示()外的文件是()内文件的子类,实现类或依赖
浅灰 表示解释或其类型
高亮显示 表示重点或者需要注意未被解决的Bug
纯小白,有什么做得不好的地方请各位大佬指正,谢谢!
项目/数据库/Jar文件下载
Java-Project文件夹中存放项目,需要的同学可以下载看一下,也欢迎进行修改!
Java-Jar文件夹中存放.java或其他类型需要引入的外部文件
Java-数据库 文件夹中存放建库建表的sql文件
jar文件里面有不需要的可以不下载 本文档只用到了mysql connector
sqlserver与oracle数据库请下载sqljdbc4/ojdbc14并修改数据库连接语句
(连接类:src – Jdbc – Tool – BookManageOper 修改时仅需修改常量值)
一.所有页面与项目介绍
首页面
添加页面
包含四个主要模块:查询 – 增加 – 删除 – 分页
可以通过当前项目对Jsp+Servlet的基础进行检验
注意!我没有对页面进行任何的美化
所有代码只是为了做出来作业而写的
如果想要美化可以自己修改Script下的内容
二.所用软件与文件
软件
Idea
SQLyog(mysql) 可使用其他数据库代替
JAR文件
mySql-Connector-java
注意!jar文件需要在File-Project Structure-Artifacts中引入到WEB-INF/lib中
三.数据库的建立
在进行代码的编写之前,我们首先把数据库与表建立好
我的数据库仅适用于MySql,其他数据库请自行建库建表!
项目/数据库/Jar文件下载中 Java – 数据库 – BookManage.sql 进入SQLyog执行即可
Book表(table)
id | int | 主键 自增 | 编号 |
name | varchar(50) | 非空 | 书名 |
author | varchar(50) | 非空 | 作者名 |
time | date | 非空 | 购入时间 |
type | int | 非空 外键(type-id) | 类型 |
Book表.png
Type表(table)
id | int | 主键 自增 | 编号 |
name | varchar(50) | 非空 | 类型名 |
Type表.png
四.导入Jar文件
在idea2018中 导入jar文件 其他版本或软件请自行寻找教程
菜单栏-File-Project Structure中选择Modules
选择Dependencies
在Dependencies-Scope旁边选择绿色的加号中选择jars or …..
选择需要加入的Jar文件并点击Apply 退出当前弹框
再次进入 菜单栏-File-Project Structure 但是选择Artifacts
在Artifacts中选择Output Layout
在右方Available Elements选择需要加入的jar
选择后在下方点击Fix 并选择Add ‘xx.jar’ to Artifacts 或者 Add All…
五.代码编写
- src – Jdbc
(1)src-jdbc包含的文件与其详解
src – Jdbc包含Dao(数据访问接口) , Impl(Dao实现类) , Entity(实体类) , Tool(工具类)
Dao(数据访问接口):包含BookDao与TypeDao 主要用来进行方法的定义
Impl(Dao实现类):包含BookDaoImpl与TypeDaoImpl,他们都继承自Dao中的接口,主要进行抽象方法的具体实现
Entity(实体类):包含Book与Type,也就是数据库中的表,其中的字段就是数据库的字段
Tool(工具类):包含BookManageOper与Page,用于数据库的连接开启与关闭和分页的操作
(2)src – jdbc – Tool
(2.1)src – jdbc – Tool – BookManageOper[数据库连接][工具类]
首先就是进行数据库的连接 需要用到Jar文件连接数据库
代码的解释已经在注释里了,如果有什么问题欢迎提出!谢谢!
package Jdbc.Tool;import java.io.Console;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;public class BookManageOper {//创建数据与数据库的连接的字符常量 修改数据库仅需修改url中的bookmanage即可//connector8.x中已经进行修改classname与url,详细请前往其他教程寻找private static final String classname="com.mysql.jdbc.Driver";//mysql5.x不需要" />
(2.2)src - jdbc - Tool - Page[翻页][工具类]
package Jdbc.Tool;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;public class Page {//当前页数 默认为1private int thisPage=1;//总页数private int sumPage;//每页显示行数{固定为5 修改的时候修改5为x即可}private int showPage=5;//所有记录数 可以使用这个来进行代替sumpage? 【未实现】private int sumRecord;//单例模式private Page(){}private static Page page=null;public static Page getPage(){if(page==null)page=new Page();return page;}//私有的字段 用于数据库连接与操作private Connection connection=null;private PreparedStatement preparedStatement=null;private ResultSet resultSet=null;//在这里我没有给sumRecord创建get/set方法 因为没有外部类使用到他//如果有使用的需求可以加上 没有需求可以把sumRecord直接删除 在下方sum定义局部变量public int getThisPage() {return thisPage;}//当设置当前页数时,进行判断public void setThisPage(int thisPage) {//如果大于0且小于等于总页数,正常运行if(thisPage>0&&thisPagesumPage){this.thisPage=getSumPage();}//如果都不满足(小于0) 那么设为默认值1else{this.thisPage=1;}}public int getSumPage() {return sumPage;}//当设置总页数时,进行判断public void setSumPage(int sumPage) {//当总页数大于0时 进行赋值 否则将sumPage设为1(可以不设else 那么出现0){this.sumPage = sumPage;//当总页数设置完之后,需要将当前页数设为当前页数//因为当删除数据之后 4页变成了3页 那么当前页数不能继续为4 而是为最大页数3this.setThisPage(this.getThisPage());}else{this.sumPage = 1;}}public int getShowPage() {return showPage;}public void setShowPage(int showPage) {//这里可以不进行判断,因为没在外面设置ShowPage//但是有些页面需要进行每页显示的修改 如论坛//需要进行每页显示的修改时需要进行判断if(showPage>=1&&showPage<=99){this.showPage = showPage;}}//获取总记录数 初始化或每次添加、删除结束后执行public void loadSumRecord(){System.out.println("Tool - Page - getSumPage()");try{//创建Connection连接connection=BookManageOper.create();//查询Book表的所有记录String sql="select count(1) from book";preparedStatement=connection.prepareStatement(sql);resultSet=preparedStatement.executeQuery();//因为是返回count(1)[只返回一个数据] 所以使用ifif(resultSet.next()){sumRecord=resultSet.getInt(1);//三目运算符 if?true:false 当总记录除总页数余0时 返回结果,不为0返回结果+1this.setSumPage(sumRecord%showPage==0?sumRecord/showPage:sumRecord/showPage+1);}}catch (Exception ex){ex.printStackTrace();}finally {BookManageOper.close(connection,preparedStatement,resultSet);}}}
(3)src - jdbc - Entity
Entity进行表与其中字段的定义,这就没必要解释了
(3.1)src - jdbc - Entity - Book[图书][实体类]
package Jdbc.Entity;public class Book {//图书 mysql - BookManage . Book//图书编号private int id;//图书名private String name;//作者名private String author;//购入时间private String time;//图书类型 - Type类 包含id(类型编号)与name(类型名)private Type type;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public String getTime() {return time;}public void setTime(String time) {this.time = time;}public Type getType() {return type;}public void setType(Type type) {this.type = type;}}
(3.2)src - jdbc - Entity - Type[类型][实体类]
package Jdbc.Entity;public class Type {//图书类型 mysql - BookManage . Type//图书类型编号private int id;//图书类型名private String name;//无参构造方法public Type(){}//有参构造方法 方便赋值 不用再进行type.setId()...public Type(int id, String name) {this.id = id;this.name = name;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}
(4)src - jdbc - Dao
Dao中包含了方法的定义,需要什么方法就写什么方法
接口中的方法默认使用abstract修饰,不可以有方法体
但可以使用default把abstract覆盖掉
(4.1)src - jdbc - Dao - BookDao[图书][Dao接口]
package Jdbc.Dao;import Jdbc.Entity.Book;import java.util.List;public interface BookDao {//获取所有书籍数据 Book - index.jsp/selectServlet -List getAllBook();//增加一条数据 Book - insert.jsp/insertServlet -boolean insertBook(String name,String author,String time,int type);//删除一条数据 Book - index.jsp/deleteServlet -boolean deleteBook(int id);}
(4.2)src - jdbc - Dao - TypeDao[类型][Dao接口]
package Jdbc.Dao;import Jdbc.Entity.Type;import java.util.List;public interface TypeDao {//获取所有类型信息 Type - insert.jsp/Servlet -List getAllType();}
(5)src - jdbc - Impl
Impl通过implements Dao 来实现Dao中的抽象方法
impl一般来说都是默认类 不会是接口或抽象类 因为没有意义
(5.1)src - jdbc - Impl - BookDaoImpl(BookDao)[图书][Dao接口实现类]
package Jdbc.Impl;import Jdbc.Dao.BookDao;import Jdbc.Entity.Book;import Jdbc.Entity.Type;import Jdbc.Tool.BookManageOper;import Jdbc.Tool.Page;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.util.ArrayList;import java.util.List;public class BookDaoImpl implements BookDao {//连接数据库与处理sqlConnection connection=null;PreparedStatement preparedStatement=null;ResultSet resultSet=null;@Overridepublic List getAllBook() {//获取所有书籍数据//当获取书籍时 首先重新加载一下记录Page page=Page.getPage();page.loadSumRecord();//先创建一个List 之后直接Return ListList bookList=new ArrayList() ;try{connection=BookManageOper.create();//查询图书表中的x-x行数据 并查询它对应的类型名String sql="select b.*,t.* from book b,type t where b.type=t.id limit ?,?";preparedStatement=connection.prepareStatement(sql);// row * ( page - 1 ) 5 * (2-1) = 5 不在前五行int Limit1=page.getShowPage()*(page.getThisPage()-1);preparedStatement.setInt(1, Limit1);preparedStatement.setInt(2, page.getShowPage());resultSet=preparedStatement.executeQuery();//返回不确定行或多行的查询sql语句 使用whilewhile (resultSet.next()){//创建一个book对象 并将数据库中的值赋给这个对象 Book book=new Book(); book.setId(resultSet.getInt("b.id")); book.setName(resultSet.getString("b.name")); book.setAuthor(resultSet.getString("b.author")); book.setTime(resultSet.getString("b.time")); book.setType(new Type(resultSet.getInt("t.id"),resultSet.getString("t.name")));//将当前对象加入到list中 bookList.add(book);}System.out.println("Impl - BookDaoImpl - getAllBook() ReturnListCount : "+bookList.size());}catch (Exception ex){ex.printStackTrace();System.out.println("Impl - BookDaoImpl - getAllBook() Error");}finally {BookManageOper.close(connection,preparedStatement,resultSet);}return bookList;}@Overridepublic boolean insertBook(String name,String author,String time,int type) {//添加一条数据boolean Return=false;try{connection=BookManageOper.create();//增加一条数据 因为id为自增 所以会自动赋值String sql="insert into book(name,author,time,type) values (?,?,?,?)";preparedStatement=connection.prepareStatement(sql);preparedStatement.setString(1,name);preparedStatement.setString(2,author);preparedStatement.setString(3,time);preparedStatement.setInt(4,type);//执行返回影响行数的sql使用Updateint ReturnInt=preparedStatement.executeUpdate();//返回行数大于0则成功if(ReturnInt>0)Return=true;System.out.println("Impl - BookDaoImpl - insertBook(s,s,s,i) Return : "+Return);}catch (Exception ex){ex.printStackTrace();System.out.println("Impl - BookDaoImpl - insertBook(s,s,s,i)");}finally {BookManageOper.close(connection,preparedStatement,resultSet);}return Return;}@Overridepublic boolean deleteBook(int id) {//删除一条数据boolean Return=false;try{connection=BookManageOper.create();//根据id删除一条数据 因为id是唯一的String sql="delete from book where id=?";preparedStatement=connection.prepareStatement(sql);preparedStatement.setInt(1,id);int ReturnInt=preparedStatement.executeUpdate();if(ReturnInt>0)Return=true;System.out.println("Impl - BookDaoImpl - insertBook(s,s,s,i) Return : "+Return);}catch (Exception ex){ex.printStackTrace();System.out.println("Impl - BookDaoImpl - deleteBook(s) Error");}finally {BookManageOper.close(connection,preparedStatement,resultSet);}return Return;}}
(5.2)src - jdbc - Impl - TypeDaoImpl(TypeDao)[类型][Dao接口实现类]
package Jdbc.Impl;import Jdbc.Dao.TypeDao;import Jdbc.Entity.Type;import Jdbc.Tool.BookManageOper;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.util.ArrayList;import java.util.List;public class TypeDaoImpl implements TypeDao {Connection connection=null;PreparedStatement preparedStatement=null;ResultSet resultSet=null;@Overridepublic List getAllType() {//获取所有的图书类型List typeList = new ArrayList();try{connection=BookManageOper.create();String sql="select * from type";preparedStatement=connection.prepareStatement(sql);resultSet=preparedStatement.executeQuery();while (resultSet.next()){Type type=new Type();type.setId(resultSet.getInt("id"));type.setName(resultSet.getString("name"));typeList.add(type);}System.out.println("Impl - TypeDaoImpl - getAllType() - ReturnListCount : "+typeList.size());}catch (Exception ex){ex.printStackTrace();System.out.println("Impl - TypeDaoImpl - getAllType() Error");}finally {BookManageOper.close(connection,preparedStatement,resultSet);}System.out.println("Impl - TypeDaoImpl - getAllType() 完成");System.out.println();return typeList;}}
- web && src - Servlet
(1)web - web_inf
(1.1)web - web_inf - web.xml[Web配置文件]
web.xml是web程序的配置文件,它很重要!!!没有配置web.xml的话会报大错
index.jspSelectServletServlet.SelectServletSelectServlet/SelectServletInsertServletServlet.InsertServletInsertServlet/InsertServletdeleteServletServlet.deleteServletdeleteServlet/deleteServletPageServletServlet.PageServletPageServlet/PageServlet
(2)web - *.jsp 与其相对应的Servlet
(2.1)web - index页面
(2.1.1)web - index.jsp[首页][Jsp页面]
个人图书管理 <%----%><%Page page1=Page.getPage();List bookList=(List) session.getAttribute("bookList");if(bookList==null){request.getRequestDispatcher("SelectServlet").forward(request,response);}//else如果删掉 session一直有值 就不会再次进入获取bookList 会造成页面数据不刷新else{session.setAttribute("bookList",null);}%>图书信息
图书名称 图书作者 购买时间 图书分类 操作 <%for (Book b : bookList) {out.print("" +""+b.getName()+" " +""+b.getAuthor()+" " +""+b.getTime()+" " +""+b.getType().getName()+" " +"删除 " +" ");}%>
首页上一页/下一页尾页
新增图书信息$(function(){setOddBack()})function setOddBack(){$("tr:odd").css("background","gray");$("tr:even").css("background","none");}$(".delete").click(function () {var bookid=$(this).attr("bookid");//confirm 根据点击的按钮返回true falsevar deleteIs=confirm("确定要删除编号"+bookid+"的书籍吗?");//如果点击确定 那么进入deleteServletif(deleteIs==true){location.href="deleteServlet?bookid="+bookid;}})alert("删除成功");alert("删除失败");
(2.1.2)web - SelectServlet (index.jsp)[查询][Servlet]
package Servlet;import Jdbc.Dao.BookDao;import Jdbc.Impl.BookDaoImpl;import Jdbc.Entity.Book;import javafx.application.Application;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;import java.io.IOException;import java.util.List;@WebServlet(name = "SelectServlet")public class SelectServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//当前doPost()暂无作用System.out.println();}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//当前doGet()用于页面中Session - bookList的初始化//创建Jdbc - Impl - BookDaoImpl实例BookDao bookDao=new BookDaoImpl();//获取book中所有数据List bookList=bookDao.getAllBook();//将book表中的数据存入Session - bookList中HttpSession session=request.getSession();session.setAttribute("bookList",bookList);//跳转到jsp页面request.getRequestDispatcher("index.jsp").forward(request,response);System.out.println();}}
(2.1.3)web - deleteServlet(index.jsp)[删除][Servlet]
package Servlet;import Jdbc.Dao.BookDao;import Jdbc.Impl.BookDaoImpl;import Jdbc.Tool.Page;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 java.io.IOException;import java.io.PrintWriter;@WebServlet(name = "deleteServlet")public class deleteServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String idString=request.getParameter("bookid");int id=Integer.parseInt(idString);BookDao bookDao=new BookDaoImpl();//根据id删除一条数据 返回true成功/false失败boolean ReturnIs=bookDao.deleteBook(id);//如果成功将index.jsp中的delIs设为delTrue 否则设为delFalseif(ReturnIs==true){request.getRequestDispatcher("index.jsp?delIs=delTrue").forward(request,response);}else{request.getRequestDispatcher("index.jsp?delIs=delFalse").forward(request,response);}}}
(2.1.4)web - PageServlet(index.jsp)[分页][Servlet]
package Servlet;import Jdbc.Tool.Page;import com.mysql.cj.Session;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;import java.io.IOException;@WebServlet(name = "PageServlet")public class PageServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String toPageType=request.getParameter("toPageType");Page page=Page.getPage();//switch判断是什么操作 执行对应的代码switch (toPageType){case "First":page.setThisPage(1);break;case "Prev":page.setThisPage(page.getThisPage()-1);break;case "Next":page.setThisPage(page.getThisPage()+1);break;case "Last":page.setThisPage(page.getSumPage());break;}HttpSession session=request.getSession();session.setAttribute("bookList",null);//这里不能使用转发 使用转发会出现thisPage多次++的问题response.sendRedirect("index.jsp");}}
(2.1)web - insert页面
(2.2)web - insert.jsp[添加][Jsp页面]
添加图书 图书名称
图书作者
//购入时间默认为本日 并且最大为本日购入时间
图书类别${t.getName()}
function goIndex() {location.href="index.jsp"}var conIs=confirm("添加成功(确定继续添加,取消返回首页)");if(conIs==false){goIndex();}else{;}alert("添加失败");
(2.2.1)web - InsertServlet(Insert.jsp)[添加][Servlet]
package Servlet;import Jdbc.Dao.BookDao;import Jdbc.Dao.TypeDao;import Jdbc.Entity.Type;import Jdbc.Impl.BookDaoImpl;import Jdbc.Impl.TypeDaoImpl;import com.mysql.cj.Session;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;import java.io.IOException;import java.util.List;@WebServlet(name = "InsertServlet")public class InsertServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//当前doPost()方法用于向BookManage - Book表中添加一条数据//设置获取的字符编码格式为utf-8request.setCharacterEncoding("utf-8");//获取所有需要添加的字段String name=request.getParameter("insertName");String author=request.getParameter("insertAuthor");String time=request.getParameter("insertTime");String typeString=request.getParameter("insertType");int type=Integer.parseInt(typeString);//创建Jdbc - Impl - BookDaoImpl实例BookDao bookDao=new BookDaoImpl();//进行添加 并返回是否添加成功(t/f)boolean insertIs=bookDao.insertBook(name,author,time,type);//跳转到jsp页面if(insertIs==true){request.getRequestDispatcher("Insert.jsp?insIs=insTrue").forward(request,response);}else{request.getRequestDispatcher("Insert.jsp?insIs=insFalse").forward(request,response);}System.out.println();}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//当前doGet()用于页面中Session - typeList的初始化//创建Jdbc - Impl - TypeDaoImpl实例TypeDao typeDao=new TypeDaoImpl();//获取Type表中的所有数据List typeList=typeDao.getAllType();//将Type表中的数据添加到Session - typeList中,以便jsp页面进行使用HttpSession session=request.getSession();if(typeList!=null)session.setAttribute("typeList",typeList);//跳转到jsp页面request.getRequestDispatcher("Insert.jsp").forward(request,response);System.out.println();}}
六.结尾
图书管理系统还是能够做为检测自己JavaWeb基础语法与逻辑的一个项目
第一次写文章 逻辑有点乱 不过总算也是写完了
有什么更好的想法欢迎大佬们指正留言!