Java、JavaWeb、数据库-图书管理系统

news2025/1/18 21:11:01

这一章主要是把上一章写在网页里的java 代码从网页中分离出来,放在专门的servlet类中。每一个servlet类对应一个数据库的表。

规范性问题:

1、dao包存放有关数据库的信息:BaseDao包就放数据库加载驱动和增删改和关闭资源;而其他的每一个表名对应一个相应名字的dao包,写数据库的增删改查操作;

2、servlet包专存放和网页有关的代码,把网页传来的参数进行接受,同时调用相应名字的dao类中的方法,返回到相应的页面。

3、untity包专门放对应表格的实体类

4、test包专门放测试的方法,单元测试等。

整合前面的的学生管理系统,重构一个图书管理系统,要求规范性,且网页中不在出现java代码,都放在servlet类中

在写代码前先建好相应的包,并且导入数据库的jar包,web的jar包,还有tomcat的配置,以及在数据库编辑软件navicat建好相应的数据表。

图书管理系统的运行截图:左上方两个表在数据库建好

登录界面展示:

 注册界面展示:

各种功能展示:

一、代码:

BaseDao:

package com.zyl.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

/**
 * @className: BaseDao
 * @author: Zyl
 * @date: 2024/12/3 16:49
 * @Version: 1.0
 * @description:
 */

public class BaseDao {
     Connection connection= null;
     PreparedStatement ps=null;
     ResultSet resultSet = null;

     String url = "jdbc:mysql://localhost:3306/jdbctest";
     String username = "root";
     String password = "root";
     String DriverName="com.mysql.jdbc.Driver";
    //加载驱动,获取连接,连接数据库
    public  void connection()throws  Exception{
        Class.forName(DriverName);
        connection = DriverManager.getConnection(url, username, password);
    }
    //针对增删改的方法,没有查询的功能
    public int edit(String sql,Object... params) {

        try {
            connection();
            ps = connection.prepareStatement(sql);
            for (int i = 0; i < params.length; i++) {
                ps.setObject(i + 1, params[i]);
            }
            int row = ps.executeUpdate();
            return row;
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            closeAll();
        }

    }
    //关闭所有的资源
    public  void closeAll(){
        try {
            if(resultSet!=null){
                resultSet.close();
            }
            if(ps!=null){
                ps.close();
            }
            if(connection!=null){
                connection.close();
            }
        }catch (Exception e){
            throw new RuntimeException(e);
        }
    }

}

BookDao:

package com.zyl.dao;

import com.zyl.untity.Book;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

/**
 * @className: BookDao
 * @author: Zyl
 * @date: 2024/12/6 10
 * @Version: 1.0
 * @description:
 */

public class BookDao extends BaseDao{
//查询所有的图书
    public ArrayList<Book> selectAll(){
        ArrayList<Book> list=new ArrayList<Book>();
        try {
            connection();
            String sql="select * from tbl_book";

            ps = connection.prepareStatement(sql);
            resultSet = ps.executeQuery();
            while (resultSet.next()){
                int id=resultSet.getInt("id");
                String name=resultSet.getString("name");
                double price=resultSet.getDouble("price");
                String publisher=resultSet.getString("publisher");
                Book book =new Book();
                book.setId(id);
                book.setName(name);
                book.setPrice(price);
                book.setPublisher(publisher);
                list.add(book);
            }
            return list;
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            closeAll();
        }


    }
    public int  delete(int id){
        String sql = "delete from  tbl_book where id=?";
        //d调用父类BaseDao 的edit()方法   增删改操作;;;;;;
        int edit = edit(sql,id);
        return  edit;
    }
    public Book findById(int id){
        Book book =null;

        try {
            String sql = "select * from tbl_book where id=?";
            connection();
            ps = connection.prepareStatement(sql);
            ps.setInt(1,id);
            resultSet = ps.executeQuery();
            while (resultSet.next()){
                int id1=resultSet.getInt("id");
                String name=resultSet.getString("name");
                double price=resultSet.getDouble("price");
                String publisher=resultSet.getString("publisher");
                book=new Book(id1,name,price,publisher);
            }
            return book;
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            closeAll();
        }
    }
    public int  update(int id,String name,double price,String publisher ){
        String sql = "update  tbl_book set name=?,price=?,publisher=?where id=?";
        //d调用父类BaseDao 的edit()方法   增删改操作;;;;;;
        int edit = edit(sql,name,price,publisher,id);
        return  edit;
    }
    public int  insert(String name,double price,String publisher ){
        String sql = "insert into tbl_book(name,price,publisher) values(?,?,?)";
        //d调用父类BaseDao 的edit()方法   增删改操作;;;;;;
        int edit = edit(sql,name,price,publisher);
        return  edit;
    }


}

