Java Web应用程序实现用户登录、学生信息管理和验证码验证以及页面跳转等基本功能(IDEA)含(Ajax、JSTL)

一、具体框架以及代码功能的展示:

1. 文件结构

  • web03: 项目根目录。

    • src: 包含Java源代码。

      • cn.lvb: 主包。

        • bean : 包含实体类,如 BookStudent

        • controller : 包含处理HTTP请求的Servlet类,如 DoLogin, Index, StuList1, VerifyCode

        • dao : 包含数据访问对象(DAO)类,如 StudentDAO

    • web: 包含Web资源。

      • css: 样式表文件。

      • fonts: 字体文件。

      • images: 图片资源。

      • js: JavaScript文件。

      • WEB-INF : 包含受保护的资源,如 web.xml 和 JSP 文件。

      • jsp : 包含JSP页面,如 index.jspstu_list.jsp

      • login.html: 登录页面。

2. Java 类

  • Book.java: 一个简单的Java Bean类,表示书籍实体,包含书籍的ID、名称、作者、价格和描述等属性。

  • DoLogin.java: 处理用户登录请求的Servlet。它验证用户输入的用户名、密码和验证码,并返回JSON格式的响应。

  • Index.java: 处理主页请求的Servlet。检查用户是否已登录,如果未登录则重定向到登录页面。

  • StuList1.java : 处理学生列表请求的Servlet。从 StudentDAO 获取学生列表并转发到 stu_list.jsp 页面。

  • VerifyCode.java: 生成验证码图片的Servlet。验证码图片用于登录时的验证。

  • StudentDAO.java: 数据访问对象类,提供对学生数据的访问方法,如获取所有学生列表或根据学号获取单个学生信息。

3. JSP 页面

  • index.jsp: 主页面,显示后台管理系统的布局和导航菜单。

  • stu_list.jsp: 显示学生列表的页面,使用JSTL标签库遍历并显示学生信息。

  • login.html: 登录页面,包含用户名、密码和验证码的输入表单,以及登录按钮。

4. HTML 和 JavaScript

  • login.html: 包含登录表单和JavaScript代码,用于处理登录请求和验证码刷新。

    • mylogin() : JavaScript函数,通过AJAX发送登录请求到 DoLogin Servlet,并根据响应结果进行相应操作。

    • refreshCaptcha(): JavaScript函数,用于刷新验证码图片。

5. CSS 和样式

  • CSS 文件: 包含样式表文件,用于定义页面的外观和布局。

  • 内联样式 : 在 login.html 中定义了登录页面的样式,包括背景图片、表单布局等。

6. Servlet 功能

  • DoLogin: 处理登录请求,验证用户输入的用户名、密码和验证码,并返回JSON格式的响应。

  • Index: 检查用户是否已登录,如果未登录则重定向到登录页面,否则转发到主页。

  • StuList1: 获取学生列表并转发到显示页面。

  • VerifyCode: 生成验证码图片并存储在会话中,用于验证用户输入。

7. DAO 功能

  • StudentDAO: 提供对学生数据的访问方法,如获取所有学生列表或根据学号获取单个学生信息。

8. 页面交互

  • AJAX 请求 : 在 login.html 中使用AJAX发送登录请求,并根据响应结果进行页面跳转或显示错误信息。

  • 验证码刷新 : 通过JavaScript函数 refreshCaptcha() 刷新验证码图片,避免浏览器缓存旧的验证码。

9. 页面布局

  • index.jsp: 使用Bootstrap框架和自定义样式构建后台管理系统的布局,包括侧边导航栏、头部信息和主要内容区域。

  • stu_list.jsp: 使用Bootstrap表格组件显示学生列表,并提供编辑和删除操作的按钮。

10. 依赖库

  • Bootstrap: 用于构建响应式页面布局和样式。

  • jQuery: 用于简化JavaScript代码和处理AJAX请求。

  • JSTL: 用于在JSP页面中遍历和显示数据。

!!

!!运行结果展示先放在这里,具体代码可往下看:

用户名密码代码已经设置好了:tom 123456 :

当登陆用户名密码错误时:

正确时但验证码错误,重新刷新验证码登录:

都正确时,进入页面:

但是要注意 只有登陆了之后http://localhost:8080/web03/Index 这个网页才能直接访问,否则运行后只会跳转到让你登陆的界面:http://localhost:8080/web03/login.html

二、代码各个部分以及功能展示:

这个 Index 类是一个Servlet,用于处理主页请求。它的主要功能是检查用户是否已经登录,并根据

用户的登录状态决定是否允许访问主页。以下是代码的详细解释:

1. 注解

  • @WebServlet("/Index"): 这个注解将该Servlet映射到URL路径 /Index。当用户访问 /Index 时,该Servlet会被调用。

2. doGet 方法

  • HttpSession session = request.getSession();: 获取当前用户的会话(Session)。会话用于在多个请求之间存储用户相关的信息。

  • String user = (String)session.getAttribute("user"); : 从会话中获取名为 user 的属性。这个属性通常在用户登录成功后设置(例如在 DoLogin Servlet 中设置)。

  • if(user==null) : 检查 user 属性是否为 null。如果为 null,表示用户未登录。

    • response.sendRedirect("login.html"); : 如果用户未登录,重定向到 login.html 页面,要求用户登录。

    • return;: 结束方法执行,确保后续代码不会被执行。

  • request.getRequestDispatcher("/WEB-INF/jsp/index.jsp").forward(request,response); : 如果用户已登录,将请求转发到 /WEB-INF/jsp/index.jsp 页面。/WEB-INF 目录下的资源通常受保护,不能直接通过URL访问,只能通过服务器端转发访问。

3. doPost 方法

  • protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException: 处理POST请求。

    • doGet(request, response); : 在 doPost 方法中调用 doGet 方法,使得POST请求和GET请求的处理逻辑一致。这是一种常见的做法,特别是在处理表单提交时。

4. 功能总结

  • 用户登录验证: 该Servlet首先检查用户是否已经登录。如果用户未登录,则重定向到登录页面。

  • 页面转发 : 如果用户已登录,则将请求转发到主页 (index.jsp),允许用户访问主页内容。

  • 安全性 : 通过检查会话中的 user 属性,确保只有已登录的用户才能访问主页。

