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

实现用户登录系统的前后端开发

**一、**实验名称

实现用户登录系统的前后端开发。

**二、**参考资料

Web开发技术第一章课件。

**三、**实验目的

1.练习前端基本技术的使用。

2.练习使用Servlet/JSP开发简单后端程序。

3.练习使用Tomcat发布Web应用。

4.练习使用Spring Boot开发简单的后端程序。

**四、**实验内容

选做一: 使用Servlet和JSP实现后端

1.参照课件,在PostgreSQL中创建webdemo数据库,在数据库中创建users表并插入一条记录。

2.把Tomcat压缩包解压到自己的电脑,把PostgreSQL的JDBC驱动程序postgresql-42.5.0.jar复制到Tomcat的lib目录下。

3.在IDEA中创建webdemo项目。

4.把Tomcat安装目录下的lib目录中servlet-api.jar和jsp-api.jar添加到项目的库中。

5.在项目文件文件夹下新建web目录,在该目录下新建login.html,该文件内容如下:

5f60517c64c4f0f6e93ecf5b1e045298.jpeg

13820e7664f67da6aea63a2ed5ee5163.jpeg

d80a168870088b13aad127f0d50c9245.jpeg

7f1985f14ec9d7b8fc1c8cb2928eb213.jpeg

ba8b7cc0791ab1d02afdce00a0028020.jpeg

36c35b5ad4d3adf77aa3b422e856f652.jpeg

fd0e4ee7449d2a28d442579779a5de06.jpeg

286eb9cb1ea49a92532f4652fdb4dd0a.jpeg

选做二:使用Spring Boot实现后端

前端实现部分的login.html、login.css和login.js的内容和选做一基本相同,区别在于login.html中form标签的action属性的值为action=“/login”,login.html文件、存放login.css的css文件夹和存放login.js的js文件夹都要放到Spring Boot项目的resources目录下的static目录中。

后端实现部分参照Web开发技术第一章课件77页:使用IDEA创建Spring Boot项目-89页。

实验报告

一、程序代码

  1. 在项目文件文件夹下新建web目录,在该目录下新建login.html,该文件内容如下:

2.在web目录下新建css目录,在该目录下新建login.css文件,内容如下:

body {
position: absolute;
height: 100%;
width: 100%;
display: flex;
justify-content:center;
align-items: center;
}
.center {
display: flex;
justify-content: center;
align-items: center;
width: 600px;
height:300px;
background-color: #f0f0f0;
}
div {box-shadow: 0px 0px 0px #888888;}

3.在web目录下新建js目录,在该目录下新建login.js文件,内容如下:

function valid() {
let user = document.getElementById(“username”);
let password = document.ElementById(“password”);
if (username.value == “” password.value == “”) {
alert(“用户名或密码不能为空!”);
return false;
}else {
return true;
}
}

4.在web目录下新建result.jsp,内容如下:

<%@ page contentType=“text/html; charset=utf-8”%>

用户登录结果

${msg}

5.在项目的src目录下新建com.example.webdemo软件包,在该包下新建database.properties文件,该文件内容如下:

driver=org.postgresql.Driver
vrl=jdbc:postgresql://localhost:5432/webdome
username=postgres
password=12345678

6.在com.example.webdemo软件包下新建util、model、dao和controller四个软件包。

7.在util包下新建DBUtil类,该类内容如下:

package com.example.webdemo.util;

import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

/**
* 数据库连接与操作工具类
*/
public class DBUtil {
private static String driver; // 数据库驱动字符串
private static String url; // 连接URL字符串
private static String username; // 数据库用户名
private static String password; // 用户密码
private static Connection conn = null;
private static PreparedStatement pst = null;
private static ResultSet rs = null;

static {
try {
//静态代码块,在类加载的时候执行
init();
} catch (Exception ex) {
Logger.getLogger(DBUtil.class.getName()).log(Level.SEVERE, null, ex);
}
}
/**
* 初始化连接参数,从配置文件里获得
*
* @throws IOException
*/
public static void init() throws Exception {
Properties params = new Properties();
String configFile = “com/example/webdome/database.properties”;//配置文件路径
//加载配置文件到输入流中
InputStream is = DBUtil.class.getClassLoader().getResourceAsStream(configFile);

//从输入流中读取属性列表
params.load(is);

//根据指定的获取对应的值
driver = params.getProperty(“driver”);
url = params.getProperty(“url”);
username = params.getProperty(“username”);
password = params.getProperty(“password”);
Class.forName(driver);
}
/**
* 获取数据库连接对象。
*
* @return
* @throws ClassNotFoundException
* @throws SQLException
*/
public static void getConnection() throws Exception {
conn = DriverManager.getConnection(url, username, password);
}

/**
* 执行SQL语句,可以进行查询
*/
public static ResultSet executeQuery(String preparedSql, Object… param) throws Exception {
getConnection();
pst = conn.prepareStatement(preparedSql);
if (param != null) {
for (int i = 0; i < param.length; i++) {
// 为预编译sql设置参数
pst.setObject(i + 1, param[i]);
}
}
rs = pst.executeQuery();
return rs;
}
/**
* 执行SQL语句,可以进行增、删、改的操作,不能执行查询
*/
public static int executeUpdate(String preparedSql, Object… param) throws Exception {
int num;
getConnection();
try (Connection connection = conn;
PreparedStatement pstmt = connection.prepareStatement(preparedSql)) {
if (param != null) {
for (int i = 0; i < param.length; i++) {
pstmt.setObject(i + 1, param[i]); // 为预编译sql设置参数
}
}
num = pstmt.executeUpdate();
return num;
}

}
public static void closeAll() throws Exception{
// 如果rs不空,关闭rs
if (rs != null) {
rs.close();
}
// 如果pstmt不空,关闭pstmt
if (pst != null) {
pst.close();
}
// 如果conn不空,关闭conn
if (conn != null) {
conn.close();
}
}

}

8.在model包下新建User类,该类内容如下:

package com.example.webdemo.model;

public class User {
private String username;
private String password;
public User(String name,String pass){
username=name;
password=pass;
}
public String getUsername(){
return username;
}
public String getPassword(){
return password;
}
}

9.在dao包下新建UserDao接口,该接口内容如下:

package com.example.webdemo.dao;

import com.example.webdemo.model.User;

import java.util.Optional;

public interface UserDao {
Optional getUser(String username, String password) throws Exception;
}

10.在dao包下新建UserDaoImpl类,该类内容如下:

package com.example.webdemo.dao;

import com.example.webdemo.model.User;
import com.example.webdemo.util.DBUtil;

import java.sql.ResultSet;
import java.util.Optional;

public class UserDaoImpl implements UserDao{
@Override
public Optional getUser(String username,String password) throws Exception{
ResultSet rs = DBUtil.executeQuery(“select * from users where username= and password=”,username,password);
Optional result=Optional.empty();
if (rs.next()){
result= Optional.of(new User(rs.getString(“username”),rs.getString(“password”)));
}
DBUtil.closeAll();
return result;
}
}

11.在controller包下新建LoginController类,该类内容如下:

package com.example.webdemo.controller;

import com.example.webdemo.dao.UserDao;
import com.example.webdemo.dao.UserDaoImpl;
import com.example.webdemo.model.User;
import jakarta.servlet.Servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.util.Optional;

@WebServlet(“/login”)
public class LoginController extends HttpServlet {
private UserDao userDao= new UserDaoImpl();
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {
String username = req.getParameter(“username”);
String password = req.getParameter(“password”);
String msg = “登陆成功,欢迎”+username+“!”;
try {
Optional daoResult = userDao.getUser(username, password);
if (daoResult.isEmpty()) {
msg = “登陆失败,用户名或密码错误!”;
}
}
catch (Exception e) {
msg = “登陆失败,数据库访问错误!”;
}
req.setAttribute(“msg”,msg);
req.getRequestDispatcher(“/WEB-INF/jsp/resylt.jsp”).forward(req,resp);
}
}

二、实验结果(含程序运行截图)

输入账号密码后,后台访问数据库,显示欢迎admin用户界面:

7285dc4ae3e6495d84d4272c0c149e4f.png

  • 出现问题及解决方法

问题1:在命令行窗口,输入startup并回车启动Tomcat服务器时,弹出的tomcat窗口为乱码:

bb0a83a52e60486285561a96306e9d8b.png

并且打开Edge浏览器,在地址栏中输入localhost:8080,显示404,说明Tomcat服务器没有启动成功:

做法:需要设置环境变量

  1. 右键单击此电脑,选择属性

df7ad2ffb4ba458c84371cd2e1ae6bc0.png

2.选择高级系统设置

fe904c53e9cc4d61a1ad0a7c92c0b818.png

3.选择环境变量

6a4b425329764daea13b24343c69074d.png

4.在系统变量下方选择新建

7cab741b58e24b2c9d474bc6829f04e1.png

72ea7c6618b64af185242dae1e7cb3ed.png

5.选择环境变量的path进行编辑、新建如下图所示

267cf07d34374561a41bb1c764c3653b.png

6.打开Edge浏览器,在地址栏中输 入localhost:8080,能显示 如下图形所示的默认页面,说明Tomcat服务器启动成功:

eacd3950c2474fe99a597cf05517e577.png

问题2:在输入 startup并回车启动Tomcat服务器后,打开Edge浏览器,在地址栏中输 入localhost:8080,显示无法访问此页面,如下图所示

1fba1a7d467d48b79ba60bac99b603c5.png

错误说明:是因为在输入 startup并回车启动Tomcat服务器后,关闭了Tomcat窗口导致的。不可关闭Tomcat窗口,只需重新在打开命令行窗口,输入: cd D: omcat10in 进入到tomcat10的bin目录,输入 startup并回车启动Tomcat服务器;打开Edge浏览器,在地址栏中输 入localhost:8080,如果能显示 如右侧图形所示的默认页面,说明Tomcat服务器启动成功:

eacd3950c2474fe99a597cf05517e577.png

问题3:数据库连接不上,输入账号密码后页面显示404,无法解决

解决办法:添加lib文件夹导入jar包,点击FIle-Project Structure-Arifacts,选择自己的项目,然后在WEB-INF文件夹下创建lib文件夹

四、 实验心得

  1. 前端基本技术的使用,按照以下步骤进行:

  2. 学习HTML和CSS,并练习编写HTML和CSS代码:HTML是用于编写网页结构的标记语言,而CSS则用于美化HTML页面。通过学习这些技术。确保理解HTML的基本标签和CSS的语法,并能运用它们来创建和美化网页。通过编写一些简单的网页来实践学到的HTML和CSS知识。尝试使用不同的标签和CSS属性来创建页面布局、添加样式和动画效果。

  3. 要使用Tomcat发布Web应用,你可以按照以下步骤进行操作:

  4. 确保你已经安装了Tomcat服务器。

  5. 将WAR文件(用于分发和部署Web应用程序的归档文件,其中包含了应用程序的所有资源(如HTML、CSS、JavaScript文件)和编译后的Java类文件)复制到Tomcat的webapps目录下。Tomcat会自动检测该目录下的WAR文件,并将其解压缩到相应的目录中,然后启动Web应用程序。

如果你使用的是Tomcat的默认配置,那么 webapps 目录通常位于Tomcat安装目录下的 webapps 文件夹中。

如果你的Web应用程序的上下文路径不是根路径),需要在webapps目录下创建一个与上下文路径相同名称的文件夹,并将WAR文件复制到该文件夹中。

  1. 启动Tomcat服务器。你可以通过命令行启动Tomcat,或者在Windows上使用Tomcat提供的启动脚本。启动后,Tomcat将开始监听配置的端口(默认为8080),并等待客户端的请求。
  2. 访问你的Web应用程序。在浏览器中输入Tomcat服务器的地址和Web应用程序的上下文路径,例如hp:/localhost:8080myapp,你将能够访问到你发布的Web应用程序。