UserDao:

package com.zyl.dao;

import com.zyl.untity.User;

/**
 * @className: UserDao
 * @author: Zyl
 * @date: 2024/12/6 10:15
 * @Version: 1.0
 * @description:
 */

public class UserDao extends BaseDao{

 public User login(String username, String password){
     User user=null;
     try {
         String sql="select * from tbl_user where username=? and password=?";
         connection();
         ps = connection.prepareStatement(sql);
         ps.setObject(1,username);
         ps.setObject(2,password);
         resultSet = ps.executeQuery();
         while(resultSet.next()){
             int id = resultSet.getInt("id");
             String username1 = resultSet.getString("username");
             String password1 = resultSet.getString("password");
             String realname = resultSet.getString("realname");
             int age = resultSet.getInt("age");
            // user=new User(username1,id,password1,realname,age);
             user=new User();
             user.setId(id);
             user.setUsername(username1);
             user.setAge(age);
             user.setPassword(password1);
             user.setRealname(realname);
         }

     } catch (Exception e) {
         throw new RuntimeException(e);
     } finally {
         closeAll();
     }
     return user;
   }

public int  add(String username, String password){
    String sql="insert into tbl_user(username,password) values(?,?)";
    int i=edit(sql,username,password);
    return  i;

}




 }

BookServlet:

package com.zyl.servlet;

import com.zyl.dao.BookDao;
import com.zyl.untity.Book;

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.UnsupportedEncodingException;
import java.util.ArrayList;

/**
 * @className: BookServlet
 * @author: Zyl
 * @date: 2024/12/6 10:26
 * @Version: 1.0
 * @description:
 */
@WebServlet(urlPatterns = "/book")
public class BookServlet extends HttpServlet {
    private BookDao bookDao = new BookDao();
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        String method = req.getParameter("method");
        if("delete".equals(method)){
            delete(req,resp);
        }else if("getById".equals(method)){
            selectById(req,resp);
        }else if("update".equals(method)){
            update(req,resp);
        }else if("insert".equals(method)){
            insert(req,resp);
        }
        else{
            selectAll(req,resp);
        }



    }
    public void insert(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取参数
        String name = req.getParameter("name");
        double price = Double.parseDouble(req.getParameter("price"));
        String publisher = req.getParameter("publisher");
        BookDao bookDao = new BookDao();
        int i = bookDao.insert(name, price, publisher);
        if(i>0){
            resp.sendRedirect("/book");
        }

    }

    private void selectById(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取id
        String id = req.getParameter("id");
        //创建对象
        BookDao bookDao = new BookDao();
        Book b = bookDao.findById(Integer.parseInt(id));
        req.setAttribute("book",b);
        req.getRequestDispatcher("/edit.jsp").forward(req,resp);


    }

    public void selectAll(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{

        BookDao bookDao = new BookDao();
        ArrayList<Book> books = bookDao.selectAll();
        req.setAttribute("books",books);
        req.getRequestDispatcher("/index.jsp").forward(req,resp);
    }
    public void delete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
        String id = req.getParameter("id");//获取id
        BookDao bookDao = new BookDao();//创建对象
        int delete = bookDao.delete(Integer.parseInt(id));
        if(delete>0){
            resp.sendRedirect("/book");
        }

    }
    public void update(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
        //获取参数
        String id = req.getParameter("id");
        String name = req.getParameter("name");
        String  price = req.getParameter("price");
        String publisher = req.getParameter("publisher");
        //先判断在创建对象并调用方法
        if(id!=null&&!id.equals("")&&name!=null&&!name.equals("")&&price!=null&&!price.equals("")&&publisher!=null&&!publisher.equals("")){
            BookDao b=new BookDao();
            int i=b.update(Integer.parseInt(id),name, Double.parseDouble(price),publisher);
            if(i>0){
                resp.sendRedirect("/book");
            }
        }




    }
}

UserServlet:

package com.zyl.servlet;

import com.zyl.dao.UserDao;
import com.zyl.untity.User;

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.io.UnsupportedEncodingException;

