当前位置: 首页 > news >正文

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

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

 

1. 文件结构

  • web03: 项目根目录。

    • src: 包含Java源代码。

      • cn.lvb: 主包。

        • bean: 包含实体类,如 Book 和 Student

        • controller: 包含处理HTTP请求的Servlet类,如 DoLoginIndexStuList1VerifyCode

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

    • web: 包含Web资源。

      • css: 样式表文件。

      • fonts: 字体文件。

      • images: 图片资源。

      • js: JavaScript文件。

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

      • jsp: 包含JSP页面,如 index.jsp 和 stu_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,应用程序能够确保只有已登录的用户才能访问主页,从而保护敏感资源不被未授权用户访问。

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 {@Overrideprotected 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);}@Overrideprotected 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 文件,系统能够提供一个功能丰富、用户友好的后台管理界面,支持多模块导航和动态内容加载,提升用户的操作体验。


<%@ 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 文件,系统能够提供一个安全、用户友好的登录界面,确保只有授权用户才能访问后台管理系统的功能。

<!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 URLvar 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 对象。

    • 参数依次为书籍的 idnameauthorprice 和 description

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应用程序中非常常见,特别是在涉及数据管理和业务逻辑处理的场景中。

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应用程序中非常常见,特别是在涉及数据管理和业务逻辑处理的场景中。

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. 处理登录请求

    • 通过 GET 和 POST 方法接收客户端提交的登录请求。

  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,确保正确处理中文字符。

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 {@Overrideprotected 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}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}
}

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

StuList1

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 {@Overrideprotected 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);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}
}

VerifyCode:

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 {@Overrideprotected 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;//创建一副内存图像:BufferedImageBufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);//得到属于该图片的画笔:GraphicsGraphics 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);//输出到浏览器的页面上:ImageIOImageIO.write(image, "jpg", response.getOutputStream());}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}
}

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);}}

 


<%@ 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>

相关文章:

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

一、具体框架以及代码功能的展示&#xff1a; 1. 文件结构 web03: 项目根目录。 src: 包含Java源代码。 cn.lvb: 主包。 bean: 包含实体类&#xff0c;如 Book 和 Student。 controller: 包含处理HTTP请求的Servlet类&#xff0c;如 DoLogin, Index, StuList1, VerifyCode。 …...

【Mybatis-plus】在mybatis-plus中 if test标签如何判断 list不为空

博主介绍&#xff1a;✌全网粉丝22W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

MySQL 事务(Transaction)详解

MySQL 事务&#xff08;Transaction&#xff09;详解 1. 什么是事务&#xff1f; 事务&#xff08;Transaction&#xff09;是一组要么全部执行&#xff0c;要么全部回滚的 SQL 语句&#xff0c;用于保证数据一致性。事务一般用于银行转账、订单支付等操作&#xff0c;确保多个…...

Redis 知识点梳理

第一章 NoSQL数据库发展历史简介 1、 Web的历史发展历程 web1.0时代简介 web 1.0是以编辑为特征&#xff0c;网站提供给用户的内容是网站编辑进行编辑处理后提供的&#xff0c;用户阅读网站提供的内容这个过程是网站到用户的单向行为web1.0时代的代表站点为新浪&#xff0c;…...

github上传操作简单说明

前期准备 0.下载git&#xff08;如果已经有了就不用了&#xff09; 1.在GitHub上新建一个存储库 2.先在本地创建一个目录作为本地库目录&#xff0c;在目录里打开git bash进行上传 上传过程 echo "# Garbled_repair" >> README.md 作用&#xff1a;创建一个…...

在 ASP .NET Core 9.0 中使用 Scalar 创建漂亮的 API 文档

示例代码&#xff1a;https://download.csdn.net/download/hefeng_aspnet/90407900 Scalar 是一款可帮助我们为 API 创建精美文档的工具。与感觉有些过时的默认 Swagger 文档不同&#xff0c;Scalar 为 API 文档提供了全新而现代的 UI。其简洁的设计让开发人员可以轻松找到测试…...

针对 pdf.mjs 文件因 MIME 类型错误导致的 Failed to load module script 问题解决方案

Failed to load module script: Expected a JavaScript module script but the server responded with a MIME type of “application/octet-stream”. Strict MIME type checking is enforced for module scripts per HTML spec. pdf.mjs 这种问题该如何处理 nginx 针对 pdf.…...

Flink介绍与安装