相关文章:

实现用户登录系统的前后端开发

**一、**实验名称 实现用户登录系统的前后端开发。 **二、**参考资料 Web开发技术第一章课件。 **三、**实验目的 1.练习前端基本技术的使用。 2.练习使用Servlet/JSP开发简单后端程序。 3.练习使用Tomcat发布Web应用。 4.练习使用Spring Boot开发简单的后端程序。 **…...

双刃剑下的机遇与风险:交易中的杠杆效应

做外汇交易的人都会不可避免地需要考虑交易的杠杆大小。在这个市场中&#xff0c;杠杆效应作为一种关键的金融工具&#xff0c;不仅为投资者提供了放大收益的机会&#xff0c;同时也带来了更高的风险。今天&#xff0c;EagleTrader想与广大交易员一起深入探讨这个不可或缺的要素…...

伏羲0.13(文生图)

确保伏羲0.12&#xff08;文生图&#xff09;注释和GUI显示均为中文&#xff0c;项目文件夹名称为中文&#xff0c;并提供使用说明。此外&#xff0c;我将完善风格迁移的确定及训练函数和代码。以下是完整的Python文件和相关说明。 项目结构 文本生成多模态项目/ ├── conf…...

深度学习blog-卷积神经网络(CNN)

卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;是一种广泛应用于计算机视觉领域&#xff0c;如图像分类、目标检测和图像分割等任务中的深度学习模型。 1. 结构 卷积神经网络一般由以下几个主要层组成&#xff1a; 输入层&#xff1a;接收…...