/**
 * @className: UserServlet
 * @author: Zyl
 * @date: 2024/12/6 10:25
 * @Version: 1.0
 * @description:
 */
@WebServlet(urlPatterns = "/user")
public class UserServlet extends HttpServlet {
    private UserDao userDao=new UserDao();//对象
    @Override
    public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");

        String method = req.getParameter("method");
        if ("login".equals(method)) {
            login(req, resp);
        } else if ("register".equals(method)) {
            register(req, resp);
        } else if ("exit".equals(method)){
            exit(req, resp);

        }
    }
    public void exit(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException  {
        HttpSession session=req.getSession();
       //获取session,判断是否登录,登录了就删除session,并跳转回登录页面

            session.removeAttribute("user");
            resp.sendRedirect("/login.jsp");
    }

    public void login(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        UserDao userDao = new UserDao();
        User user = userDao.login(username, password);
        if (user!= null) {
            //保存到session会话
            req.getSession().setAttribute("user", user);
            //跳转--成功页面【展示所有图书】
            resp.sendRedirect("/book");
        } else {
            //跳转到登录页面
            req.setAttribute("error", "<font color='red'>账号或密码错误</font>");
            req.getRequestDispatcher("/login.jsp").forward(req, resp);//转发跳转.必须转发跳转
        }


    }

    public void register(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取表单数据
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String confirmPassword = req.getParameter("confirmPassword");
        System.out.println(1222);
        // 初始化消息变量
        String message = "";
        String messageType = "";

        // 检查密码是否一致
        if (!password.equals(confirmPassword)) {
            message = "两次输入的密码不一致,请重新输入。";
            messageType = "error-message";
        } else {
            // 创建 UserDao 实例
            UserDao userDao = new UserDao();
            // 检查用户名和密码是否同时存在
            if (userDao.login(username, password) != null) {
                message = "该用户名和密码已被注册过。";
                messageType = "error-message";
            } else {
                // 调用 add 方法添加学生
                int result = userDao.add(username, password);

                if (result > 0) {
                    message = "注册成功!";
                    messageType = "success-message";
                } else {
                    message = "注册失败,请重试。";
                    messageType = "error-message";
                }
            }
        }
        // 将消息存储到请求属性中

        req.setAttribute("message", message);
        req.setAttribute("messageType", messageType);


        // 转发到 register.jsp 显示消息
        req.getRequestDispatcher("/register.jsp").forward(req, resp);
    }

}

二、网页代码:

bookadd.jsp:

<%--
  Created by IntelliJ IDEA.
  User: 
  Date: 2024/12/7
  Time: 16:21
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>添加图书界面</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            background-color: #f4f4f9;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            margin: 0;
        }
        .container {
            background-color: #fff;
            padding: 20px;
            border-radius: 8px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
            width: 80%;
            max-width: 400px;
            text-align: center;
        }
        .container h1 {
            margin-bottom: 20px;
        }
        .form-group {
            margin-bottom: 15px;
            text-align: left;
        }
        .form-group label {
            display: block;
            margin-bottom: 5px;
            font-weight: bold;
        }
        .form-group input {
            width: 100%;
            padding: 8px;
            box-sizing: border-box;
            border: 1px solid #ccc;
            border-radius: 4px;
        }
        .button-container {
            margin-top: 20px;
        }
        .button-container button {
            padding: 10px 20px;
            border: none;
            border-radius: 4px;
            cursor: pointer;
            background-color: #007bff;
            color: white;
            font-size: 16px;
        }
        .button-container button:hover {
            background-color: #0056b3;
        }
        .error-message {
            color: red;
            margin-bottom: 15px;
        }
        .success-message {
            color: green;
            margin-bottom: 15px;
        }
    </style>
</head>
<body>
<div class="container">
    <h1>添加图书界面</h1>
    <c:if test="${sessionScope.user==null}">
        <c:redirect url="/login.jsp"/>
    </c:if>
    <form action="/book?method=insert" method="post">
        <div class="form-group">
            <label for="name">书名:</label>
            <input type="text" id="name" name="name" placeholder="请输入书名" required/>
        </div>
        <div class="form-group">
            <label for="price">价格:</label>
            <input type="number" id="price" name="price" placeholder="请输入价格" step="0.01" required/>
        </div>
        <div class="form-group">
            <label for="publisher">出版社:</label>
            <input type="text" id="publisher" name="publisher" placeholder="请输入出版社" required/>
        </div>
        <div class="button-container">
            <button type="submit">添加</button>
        </div>
    </form>
