Java Web应用程序实现用户登录、学生信息管理和验证码验证以及页面跳转等基本功能(IDEA)含(Ajax、JSTL)
一、具体框架以及代码功能的展示:
1. 文件结构
-
web03: 项目根目录。
-
src: 包含Java源代码。
-
cn.lvb: 主包。
-
bean: 包含实体类,如
Book
和Student
。 -
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.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 {
@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
文件,系统能够提供一个功能丰富、用户友好的后台管理界面,支持多模块导航和动态内容加载,提升用户的操作体验。
<%@ 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 © 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 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
对象。 -
参数依次为书籍的
id
、name
、author
、price
和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 的主要功能的简单列举:
-
处理登录请求
-
通过
GET
和POST
方法接收客户端提交的登录请求。
-
-
获取请求参数
-
从请求中提取用户名 (
username
)、密码 (password
) 和验证码 (verifyCode
)。
-
-
验证码验证
-
从会话 (
HttpSession
) 中获取服务器生成的验证码,并与用户提交的验证码进行比较。 -
如果验证码不匹配,返回错误信息:
{"code":-1,"msg":"验证码错误"}
。
-
-
用户名和密码验证
-
检查用户名是否为
tom
,密码是否为123456
(硬编码验证)。 -
如果匹配,将用户名存储到会话中,并返回成功信息:
{"code":1,"msg":"登录成功"}
。 -
如果不匹配,返回错误信息:
{"code":-1,"msg":"用户名密码错误"}
。
-
-
会话管理
-
登录成功后,将用户名存储在会话中,以便后续请求可以使用该信息。
-
-
返回 JSON 响应
-
无论登录成功还是失败,都以 JSON 格式返回状态码 (
code
) 和消息 (msg
)。
-
-
字符编码处理
-
设置请求和响应的字符编码为
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 {
@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
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:
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);
}
}
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>