深度学习中的残差网络、加权残差连接(WRC)与跨阶段部分连接(CSP)详解

随着深度学习技术的不断发展&#xff0c;神经网络架构变得越来越复杂&#xff0c;而这些复杂网络在训练时常常遇到梯度消失、梯度爆炸以及计算效率低等问题。为了克服这些问题&#xff0c;研究者们提出了多种网络架构&#xff0c;包括 残差网络&#xff08;ResNet&#xff09;、…...

在Nginx部署Web应用,如何保障后端API的安全

1. 使用HTTPS和http2.0 参考&#xff1a;Nginx配置HTTP2.0_nginx 支持 2.0-CSDN博客 2. 设置严格的CORS策略 通过add_header指令设置CORS头。 只允许来自https://frontend.yourdomain.com的请求访问API location /api/ {if ($http_origin ~* (https://frontend\.yourdomai…...

arm架构 uos操作系统离线安装k8s

目录 操作系统信息 安装文件准备 主机准备 主机配置 配置hosts&#xff08;所有节点&#xff09; 关闭防火墙、selinux、swap、dnsmasq(所有节点) 系统参数设置(所有节点) 配置ipvs功能(所有节点) 安装docker&#xff08;所有节点&#xff09; 卸载老版本 安装docke…...

OpenCV-Python实战(1)——图像or视频文件处理

1、安装依赖库 pip install opencv-python # 主模块包pip install opencv-contrib-python # 主模块附加模块pip install numpy # numpy 库 2、图像的读取、显示、保存 读取&#xff1a;cv2.imread() img cv2.imread(path, flag) img: cv2.imread()函数返回值&#x…...

Flink SQL Cookbook on Zeppelin 部署使用

简介&#xff1a;对于初学者来说&#xff0c;学习 Flink 可能不是一件容易的事情。看文档是一种学习&#xff0c;更重要的是实践起来。但对于一个初学者来说要把一个 Flink SQL 跑起来还真不容易&#xff0c;要搭各种环境&#xff0c;真心累。很幸运的是&#xff0c;Flink 生态…...

【hackmyvm】DC04靶机wp