</div>
</body>
</html>

edit.jsp:

<%--
  Created by IntelliJ IDEA.
  User: 
  Date: 2024/12/7
  Time: 15:37
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>编辑图书</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            background-color: #f4f4f9;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            margin: 0;
        }
        .container {
            background-color: #fff;
            padding: 20px;
            border-radius: 8px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
            width: 80%;
            max-width: 400px;
            text-align: center;
        }
        .container h1 {
            margin-bottom: 20px;
        }
        .form-group {
            margin-bottom: 15px;
            text-align: left;
        }
        .form-group label {
            display: block;
            margin-bottom: 5px;
            font-weight: bold;
        }
        .form-group input {
            width: 100%;
            padding: 8px;
            box-sizing: border-box;
            border: 1px solid #ccc;
            border-radius: 4px;
        }
        .button-container {
            margin-top: 20px;
        }
        .button-container button {
            padding: 10px 20px;
            border: none;
            border-radius: 4px;
            cursor: pointer;
            background-color: #007bff;
            color: white;
            font-size: 16px;
        }
        .button-container button:hover {
            background-color: #0056b3;
        }
        .error-message {
            color: red;
            margin-bottom: 15px;
        }
        .success-message {
            color: green;
            margin-bottom: 15px;
        }
    </style>
</head>
<body>
<div class="container">
    <h1>编辑图书</h1>
    <c:if test="${sessionScope.user==null}">
        <c:redirect url="/login.jsp"/>
    </c:if>
    <form action="/book?method=update" method="post">
        <div class="form-group">
            <label for="id">ID:</label>
            <input type="text" id="id" name="id" value="${book.getId()}" readonly/>
        </div>
        <div class="form-group">
            <label for="name">书名:</label>
            <input type="text" id="name" name="name" placeholder="请输入书名" value="${book.getName()}" required/>
        </div>
        <div class="form-group">
            <label for="price">价格:</label>
            <input type="number" id="price" name="price" placeholder="请输入价格" value="${book.getPrice()}" step="0.01" required/>
        </div>
        <div class="form-group">
            <label for="publisher">出版社:</label>
            <input type="text" id="publisher" name="publisher" placeholder="请输入出版社" value="${book.getPublisher()}" required/>
        </div>
        <div class="button-container">
            <button type="submit">立即修改</button>
        </div>
    </form>
</div>
</body>
</html>

index.jsp:

<%@ page import="com.zyl.untity.User" %><%--
  Created by IntelliJ IDEA.
  User: ${zyl}
  Date: 2024/12/6
  Time: 10:12
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
  <title>图书首页</title>
  <style>
    body {
      font-family: Arial, sans-serif;
      background-color: #f4f4f9;
      display: flex;
      justify-content: center;
      align-items: center;
      height: 100vh;
      margin: 0;
    }
    .container {
      background-color: #fff;
      padding: 20px;
      border-radius: 8px;
      box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
      width: 80%;
      max-width: 800px;
      text-align: center;
    }
    .container h1 {
      margin-bottom: 20px;
    }
    .button-container {
      margin-bottom: 20px;
    }
    .button-container button {
      margin: 0 10px;
      padding: 10px 20px;
      border: none;
      border-radius: 4px;
      cursor: pointer;
      background-color: #007bff;
      color: white;
      font-size: 16px;
    }
    .button-container button:hover {
      background-color: #0056b3;
    }
    table {
      width: 100%;
      border-collapse: collapse;
      margin-top: 20px;
    }
    th, td {
      border: 1px solid #ddd;
      padding: 8px;
      text-align: left;
    }
    th {
      background-color: #f2f2f2;
    }
    tr:nth-child(even) {
      background-color: #f9f9f9;
    }
    tr:hover {
      background-color: #f1f1f1;
    }
    a {
      margin: 0 5px;
      text-decoration: none;
      color: #007bff;
    }
    a:hover {
      text-decoration: underline;
    }
  </style>
</head>
<body>
<c:if test="${sessionScope.user == null}">
  <c:redirect url="/login.jsp"/>
