【JavaEE】加法计算器与用户登录实战演练

目录

      • 综合练习
        • 加法计算器
          • 1. 准备工作
          • 2. 约定前后端交互接口
          • 3. 服务器代码
        • 用户登录
          • 1. 准备工作
          • 2. 约定前后端交互接口
          • 3. 服务器代码
          • 4. 调整前端页面代码


综合练习

  1. 理解前后端交互过程
  2. 接⼝传参, 数据返回, 以及⻚⾯展⽰
加法计算器

需求: 输⼊两个整数, 点击"点击相加"按钮, 显⽰计算结果

1. 准备工作

创建 SpringBoot 项⽬: 引⼊Spring Web依赖, 把前端⻚⾯放在项⽬中

前端方面:添加访问url和请求⽅式<form action="calc/sum" method="post">

calc.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><form action="calc/sum" method="post"><h1>计算器</h1>数字1:<input name="num1" type="text"><br>数字2:<input name="num2" type="text"><br><input type="submit" value=" 点击相加 "></form>
</body></html>

Servlet是放在webapp下面,Spring是放在static下面

2. 约定前后端交互接口

概念介绍

约定 “前后端交互接⼝” 是进⾏ Web 开发中的关键环节.

接⼝⼜叫 API(Application Programming Interface), 我们⼀般讲到接⼝或者 API,指的都是同⼀个东西.

是指应⽤程序对外提供的服务的描述, ⽤于交换信息和执⾏任务(与JavaSE阶段学习的[类和接⼝]中的接⼝是两回事)

简单来说, 就是允许客⼾端给服务器发送哪些 HTTP 请求, 并且每种请求预期获取什么样的 HTTP 响应.

现在"前后端分离"模式开发, 前端和后端代码通常由不同的团队负责开发. 双⽅团队在开发之前, 会提前约定好交互的⽅式. 客⼾端发起请求, 服务器提供对应的服务. 服务器提供的服务种类有很多, 客⼾端按照双⽅约定指定选择哪⼀个服务.

接⼝, 其实也就是我们前⾯⽹络模块讲的的"应⽤层协议". 把约定的内容写在⽂档上, 就是"接⼝⽂档" ,接⼝⽂档也可以理解为是 应⽤程序的"操作说明书".

在项⽬开发前, 根据需求先约定好前后端交互接⼝, 双⽅按照接⼝⽂档进⾏开发

接⼝⽂档通常由服务提供⽅来写, 交由服务使⽤⽅确认,也就是客⼾端.

接⼝⽂档⼀旦写好, 尽量不要轻易改变.

如若需要改变, 必须要通知另⼀⽅知晓.

需求分析

加法计算器功能, 对两个整数进⾏相加, 需要客⼾端提供参与计算的两个数, 服务端返回这两个整数计算的结果

基于以上分析, 我们来定义接⼝

请求路径:calc/sum请求⽅式:GET/POST接⼝描述:计算两个整数相加

请求参数:

参数名类型是否必须备注
num1Integer参与计算的第一个数
num2Integer参与计算的第二个数

⽰例: num1=5&num2=3

响应数据:

Content-Type: text/html响应内容: 计算机计算结果: 8

服务器给浏览器返回计算的结果

3. 服务器代码
@RestController
@RequestMapping("/calc")
public class CalcController {@RequestMapping("/sum")public String sum(Integer num1,Integer num2){Integer sum=num1+num2;return "计算结果:"+sum;}
}

在这里插入图片描述

在这里插入图片描述

开发中程序报错如何定位问题?

先定位前端还是后端

通过日志

  1. 前端:按F12看控制台
  2. 后端:接口,看控制台日志

看请求是否到达后端,没到后端就是前端问题

我们可以在后端接口处加个打印日志,通常打印在第一行,避免发生错误导致执行不到打印语句

@RequestMapping("/sum")
public String sum(Integer num1,Integer num2){System.out.println("=======sum=======");Integer sum=num1+num2;return "计算结果:"+sum;
}

如果后端没有打印,那就是前端问题,就按F12看看控制台,如果也没有报错,那就得看代码了

如果此时也是发现不了问题,那就测试接口

直接输入127.0.0.1/calc/sum?num1=5&num2=3测试,这是我们后端响应的URL,如果这里OK那问题一定在前端