Apache Flink是一个在有界数据流和无界数据流上进行有状态计算分布式处理引擎和框架。Flink 设计旨在所有常见的集群环境中运行&#xff0c;以任意规模和内存级速度执行计算。 一、主要特点和功能 1. 实时流处理: 低延迟: Flink 能够以亚秒级的延迟处理数据流&#xff0c;非常…...

《双指针算法指南:LeetCode 经典题解(C++实现)》

《双指针算法指南&#xff1a;LeetCode 经典题解&#xff08;C实现&#xff09;》 —— 从快慢指针到对撞指针&#xff0c;刷题效率提升 200%&#xff01; 常⻅的双指针有两种形式&#xff0c;⼀种是对撞指针&#xff0c;⼀种是左右指针。 对撞指针&#xff1a; ⼀般⽤于顺…...

kaggle上经典泰坦尼克项目数据分析探索

之前了解在kaggle上这个项目很火&#xff0c;最近想要加强一下python数据分析&#xff0c;所以在kaggle上找到这个项目进行学习探索&#xff0c;下面是将一些学习资料以及过程整理出来。 一、首先我们了解一下项目背景以及如何找到这个项目。 kaggle项目地址: https://www.k…...

【深度学习】多目标融合算法(五):定制门控网络CGC(Customized Gate Control)

目录 一、引言 二、CGC&#xff08;Customized Gate Control&#xff0c;定制门控网络&#xff09; 2.1 技术原理 2.2 技术优缺点 2.3 业务代码实践 2.3.1 业务场景与建模 2.3.2 模型代码实现 2.3.3 模型训练与推理测试 2.3.4 打印模型结构 三、总结 一、引言 上一…...

Ubuntu上查看GPU使用情况并释放内存

先用nvidia-smi查看GPU当前使用情况 再用fuser 命令查找对应显卡上占用 GPU 的进程 最后查到了用kill -9强制杀掉进程&#xff08;PID&#xff09;即可...

大数据学习栈记——HBase安装

本文介绍大数据技术中流行的非关系型数据库HBase的安装&#xff0c;操作系统&#xff1a;Ubuntu24.04 安装Zookeeper 安装HBase前需要先安装Zookeeper&#xff0c;HBase使用Zookeeper作为其分布式协同服务&#xff0c;存储了HBase集群的元数据信息&#xff0c;并提供了分布式…...

[入门]NUC13配置Ubuntu20.04详细步骤

文章目录 1. 安装Ubuntu20.041.1 制作系统启动盘1.1.1 下载镜像文件1.1.2 配置启动盘 1.2 安装内存条、硬盘1.3 安装系统 2. 网卡驱动配置2.1 关闭安全启动2.2 安装intel官方网卡驱动backport2.2.1 第四步可能会出现问题 2.3 ubuntu官方的驱动2.4 重启 3. 软件安装3.1 录屏软件…...

【实战指南】用MongoDB存储文档和图片等大文件(Java实现)

一、前言 在现代应用开发中,经常需要处理和存储大量的文档、图片等大文件。传统的关系型数据库在处理这类大文件时,往往会面临性能瓶颈、存储成本高等问题。而 MongoDB 作为一款流行的 NoSQL 数据库,提供了 GridFS 规范,能够很好地解决大文件存储的问题。GridFS 可以将大文…...

使用Gitee Go流水线部署个人项目到服务器指南

使用Gitee Go流水线部署个人项目到服务器指南 前言&#xff01;&#xff01;&#xff01; 本文解决的问题&#xff1a; 你有一台ECS服务器&#xff0c;你在上面部署了一个Java服务也就是一个jar&#xff0c;你觉着你每次手动本地打包&#xff0c;上传&#xff0c;在通过命令去…...

使用Three.js渲染器创建炫酷3D场景

引言 在当今数字化的时代&#xff0c;3D图形技术正以其独特的魅力在各个领域掀起波澜。从影视制作到游戏开发&#xff0c;从虚拟现实到网页交互&#xff0c;3D场景以其强烈的视觉冲击力和沉浸式的体验&#xff0c;成为了吸引用户、传达信息的重要手段。而Three.js&#xff0c;…...

Spring Boot 集成 Elasticsearch怎样在不启动es的情况下正常启动服务

解释 在spingboot 集成es客户端后&#xff0c;每当服务启动时&#xff0c;服务默认都会查看es中是否已经创建了对应的索引&#xff0c;如果没有索引则创建。基于上面的规则我们可以通过配置不自动创建索引来达到在没有es服务的情况下正常启动服务。 解决办法 在entity类的Docu…...