</c:if>
<div class="container">
  <h1>欢迎${sessionScope.user.realname}访问图书管理系统</h1>
  <div class="button-container">
    <button οnclick="location.href='/bookadd.jsp'">添加</button>
    <button οnclick="location.href='/user?method=exit'">退出</button>
  </div>
  <table>
    <tr>
      <th>编号</th>
      <th>姓名</th>
      <th>价格</th>
      <th>出版社</th>
      <th>操作</th>
    </tr>
    <c:forEach items="${requestScope.books}" var="b">
      <tr>
        <td>${b.id}</td>
        <td>${b.name}</td>
        <td>${b.price}</td>
        <td>${b.publisher}</td>
        <td>
          <a οnclick="del(${b.id})">删除</a>
          <a href="/book?method=getById&id=${b.id}">修改</a>
        </td>
      </tr>
    </c:forEach>
  </table>
</div>
<script>
  function del(id) {
    var b = confirm("是否删除该记录?");
    if (b) {
      location.href = "/book?method=delete&id=" + id;
    }
  }
</script>
</body>
</html>

login.jsp:

<%--
  Created by IntelliJ IDEA.
  User: 
  Date: 2024/12/6
  Time: 10:50
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录界面</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            background-color: #f4f4f9;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            margin: 0;
        }
        .login-container {
            background-color: #fff;
            padding: 20px;
            border-radius: 8px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
            width: 300px;
            text-align: center;
        }
        .login-container h2 {
            margin-bottom: 20px;
        }
        .login-container input[type="text"],
        .login-container input[type="password"] {
            width: calc(100% - 22px);
            padding: 10px;
            margin: 10px 0;
            border: 1px solid #ccc;
            border-radius: 4px;
        }
        .login-container input[type="submit"],
        .login-container input[type="button"] {
            width: calc(100% - 22px);
            padding: 10px;
            margin: 10px 0;
            border: none;
            border-radius: 4px;
            cursor: pointer;
            background-color: #007bff;
            color: white;
            font-size: 16px;
        }
        .login-container input[type="submit"]:hover,
        .login-container input[type="button"]:hover {
            background-color: #0056b3;
        }
        .error-message {
            color: red;
            margin-bottom: 10px;
        }
    </style>
</head>
<body>
<div class="login-container">
    <h2>登录界面</h2>
    <div class="error-message">${error}</div>

    <form action="/user?method=login" method="post">
        <input type="text" name="username" placeholder="账号"/><br>
        <input type="password" name="password" placeholder="密码"/><br>
        <input type="submit" value="立即登录"/>
        <input type="button" value="注册" οnclick="location.href='register.jsp'"/>
    </form>
</div>
</body>
</html>

register.jsp:

<%--
  Created by IntelliJ IDEA.
  User: 
  Date: 2024/12/7
  Time: 10:56
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>注册界面</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            background-color: #f4f4f9;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            margin: 0;
        }
        .container {
            background-color: #fff;
            padding: 20px;
            border-radius: 8px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
            width: 80%;
            max-width: 400px;
            text-align: center;
        }
        .container h1 {
            margin-bottom: 20px;
        }
        .form-group {
            margin-bottom: 15px;
            text-align: left;
        }
        .form-group label {
            display: block;
            margin-bottom: 5px;
            font-weight: bold;
        }
        .form-group input {
            width: 100%;
            padding: 8px;
            box-sizing: border-box;
            border: 1px solid #ccc;
            border-radius: 4px;
        }
        .button-container {
            margin-top: 20px;
        }
        .button-container button {
            padding: 10px 20px;
            border: none;
            border-radius: 4px;
            cursor: pointer;
            background-color: #007bff;
            color: white;
            font-size: 16px;
        }
        .button-container button:hover {
            background-color: #0056b3;
        }
        .error-message {
            color: red;
            margin-bottom: 15px;
        }
        .success-message {
            color: green;
            margin-bottom: 15px;
        }
        .login-link {
            margin-top: 15px;
            font-size: 14px;
        }
        .login-link a {
            color: #007bff;
            text-decoration: none;
        }
        .login-link a:hover {
            text-decoration: underline;
        }
    </style>
