当前位置:   article > 正文

web小项目-曼波生日录(Servlet+JSP+MySQL)

web小项目-曼波生日录(Servlet+JSP+MySQL)

效果演示:

当记录条数过多时会自动出现滚轮,数据不会超出紫框

数据库实时记录:

项目源代码以及所用到的资源:

链接: https://pan.baidu.com/s/1w0czmH9xBfetk7CZ7RNbtQ?pwd=6666 提取码: 6666 复制这段内容后打开百度网盘手机App,操作更方便哦

1 项目准备

1.1 数据库的设计

生日表:t_birthday

需要字段:姓名,年龄,生日日期

1.2 网页的设计

首先,要准备好网页要用到的背景图片,在html文件的同一级文件夹下创建 images 文件夹,将所有图片放入其中

开始界面:main.html,需要设计一个查询生日录按钮,再美化一下网页

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>小曼波生日录</title>
  6. <style>
  7. div{
  8. border: 10px solid #c68383;
  9. margin-left: 150px;
  10. margin-right: 150px;
  11. padding: 20px;
  12. }
  13. img{
  14. width: 50%;
  15. }
  16. input{
  17. background-image: url("images/log.jpg");
  18. width: 300px;
  19. height: 300px;
  20. font-size: 50px;
  21. }
  22. p{
  23. font-size: 21px;
  24. }
  25. h1{
  26. background-color: #c68383;
  27. }
  28. </style>
  29. </head>
  30. <body>
  31. <div>
  32. <img src="images/log.jpg" style="float: left; margin-right: 10px;" />
  33. <h1>小曼波生日录</h1>
  34. <p>
  35. 小曼波老是忘记好朋友的生日,摸摸她的脑袋,帮她回忆回忆吧!
  36. </p>
  37. <form action="show.html" method="get">
  38. <input type="submit" value="点击查询">
  39. </form>
  40. </div>
  41. </body>
  42. </html>

查询结果展示页面:show.html,需要一个新增按钮,需要在每条数据后面添加删除按钮

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>生日表查询结果</title>
  6. <style>
  7. table {
  8. width: 75%;
  9. border-collapse: collapse;
  10. margin: 0 auto;
  11. }
  12. th,
  13. td {
  14. border: 2px solid black;
  15. padding: 10px;
  16. text-align: center;
  17. background-color: white;
  18. opacity: 0.8;
  19. }
  20. body {
  21. background-image: url("images/img.png");
  22. background-size: cover;
  23. background-repeat: no-repeat;
  24. margin: 0;
  25. padding: 0;
  26. }
  27. h1{
  28. width: 50%;
  29. text-align : center;
  30. background-color: #e1a8f6;
  31. opacity: 0.8;
  32. }
  33. #content {
  34. background-color: white;
  35. border: 10px solid #e1a8f6;
  36. overflow-y: auto;
  37. max-height: 320px;
  38. margin-left: 100px;
  39. margin-right: 100px;
  40. opacity: 0.8;
  41. }
  42. .add {
  43. width: 300px;
  44. text-align : center;
  45. opacity: 0.8;
  46. }
  47. </style>
  48. <script type="text/javascript">
  49. function del(name){
  50. var flag = window.confirm("哦马吉利~曼波~你确认要删除吗");
  51. if(flag){
  52. //浏览器发送get请求
  53. }
  54. }
  55. </script>
  56. </head>
  57. <body>
  58. <div style="display: grid; place-items: center;">
  59. <h1>想起来了!wow~</h1>
  60. <button class="add" onclick="window.location.href='add.html'">新增</button>
  61. <button class="add" onclick="window.location.href='main.html'">返回</button>
  62. <br>
  63. </div>
  64. <div id="content">
  65. <table>
  66. <tr>
  67. <th>姓名</th>
  68. <th>年龄</th>
  69. <th>生日日期</th>
  70. <th>操作</th>
  71. </tr>
  72. <!-- 在这里展示查询的结果,目前先暂时写一个测试用例 -->
  73. <tr>
  74. <td>曼波</td>
  75. <td>18</td>
  76. <td>1-1-1</td>
  77. <td><a href="javascript:void(0)" onclick="del(this)">删除</a></td>
  78. </tr>
  79. <!-- 在这里展示查询的结果,目前先暂时写一个测试用例 -->
  80. </table>
  81. </div>
  82. </body>
  83. </html>