如果重启项目后,有些页面仍无法加载的话怎么办?

这是缓存的问题,我们可以清理缓存

双击后target就消失了

注意:浏览器缓存可能也是要清理的

用户登录

需求: ⽤⼾输⼊账号和密码, 后端进⾏校验密码是否正确

  1. 如果不正确, 前端进⾏⽤⼾告知
  2. 如果正确, 跳转到⾸⻚. ⾸⻚显⽰当前登录⽤⼾
  3. 后续再访问⾸⻚, 可以获取到登录⽤⼾信息
1. 准备工作

把前端⻚⾯放在项⽬中

login.html

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>登录页面</title>
</head><body><h1>用户登录</h1>用户名:<input name="userName" type="text" id="userName"><br>密码:<input name="password" type="password" id="password"><br><input type="button" value="登录" onclick="login()"><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script><script>function login() {}</script>
</body></html>

index.html

<!doctype html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>用户登录首页</title>
</head><body>登录人: <span id="loginUser"></span><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script><script></script>
</body></html>

2. 约定前后端交互接口

需求分析

对于后端开发⼈员⽽⾔, 不涉及前端⻚⾯的展⽰, 只需要提供两个功能

  1. 登录⻚⾯: 通过账号和密码, 校验输⼊的账号密码是否正确, 并告知前端
  2. ⾸⻚: 告知前端当前登录⽤⼾. 如果当前已有⽤⼾登录, 返回登录的账号, 如果没有, 返回空

接口定义

  1. 校验接⼝
请求路径:/user/login请求⽅式:POST接⼝描述:校验账号密码是否正确

请求参数

参数名类型是否必须备注
userNameString校验的账号
passwordString校验的密码

响应数据

Content-Type: text/html响应内容: true //账号密码验证成功
false//账号密码验证失败
  1. 查询登录⽤⼾接⼝
请求路径:/user/getLoginUser请求⽅式:GET接⼝描述:查询当前登录的⽤⼾

请求参数

响应数据

Content-Type: text/html响应内容: 
zhangsan

返回当前登录的⽤⼾

