Spring MVC开发小练习

1. 加法计算器

需求:输入两个整数,计算和

约定前后端交互接口:

在开发项目前,根据需求先约定好前后端交互接口,双方按照接口文档进行开发,接口文档一旦写好,尽量不要轻易改变,如果要修改,必须通知另一方知晓

接口定义:

请求路径:calc/add

请求方式:GET/POST

接口描述:计算两个整数相加

请求参数:

参数名:num1 类型:Integer 是否必须:是  备注:参与计算的第一个数

参数名:num2 类型:Integer 是否必须:是  备注:参与计算的第二个数

响应数据:

Content-Type:text/html

响应内容:计算结果是:(num1+num2)

后端代码:

@RestController
@RequestMapping("/calc")
public class CalcController {@RequestMapping("/add")public String add(Integer num1, Integer num2) {Integer sum = num1 + num2;return "计算结果是:" + sum;}
}

前端代码: 

这里我们放在static内:

<!DOCTYPE html>
<html lang="ch">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Calc</title>
</head>
<body><form action="calc/add"><h1>计算器</h1>数字1:<input type="text" name="num1"><br/>数字2:<input type="text" name="num2"><br/><input type="submit" value="计算结果">
</form>
</body>
</html>

注意: name属性决定url中的Key

2. 用户登录

接口定义:

1.登录接口

请求路径:user/login

请求方式:POST

接口描述:校验用户名密码是否正确

请求参数:

参数1:参数名:userName 类型:String 是否必须:是 备注:用户名

参数2:参数名:password 类型:String 是否必须:是 备注:密码

响应数据:

Content-Type:text/html

响应内容:

true:登录成功

false:登录失败

2. 查询登录用户接口

请求路径:/user/getUserName

请求方式:GET/POST

接口描述:查询当前登录的用户

请求参数:无
响应数据:Content-Type:text/html

响应内容:用户名

后端代码:

@RestController
@RequestMapping("/user")
public class LoginController {@RequestMapping("/login")public Boolean login(String userName, String password, HttpSession session) {//储存当前用户的Sessionsession.setAttribute("name", userName);return "Ting-666".equals(userName) && "666777".equals(password);}@RequestMapping("/getUserName")public String getUserName(@SessionAttribute("name") String name){return name;}
}

前端代码:

login.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>login</title>
</head>
<body><h1>用户登录</h1>用户名<input type="text" name="userName" id="userName"><br/>密码<input type="password" name="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() {//使用ajax发送请求$.ajax({url:"/user/login",type:"post",data:{userName:$("#userName").val(),password:$("#password").val()},//HTTP 响应成功success:function(result) {if(result) {location.href = "/getUserName.html";}else{alert("用户名或密码错误");}}});}</script>
</body>
</html>

注意Jquery不能使用本地的

getUserName.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>登录人:<span id="loginUser"></span><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script><script>$.ajax({url:"/user/getUserName",type:"get",success:function(UserName){$("#loginUser").text(UserName);}})</script>
</body>
</html>

3. 留言板

需求:实现一个留言板,把A对B说的话添加到留言版上

1. 发布留言

接口定义:

请求路径:/message/publish

请求方法:post

请求参数:

参数1:参数名:from 类型:String 是否必须:是 备注:A

参数2:参数名:to 类型:String 是否必须:是 备注:B

参数1:参数名:say 类型:String 是否必须:是 备注:说的内容

返回值:true/false 备注:成功/失败

2. 展示已有的留言

接口定义:

请求路径:/message/getMessage

请求方法:get

请求参数:无

返回值:返回一个list

后端代码:

package com.example.j20240313springmvc;import lombok.Data;/*** 存储一次留言*/
@Data
public class Message {private String from;private String to;private String say;
}
//@Data 是lombok中的一个注解,可以在编译时自动生成get,set,toString 等方法
@RestController
@RequestMapping("/message")
public class MessageController {List<Message> messages = new ArrayList<>();public Boolean publish(Message message) {if(!StringUtils.hasLength(message.getFrom())||!StringUtils.hasLength(message.getTo())||!StringUtils.hasLength(message.getSay())) {return false;}messages.add(message);return true;}public List<Message> getMessages() {return messages;}
}

前端代码:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>留言板</title><style>.container {width: 350px;height: 300px;margin: 0 auto;/* border: 1px black solid; */text-align: center;}.grey {color: grey;}.container .row {width: 350px;height: 40px;display: flex;justify-content: space-between;align-items: center;}.container .row input {width: 260px;height: 30px;}#submit {width: 350px;height: 40px;background-color: orange;color: white;border: none;margin: 10px;border-radius: 5px;font-size: 20px;}</style>
</head><body>
<div class="container"><h1>留言板</h1><p class="grey">输入后点击提交, 会将信息显示下方空白处</p><div class="row"><span>谁:</span> <input type="text" name="" id="from"></div><div class="row"><span>对谁:</span> <input type="text" name="" id="to"></div><div class="row"><span>说什么:</span> <input type="text" name="" id="say"></div><input type="button" value="提交" id="submit" onclick="submit()"><!-- <div>A 对 B 说: hello</div> -->
</div><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script>$.ajax({url:"/message/getMessages",type:"get",success:function(messages) {for(var message of messages) {var divE = "<div>"+message.from +"对" + message.to + "说:" + message.say+"</div>";$(".container").append(divE);}}});function submit(){var from = $('#from').val();var to = $('#to').val();var say = $('#say').val();$.ajax({url:"/message/publish",type:"post",data:{from:$("#from").val(),to:$("#to").val(),say:$("#say").val()},success:function(result) {if(result) {//2. 构造节点var divE = "<div>"+from +"对" + to + "说:" + say+"</div>";//3. 把节点添加到页面上$(".container").append(divE);//4. 清空输入框的值$('#from').val("");$('#to').val("");$('#say').val("");}else{$('#from').val("");$('#to').val("");$('#say').val("");alert("非法输入");}}});}</script>
</body></html>

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

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

相关文章

CPU设计实战-Wishbone总线接口

为什么需要改用总线接口&#xff1f; 1.但是在实际应用中&#xff0c;程序的体积可能非常大&#xff0c;指令存储器就不能再集成在FPGA内部了&#xff0c;一般使用FPGA芯片外部的Flash作为指令存储器。同理,-般使用FPGA芯片外部的SDRAM作为数据存储器。 2.统一接口标准。 很多…

蓝桥杯 2023 省B 飞机降落

首先&#xff0c;这题要求的数据量比较少&#xff0c;我们可以考虑考虑暴力解法。 这题可能难在很多情况的考虑&#xff0c;比如说&#xff1a; 现在时间是10&#xff0c;有个飞机20才到&#xff0c;我们是可以干等10分钟。 #include <iostream> #include <…

0101插入排序-算法基础-算法导论第三版

文章目录 一 插入排序二 循环不变式与插入排序的正确性三 伪代码中的一些约定四 Java代码实现插入排序结语 一 插入排序 输入&#xff1a; n n n个数订单一个序列 ( a 1 , a 2 , ⋯ , a n ) (a_1,a_2,\cdots,a_n) (a1​,a2​,⋯,an​). **输出&#xff1a;**输入序列的一个排…

OpenWRT+zeroTier旁路由组网

前言 我之前写过一篇文章&#xff0c;探究了zeroTier的最基础的玩法&#xff0c;那篇文章结尾我提到了使用zeroTier虽然实现组网了&#xff0c;但是我只能访问局域网中制定的设备&#xff0c;局域网中其他设备无法访问&#xff0c;这篇文章我又研究了一套方案openwrtzeroTier旁…

IEEE Transactions on Medical Imaging(TMI)论文推荐:2024年01月(1)

Unsupervised Domain Adaptation for Medical Image Segmentation by Disentanglement Learning and Self-Training 摘要&#xff1a;无监督域适应(Unsupervised domain adaptive, UDA)旨在提高深度模型在无标记数据上的分割性能&#xff0c;近年来受到广泛关注。在本文中&…

el-input设置max、min无效的解决方案

目录 一、方式1&#xff1a;type“number” 二、方式2&#xff1a;oninput&#xff08;推荐&#xff09; 三、计算属性 如下表所示&#xff0c;下面为官方关于max&#xff0c;min的介绍&#xff1a; el-input&#xff1a; max原生属性&#xff0c;设置最大值min原生属性&a…

如何在 Linux ubuntu 系统上搭建 Java web 程序的运行环境

如何在 Linux ubuntu 系统上搭建 Java web 程序的运行环境 基于包管理器进行安装 Linux 会把一些软件包放到对应的服务器上&#xff0c;通过包管理器这样的程序&#xff0c;来把这些软件包给下载安装 ubuntu系统上的包管理器是 apt centos系统上的包管理器 yum 注&#xff1a;…

前缀和算法

前缀和可以快速求出数组中某个连续区间的和 预处理出来一个前缀和数组 为了处理边界情况,下标从1开始 dp[i]表示原数组[ 1 , i ]区间内所有元素之和 dp[i]dp[i-1]原数组[i] 使用前缀和数组 文章目录 【模板】前缀和【模板】二维前缀和寻找数组的中心下标除自身以外数组的乘积…

打卡学习kubernetes——了解k8s基本概念

目录 1 Container 2 Pod 3 Node 4 Namespace 5 Service 6 Label 7 Annotations 8 Volume 1 Container Container(容器)是一种便携式、轻量级的操作系统级虚拟化技术。它使用namespace隔离不同的软件运行环境&#xff0c;并通过镜像自包含软件的运行环境&#xff0c;从而…

关于继承是怎么样的?那当然是很好理解之

本文描述了关于继承的大部分知识&#xff0c;但是并不全&#xff0c;每篇博客之间的知识都有互串&#xff0c;所以需要把几篇文章合起来看&#xff0c;学会融会贯通&#xff01; 温馨提示&#xff1a;使用PC端观看&#xff0c;效果更佳&#xff01; 目录 1.继承是什么 2.什…

机器学习是什么?

机器学习是一种人工智能&#xff08;AI&#xff09;的分支&#xff0c;其主要目标是使计算机系统能够通过数据和经验来改进和学习&#xff0c;而无需明确地编程。在机器学习中&#xff0c;计算机系统会通过对大量数据进行学习和分析&#xff0c;从中发现模式和规律&#xff0c;…

JavaScript进阶:js的一些学习笔记-4

文章目录 1. 拷贝1. 浅拷贝2. 深拷贝 2. 异常处理 1. 拷贝 这里指的拷贝是指拷贝引用类型的数据(对象) 1. 浅拷贝 拷贝对象&#xff1a;Object.assign() 或者 {…obj} 展开运算符 const obj {name:liuze,age:23 } const o {...obj}; o.age 22; console.log(o); console.…

Linux | Ubuntu安装pylsl

PYNQ开发中使用pylsl过程记录 操作系统为 Linux pynq 5.15.19-xilinx-v2022.1 #1 SMP PREEMPT Mon Apr 11 17:52:14 UTC 2022 armv7l armv7l armv7l GNU/Linux 使用 pip install pylsl 安装后在导入包的过程中会遇到如下错误&#xff1a; RuntimeError: LSL binary library f…

深入浅出前端本地储存(1)

引言 2021 年&#xff0c;如果你的前端应用&#xff0c;需要在浏览器上保存数据&#xff0c;有三个主流方案&#xff1a; CookieWeb Storage (LocalStorage)IndexedDB 这些方案就是如今应用最广、浏览器兼容性最高的三种前端储存方案 今天这篇文章就聊一聊这三种方案的历史…

前端基础篇-深入了解 Ajax 、Axios

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 Ajax 概述 2.0 Axios 概述 3.0 综合案例 1.0 Ajax 概述 通过 Ajax 可以给服务器发送请求&#xff0c;并获取服务器响应的数据。异步交互是指&#xff0c;可以在不…

【安全类书籍-2】Web渗透测试:使用Kali Linux

目录 内容简介 作用 下载地址 内容简介 书籍的主要内容是指导读者如何运用Kali Linux这一专业的渗透测试平台对Web应用程序进行全面的安全测试。作者们从攻击者的视角出发,详细阐述了渗透测试的基本概念和技术,以及如何配置Kali Linux以适应渗透测试需求。书中不仅教授读者…

[zdyz]FreeRTOS笔记

FreeRTOS基础知识 1&#xff0c;任务调度器简介 调度器就是使用相关的调度算法来决定当前需要执行的哪个任务 抢占式调度 时间片调度 协程式调度 略 2&#xff0c;任务状态 运行态 正在执行的任务&#xff0c;该任务就处于运行态&#xff0c;注意在STM32中&#xff0c;同…

【JAVA】Servlet开发

目录 HttpServlet HttpServletRequest HttpServletResponse 错误页面 设置网页自动刷新时间 构造重定向相应 js发起http请求 服务器端对js发起的http请求进行处理 前端获取后端数据&#xff0c;添加到当前页面的末尾&#xff0c;代码示例&#xff1a; 前后端交互&…

Linux环境(Ubuntu)上搭建MQTT服务器(EMQX )

目录 概述 1 认识EMQX 1.1 EMQX 简介 1.2 EMQX 版本类型 2 Ubuntu搭建EMQX 平台 2.1 下载和安装 2.1.1 下载 2.1.2 安装 2.2 查看运行端口 3 运行Dashboard 管理控制台 3.1 查看Ubuntu上的防火墙 3.2 运行Dashboard 管理控制台 概述 本文主要介绍EMQX 的一些内容&a…

深入解析C++树形关联式容器:map、set及其衍生容器的使用与原理

文章目录 一、引言二、关联式容器的中的 paira.pair 的创建及使用b.pair 间的比较 三、 map 与 set 详解1. map 的基本操作2. set 的基本操作3.关联式容器的迭代器 四、 multimap 与 multiset 的特性五、关联式容器的使用技巧与注意事项1. 键值类型的选择与设计2. 自定义比较函…