新增页面:add.html,需要输入人物信息,需要一个 post 请求提交按钮

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>新增生日信息</title>
  6. <style>
  7. body {
  8. height: 800px;
  9. background-image: url("images/add.png");
  10. background-repeat: no-repeat;
  11. background-position: center ;
  12. display: grid;
  13. place-items: center;
  14. }
  15. div {
  16. border: 2px solid black;
  17. background-color: white;
  18. opacity: 0.7;
  19. text-align: center;
  20. font-weight: bold;
  21. padding: 10px;
  22. }
  23. form{
  24. width: 380px;
  25. }
  26. input{
  27. width: 200px;
  28. }
  29. </style>
  30. </head>
  31. <body>
  32. <div>
  33. <p>新增生日信息</p>
  34. <form action="/birth/add/post" method="post">
  35. <label for="name">姓名:</label><input type="text" id="name" name="name"><br>
  36. <label for="age">年龄:</label><input type="number" id="age" name="age"><br>
  37. <label for="birthday">生日:</label><input type="String" id="birthday" name="birthday">
  38. <br>
  39. <hr>
  40. <input type="submit" value="提交">
  41. </form>
  42. <hr>
  43. <form action="show.html" method="get">
  44. <input type="submit" value="返回">
  45. </form>
  46. </div>
  47. </body>
  48. </html>

这是我美化网页用到的所有标签以及参数

标签中声明只需以空格隔开

选择id:#

标题居中展示属性: 
居中方式一:text-align: center;
居中方式二:margin: 0 auto;
居中方式三: <div style="display: grid; place-items: center;">
横竖都居中:
div {
      display: flex;
      align-items: center; 
      justify-content: center; 
    }

不透明度属性:opacity: 0.5;

背景颜色属性:background-color: white;

背景图片属性:background-image: url("img.png");

浮动图片:<img src="images/log.jpg" style="float: left; margin-right: 10px;" />

宽高:width: 300px; 
 height: 300px;    

字体大小:font-size: 16px;
加粗字体:font-weight: bold;

网页添加背景图片,顶满网页:
body {
      background-image: url("images/img.png");
      background-size: cover;
      background-repeat: no-repeat;
      margin: 0;
      padding: 0;
    }
以图片为基准添加背景图片,并居中
body {
      width: 751px;
      height: 1024px;
      background-image: url("images/add.jpg");
      background-repeat: no-repeat;
      background-position: center ;
    }

添加下面的属性后可以让所有内容都填充到 body的中部
display: grid;
place-items: center;

滚轮展示内容:
div {
      overflow-y: auto;
      max-height: 300px;
    }

1.3 部署一个 Tomcat 项目

不会部署的可以参考我之前的文章:同时用到,网页,java程序,数据库的web小应用

将所有要用到的图片,以及 html 页面,全部导入 web 目录中,在导入前先在浏览器上运行 html 页面看看功能是否正常,此时除了提交按钮不能点,其他按钮都是可以交互的

将所有 html 文件的后缀名改为.jsp

将 JDBC 连接数据库要用的 jar 包也导入到 WEB-INF 目录下,并 Add As  Lib... ,使其能够展开才算成功导入

1.4 自己实现一个 JDBC 的工具类,放到 src->Servlet 包下(Servlet自己创建)

  1. import java.sql.*;
  2. public class JDBCutil {
  3. private JDBCutil(){};
  4. //建立连接并得到连接
  5. public static Connection getConnection() throws SQLException, ClassNotFoundException {
  6. Class.forName("com.mysql.jdbc.Driver");
  7. return DriverManager.getConnection("jdbc:mysql://localhost:3306/learnbase","root","1234");
  8. }
  9. //释放资源
  10. public static void closeRs(ResultSet rs,PreparedStatement ps,Connection conn){
  11. if(rs != null) {
  12. try {
  13. rs.close();
  14. } catch (SQLException throwables) {
  15. throwables.printStackTrace();
  16. }
  17. }
  18. if(ps == null) {
  19. try {
  20. ps.close();
  21. } catch (SQLException throwables) {
  22. throwables.printStackTrace();
  23. }
  24. }
  25. if(conn == null) {
  26. try {
  27. conn.close();
  28. } catch (SQLException throwables) {
  29. throwables.printStackTrace();
  30. }
  31. }
  32. }
  33. }