明远智睿SD2351核心板:多接口融合,破解边缘计算难题

在边缘计算领域&#xff0c;明讯智睿SD2351核心板凭借丰富的接口资源与异构计算架构&#xff0c;成为工业网关与智能终端的理想选择。硬件配置升级 :处理器:四核Cortex-A35&#xff0c;256KB L2缓存&#xff0c;动态调频降低功耗;存储性能:emMC 5.0 HS400模式读写速度提升40%&a…...

xampp安装教程与配置

一、安装 XAMPP &#xff08;一&#xff09;下载 访问官网&#xff1a;打开浏览器&#xff0c;访问 XAMPP 官方网站&#xff08;https://www.apachefriends.org/zh_cn/index.html&#xff09;。 选择版本&#xff1a;根据你的操作系统&#xff08;Windows、macOS 或 Linux&am…...

设计模式之单例模式(Singleton Pattern)

单例模式&#xff08;Singleton Pattern&#xff09;是一种常用的设计模式&#xff0c;确保一个类只有一个实例&#xff0c;并提供一个全局访问点。单例模式在许多场景中非常有用&#xff0c;例如配置管理、日志记录、线程池等。 ### **1. 单例模式的特点** 1. **唯一实例**&a…...

Androidstudio实现引导页文字动画

文章目录 1. 功能需求2. 代码实现过程1. 编写布局文件2. 实现引导页GuideActivity 3. 总结4. 效果演示5. 关于作者其它项目视频教程介绍 1. 功能需求 1、引导页具有两行文字&#xff08;“疫情在前”和“共克时艰”&#xff09;&#xff0c;和向上的 图标。 2、进入【引导页】…...

【linux】线程概念与控制

引言 当现代CPU的晶体管密度逼近物理极限&#xff0c;多核架构已成为突破性能瓶颈的必由之路。在这个计算密集型任务与异步IO需求并行的时代&#xff0c;多线程编程不再是可选项&#xff0c;而是开发者必须掌握的核心技能。Linux作为承载着全球90%云计算负载的操作系统&#xf…...

Cesium 自定义路径导航材质

cesium 自定义路径导航纹理图片随便更换&#xff0c;UI 提供设计图片即可达到效果&#xff1b; 打开小马的weix 关注下 搜索“技术链” 回复关键词《《路径》》获取原始代码&#xff1b; 拿到就能用轻松解决&#xff01;帮忙点个关注吧&#xff01;...

用 pytorch 从零开始创建大语言模型(五):预训练无标注数据

用 pytorch 从零开始创建大语言模型&#xff08;五&#xff09;&#xff1a;预训练无标注数据 5 预训练无标注数据5.1 评估文本生成模型5.1.1 使用 GPT 生成文本5.1.2 计算文本生成损失5.1.3 计算训练集和验证集的损失 5.2 训练 LLM5.3 解码策略以控制随机性5.3.1 温度缩放&am…...

[AI速读]混合验证方案:如何高效解决RISC-V向量扩展的验证难题

RISC-V作为一种开源指令集架构,近年来在AI和高性能计算领域备受关注。其向量扩展(RVV)为处理并行数据提供了强大的支持,但复杂的异常处理和冒险检测机制也带来了验证上的巨大挑战。本文将结合一篇技术论文,解析一种混合验证方案,帮助开发者更高效地解决RVV的验证问题。 一…...

模型空间、图纸空间、布局(Layout)之间联系——CAD c#二次开发

在 AutoCAD 的二次开发中&#xff0c;**模型空间&#xff08;Model Space&#xff09;**、**图纸空间&#xff08;Paper Space&#xff09;** 和 **布局&#xff08;Layout&#xff09;** 是三个核心概念&#xff0c;它们的关系及开发中的操作逻辑如下&#xff1a; --- 1. 模…...

Linux 日常开发常用命令(解释-全)

帮助类 #查看cd命令的帮助信息 [rootcentos100 ~] help cd # 查看网卡配置信息 [rootcentos100 ~] ifconfig # 检测到目标主机是否连接正常 [rootcentos100 ~] ping IP地址[rootcentos100 ~] ssh [-p port] userremote #远程登录user 是在远程机器上的用户名&#xff0c;如果…...

数据库监控:确保业务连续性和用户体验