</head>
<body>
<div class="container">
    <h1>注册界面</h1>
    <c:if test="${not empty message}">
        <div class="${messageType}">${message}</div>
    </c:if>
    <form action="/user?method=register" method="post">
        <div class="form-group">
            <label for="username">账号:</label>
            <input type="text" id="username" name="username" required>
        </div>
        <div class="form-group">
            <label for="password">密码:</label>
            <input type="password" id="password" name="password" required>
        </div>
        <div class="form-group">
            <label for="confirmPassword">确认密码:</label>
            <input type="password" id="confirmPassword" name="confirmPassword" required>
        </div>
        <div class="button-container">
            <button type="submit">注册</button>
        </div>
        <div class="login-link">
            <a href="login.jsp">已有账号,立即登录</a>
        </div>
    </form>
</div>
</body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2256109.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Scrapy 中的配置笔记

概述 scrapy在命令启动之前&#xff0c;先设置好了各种配置文件。其中包括系统自带的默认配置文件&#xff0c;还有用户自定义的settings.py。其中还有一个日常开发中不怎么用的scrapy.cfg文件&#xff0c;这个文件是用来告诉scrapy用户自定义的settings.py文件在哪里的 关键…

如何在.NET 8.0 上安装 FastReport 并创建简单报告(下)

FastReport 是一款灵活而强大的报告工具。它允许用户以各种格式访问数据源并以可视化方式呈现它们。使用 FastReport 创建的报告可以在用户界面中使用拖放逻辑轻松设计&#xff0c;并转换为不同的格式&#xff08;PDF、Excel、Word 等&#xff09;。>> 如何在.NET 8.0 上…

NLP算法具备技能

摘要&#xff1a;好久不看理论&#xff0c;最近把自己学过以及用到过的东西都列了出来&#xff0c;主要是这个大纲体系&#xff0c;详细的内容部分是使用LLM来辅助编写的。 一、大模型 1.1 常用大模型 1.1.1 Qwen ‌Qwen大模型‌是由阿里巴巴开发的系列大语言模型&#xff…

Unity中使用Sqlite存储本地数据

sqlite-net sqlite下载页 我的环境&#xff1a;win11、unity团结1.3.4 1.下载sqlite-net&#xff0c;将SQLite.cs脚本导入Unity 2.下载各平台依赖项&#xff0c;如dll、aar等。导入Unity并设置 3.简单列子&#xff0c;打包测试 using System; using System.IO; using SQLi…

OpenWRT下深入了解IPv6——IPv6 地址结构、前缀划分、子网的概念

一、IPv6地址结构、命名与分类 IPv6 地址由 128 位组成&#xff0c;通常以 : 分隔为 8 组 16 位。 1.IPv6地址压缩 1&#xff09;.前导0可以省略 2&#xff09;.全为0的组可以用::替代 2.IPv6地址分类 3.EUI-64最新标识接口的方法 比mac地址更多 插入FFFE 将第7bit进行反转…

数据结构 ——无头单链表

数据结构 ——无头单链表 一、无头单链表的定义与特性 1、单链表简介 单链表是一种常见的基础数据结构&#xff0c;它由一系列节点组成&#xff0c;每个节点包含数据部分和指向下一个节点的指针。无头单链表是单链表的一种变体&#xff0c;其特点是没有明确的头节点&#xff0…

阿拉丁论文助手:一键点亮学术之路

在学术研究的海洋中&#xff0c;每一位学者都渴望拥有一盏能够照亮前行道路的神灯。阿拉丁论文助手&#xff0c;正是这样一盏神奇的灯&#xff0c;它以其先进的人工智能技术和丰富的学术资源&#xff0c;为学者们的学术写作提供了全方位的支持。 一、阿拉丁论文助手简介 阿拉丁…

大语言模型应用Text2SQL本地部署实践初探

自从两年前OpenAI公司发布ChatGPT后&#xff0c;大模型(Large Language Model&#xff0c;简称LLM)相关技术在国内外可谓百家争鸣&#xff0c;遍地开花&#xff0c;在传统数据挖掘、机器学习和深度学习的基础上&#xff0c;正式宣告进入快速发展的人工智能(Artificial Intellig…

【UE5 C++课程系列笔记】07——使用定时器实现倒计时效果

使用定时器实现如下倒计时效果 效果 步骤 1. 新建一个Actor类&#xff0c;这里命名为“CountDownTimerActor” 2. 在头文件中先定义倒计时时间和更新剩余时间的函数方法 前向声明一个文本渲染组件 3. 在源文件中引入文本渲染组件 创建文本渲染组件并进行一些设置 实现Update…

synchronized的特性