created: 2024-12-04 23:08 tags: HMV黄金票据PTTntlm中毒 难度: ⭐️⭐️⭐️⭐️⭐️ 作者: josemlwdf 系统: Windows 1. 基本信息^toc 文章目录 1. 基本信息^toc2. 信息收集2.1. 端口扫描2.2. 目录扫描2.3. 网址利用 3. websvc用户3.1. NTLM中毒攻击3.2. smb探测 4. rtina9…...

记录jvm进程号

日常开发中&#xff0c;相信大家会经常用到这么一行命令&#xff1a; ps -ef | grep xxx.jar | grep -v grep | awk {print $2} | xargs -r kill -9 就是杀掉xxx相关的进程&#xff0c;然后启动&#xff0c;当然也还有其他的方式可以实现类似的功能&#xff0c;我就不列举了&…...

day19——web自动化测试(1)

【没有所谓的运气&#x1f36c;&#xff0c;只有绝对的努力✊】 目录 1、什么是自动化 1.1 概念&#xff1a; 1.2 优点&#xff1a; 2、什么是自动化测试 2.1 自动化测试能解决什么问题&#xff1f; 2.1.1 优点&#xff1a; 2.1.2 误区&#xff1a; 2.2 自动化测试分类…...

go window安装protoc protoc生成protobuf文件

1. 下载&#xff1a; Releases protocolbuffers/protobuf GitHub 2. 解压缩&#xff1a; 3. 配置环境变量&#xff1a; 选择系统变量->Path -> 新增 解压缩后的bin路径 4. 打印版本&#xff1a; protoc --version 5. 安装protoc-gen-go cmd 下输入安装命令&#xff0…...

微信小程序中momentjs无法切换中文问题处理

微信小程序中momentj.s无法切换中文问题处理. 表现为 使用 locale(“zh-cn”)无效。 处理方法 # 1、先删除 miniprogram_npm\moment\index.js # 2、将 node_modules\moment\min\moment-with-locales.min.js 复制到 miniprogram_npm\moment下 并重命名为index.js # 3、修改mi…...

数据结构:链表

链表是一种常见的数据结构&#xff0c;它由一系列节点&#xff08;Node&#xff09;组成&#xff0c;每个节点包含两个部分&#xff1a;数据域和指针域。数据域用于存储数据元素的值&#xff0c;而指针域则用于指向链表中的下一个节点。这种结构使得链表能够动态地进行插入和删…...

领克Z20结合AI技术,革新自动驾驶辅助系统

眼瞅着&#xff0c;再有不到 5 个星期&#xff0c;春节就要热热闹闹地登场啦&#xff01;对于在外辛苦打拼了一整年的打工人而言&#xff0c;回家过年可不就是这一年里心心念念、最最期盼的高光时刻嘛。这不&#xff0c;这几天各地的高速公路愈发熙熙攘攘起来&#xff0c;川流不…...

vector快慢指针+例题详解

1.快慢指针 例题 给定一个链表&#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;我们使用整数 pos 来表示链表尾连接到链表中的位置&#xff08;索引从…...

重温设计模式--1、组合模式

文章目录 1 、组合模式&#xff08;Composite Pattern&#xff09;概述2. 组合模式的结构3. C 代码示例4. C示例代码25 .应用场景 1 、组合模式&#xff08;Composite Pattern&#xff09;概述 定义&#xff1a;组合模式是一种结构型设计模式&#xff0c;它允许你将对象组合成…...

单片机:实现SYN6288语音播报(附带源码)

单片机实现SYN6288语音播报 SYN6288是一款广泛应用于语音合成的IC&#xff0c;可以通过串口与单片机&#xff08;如51系列、STM32等&#xff09;进行通信&#xff0c;实现场景化的语音播报。通过连接外部存储设备&#xff08;如SD卡&#xff09;存储语音文件或直接通过内部语音…...

cookie,session,token 的区别

解决什么问题?Cookie&#xff08;客户端存储&#xff09;问题来了 Session&#xff08;会话&#xff09;解决的问题问题来了 token(令牌)解决的问题问题:token是无状态的如何解决? 解决什么问题? 解决http无状态的问题,说简单点就是用户身份的验证 举个例子: 张三在银行里…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...