在数字化时代&#xff0c;数据库作为企业的数据心脏&#xff0c;其重要性不言而喻。无论是交易系统、客户关系管理系统&#xff0c;还是数据分析平台&#xff0c;都离不开数据库的支撑。然而&#xff0c;数据库的运行状态和性能直接影响着企业的业务连续性和用户体验。因此&…...

Java面试黄金宝典9

1. Redis 持久化机制 Redis 提供了两种主要的持久化机制&#xff1a;RDB&#xff08;Redis Database&#xff09;和 AOF&#xff08;Append Only File&#xff09;&#xff0c;下面对这两种机制进行详细介绍。 RDB&#xff08;Redis Database&#xff09; 原理&#xff1a;RDB …...

【C#】WinForm自定义控件及窗体

前言 WinForm&#xff08;Windows Forms&#xff09;是Microsoft.NET框架中的技术&#xff0c;用于开发Windows桌面应用程序。它提供了一套丰富的控件和组件。通过拖放控件、编写事件处理程序等方式快速构建用户界面。 通过属性窗口定制这些控件的外观和行为。 通过数据绑定&am…...

VideoHelper 油猴脚本,重塑你的视频观看体验

VideoHelper 油猴脚本&#xff0c;重塑你的视频观看体验 在日常上网看视频时&#xff0c;你是否也被这些问题困扰&#xff1a;视频网站开头的广告又臭又长&#xff0c;找个合适的播放倍速要在一堆选项里翻半天&#xff0c;每次手动调音量、点全屏按钮繁琐又影响沉浸感&#xf…...

从收藏夹到知识图谱:书签管理器如何重塑你的信息获取方式?

在信息爆炸的今天&#xff0c;浏览器收藏夹早已沦为 “数字垃圾堆”—— 杂乱无章的网址、重复的标签、过期的链接&#xff0c;不仅降低效率&#xff0c;更成为信息焦虑的源头。智能书签管理器通过AI分类、跨平台同步、隐私保护等黑科技&#xff0c;重塑您的数字生活方式。书签…...

SOFABoot-07-版本查看

前言 大家好&#xff0c;我是老马。 sofastack 其实出来很久了&#xff0c;第一次应该是在 2022 年左右开始关注&#xff0c;但是一直没有深入研究。 最近想学习一下 SOFA 对于生态的设计和思考。 sofaboot 系列 SOFABoot-00-sofaboot 概览 SOFABoot-01-蚂蚁金服开源的 s…...

[极客大挑战 2019]Http_3.19BUUCTF练习day3(1)

BUUCTF练习day3(1)_[极客大挑战 2019]Http 打开靶场&#xff0c;查看源码(如果在做题时没有什么发现就查看源码) 打开Secret.php提示没有来自https://Sycsecret.buuoj.cn 添加Referer头为https://Sycsecret.buuoj.cn&#xff08;提示说我们没有来自那个网址&#xff0c;那我们…...

golang Error的一些坑

golang Error的一些坑 golang error的设计可能是被人吐槽最多的golang设计了。 最经典的err!nil只影响代码风格设计&#xff0c;而有一些坑会导致我们的程序发生一些与我们预期不符的问题&#xff0c;开发过程中需要注意。 ​​ errors.Is​判断error是否Wrap不符合预期 ​…...

弱网测试:全链路实战、高阶策略与自动化落地

在移动互联网时代,网络环境的不确定性成为用户体验的“隐形杀手”。弱网测试不仅是质量保障的必备环节,更是提升用户留存率和业务转化率的战略手段。 本文将从 工具链深度配置、复杂场景模拟、性能优化底层逻辑 和 自动化流水线集成 四个维度,彻底解析弱网测试的完整方法论…...

Ubuntu检查并启用 Nginx 的stream模块或重新安装支持stream模块的Nginx

stream 模块允许 Nginx 处理 TCP 和 UDP 流量&#xff0c;常用于负载均衡和端口转发等场景。本文将详细介绍如何检查 Nginx 是否支持 stream 模块&#xff0c;以及在需要时如何启用该模块。 1. 检查 Nginx 是否支持 stream 模块 首先&#xff0c;需要确认当前安装的 Nginx 是…...

mac brew 安装的php@7.4 打开redis扩展

1. 找到php7.4的pecl目录 一般在这个位置 cd /usr/local/Cellar/php7.4/7.4.33_8/pecl/20190902 ls 一下 有个 redis.so 于是 直接去php.ini编辑了 php.ini的路径 vim /usr/local/etc/php/7.4/php.ini 把938行添加进去 然后重启一下 php7.4 brew services restart ph…...