项目准备工作做好后,结构大概是这样的(其中.jsp 文件是将 html 文件改成 jsp 文件夹的)

2  JDBC 连接数据库

2.1 show 页面需要的查询数据库所有信息

由于有多个信息,我们可以将所有信息都封装成对象,再将对象装入集合,最后将集合发送到 jsp 中供网页展示

所以,我们首先要创建一个封装类:birthBeen

在 Servlet 包中新建 birthBeen 类

  1. package Servlet;
  2. public class birthBeen {
  3. private String name;
  4. private int age;
  5. private String birthday;
  6. public birthBeen(String name, int age, String birthday) {
  7. this.name = name;
  8. this.age = age;
  9. this.birthday = birthday;
  10. }
  11. public String getName() {
  12. return name;
  13. }
  14. public void setName(String name) {
  15. this.name = name;
  16. }
  17. public int getAge() {
  18. return age;
  19. }
  20. public void setAge(int age) {
  21. this.age = age;
  22. }
  23. public String getBirthday() {
  24. return birthday;
  25. }
  26. public void setBirthday(String birthday) {
  27. this.birthday = birthday;
  28. }
  29. }

这一步完成后,便可以用 JDBC 拿到数据库所有信息,并将所有信息封装后装入集合 dates (可以自己任意命名)

  1. package Servlet;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.annotation.WebServlet;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import java.io.IOException;
  8. import java.sql.Connection;
  9. import java.sql.PreparedStatement;
  10. import java.sql.ResultSet;
  11. import java.sql.SQLException;
  12. import java.util.ArrayList;
  13. import java.util.List;
  14. @WebServlet("/getBirth")
  15. public class getBirth extends HttpServlet {
  16. @Override
  17. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  18. //从数据库中获取所有人的生日
  19. Connection conn = null;
  20. PreparedStatement ps = null;
  21. ResultSet rs = null;
  22. List<birthBeen> dates = new ArrayList<>();
  23. try {
  24. conn = JDBCutil.getConnection();
  25. ps = conn.prepareStatement("select * from t_birthday");
  26. rs = ps.executeQuery();
  27. while (rs.next()){
  28. String name = rs.getString("name");
  29. int age = rs.getInt("age");
  30. String birthday = rs.getString("birthday");
  31. //封装成对象并加入集合
  32. dates.add(new birthBeen(name,age,birthday));
  33. }
  34. } catch (SQLException | ClassNotFoundException throwables) {
  35. throwables.printStackTrace();
  36. } finally {
  37. JDBCutil.closeRs(rs,ps, conn);
  38. }
  39. //将集合放入请求域
  40. request.setAttribute("dates",dates);
  41. //转发
  42. request.getRequestDispatcher("/show.jsp").forward(request,response);//这里写不需要加项目名的路径
  43. }
  44. }

这样,我们就将封装好的从数据库查询到的所有记录全部装入集合,并将集合发送到 show.jsp 中了

2.2 show 页面需要删除指定姓名的记录

在Servlet目录下创建 delete 类,用于接收 删除的 get 请求,删除完后将请求重定向到查询的Servlet路径

  1. package Servlet;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.annotation.WebServlet;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import java.io.IOException;
  8. import java.sql.Connection;
  9. import java.sql.PreparedStatement;
  10. import java.sql.SQLException;
  11. @WebServlet("/delete")
  12. public class delete extends HttpServlet {
  13. @Override
  14. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  15. String name = request.getParameter("name");
  16. Connection conn = null;
  17. PreparedStatement ps = null;
  18. try {
  19. conn = JDBCutil.getConnection();
  20. ps = conn.prepareStatement("delete from t_birthday where name = ?");
  21. ps.setString(1,name);
  22. ps.executeUpdate();
  23. } catch (SQLException | ClassNotFoundException throwables) {
  24. throwables.printStackTrace();
  25. }finally {
  26. JDBCutil.closeRs(null,ps,conn);
  27. }
  28. //完成更新,重定向到show界面
  29. String contextPath = request.getContextPath();
  30. response.sendRedirect(contextPath+"/getBirth");//重定向无需加项目名
  31. }
  32. }