1.互斥 对于synchronized修饰的方法及代码块不同线程想同时进行访问就会互斥。 就比如synchronized修饰代码块时&#xff0c;一个线程进入该代码块就会进行“加锁”。 退出代码块时会进行“解锁”。 当其他线程想要访问被加锁的代码块时&#xff0c;就会阻塞等待。 阻塞等待…

STM32之SDIO通讯接口和SD卡(九)

STM32F407 系列文章 - SDIO-To-SD Card&#xff08;九&#xff09; 目录 前言 一、SDIO接口 二、SD卡 三、实现程序 1.SD卡结构体参数说明 2.头文件定义 3.函数sd_init() 4.函数HAL_SD_MspInit() 5.函数get_sd_card_info() 6.函数get_sd_card_state() 7.函数sd_read…

Vue 提供了Transition,可以帮助你制作基于状态变化的过渡和动画

官方文档&#xff1a;https://cn.vuejs.org/guide/built-ins/transition.html Transition​ Vue 提供了两个内置组件&#xff0c;可以帮助你制作基于状态变化的过渡和动画&#xff1a; <Transition> 会在一个元素或组件进入和离开 DOM 时应用动画。本章节会介绍如何使用…

04 创建一个属于爬虫的主虚拟环境

文章目录 回顾conda常用指令创建一个爬虫虚拟主环境Win R 调出终端查看当前conda的虚拟环境创建 spider_base 的虚拟环境安装完成查看环境是否存在 为 pycharm 配置创建的爬虫主虚拟环境选一个盘符来存储之后学习所写的爬虫文件用 pycharm 打开创建的文件夹pycharm 配置解释器…

鸿蒙UI开发——渐变色效果

1、概 述 ArkTs可以通过颜色渐变接口&#xff0c;设置组件的背景颜色渐变效果&#xff0c;实现在两个或多个指定的颜色之间进行平稳的过渡。 目前提供三种渐变类型&#xff1a;线性渐变、角度渐变、径向渐变。 我们在鸿蒙UI布局实战 —— 个人中心页面开发中&#xff0c;默认…

渗透测试--数据库攻击

这篇文章瘾小生其实想了很久&#xff0c;到底是放在何处&#xff0c;最终还是想着单拎出来总结&#xff0c;因为数据库攻击对我们而言非常重要&#xff0c;而且内容众多。本篇文章将讲述在各位获取数据库权限的情况下&#xff0c;各个数据库会被如何滥用&#xff0c;以及能够滥…

Java——异常机制(上)

1 异常机制本质 (异常在Java里面是对象) (抛出异常&#xff1a;执行一个方法时&#xff0c;如果发生异常&#xff0c;则这个方法生成代表该异常的一个对象&#xff0c;停止当前执行路径&#xff0c;并把异常对象提交给JRE) 工作中&#xff0c;程序遇到的情况不可能完美。比如…

Idea Spring Initializr没有 Java 8选项解决办法

问题描述 在使用IDEA中的Spring Initializr创建新项目时&#xff0c;Java 版本近可选择Java17,21 。不能选择Java8;SpringBoot 版本也只有 3.x 问题原因 Spring 官方&#xff08; https://start.spring.io/&#xff09;不再提供旧版本的初始化配置 解决方案 方案 1 使用阿里…

npm发布插件到私有仓库保姆级教程

在开发项目的过程中&#xff0c;我们经常需要安装插件依赖&#xff0c;那么怎么把自己开发的组件封装成一个插件&#xff0c;并发布到npm 插件市场或者上传到私有仓库里面呢&#xff1f;今天总结下自己发布插件到私有仓库的记录&#xff1a; 一、创建组件 执行命令创建一个空…

渗透测试---burpsuite(5)web网页端抓包与APP渗透测试

声明&#xff1a;学习素材来自b站up【泷羽Sec】&#xff0c;侵删&#xff0c;若阅读过程中有相关方面的不足&#xff0c;还请指正&#xff0c;本文只做相关技术分享,切莫从事违法等相关行为&#xff0c;本人与泷羽sec团队一律不承担一切后果 视频地址&#xff1a;泷羽---bp&…

关闭windows11的“热门搜索”

win10搜索栏热门搜索怎么关闭&#xff1f;win10搜索栏热门搜索关闭方法分享_搜索_onecdll-GitCode 开源社区 注册表地址是&#xff1a;计算机\HKEY_CURRENT_USER\SOFTWARE\Policies\Microsoft\Windows\ 最后效果如下&#xff1a;