Redis 内存管理

Redis 内存管理 1. Redis 给缓存数据设置过期时间的作用 给缓存数据设置过期时间&#xff08;TTL, Time-To-Live&#xff09;有以下几个重要作用&#xff1a; (1) 自动释放内存 避免缓存数据无限增长&#xff0c;导致 Redis 内存溢出。例如&#xff0c;在 会话管理、短连接…...

学习CSS滤镜属性 `filter: invert()`

一、核心机制 数学原理 invert(1) 对每个像素的RGB通道执行 颜色反相计算&#xff1a; 新通道值 255 - 原通道值 例如 rgb(255,0,0)&#xff08;纯红&#xff09;会转换为 rgb(0,255,255)&#xff08;青色&#xff09;。 透明度处理 该滤镜会保留元素的Alpha通道&#xff08;…...

网络空间安全专业发展历程及开设院校

一、专业发展历程 1. 早期探索阶段&#xff08;1990年代末—2000年代初&#xff09; &#xff08;1&#xff09;背景&#xff1a; 1990年代互联网进入中国&#xff0c;计算机病毒、黑客攻击等问题逐渐显现&#xff0c;社会对信息安全人才的需求开始萌芽。 &#xff08;2&…...

Linux中mutex机制

在Linux中&#xff0c;mutex是一种用于多线程编程的同步机制&#xff0c;用于保护共享资源&#xff0c;防止多个线程同时访问或修改这些资源&#xff0c;从而避免竞态条件的发生。mutex 是“mutual exclusion”的缩写&#xff0c;意为“互斥”。 1. Mutex 的基本概念 互斥锁&…...

Web网页

1.结构与表现分离 HTML用于结构 css用于表现&#xff0c;增加了丰富的样式效果&#xff0c;极大满足了开发者的需求 选择器&#xff1b;用于指定css样式作用的html对象{}选择某个属性 p标签 color;本颜色 font-size:子属性 字大小 font-family&#xff1b;字体 font-…...

Redis 在windows下的下载安装与配置

参考链接:https://developer.aliyun.com/article/1395346 下载 Redis 访问 Redis 下载地址&#xff1a;https://github.com/tporadowski/redis/releases 下载 Redis 时&#xff0c;你可以选择 ZIP 包或 MSI 安装&#xff1a; ZIP包&#xff1a;需要手动解压、初始化、配置和…...

基于随机森林回归预测葡萄酒质量

基于随机森林回归预测葡萄酒质量 1.作者介绍2.随机森林算法与数据集介绍2.1定义2.2核心思想2.3主要步骤2.4数据集介绍 3.算法实现3.1数据加载与探索3.2数据可视化3.3数据预处理&#xff08;标准化、划分训练/测试集&#xff09;3.4模型训练与优化&#xff08;随机森林回归 超参…...

在大数据开发中ETL是指什么?

hello宝子们...我们是艾斯视觉擅长ui设计和前端数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在数字经济时代&#xff0c;数据已成为企业最核心的资产。然而&#xff0c;分散在业务系统、日志文件…...

Centos操作系统安装及优化

Centos操作系统安装及优化 零、环境概述 主机名 centos版本 cpu 内存 Vmware版本 ip地址 test CentOS Linux release 7.6.1810 (Core) 2C 2G 15.5.1 10.0.0.10 一、介质下载 1、7.6版本下载 CentOS7.6标准版下载链接: https://archive.kernel.org/centos-vault/7.6.1810/i…...

2025年03月10日人慧前端面试(外包滴滴)

目录 普通函数和箭头函数的区别loader 和 plugin 的区别webpack 怎么实现分包&#xff0c;为什么要分包webpack 的构建流程变量提升react 开发中遇到过什么问题什么是闭包vue 开发中遇到过什么问题vue中的 dep 和 watcher 的依赖收集是什么阶段什么是原型链react setState 是同…...

NLP高频面试题(十)——目前常见的几种大模型架构是啥样的

深入浅出&#xff1a;目前常见的几种大模型架构解析 随着Transformer模型的提出与发展&#xff0c;语言大模型迅速崛起&#xff0c;已经成为人工智能领域最为关注的热点之一。本文将为大家详细解析几种目前常见的大模型架构&#xff0c;帮助读者理解其核心差异及适用场景。 1…...