2.3 add 页面需要增加记录

在 Servlet 下创建 getPost 类,用于接收浏览器发送的增加记录的 post 请求,在新增完数据后将请求重定向到查询的Servlet路径

  1. package Servlet;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.annotation.WebServlet;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import java.io.IOException;
  8. import java.sql.Connection;
  9. import java.sql.PreparedStatement;
  10. import java.sql.SQLException;
  11. @WebServlet("/add/post")
  12. public class getPost extends HttpServlet {
  13. @Override
  14. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  15. Connection conn = null;
  16. PreparedStatement ps = null;
  17. request.setCharacterEncoding("UTF-8");
  18. String name = request.getParameter("name");
  19. int age = Integer.parseInt(request.getParameter("age"));
  20. String birthday = request.getParameter("birthday");
  21. try {
  22. conn = JDBCutil.getConnection();
  23. ps = conn.prepareStatement("insert into t_birthday values(?,?,?)");
  24. //给问号放值,下标从1开始
  25. ps.setString(1,name);
  26. ps.setInt(2,age);
  27. ps.setString(3,birthday);
  28. ps.executeUpdate();
  29. } catch (SQLException | ClassNotFoundException throwables) {
  30. throwables.printStackTrace();
  31. } finally {
  32. JDBCutil.closeRs(null,ps,conn);
  33. }
  34. //完成更新,重定向到show界面
  35. String contextPath = request.getContextPath();
  36. response.sendRedirect(contextPath+"/getBirth");//重定向无需加项目名
  37. }
  38. }

3  改造 JSP, 响应浏览器请求

3.1 show.jsp

需要接收 getBirth 转发过来的集合 dates 并展示到页面

点击删除按钮需要向 /birth/delete 路径发送get请求 并删除记录

  1. <%@page contentType = "text/html;charset=UTF-8" %>
  2. <%@page import="java.util.List,Servlet.birthBeen" %>
  3. <!DOCTYPE html>
  4. <html>
  5. <head>
  6. <meta charset="UTF-8">
  7. <title>生日表查询结果</title>
  8. <style>
  9. table {
  10. width: 75%;
  11. border-collapse: collapse;
  12. margin: 0 auto;
  13. }
  14. th,
  15. td {
  16. border: 2px solid black;
  17. padding: 10px;
  18. text-align: center;
  19. background-color: white;
  20. opacity: 0.8;
  21. }
  22. body {
  23. background-image: url("images/img.png");
  24. background-size: cover;
  25. background-repeat: no-repeat;
  26. margin: 0;
  27. padding: 0;
  28. }
  29. h1{
  30. width: 50%;
  31. text-align : center;
  32. background-color: #e1a8f6;
  33. opacity: 0.8;
  34. }
  35. #content {
  36. background-color: white;
  37. border: 10px solid #e1a8f6;
  38. overflow-y: auto;
  39. max-height: 320px;
  40. margin-left: 100px;
  41. margin-right: 100px;
  42. opacity: 0.8;
  43. }
  44. .add {
  45. width: 300px;
  46. text-align : center;
  47. opacity: 0.8;
  48. }
  49. </style>
  50. <script type="text/javascript">
  51. function del(name){
  52. var flag = window.confirm("哦马吉利~曼波~你确认要删除吗");
  53. if(flag){
  54. document.location.href = "/birth/delete?name=" + name;//浏览器发送get请求
  55. }
  56. }
  57. </script>
  58. </head>
  59. <body>
  60. <div style="display: grid; place-items: center;">
  61. <h1>想起来了!wow~</h1>
  62. <button class="add" onclick="window.location.href='add.jsp'">新增</button>
  63. <button class="add" onclick="window.location.href='main.jsp'">返回</button>
  64. <br>
  65. </div>
  66. <div id="content">
  67. <table>
  68. <tr>
  69. <th>姓名</th>
  70. <th>年龄</th>
  71. <th>生日日期</th>
  72. <th>操作</th>
  73. </tr>
  74. <!-- 展示查询的结果 -->
  75. <%--拿到查询结果集--%>
  76. <%
  77. List<birthBeen> dates = (List<birthBeen>)request.getAttribute("dates");//注意这里返回的是 Object 类,需要强转为我们要用的类
  78. //记得要最在上面导入包
  79. for(birthBeen bb : dates){
  80. String name = bb.getName();
  81. int age = bb.getAge();
  82. String birthday = bb.getBirthday();
  83. %>
  84. <tr>
  85. <td><%=name%></td>
  86. <td><%=age%></td>
  87. <td><%=birthday%></td>
  88. <%-- 通过传入姓名参数给函数del发送get请求--%>
  89. <td><a href="javascript:void(0)" onclick="del('<%=name%>')">删除</a></td>
  90. </tr>
  91. <%
  92. }
  93. %>
  94. <!-- 展示查询的结果 -->
  95. </table>
  96. </div>
  97. </body>
  98. </html>