3. 服务器代码
@RestController
@RequestMapping("/user")
public class UserController {@RequestMapping("/login")public Boolean login(String username, String password, HttpSession session){//校验参数合法性//if(username==null||username.length()==0||password==null||password.length()==0){//    return false;//}if(!StringUtils.hasLength(username)||!StringUtils.hasLength(password)){return false;}//进行用户名密码校验if("admin".equals(username)&&"admin".equals(password)){//设置sessionsession.setAttribute("username","admin");return true;}return false; }@RequestMapping("/getUserInfo")public String getUserInfo(HttpServletRequest request){//从session中获取登录用户HttpSession session=request.getSession(false);String username=null;if(session!=null) username= (String) session.getAttribute("username");return username;}
}

直接输入http://127.0.0.1:8080/user/login?username=admin&password=admin测试后端接口,这样不需要前端页面

在这里插入图片描述

如果是输入http://127.0.0.1:8080/user/login则显示false

4. 调整前端页面代码
  1. 调整登录⻚⾯login.html

对于前端⽽⾔, 当点击登录按钮时, 需要把⽤⼾输⼊的信息传递到后端进⾏校验, 后端校验成功, 则跳转到⾸⻚:index.html, 后端校验失败, 则直接弹窗

<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script>function login() {console.log("登录...")$.ajax({url:"/user/login",type:"post",data:{"userName":$("#userName").val(),"password":$("#password").val()},success:function(result){if(result){location.href="/index.html";//location.assign();}else{alert("密码错误")}}});}</script>

⻚⾯跳转的三种⽅式:

  1. window.location.href = “book_list.html”;
  2. window.location.assign(“book_list.html”);
  3. window.location.replace(“book_list.html”);

以上写法, 通常把"window." 省略, ⽐如 window.location.href = "book_list.html"; 写成 location.href = "book_list.html";

三者区别参考:https://developer.aliyun.com/article/330720

  1. 调整首页代码

⾸⻚代码⽐较简单, 只显⽰当前登录⽤⼾即可.

当前登录⽤⼾需要从后端获取, 并显⽰到前端

<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script>console.log("登录人...")//页面加载时,就去调用后端请求$.ajax({url:"/user/getUserInfo",type:"get",success:function(username){$("#loginUser").text(username);}});
</script>

调试

在这里插入图片描述

在这里插入图片描述

多次刷新 http://127.0.0.1:8080/index.html 发现依然可以获取到登录⽤⼾

如果重启服务器, 则登录⼈显⽰: 空

Session 存在内存中, 如果不做任何处理, 默认服务器重启, Session数据就丢失了

项目如何debug?

如果不想打日志,也可以用断点的方式

在自己的代码上打的断点运行前是红点,服务器运行成功后,是一个带的红点

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

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

相关文章

56. UE5 RPG 给敌人添加AI实现跟随玩家

在这一篇里&#xff0c;我们要实现一下敌人的AI&#xff0c;敌人也需要一系列的行为&#xff0c;比如朝向英雄攻击&#xff0c;移动&#xff0c;在满足条件时施放技能。这些敌人的行为可以通过使用UE的内置的AI系统去实现。 在UE里&#xff0c;只要是基于Character类创建的蓝图…

安卓绕过限制直接使用Android/data无需授权,支持安卓14(部分)

大家都知道&#xff0c;安卓每次更新都会给权限划分的更细、收的更紧。   早在安卓11的时候还可以直接通过授权Android/data来实现操作其他软件的目录&#xff0c;没有之前安卓11授权的图了&#xff0c;反正都长一个样&#xff0c;就直接贴新图了。   后面到了安卓12~13的…

AWS安全性身份和合规性之IAM Identity Center(AWS Single Sign-On)

AWS IAM Identity Center&#xff0c;又称为AWS Single Sign-On&#xff08;SSO&#xff09;&#xff0c;是一项AWS托管的身份验证服务&#xff0c;用于集中管理多个AWS账户和SaaS应用程序的用户身份验证和授权。 单点登录&#xff08;SSO&#xff09;是一种身份验证解决方案&…

SQL Server 基础学习笔记

## SQL Server 基础学习笔记 ### 1. SQL Server 概述 SQL Server 是 Microsoft 开发的关系数据库管理系统&#xff08;RDBMS&#xff09;。它支持 SQL 语言&#xff0c;并提供了数据存储、查询、更新和管理等功能。 ### 2. 安装与配置 - **下载与安装**&#xff1a;从 Micros…

C/C++常用错误 or 规范注意

目录 前言1、是否可以强转 前言 之前做过关于python报错集&#xff08;未来如果出现一些有意义的错误还是会继续更新的&#xff09;&#xff0c;今天记录一下C/C的一些常见错误&#xff08;可能其实不算error&#xff0c;只是根据规范&#xff0c;尽量提升代码质量&#xff09…

信息系统项目管理师0128:输出(8项目整合管理—8.6管理项目知识—8.6.3输出)

点击查看专栏目录 文章目录 8.6.3 输出 8.6.3 输出 经验教训登记册 经验教训登记册可以包含执行情况的类别和详细的描述&#xff0c;还可包括与执行情况相关的影响、建议和行动方案。经验教训登记册可以记录遇到的挑战、问题、意识到的风险和机会以及其他适用的内容。经验教训…

(delphi11最新学习资料) Object Pascal 学习笔记---第13章第1节 (全局数据、栈和堆)

13.1 全局数据、栈和堆** ​ 任何平台上的任何 Object Pascal 应用程序所使用的内存可以分为两个部分&#xff1a;代码和数据。就代码部分而言&#xff0c;程序可执行文件的指令部分、资源&#xff08;如位图和窗体描述&#xff09;以及程序使用的库都加载到其内存空间中。这些…

TypeScript 学习笔记(三):模块系统与命名空间

1. 引言 在前两篇学习笔记中&#xff0c;我们介绍了 TypeScript 的基础知识和高级类型系统。本篇将重点讲解 TypeScript 的模块系统与命名空间&#xff0c;帮助你理解如何组织代码、管理依赖以及与 JavaScript 互操作。 2. 模块系统 TypeScript 支持两种模块系统&#xff1a…

Debezium+Kafka:Oracle 11g 数据实时同步至 DolphinDB 解决方案

随着越来越多用户使用 DolphinDB&#xff0c;各式各样的应用场景对 DolphinDB 的数据接入提出了不同的要求。部分用户需要将 Oracle 11g 的数据实时同步到 DolphinDB 中来&#xff0c;以满足在 DolphinDB 中实时使用数据的需求。本篇教程将介绍使用 Debezium 来实时捕获和发布 …

npm介绍、常用命令详解以及什么是全局目录

目录 npm介绍、常用命令详解以及什么是全局目录一、介绍npm的主要功能npm仓库npm的配置npm的版本控制 二、命令1. npm init: 初始化一个新的Node.js项目&#xff0c;创建package.json文件。package.json是一个描述项目信息和依赖关系的文件。2. npm install <package_name&g…

LeetCode算法题:42. 接雨水(Java)

题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3…

基于vue3速学angular

因为工作原因&#xff0c;需要接手新的项目&#xff0c;新的项目是angular框架的&#xff0c;自学下和vue3的区别&#xff0c;写篇博客记录下&#xff1a; 参考&#xff1a;https://zhuanlan.zhihu.com/p/546843290?utm_id0 1.结构上&#xff1a; vue3:一个vue文件&#xff…

python:pycharm虚拟解释器报错环境位置目录为空

目录 解释器分控制台解释器 和 pycharm解释器 控制台解释器切换&#xff1a; pycharm解释器 解释器分控制台解释器 和 pycharm解释器 控制台解释器切换&#xff1a; 切换到解释器下 激活解释器 查看解释器 where python 激活成功 这时在控制台使用python xxx.py 可以…

卷积神经网络和误差反向传播如何一起工作

用更简单的方式来理解卷积神经网络&#xff08;CNN&#xff09;和误差反向传播法&#xff08;一种梯度下降的应用方式&#xff09;是如何一起工作的&#xff0c;这次我们用一个找宝藏的游戏来比喻&#xff1a; 游戏背景&#xff1a;寻宝图的秘密 想象你有一张藏宝图&#xff…

​​​【收录 Hello 算法】10.1 二分查找

目录 10.1 二分查找 10.1.1 区间表示方法 10.1.2 优点与局限性 10.1 二分查找 二分查找&#xff08;binary search&#xff09;是一种基于分治策略的高效搜索算法。它利用数据的有序性&#xff0c;每轮缩小一半搜索范围&#xff0c;直至找到目标元素或搜索区间为空…

C++中的类型转换

文章目录 C中的四种类型转换static_castreinterpret_castconst_castdynamic_cast RTTI C中的四种类型转换 C语言中已经存在类型转换了&#xff0c;为什么C还要提出自己风格的类型转换&#xff1f; C风格的转换格式很简单&#xff0c;但是有不少缺点的&#xff1a; 转换的可视…

​​​【收录 Hello 算法】第 10 章 搜索

目录 第 10 章 搜索 本章内容 第 10 章 搜索 搜索是一场未知的冒险&#xff0c;我们或许需要走遍神秘空间的每个角落&#xff0c;又或许可以快速锁定目标。 在这场寻觅之旅中&#xff0c;每一次探索都可能得到一个未曾料想的答案。 本章内容 10.1 二分查找10.2 二…

【如何检查 ONNX 模型是否正确?】onnx.checker.check_model 用法详解

以下是对 onnx.checker.check_model 函数文档的翻译&#xff1a; onnx.checker.check_model 检查模型的一致性&#xff0c;即模型在结构、格式和配置方面的正确性和完整性。 如果模型的 ir_version 设置不正确或高于检查器的 ir_version&#xff0c;或者模型在 metadata_pro…

Java序列化解密:技巧、陷阱与最佳实践

1. 概述Java序列化的概念与应用场景 1.1 序列化简介 在Java中&#xff0c;序列化机制允许我们将一个对象状态转换为一串字节序列&#xff0c;并可在稍后再将这串字节序列恢复为对象。这一特性极大地方便了对象的持久化处理与网络传输。 1.2 为何需要序列化 序列化主要用于两…

恶劣天候激光雷达点云模拟方法论文整理

恶劣天候点云模拟方法论文整理 模拟雨天点云&#xff1a;【AAAI2024】模拟雪天点云&#xff1a;【CVPR 2022 oral】模拟雾天点云&#xff1a;【ICCV2021】模拟点云恶劣天候的散射现象&#xff1a;【Arxiv 2021】模拟积水地面的水花飞溅点云&#xff1a;【RAL2022】 模拟雨天点云…