5. 使用场景

  • 这个Servlet通常用于保护需要登录才能访问的页面。例如,在后台管理系统中,只有登录后的用户才能访问管理页面。

  • 通过这种方式,可以有效地防止未授权用户访问受保护的资源。

6. 相关技术

  • HttpSession: 用于在多个请求之间存储用户信息。会话通常用于跟踪用户的登录状态。

  • RequestDispatcher: 用于将请求转发到其他资源(如JSP页面)。转发是在服务器端完成的,客户端不会知道转发的目标资源。

  • sendRedirect: 用于将客户端重定向到另一个URL。与转发不同,重定向会导致客户端发起一个新的请求。

通过这个Servlet,应用程序能够确保只有已登录的用户才能访问主页,从而保护敏感资源不被未授权用户访问。

javascript 复制代码
package cn.lvb.controller;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

@WebServlet("/Index")
public class Index extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        HttpSession session = request.getSession();
        String user = (String)session.getAttribute("user");
        if(user==null)
        {
            response.sendRedirect("login.html");
            return;
        }

        request.getRequestDispatcher("/WEB-INF/jsp/index.jsp").forward(request,response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

这个 index.jsp 文件是一个Java Server Page (JSP)

用于构建后台管理系统的首页。它提供了用户界面和导航功能,允许用户访问系统的不同部分。以下是该文件的功能与作用的详细解释:

1. 页面结构

  • DOCTYPE 和 HTML 标签: 定义了文档类型和HTML文档的基本结构。

  • head 部分: 包含页面的元数据、标题、样式表和脚本引用。

  • body 部分: 包含页面的实际内容,分为左侧导航栏、头部信息和主要内容区域。

2. 页面功能

  • 左侧导航栏 (<aside class="lyear-layout-sidebar">):

    • Logo: 显示系统的Logo,点击可以返回首页。

    • 导航菜单: 包含多个菜单项和子菜单项,用于导航到系统的不同部分,如后台首页、学生信息、UI元素、表单、示例页面、JS插件等。

    • 多级菜单: 支持多级菜单结构,允许用户访问更深层次的页面。

    • 版权信息: 显示在导航栏底部,包含版权声明和链接。

  • 头部信息 (<header class="lyear-layout-header">):

    • 用户信息: 显示当前登录用户的头像和用户名,并提供下拉菜单用于访问个人信息、修改密码、清空缓存和退出登录。

    • 主题配色切换: 允许用户切换系统的主题配色,包括Logo、头部和侧边栏的背景颜色。

  • 主要内容区域 (<main class="lyear-layout-content">):

    • iframe 内容 : 使用 <div id="iframe-content"></div> 作为占位符,用于动态加载其他页面的内容。

3. 样式和脚本

  • 样式表:

    • Bootstrap: 提供响应式布局和基本样式。

    • Material Design Icons: 提供图标支持。

    • 自定义样式 (style.min.css): 定义系统的自定义样式。

  • 脚本:

    • jQuery: 用于简化JavaScript代码和处理DOM操作。

    • Bootstrap: 提供交互组件和JavaScript功能。

    • Perfect Scrollbar: 提供自定义滚动条。

    • Multitabs: 支持多标签页功能。

    • 自定义脚本 (index.min.js): 包含系统的自定义JavaScript逻辑。

4. 动态内容加载

  • 多标签页功能 : 通过 multitabs 类和相关脚本,支持在主要内容区域动态加载和切换多个标签页,提升用户体验。

5. 用户交互

  • 导航菜单: 用户可以通过点击导航菜单项访问系统的不同功能页面。

  • 用户信息下拉菜单: 提供用户相关的操作选项,如查看个人信息、修改密码、退出登录等。

  • 主题配色切换: 允许用户根据个人喜好切换系统的视觉主题。

6. 安全性

  • 用户登录验证: 虽然在这个JSP文件中没有直接处理登录验证,但通常会在服务器端(如Servlet)验证用户是否已登录,未登录用户会被重定向到登录页面。

7. 使用场景

  • 后台管理系统: 这个页面通常用于后台管理系统的主页,提供系统的整体导航和用户界面。

  • 多模块支持: 通过多级菜单和多标签页功能,支持系统的多个模块和功能页面。

8. 技术栈

  • 前端: HTML, CSS, JavaScript, Bootstrap, jQuery.

  • 后端: JSP, Java Servlets.

通过这个**index.jsp** 文件,系统能够提供一个功能丰富、用户友好的后台管理界面,支持多模块导航和动态内容加载,提升用户的操作体验。

java 复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
    <title>首页 - 光年(Light Year Admin)后台管理系统模板</title>
    <link rel="icon" href="favicon.ico" type="image/ico">
    <meta name="keywords" content="LightYear,光年,后台模板,后台管理系统,光年HTML模板">
    <meta name="description" content="LightYear是一个基于Bootstrap v3.3.7的后台管理系统的HTML模板。">
    <meta name="author" content="yinqi">
    <link href="css/bootstrap.min.css" rel="stylesheet">
    <link href="css/materialdesignicons.min.css" rel="stylesheet">
    <link rel="stylesheet" href="js/bootstrap-multitabs/multitabs.min.css">
    <link href="css/style.min.css" rel="stylesheet">
</head>

<body>
<div class="lyear-layout-web">
    <div class="lyear-layout-container">
        <!--左侧导航-->
        <aside class="lyear-layout-sidebar">

            <!-- logo -->
            <div id="logo" class="sidebar-header">
                <a href="index.html"><img src="images/logo-sidebar.png" title="LightYear" alt="LightYear" /></a>
            </div>
            <div class="lyear-layout-sidebar-scroll">

                <nav class="sidebar-main">
                    <ul class="nav nav-drawer">
                        <li class="nav-item active"> <a class="multitabs" href="lyear_main.html"><i class="mdi mdi-home"></i> <span>后台首页</span></a> </li>



                        <li class="nav-item nav-item-has-subnav">
                            <a href="javascript:void(0)"><i class="mdi mdi-palette"></i> <span>学生信息</span></a>
                            <ul class="nav nav-subnav">
                                <li> <a class="multitabs" href="StuList1">学生列表1</a> </li>
                                <li> <a class="multitabs" href="StuList2">学生列表2</a> </li>
                            </ul>
                        </li>




                        <li class="nav-item nav-item-has-subnav">
                            <a href="javascript:void(0)"><i class="mdi mdi-palette"></i> <span>UI 元素</span></a>
                            <ul class="nav nav-subnav">
                                <li> <a class="multitabs" href="lyear_ui_buttons.html">按钮</a> </li>
                                <li> <a class="multitabs" href="lyear_ui_cards.html">卡片</a> </li>
                                <li> <a class="multitabs" href="lyear_ui_grid.html">格栅</a> </li>
                                <li> <a class="multitabs" href="lyear_ui_icons.html">图标</a> </li>
                                <li> <a class="multitabs" href="lyear_ui_tables.html">表格</a> </li>
                                <li> <a class="multitabs" href="lyear_ui_modals.html">模态框</a> </li>
                                <li> <a class="multitabs" href="lyear_ui_tooltips_popover.html">提示 / 弹出框</a> </li>
                                <li> <a class="multitabs" href="lyear_ui_alerts.html">警告框</a> </li>
                                <li> <a class="multitabs" href="lyear_ui_pagination.html">分页</a> </li>
                                <li> <a class="multitabs" href="lyear_ui_progress.html">进度条</a> </li>
                                <li> <a class="multitabs" href="lyear_ui_tabs.html">标签页</a> </li>
                                <li> <a class="multitabs" href="lyear_ui_typography.html">排版</a> </li>
                                <li> <a class="multitabs" href="lyear_ui_step.html">步骤</a> </li>
                                <li> <a class="multitabs" href="lyear_ui_other.html">其他</a> </li>
                            </ul>
                        </li>



                        <li class="nav-item nav-item-has-subnav">
                            <a href="javascript:void(0)"><i class="mdi mdi-format-align-justify"></i> <span>表单</span></a>
                            <ul class="nav nav-subnav">
                                <li> <a class="multitabs" href="lyear_forms_elements.html">基本元素</a> </li>
                                <li> <a class="multitabs" href="lyear_forms_radio.html">单选框</a> </li>
                                <li> <a class="multitabs" href="lyear_forms_checkbox.html">复选框</a> </li>
                                <li> <a class="multitabs" href="lyear_forms_switch.html">开关</a> </li>
                            </ul>
                        </li>
                        <li class="nav-item nav-item-has-subnav">
                            <a href="javascript:void(0)"><i class="mdi mdi-file-outline"></i> <span>示例页面</span></a>
                            <ul class="nav nav-subnav">
                                <li> <a class="multitabs" href="lyear_pages_doc.html">文档列表</a> </li>
                                <li> <a class="multitabs" href="lyear_pages_gallery.html">图库列表</a> </li>
                                <li> <a class="multitabs" href="lyear_pages_config.html">网站配置</a> </li>
                                <li> <a class="multitabs" href="lyear_pages_rabc.html">设置权限</a> </li>
                                <li> <a class="multitabs" href="lyear_pages_add_doc.html">新增文档</a> </li>
                                <li> <a class="multitabs" href="lyear_pages_guide.html">表单向导</a> </li>
                                <li> <a class="multitabs" href="lyear_pages_data_table.html">表格插件</a> </li>
                                <li> <a href="lyear_pages_login.html" target="_blank">登录页面</a> </li>
                                <li> <a href="lyear_pages_login_2.html" target="_blank">登录页面2</a> </li>
                                <li> <a href="lyear_pages_login_3.html" target="_blank">登录页面3</a> </li>
                                <li> <a href="lyear_pages_login_4.html" target="_blank">登录页面4</a> </li>
                                <li> <a href="lyear_pages_error.html" target="_blank">错误页面</a> </li>
                            </ul>
                        </li>
                        <li class="nav-item nav-item-has-subnav">
                            <a href="javascript:void(0)"><i class="mdi mdi-language-javascript"></i> <span>JS 插件</span></a>
                            <ul class="nav nav-subnav">
                                <li> <a class="multitabs" href="lyear_js_datepicker.html">日期选取器</a> </li>
                                <li> <a class="multitabs" href="lyear_js_sliders.html">滑块</a> </li>
                                <li> <a class="multitabs" href="lyear_js_colorpicker.html">选色器</a> </li>
                                <li> <a class="multitabs" href="lyear_js_chartjs.html">Chart.js</a> </li>
                                <li> <a class="multitabs" href="lyear_js_jconfirm.html">对话框</a> </li>
                                <li> <a class="multitabs" href="lyear_js_tags_input.html">标签插件</a> </li>
                                <li> <a class="multitabs" href="lyear_js_notify.html">通知消息</a> </li>
                            </ul>
                        </li>
                        <li class="nav-item nav-item-has-subnav">
                            <a href="javascript:void(0)"><i class="mdi mdi-menu"></i> <span>多级菜单</span></a>
                            <ul class="nav nav-subnav">
                                <li> <a href="#!">一级菜单</a> </li>
                                <li class="nav-item nav-item-has-subnav">
                                    <a href="#!">一级菜单</a>
                                    <ul class="nav nav-subnav">
                                        <li> <a href="#!">二级菜单</a> </li>
                                        <li class="nav-item nav-item-has-subnav">
                                            <a href="#!">二级菜单</a>
                                            <ul class="nav nav-subnav">
                                                <li> <a href="#!">三级菜单</a> </li>
                                                <li> <a href="#!">三级菜单</a> </li>
                                            </ul>
                                        </li>
                                    </ul>
                                </li>
                                <li> <a href="#!">一级菜单</a> </li>
                            </ul>
                        </li>
                    </ul>
                </nav>

                <div class="sidebar-footer">
                    <p class="copyright">Copyright &copy; 2019. <a target="_blank" href="http://lyear.itshubao.com">IT书包</a> All rights reserved.</p>
                </div>
            </div>

        </aside>
        <!--End 左侧导航-->

        <!--头部信息-->
        <header class="lyear-layout-header">

            <nav class="navbar navbar-default">
                <div class="topbar">

                    <div class="topbar-left">
                        <div class="lyear-aside-toggler">
                            <span class="lyear-toggler-bar"></span>
                            <span class="lyear-toggler-bar"></span>
                            <span class="lyear-toggler-bar"></span>
                        </div>
                    </div>

                    <ul class="topbar-right">
                        <li class="dropdown dropdown-profile">
                            <a href="javascript:void(0)" data-toggle="dropdown">
                                <img class="img-avatar img-avatar-48 m-r-10" src="images/users/avatar.jpg" alt="笔下光年" />
                                <span>${user} <span class="caret"></span></span>
                            </a>
                            <ul class="dropdown-menu dropdown-menu-right">
                                <li> <a class="multitabs" data-url="lyear_pages_profile.html" href="javascript:void(0)"><i class="mdi mdi-account"></i> 个人信息</a> </li>
                                <li> <a class="multitabs" data-url="lyear_pages_edit_pwd.html" href="javascript:void(0)"><i class="mdi mdi-lock-outline"></i> 修改密码</a> </li>
                                <li> <a href="javascript:void(0)"><i class="mdi mdi-delete"></i> 清空缓存</a></li>
                                <li class="divider"></li>
                                <li> <a href="lyear_pages_login.html"><i class="mdi mdi-logout-variant"></i> 退出登录</a> </li>
                            </ul>
                        </li>
                        <!--切换主题配色-->
                        <li class="dropdown dropdown-skin">
                            <span data-toggle="dropdown" class="icon-palette"><i class="mdi mdi-palette"></i></span>
                            <ul class="dropdown-menu dropdown-menu-right" data-stopPropagation="true">
                                <li class="drop-title"><p>LOGO</p></li>
                                <li class="drop-skin-li clearfix">
                  <span class="inverse">
                    <input type="radio" name="logo_bg" value="default" id="logo_bg_1" checked>
                    <label for="logo_bg_1"></label>
                  </span>
                                    <span>
                    <input type="radio" name="logo_bg" value="color_2" id="logo_bg_2">
                    <label for="logo_bg_2"></label>
                  </span>
                                    <span>
                    <input type="radio" name="logo_bg" value="color_3" id="logo_bg_3">
                    <label for="logo_bg_3"></label>
                  </span>
                                    <span>
                    <input type="radio" name="logo_bg" value="color_4" id="logo_bg_4">
                    <label for="logo_bg_4"></label>
                  </span>
                                    <span>
                    <input type="radio" name="logo_bg" value="color_5" id="logo_bg_5">
                    <label for="logo_bg_5"></label>
                  </span>
                                    <span>
                    <input type="radio" name="logo_bg" value="color_6" id="logo_bg_6">
                    <label for="logo_bg_6"></label>
                  </span>
                                    <span>
                    <input type="radio" name="logo_bg" value="color_7" id="logo_bg_7">
                    <label for="logo_bg_7"></label>
                  </span>
                                    <span>
                    <input type="radio" name="logo_bg" value="color_8" id="logo_bg_8">
                    <label for="logo_bg_8"></label>
                  </span>
                                </li>
                                <li class="drop-title"><p>头部</p></li>
                                <li class="drop-skin-li clearfix">
                  <span class="inverse">
                    <input type="radio" name="header_bg" value="default" id="header_bg_1" checked>
                    <label for="header_bg_1"></label>
                  </span>
                                    <span>
                    <input type="radio" name="header_bg" value="color_2" id="header_bg_2">
                    <label for="header_bg_2"></label>
                  </span>
                                    <span>
                    <input type="radio" name="header_bg" value="color_3" id="header_bg_3">
                    <label for="header_bg_3"></label>
                  </span>
                                    <span>
                    <input type="radio" name="header_bg" value="color_4" id="header_bg_4">
                    <label for="header_bg_4"></label>
                  </span>
                                    <span>
                    <input type="radio" name="header_bg" value="color_5" id="header_bg_5">
                    <label for="header_bg_5"></label>
                  </span>
                                    <span>
                    <input type="radio" name="header_bg" value="color_6" id="header_bg_6">
                    <label for="header_bg_6"></label>
                  </span>
                                    <span>
                    <input type="radio" name="header_bg" value="color_7" id="header_bg_7">
                    <label for="header_bg_7"></label>
                  </span>
                                    <span>
                    <input type="radio" name="header_bg" value="color_8" id="header_bg_8">
                    <label for="header_bg_8"></label>
                  </span>
                                </li>
                                <li class="drop-title"><p>侧边栏</p></li>
                                <li class="drop-skin-li clearfix">
                  <span class="inverse">
                    <input type="radio" name="sidebar_bg" value="default" id="sidebar_bg_1" checked>
                    <label for="sidebar_bg_1"></label>
                  </span>
                                    <span>
                    <input type="radio" name="sidebar_bg" value="color_2" id="sidebar_bg_2">
                    <label for="sidebar_bg_2"></label>
                  </span>
                                    <span>
                    <input type="radio" name="sidebar_bg" value="color_3" id="sidebar_bg_3">
                    <label for="sidebar_bg_3"></label>
                  </span>
                                    <span>
                    <input type="radio" name="sidebar_bg" value="color_4" id="sidebar_bg_4">
                    <label for="sidebar_bg_4"></label>
                  </span>
                                    <span>
                    <input type="radio" name="sidebar_bg" value="color_5" id="sidebar_bg_5">
                    <label for="sidebar_bg_5"></label>
                  </span>
                                    <span>
                    <input type="radio" name="sidebar_bg" value="color_6" id="sidebar_bg_6">
                    <label for="sidebar_bg_6"></label>
                  </span>
                                    <span>
                    <input type="radio" name="sidebar_bg" value="color_7" id="sidebar_bg_7">
                    <label for="sidebar_bg_7"></label>
                  </span>
                                    <span>
                    <input type="radio" name="sidebar_bg" value="color_8" id="sidebar_bg_8">
                    <label for="sidebar_bg_8"></label>
                  </span>
                                </li>
                            </ul>
                        </li>
                        <!--切换主题配色-->
                    </ul>

                </div>
            </nav>

        </header>
        <!--End 头部信息-->

        <!--页面主要内容-->
        <main class="lyear-layout-content">

            <div id="iframe-content"></div>

        </main>
        <!--End 页面主要内容-->
    </div>
</div>

<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/bootstrap.min.js"></script>
<script type="text/javascript" src="js/perfect-scrollbar.min.js"></script>
<script type="text/javascript" src="js/bootstrap-multitabs/multitabs.js"></script>
<script type="text/javascript" src="js/index.min.js"></script>
</body>
</html>

这个 login.html 文件是一个登录页面,用于后台管理系统的用户身份验证。

它提供了一个用户界面,允许用户输入用户名、密码和验证码来登录系统。以下是该文件的作用和功能的详细解释:

1. 页面结构

  • DOCTYPE 和 HTML 标签: 定义了文档类型和HTML文档的基本结构。

  • head 部分: 包含页面的元数据、标题、样式表和脚本引用。

  • body 部分: 包含登录表单和相关的用户界面元素。

2. 页面功能

  • 登录表单:

    • 用户名输入: 用户输入用户名的地方。

    • 密码输入: 用户输入密码的地方。

    • 验证码输入: 用户输入验证码的地方,旁边有一个验证码图片,点击图片可以刷新验证码。

    • 自动登录选项: 提供一个复选框,允许用户选择在5天内自动登录。

    • 登录按钮: 用户点击后提交登录信息。

  • 右侧信息栏:

    • Logo: 显示系统的Logo。

    • 系统描述: 提供系统的简要描述。

    • 版权信息: 显示版权声明和链接。

3. 样式和脚本

  • 样式表:

    • Bootstrap: 提供响应式布局和基本样式。

    • Material Design Icons: 提供图标支持。

    • 自定义样式 (style.min.css): 定义登录页面的自定义样式。

  • 脚本:

    • jQuery: 用于简化JavaScript代码和处理DOM操作。

    • Bootstrap: 提供交互组件和JavaScript功能。

    • 自定义脚本: 包含处理登录和验证码刷新的JavaScript逻辑。

4. 用户交互

  • 登录功能:

    • mylogin() : JavaScript函数,通过AJAX发送登录请求到 DoLogin Servlet,并根据响应结果进行相应操作。如果登录成功,重定向到主页 (Index); 如果登录失败,显示错误信息并刷新验证码。
  • 验证码刷新:

    • refreshCaptcha(): JavaScript函数,用于刷新验证码图片,避免浏览器缓存旧的验证码。

5. 安全性

  • 验证码: 提供验证码输入,防止自动化脚本攻击。

  • AJAX 请求: 使用AJAX提交登录信息,避免页面刷新,提升用户体验。

6. 使用场景

  • 后台管理系统: 这个页面通常用于后台管理系统的登录界面,确保只有授权用户才能访问系统的敏感资源。

  • 用户身份验证: 通过验证用户名、密码和验证码,确保用户身份的真实性。

7. 技术栈

  • 前端: HTML, CSS, JavaScript, Bootstrap, jQuery.

  • 后端 : Java Servlets (如 DoLogin Servlet).

8. 页面布局

  • 左侧登录表单: 包含用户名、密码、验证码输入框和登录按钮。

  • 右侧信息栏: 显示系统Logo、描述和版权信息。

9. 响应式设计

  • 媒体查询: 在小屏幕设备上隐藏右侧信息栏,确保登录表单在移动设备上的可用性。

通过这个 login.html 文件,系统能够提供一个安全、用户友好的登录界面,确保只有授权用户才能访问后台管理系统的功能。

java 复制代码
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
    <title>登录页面 - 光年(Light Year Admin)后台管理系统模板</title>
    <link rel="icon" href="favicon.ico" type="image/ico">
    <meta name="keywords" content="LightYear,光年,后台模板,后台管理系统,光年HTML模板">
    <meta name="description" content="LightYear是一个基于Bootstrap v3.3.7的后台管理系统的HTML模板。">
    <meta name="author" content="yinqi">
    <link href="css/bootstrap.min.css" rel="stylesheet">
    <link href="css/materialdesignicons.min.css" rel="stylesheet">
    <link href="css/style.min.css" rel="stylesheet">
    <style>
        body {
            display: -webkit-box;
            display: flex;
            -webkit-box-pack: center;
            justify-content: center;
            -webkit-box-align: center;
            align-items: center;
            height: 100%;
        }
        .login-box {
            display: table;
            table-layout: fixed;
            overflow: hidden;
            max-width: 700px;
        }
        .login-left {
            display: table-cell;
            position: relative;
            margin-bottom: 0;
            border-width: 0;
            padding: 45px;
        }
        .login-left .form-group:last-child {
            margin-bottom: 0px;
        }
        .login-right {
            display: table-cell;
            position: relative;
            margin-bottom: 0;
            border-width: 0;
            padding: 45px;
            width: 50%;
            max-width: 50%;
            background: #67b26f!important;
            background: -moz-linear-gradient(45deg,#67b26f 0,#4ca2cd 100%)!important;
            background: -webkit-linear-gradient(45deg,#67b26f 0,#4ca2cd 100%)!important;
            background: linear-gradient(45deg,#67b26f 0,#4ca2cd 100%)!important;
            filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#67b26f', endColorstr='#4ca2cd', GradientType=1 )!important;
        }
        .login-box .has-feedback.feedback-left .form-control {
            padding-left: 38px;
            padding-right: 12px;
        }
        .login-box .has-feedback.feedback-left .form-control-feedback {
            left: 0;
            right: auto;
            width: 38px;
            height: 38px;
            line-height: 38px;
            z-index: 4;
            color: #dcdcdc;
        }
        .login-box .has-feedback.feedback-left.row .form-control-feedback {
            left: 15px;
        }
        @media (max-width: 576px) {
            .login-right {
                display: none;
            }
        }
    </style>
</head>

<body style="background-image: url(images/login-bg-2.jpg); background-size: cover;">
<div class="bg-translucent p-10">
    <div class="login-box bg-white clearfix">
        <div class="login-left">
            <form>
                <div class="form-group has-feedback feedback-left">
                    <input type="text" placeholder="请输入您的用户名" class="form-control" name="username" id="username" />
                    <span class="mdi mdi-account form-control-feedback" aria-hidden="true"></span>
                </div>
                <div class="form-group has-feedback feedback-left">
                    <input type="password" placeholder="请输入密码" class="form-control" id="password" name="password" />
                    <span class="mdi mdi-lock form-control-feedback" aria-hidden="true"></span>
                </div>
                <div class="form-group has-feedback feedback-left row">
                    <div class="col-xs-7">
                        <input type="text" name="captcha" id="captcha" class="form-control" placeholder="验证码">
                        <span class="mdi mdi-check-all form-control-feedback" aria-hidden="true"></span>
                    </div>
                    <div class="col-xs-5">
                        <img src="VerifyCode" class="pull-right" id="captchaImg" style="height: 40px" onclick="refreshCaptcha()" >
                    </div>
                </div>
                <div class="form-group">
                    <label class="lyear-checkbox checkbox-primary m-t-10">
                        <input type="checkbox"><span>5天内自动登录</span>
                    </label>
                </div>
                <div class="form-group">
                    <button class="btn btn-block btn-primary" type="button" onclick="mylogin()">立即登录</button>
                </div>
            </form>
        </div>
        <div class="login-right">
            <p><img src="images/logo.png" class="m-b-md m-t-xs" alt="logo"></p>
            <p class="text-white m-tb-15">Light Year Admin 是一个基于Bootstrap v3.3.7的后台管理系统的HTML模板。</p>
            <p class="text-white">Copyright © 2020 <a href="http://lyear.itshubao.com">IT书包</a>. All right reserved</p>
        </div>
    </div>
</div>
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/bootstrap.min.js"></script>
<script type="text/javascript">

    function mylogin() {
        var username = $('#username').val();
        var password = $('#password').val();
        var verifyCode = $('#captcha').val();

        $.ajax({
            url:"DoLogin",
            type: "post",
            data:{
                username:username, password:password, verifyCode:verifyCode
            },
            dataType: "json",
            success:function(res){

                if(res.code==-1)
                {
                    alert(res.msg);
                    refreshCaptcha();
                    $('#captcha').val('');
                }
                else   if(res.code==1)
                {
                    window.location.href = 'Index';
                }

            },
            error:function (error)
            {
                console.log(error);
                alert("failure");
            }


        });

    }




    function refreshCaptcha() {
        // Get the current timestamp and append it to the captcha image URL
        var captchaImg = document.getElementById('captchaImg');


        // 更新图片的src属性,可以通过添加时间戳避免浏览器缓存旧的验证码图片
        captchaImg.src = 'VerifyCode?time=' + new Date().getTime();
    }
</script>
</body>
</html>

这个 Book 类是一个简单的Java Bean类,用于表示书籍实体。

它封装了书籍的基本信息,并提供了对这些信息的访问和修改方法。以下是该类的功能与作用的详细解释:

1. 类的属性

  • id : 书籍的唯一标识符,类型为 String

  • name : 书籍的名称,类型为 String

  • author : 书籍的作者,类型为 String

  • price : 书籍的价格,类型为 float

  • description : 书籍的描述信息,类型为 String

2. 构造方法

  • 无参构造方法 (public Book()) : 用于创建一个空的 Book 对象。通常在需要手动设置属性值时使用。

  • 带参构造方法 (public Book(String id, String name, String author, float price, String description)):

    • 用于创建一个包含所有属性值的 Book 对象。

    • 参数依次为书籍的 idnameauthorpricedescription

3. Getter 和 Setter 方法

  • Getter 方法: 用于获取对象的属性值。

    • public String getId(): 返回书籍的 id

    • public String getName(): 返回书籍的 name

    • public String getAuthor(): 返回书籍的 author

    • public float getPrice(): 返回书籍的 price

    • public String getDescription(): 返回书籍的 description

  • Setter 方法: 用于设置对象的属性值。

    • public void setId(String id): 设置书籍的 id

    • public void setName(String name): 设置书籍的 name

    • public void setAuthor(String author): 设置书籍的 author

    • public void setPrice(float price): 设置书籍的 price

    • public void setDescription(String description): 设置书籍的 description

4. 功能与作用

  • 数据封装 : Book 类封装了书籍的相关信息,使得这些信息可以通过对象的方式进行管理和操作。

  • 数据访问与修改 : 通过Getter和Setter方法,外部代码可以安全地访问和修改 Book 对象的属性值。

  • 对象创建 : 通过构造方法,可以方便地创建包含初始值的 Book 对象。

5. 使用场景

  • 数据传递 : 在应用程序的不同层之间传递书籍信息时,可以使用 Book 对象作为数据的载体。

  • 数据存储与检索 : 在数据库操作中,Book 对象可以用于表示数据库表中的一条记录,方便进行数据的存储和检索。

  • 业务逻辑处理 : 在业务逻辑层,Book 对象可以用于处理与书籍相关的业务逻辑,如价格计算、信息验证等。

7. 总结

Book 类是一个典型的Java Bean类,用于表示书籍实体。它通过封装书籍的基本信息,并提供了对这些信息的访问和修改方法,使得书籍数据可以在应用程序中方便地传递和处理。这种设计模式在Java应用程序中非常常见,特别是在涉及数据管理和业务逻辑处理的场景中。

javascript 复制代码
package cn.lvb.bean;

public class Book {

    private String id;
    private String name;
    private String author;
    private float price;
    private String description;

    public Book() {

    }

    public Book(String id, String name, String author, float price, String description) {
        this.id = id;
        this.name = name;
        this.author = author;
        this.price = price;
        this.description = description;
    }


    public String getId() {
        return id;
    }

    public void setId(String 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 float getPrice() {
        return price;
    }

    public void setPrice(float price) {
        this.price = price;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

这个 Student 类是一个Java Bean类,用于表示学生实体。它封装了学生的基本信息,并提供了对这些信息的访问和修改方法。

1. 类的属性

  • no : 学生的学号,类型为 String

  • name : 学生的姓名,类型为 String

  • gender : 学生的性别,类型为 Integer(通常用 1 表示男性,2 表示女性)。

  • birthday : 学生的生日,类型为 String

  • className : 学生所在的班级名称,类型为 String

2. 构造方法

  • 无参构造方法 (public Student()) : 用于创建一个空的 Student 对象。通常在需要手动设置属性值时使用。

  • 带参构造方法 (public Student(String no, String name, Integer gender, String birthday, String className)):

    • 用于创建一个包含所有属性值的 Student 对象。

    • 参数依次为学生的 no(学号)、name(姓名)、gender(性别)、birthday(生日)和 className(班级名称)。

3. Getter 和 Setter 方法

  • Getter 方法: 用于获取对象的属性值。

    • public String getNo(): 返回学生的学号。

    • public String getName(): 返回学生的姓名。

    • public Integer getGender(): 返回学生的性别。

    • public String getBirthday(): 返回学生的生日。

    • public String getClassName(): 返回学生所在的班级名称。

  • Setter 方法: 用于设置对象的属性值。

    • public void setNo(String no): 设置学生的学号。

    • public void setName(String name): 设置学生的姓名。

    • public void setGender(Integer gender): 设置学生的性别。

    • public void setBirthday(String birthday): 设置学生的生日。

    • public void setClassName(String className): 设置学生所在的班级名称。

4. 功能与作用

  • 数据封装 : Student 类封装了学生的相关信息,使得这些信息可以通过对象的方式进行管理和操作。

  • 数据访问与修改 : 通过Getter和Setter方法,外部代码可以安全地访问和修改 Student 对象的属性值。

  • 对象创建 : 通过构造方法,可以方便地创建包含初始值的 Student 对象。

5. 使用场景

  • 数据传递 : 在应用程序的不同层之间传递学生信息时,可以使用 Student 对象作为数据的载体。

  • 数据存储与检索 : 在数据库操作中,Student 对象可以用于表示数据库表中的一条记录,方便进行数据的存储和检索。

  • 业务逻辑处理 : 在业务逻辑层,Student 对象可以用于处理与学生相关的业务逻辑,如成绩计算、信息验证等。

7. 总结

Student 类是一个典型的Java Bean类,用于表示学生实体。它通过封装学生的基本信息,并提供了对这些信息的访问和修改方法,使得学生数据可以在应用程序中方便地传递和处理。这种设计模式在Java应用程序中非常常见,特别是在涉及数据管理和业务逻辑处理的场景中。

javascript 复制代码
package cn.lvb.bean;

public class Student {

    private String no;
    private String name;
    private Integer gender;
    private String birthday;
    private String className;

    public Student() {
    }

    public Student(String no, String name, Integer gender, String birthday, String className) {
        this.no = no;
        this.name = name;
        this.gender = gender;
        this.birthday = birthday;
        this.className = className;
    }

    public String getNo() {
        return no;
    }

    public void setNo(String no) {
        this.no = no;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getGender() {
        return gender;
    }

    public void setGender(Integer gender) {
        this.gender = gender;
    }

    public String getBirthday() {
        return birthday;
    }

    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }
}

以下是 DoLogin Servlet 的主要功能的简单列举:

  1. 处理登录请求

    • 通过 GETPOST 方法接收客户端提交的登录请求。
  2. 获取请求参数

    • 从请求中提取用户名 (username)、密码 (password) 和验证码 (verifyCode)。
  3. 验证码验证

    • 从会话 (HttpSession) 中获取服务器生成的验证码,并与用户提交的验证码进行比较。

    • 如果验证码不匹配,返回错误信息:{"code":-1,"msg":"验证码错误"}

  4. 用户名和密码验证

    • 检查用户名是否为 tom,密码是否为 123456(硬编码验证)。

    • 如果匹配,将用户名存储到会话中,并返回成功信息:{"code":1,"msg":"登录成功"}

    • 如果不匹配,返回错误信息:{"code":-1,"msg":"用户名密码错误"}

  5. 会话管理

    • 登录成功后,将用户名存储在会话中,以便后续请求可以使用该信息。
  6. 返回 JSON 响应

    • 无论登录成功还是失败,都以 JSON 格式返回状态码 (code) 和消息 (msg)。
  7. 字符编码处理

    • 设置请求和响应的字符编码为 UTF-8,确保正确处理中文字符。
javascript 复制代码
package cn.lvb.controller;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/DoLogin")
public class DoLogin extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        response.setContentType("application/json;charset=UTF-8");
        request.setCharacterEncoding("UTF-8");
        PrintWriter out = response.getWriter();

        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String verifyCode = request.getParameter("verifyCode");


        HttpSession session = request.getSession();
        String code =(String) session.getAttribute("code");
        session.removeAttribute("code");
        if(!verifyCode.equals(code))
        {
            String ret = "{\"code\":-1,\"msg\":\"验证码错误\"}";
            out.write(ret);
            return;
        }

        if(username.equals("tom") && password.equals("123456"))
        {
            session.setAttribute("user",username);
            String ret = "{\"code\":1,\"msg\":\"登录成功\"}";
            out.write(ret);
            return;
        }
        else
        {
            String ret = "{\"code\":-1,\"msg\":\"用户名密码错误\"}";
            out.write(ret);
            return;
        }

        //username:username, password:password, verifyCode




    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

剩下的代码都是同样的道理,可自查功能:

StuList1

javascript 复制代码
package cn.lvb.controller;

import cn.lvb.bean.Student;
import cn.lvb.dao.StudentDAO;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
import java.util.List;

@WebServlet("/StuList1")
public class StuList1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


        List<Student> list = StudentDAO.getAllList();
        request.setAttribute("list", list);

        request.getRequestDispatcher("/WEB-INF/jsp/stu_list.jsp").forward(request,response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

VerifyCode:

javascript 复制代码
package cn.lvb.controller;

import javax.imageio.ImageIO;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.WebServlet;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

@WebServlet("/VerifyCode")
public class VerifyCode extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //通知浏览器不要缓存
        response.setHeader("Expires", "-1");
        response.setHeader("Cache-Control", "no-cache");
        response.setHeader("Pragma", "no-cache");

        int width = 120;
        int height = 25;
        //创建一副内存图像:BufferedImage
        BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
        //得到属于该图片的画笔:Graphics



        Graphics g = image.getGraphics();
        //画边框
        g.setColor(Color.BLUE);
        g.drawRect(0, 0, width, height);
        //填充背景色
        g.setColor(Color.YELLOW);
        g.fillRect(1, 1, width-2, height-2);
        //画干扰线
        g.setColor(Color.GRAY);

        Random r = new Random();
        for(int i=0;i<10;i++)
            g.drawLine(r.nextInt(width), r.nextInt(height), r.nextInt(width), r.nextInt(height));

        //随机数字
        g.setColor(Color.RED);
        g.setFont(new Font("宋体", Font.BOLD|Font.ITALIC, 20));
        int x = 23;



        String code = "";
        for(int i=0;i<4;i++){
            int a = r.nextInt(10);
            code+=a+"";

            g.drawString(a+"", x, 20);
            x+=20;
        }
        request.getSession().setAttribute("code",code);


        //输出到浏览器的页面上:ImageIO
        ImageIO.write(image, "jpg", response.getOutputStream());


    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}
javascript 复制代码
package cn.lvb.dao;

import cn.lvb.bean.Student;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

public class StudentDAO {

    private static Map<String, Student> map = new LinkedHashMap<>();

    static {
        map.put("111",new Student("111","张三",1,"2018-01-01","一班"));
        map.put("222",new Student("222","张1",1,"2018-01-01","一班"));
        map.put("333",new Student("333","张2",1,"2018-01-01","一班"));
        map.put("444",new Student("444","张3",2,"2018-01-01","一班"));
        map.put("555",new Student("555","张4",1,"2018-01-01","一班"));
    }

    public static Map<String, Student>  getAllMap()
    {
        return  map;
    }
    public static List<Student> getAllList()
    {
        List<Student> list = new ArrayList<>();
        for (Map.Entry<String, Student> me : map.entrySet()) {
            list.add(me.getValue());
        }
        return  list;
    }

    public static Student  getOne(String no)
    {
        return  map.get(no);
    }






}
java 复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html lang="zh">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
    <title>文档列表 - 光年(Light Year Admin)后台管理系统模板</title>
    <link rel="icon" href="favicon.ico" type="image/ico">
    <meta name="keywords" content="LightYear,光年,后台模板,后台管理系统,光年HTML模板">
    <meta name="description" content="LightYear是一个基于Bootstrap v3.3.7的后台管理系统的HTML模板。">
    <meta name="author" content="yinqi">
    <link href="css/bootstrap.min.css" rel="stylesheet">
    <link href="css/materialdesignicons.min.css" rel="stylesheet">
    <link href="css/style.min.css" rel="stylesheet">
</head>

<body>
<div class="container-fluid p-t-15">

    <div class="row">
        <div class="col-lg-12">
            <div class="card">
                <div class="card-toolbar clearfix">
                    <form class="pull-right search-bar" method="get" action="#!" role="form">
                        <div class="input-group">
                            <div class="input-group-btn">
                                <input type="hidden" name="search_field" id="search-field" value="title">
                                <button class="btn btn-default dropdown-toggle" id="search-btn" data-toggle="dropdown" type="button" aria-haspopup="true" aria-expanded="false">
                                    标题 <span class="caret"></span>
                                </button>
                                <ul class="dropdown-menu">
                                    <li> <a tabindex="-1" href="javascript:void(0)" data-field="title">标题</a> </li>
                                    <li> <a tabindex="-1" href="javascript:void(0)" data-field="cat_name">栏目</a> </li>
                                </ul>
                            </div>
                            <input type="text" class="form-control" value="" name="keyword" placeholder="请输入名称">
                        </div>
                    </form>
                    <div class="toolbar-btn-action">
                        <a class="btn btn-primary m-r-5" href="#!"><i class="mdi mdi-plus"></i> 新增</a>
                        <a class="btn btn-success m-r-5" href="#!"><i class="mdi mdi-check"></i> 启用</a>
                        <a class="btn btn-warning m-r-5" href="#!"><i class="mdi mdi-block-helper"></i> 禁用</a>
                        <a class="btn btn-danger" href="#!"><i class="mdi mdi-window-close"></i> 删除</a>
                    </div>
                </div>
                <div class="card-body">

                    <div class="table-responsive">
                        <table class="table table-bordered">
                            <thead>
                            <tr>
                                <th>序号</th>
                                <th>学号</th>
                                <th>姓名</th>
                                <th>性别</th>
                                <th>生日</th>
                                <th>班级</th>
                                <th>操作</th>
                            </tr>
                            </thead>
                            <tbody>
                            <c:forEach items="${list}" var="stu" varStatus="vs">

                                <tr>
                                    <td >${vs.index+1} </td>

                                    <td>${stu.no}</td>
                                    <td>${stu.name}</td>
                                    <td>${stu.gender==1?"男":"女"}</td>
                                    <td>${stu.birthday}</td>
                                    <td>${stu.className}</td>
                                    <td>
                                        <div class="btn-group">
                                            <a class="btn btn-xs btn-default" href="#!" title="编辑" data-toggle="tooltip"><i class="mdi mdi-pencil"></i></a>
                                            <a class="btn btn-xs btn-default" href="#!" title="删除" data-toggle="tooltip"><i class="mdi mdi-window-close"></i></a>
                                        </div>
                                    </td>
                                </tr>

                            </c:forEach>


                            </tbody>
                        </table>
                    </div>


                </div>
            </div>
        </div>

    </div>

</div>

<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/bootstrap.min.js"></script>
<script type="text/javascript" src="js/main.min.js"></script>
<script type="text/javascript">
    $(function(){
        $('.search-bar .dropdown-menu a').click(function() {
            var field = $(this).data('field') || '';
            $('#search-field').val(field);
            $('#search-btn').html($(this).text() + ' <span class="caret"></span>');
        });
    });
</script>
</body>
</html>
相关推荐
用户1563068103511 小时前
Day01 | Java 基础(Java SE)
java
Pedantic1 小时前
SwiftUI 手势层级(Gesture Hierarchy)详解
前端
飘尘1 小时前
前端转型全栈(Java后端)的快速上手指引
前端·后端·全栈
一颗烂土豆2 小时前
Meshopt 压缩深度解析,为什么它比 Draco 更快
前端·javascript·webgl
浏览器工程师3 小时前
AI Agent 接浏览器任务,先别让它一路点到底
前端·后端
行者全栈架构师3 小时前
Maven dependency:tree 的 8 个高级用法
java·后端
雨季mo浅忆3 小时前
VSCode自动格式化三要素
前端
爱勇宝3 小时前
深扒 Anthropic 1680 位工程师简历:应届生几乎没机会,AI 公司最缺的不是博士
前端·后端·程序员
kyriewen4 小时前
同事每天催我 Code Review,我写了个脚本让 AI 替我 review PR——现在他反过来催 AI 了
前端·javascript·ai编程