3.2 main.jsp

main 界面几乎没有大的改动,将按钮跳转的路径改一下即可

  1. <%@page contentType = "text/html;charset=UTF-8" %>
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5. <meta charset="UTF-8">
  6. <title>小曼波生日录</title>
  7. <style>
  8. div{
  9. border: 10px solid #c68383;
  10. margin-left: 150px;
  11. margin-right: 150px;
  12. padding: 10px;
  13. }
  14. img{
  15. width: 50%;
  16. }
  17. input{
  18. background-image: url("images/log.jpg");
  19. width: 300px;
  20. height: 300px;
  21. font-size: 50px;
  22. }
  23. p{
  24. font-size: 21px;
  25. }
  26. h1{
  27. background-color: #c68383;
  28. }
  29. </style>
  30. </head>
  31. <body>
  32. <div>
  33. <img src="images/log.jpg" style="float: left; margin-right: 10px;" />
  34. <h1>小曼波生日录</h1>
  35. <p>
  36. 小曼波老是忘记好朋友的生日,摸摸她的脑袋,帮她回忆回忆吧!
  37. </p>
  38. <%--这里的地址需要带项目名--%>
  39. <form action="/birth/getBirth" method="get">
  40. <input type="submit" value="点击查询">
  41. </form>
  42. </div>
  43. </body>
  44. </html>

3.3 add.jsp

add 界面也是主要修改请求路径

  1. <%@page contentType = "text/html;charset=UTF-8" %>
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5. <meta charset="UTF-8">
  6. <title>新增生日信息</title>
  7. <style>
  8. body {
  9. height: 800px;
  10. background-image: url("images/add.png");
  11. background-repeat: no-repeat;
  12. background-position: center ;
  13. display: grid;
  14. place-items: center;
  15. }
  16. div {
  17. border: 2px solid black;
  18. background-color: white;
  19. opacity: 0.7;
  20. text-align: center;
  21. font-weight: bold;
  22. padding: 10px;
  23. }
  24. form{
  25. width: 380px;
  26. }
  27. input{
  28. width: 200px;
  29. }
  30. </style>
  31. </head>
  32. <body>
  33. <div>
  34. <p>新增生日信息</p>
  35. <%-- 这里要加项目名--%>
  36. <form action="/birth/add/post" method="post">
  37. <label for="name">姓名:</label><input type="text" id="name" name="name"><br>
  38. <label for="age">年龄:</label><input type="number" id="age" name="age"><br>
  39. <label for="birthday">生日:</label><input type="String" id="birthday" name="birthday">
  40. <br>
  41. <hr>
  42. <input type="submit" value="提交">
  43. </form>
  44. <hr>
  45. <form action="/birth/getBirth" method="get">
  46. <input type="submit" value="返回">
  47. </form>
  48. </div>
  49. </body>
  50. </html>

点击运行按钮,输入网址即可运行

还在等什么,快上手试试吧!

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号