Spring Web MVC————入门(3)

news2025/5/20 9:58:00

今天我们来一个大练习,我们要实现一个登录界面,登录进去了先获取到登录人信息,可以选择计算器和留言板两个功能,另外我们是学后端的,对于前端我们会些基础的就行了,知道ajax怎么用,知道怎么关联到后端的参数即可,对于那些漂亮的页面,我们可以去Bootstrap找到各种各样的模版。

1,定义接口文档

我们后端程序员要学会根据接口文档写代码,工作上就是这样的,我们根据接口文档来写写属于我们那部分的代码,我们现在来定义下面4个功能的接口文档:

1,登录接口文档:

请求路径:User/Login

请求方式:Post

请求参数:

参数名                类型                是否必须                备注

userName          String              是                           需要校验的第一个参数

password           String              是                           需要校验的第二个参数

响应数据:

Content-Type:text/html

响应内容:

返回true  or   false

2,计算器接口文档

请求路径:Calc/Count

请求方式:Get

请求参数:

参数名                类型                是否必须                备注

num1                 Double             是                          参与计算的第一个参数

num2                 Double             是                          参与计算的第二个参数

op                      String               是                          运算符

响应数据:

Content-Type:text/html

响应内容:

返回计算结果Integer

3,留言板接口文档

1)获取内存历史留言

请求路径:Message/getList 

请求方式:get

请求参数:无

相应数据:

Content-Type:application/json

响应内容:

集合都是json,传的对象

2)打印留言 

请求路径:Message/publish

请求方式:get

请求参数:

MessageInfo messageinfo

对象中有String from String to String say

响应数据

Content-Type:text/html

响应内容:

json内容,如{"ok":0}

2,登录功能实现

我们现在就来根据接口文档来写代码:

@RequestMapping("/User")
@RestController
public class UserController {

    @RequestMapping("/Login")
    public boolean Login(String userName, String password, HttpServletRequest httpServletRequest){
        if(!StringUtils.hasLength(userName) || !StringUtils.hasLength(password)){
            return false;
        }
        if("admin".equals(userName) && "admin".equals(password)){
            httpServletRequest.setAttribute("userName",userName);
            return true;
        }
        return false;
    }
}

这里推荐大家去模版王找一些模版的前端代码,我觉得很方便 

<!DOCTYPE html>
<html lang="zxx">

<head>
    <title>Hotair Login Form Responsive Widget Template</title>
    <!-- Meta tag Keywords -->
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta charset="UTF-8"/>
    <meta name="keywords"
          content="Hotair Login Form Responsive web template, Bootstrap Web Templates, Flat Web Templates, Android Compatible web template, Smartphone Compatible web template, free webdesigns for Nokia, Samsung, LG, SonyEricsson, Motorola web design"/>
    <!-- //Meta tag Keywords -->
    <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+JP:wght@400;600;700;900&display=swap"
          rel="stylesheet">
    <!--/Style-CSS -->
    <link rel="stylesheet" href="css/style.css" type="text/css" media="all"/>
    <!--//Style-CSS -->

    <link rel="stylesheet" href="css/font-awesome.min.css" type="text/css" media="all">

</head>

<body>

<!-- form section start -->
<section class="w3l-hotair-form">
    <h1>Hotair Log In Form</h1>
    <div class="container">
        <!-- /form -->
        <div class="workinghny-form-grid">
            <div class="main-hotair">
                <div class="alert-close">
                    <span class="fa fa-close"></span>
                </div>

                <div class="content-wthree">
                    <h2>Log In</h2>
                    <p>To Your Account</p>
                    <form action="#" method="post">
                        <input type="text" class="text" name="userName" placeholder="User Name" required=""
                               id="userName">
                        <input type="password" class="password" name="password" placeholder="User Password" required=""
                               id="password">
                        <button class="btn" type="submit" onclick="heihei()">Log In</button>
                    </form>
                </div>
                <div class="w3l_form align-self">
                    <div class="left_grid_info">

                    </div>
                </div>
            </div>
        </div>
        <!-- //form -->
    </div>
    <!-- copyright-->
    <div class="copyright text-center">
        <p class="copy-footer-29">© 2020 Hotair Log In Form. All rights reserved | <a target="_blank"
                                                                                      href="http://www.mobanwang.com/"
                                                                                      title="网页模板">网页模板</a></p>
    </div>
    <!-- //copyright-->
</section>
<!-- //form section start -->

<script src="js/jquery.min.js"></script>
<script>
    $(document).ready(function (c) {
        $('.alert-close').on('click', function (c) {
            $('.main-hotair').fadeOut('slow', function (c) {
                $('.main-hotair').remove();
            });
        });
    });

    function heihei() {
        $.ajax({
            type: "post",
            url: "User/Login",
            data: {
                userName: $("#userName").val(),
                password: $("#password").val()
            },
            success: function (result) {
                if (result == false) {
                    alert("用户名或者密码出错")
                } else {
                    location.href = "calc.html"
                }
            }
        })
    }
</script>

</body>

</html>

我把html的文件放上去了,css,js都没有,大家去模版王找就行,之后,在Script中关联好后端传来的数据就行了; 

来看看效果:

密码正确则成功跳转,

3,跳转界面实现

这块就是纯前端的内容了,对点击的框框进行页面的跳转,

<!DOCTYPE html>
<html lang="zxx">

<head>
    <title>Hotair Login Form Responsive Widget Template</title>
    <!-- Meta tag Keywords -->
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta charset="UTF-8"/>
    <meta name="keywords"
          content="Hotair Login Form Responsive web template, Bootstrap Web Templates, Flat Web Templates, Android Compatible web template, Smartphone Compatible web template, free webdesigns for Nokia, Samsung, LG, SonyEricsson, Motorola web design"/>
    <!-- //Meta tag Keywords -->
    <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+JP:wght@400;600;700;900&display=swap"
          rel="stylesheet">
    <!--/Style-CSS -->
    <link rel="stylesheet" href="css/style.css" type="text/css" media="all"/>
    <!--//Style-CSS -->

    <link rel="stylesheet" href="css/font-awesome.min.css" type="text/css" media="all">

</head>

<body>

<!-- form section start -->
<section class="w3l-hotair-form">
    <h1>小 工 具</h1>
    <div class="container">
        <!-- /form -->
        <div class="workinghny-form-grid">
            <div class="main-hotair">
                <div class="alert-close">
                    <span class="fa fa-close"></span>
                </div>

                <div class="content-wthree">
                    <h2>Log In</h2>
                    <p>To Your Account</p>
                    <form action="#" method="post">
                        <input type="text" class="text" name="userName" placeholder="User Name" required=""
                               id="userName">
                        <input type="password" class="password" name="password" placeholder="User Password" required=""
                               id="password">
                        <button class="btn" type="submit" onclick="heihei()">Log In</button>
                    </form>
                </div>
                <div class="w3l_form align-self">
                    <div class="left_grid_info">

                    </div>
                </div>
            </div>
        </div>
        <!-- //form -->
    </div>
    <!-- copyright-->

    <!-- //copyright-->
</section>
<!-- //form section start -->

<script src="js/jquery.min.js"></script>
<script>
    $(document).ready(function (c) {
        $('.alert-close').on('click', function (c) {
            $('.main-hotair').fadeOut('slow', function (c) {
                $('.main-hotair').remove();
            });
        });
    });

    function heihei() {
        $.ajax({
            type: "post",
            url: "User/Login",
            data: {
                userName: $("#userName").val(),
                password: $("#password").val()
            },
            success: function (result) {
                if (result == false) {
                    alert("用户名或者密码出错")
                    location.href = "index.html"
                } else {
                    location.href = "choose.html"
                }
            }
        })
    }
</script>

</body>

</html>

4,计算器功能实现

我们计算器呢就先不使用模版了,用模版的话在前端中就都写好了,没我们什么事了,我们自己来!

先来看后端代码:

@RequestMapping("/Calc")
@RestController
public class CalcController {

    @RequestMapping("/count")
    public Double count(Double num1,Double num2,String op){
        Double num=0.0;
        if(num1==null || num2==null){
            return null;
        } else {
            if("+".equals(op)){
                num=num1+num2;
            } else if ("-".equals(op)) {
                num=num1-num2;
            } else if ("*".equals(op)){
                num=num1*num2;
            } else if ("/".equals(op)) {
                if(num1==0){
                    return null;
                }
                num=num1/num2;
            } else if ("%".equals(op)) {
                num=num1%num2;
            }
        }
        System.out.println(num);
        return num;
    }

}

前端的:

 

<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
        <h1>计算器</h1>
        <button type="button" onclick="clean()">AC</button><br>
        数字1:<input name="num1" type="text" id="num1"><br>
        数字2:<input name="num2" type="text" id="num2"><br>
        <select id="op" name="op1">
            <option value="+">+</option>
            <option value="-">-</option>
            <option value="*">*</option>
            <option value="/" selected>/</option>
            <option value="%">%</option>
        </select><br>
        <span id="result"></span><br>
        <button type="submit" onclick="count()">计算结果</button>
        <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script>
    function count(){
        $.ajax({
            type:"get",
            url:"Calc/count",
            data:{
                num1:$("#num1").val(),
                num2:$("#num2").val(),
                op:$("#op").val()
            },
            success:function (result) {
                if(result==null){
                    alert("输入参数有问题呀")
                }else {
                    $("#result").html(result);
                }
            }
        })
    }
    function clean() {
        $("#num1").val("")
        $("#num2").val("")
        $("#result").html("")
    }
</script>
</body>

</html>

5,留言板功能实现

@Data
public class MessageInfo {
    private String from;
    private String to;
    private String say;
}

先来publish:

这里我们使用链表,这个是在内存中的,我们看publish方法,我们如果想要传入json数据给后端我们要使用produces,这样messageinfo对象就能接收到json格式的数据转化成对应的对象中的内容,之后我们想要输出json,我们就要使用produces,这个之前讲过,可以指定我们返回的类型;


@RequestMapping("/Message")
@RestController
public class MessageController {
    List<MessageInfo> arrayList = new ArrayList<>();

    @RequestMapping(value = "/publish",produces = "application/json")
    public String publish(@RequestBody MessageInfo messageInfo){
        if (messageInfo==null){
            return "{\"ok\":0}";
        }
        if(messageInfo.getTo()!=null || messageInfo.getFrom()!=null ||
        messageInfo.getSay()!=null){
            arrayList.add(messageInfo);
            return "{\"ok\":1}";
        }
        return "{\"ok\":0}";
    }

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

在点击按钮后就会调用这个方法,重点!我们接收要使用Post方法接收JSON请求体 ,

ContentType:"application/json"表明我们传入的JSON数据会转化为对象,所以result就是对象了,这个data:JSON.stringify就是把data对象转变为json为啥呢,因为参数类型是json吗,所以我们就要前端上也写类型为json,

 function submit() {
            var from1 = $("#from").val();
            var to1 = $("#to").val();
            var say1 = $("#say").val();
            var data1 = {
                from : $('#from').val(),
                to : $('#to').val(),
                say : $('#say').val(),
            }
            $.ajax({
                type:"post",
                url:"/Message/publish",
                contentType: "application/json",
                data: JSON.stringify(data1),
                success: function (result) {
                    if(result.ok==0){
                        alert("留言失败")
                    }else{
                        //2. 构造节点
                        var divE = "<div>"+ from1 +"对" + to1 + "说:" + say1+"</div>";
                        //3. 把节点添加到页面上
                        $(".container").append(divE);

                        //4. 清空输入框的值
                        $('#from').val("");
                        $('#to').val("");
                        $('#say').val("");
                    }
                }
            })
        }

 

下面来getLIst方法,这个方法的主要目的就是我们刷新之后自动加载我们之前写的内容,容器是存活在内存中,所以关机或者长时间不使用都会发生错误的;

 后端代码:

    @RequestMapping("/getList")
    public List<MessageInfo> getList(){
        return arrayList;
    }

 前端代码:ajax:

   $.ajax({
            type: "get",
            url: "/Message/getList",
            success: function (result) {
                if(result!=null && result.length>0){
                    var html1=" ";
                    for( var a of result){
                        html1 += "<div>"+a.from +"对" + a.to + "说:" + a.say+"</div>";
                    }
                    $(".container").append(html1);
                }
            }
        })

 

我们点击刷新之后还是有这些留言的:

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

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

相关文章

NC61 两数之和【牛客网】

文章目录 零、原题链接一、题目描述二、测试用例三、解题思路3.1 排序双指针3.1 散列 四、参考代码4.1 排序双指针4.2 散列 零、原题链接 NC61 两数之和 一、题目描述 二、测试用例 三、解题思路 3.1 排序双指针 基本思路&#xff1a;   先对序列进行排序&#xff0c;然后…

如何分析动态采样引起的计划不稳定 | OceanBase SQL 调优实践

这篇博客涉及两个知识点&#xff0c;一个是动态采样&#xff0c;另一个是 DAS 执行。 用户的问题和相关结论 我们看看用户在OceanBase 社区论坛发帖中提出的疑问及其所得出的结论。 问题&#xff1a;收集统计信息之前&#xff0c;为什么会出现计划不稳定的情况&#xff1f; …

如何实现RTSP和RTMP低至100-200ms的延迟:直播SDK的技术突破

在实时音视频传输中&#xff0c;低延迟是直播应用的核心技术要求之一。无论是在线教育、远程医疗&#xff0c;还是实时互动直播&#xff0c;延迟过大会影响用户体验&#xff0c;甚至导致应用无法正常使用。大牛直播SDK&#xff08;SmartMediaKit&#xff09;在RTSP和RTMP播放器…

symfonos: 2靶场

symfonos: 2 来自 <https://www.vulnhub.com/entry/symfonos-2,331/> 1&#xff0c;将两台虚拟机网络连接都改为NAT模式 2&#xff0c;攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.182&#xff0c;靶场IP192.168.23.253 3&…

【图像生成大模型】Step-Video-T2V:下一代文本到视频生成技术

Step-Video-T2V&#xff1a;下一代文本到视频生成技术 引言Step-Video-T2V 项目概述核心技术1. 视频变分自编码器&#xff08;Video-VAE&#xff09;2. 3D 全注意力扩散 Transformer&#xff08;DiT w/ 3D Full Attention&#xff09;3. 视频直接偏好优化&#xff08;Video-DPO…

深度学习推理引擎---ONNX Runtime

一、基础概念 1. 什么是ONNX Runtime&#xff1f; 定位&#xff1a;由微软开发的跨平台推理引擎&#xff0c;专为优化ONNX&#xff08;Open Neural Network Exchange&#xff09;模型的推理性能设计。目标&#xff1a;提供高效、可扩展的推理能力&#xff0c;支持从云到边缘的…

VueUse/Core:提升Vue开发效率的实用工具库

文章目录 引言什么是VueUse/Core&#xff1f;为什么选择VueUse/Core&#xff1f;核心功能详解1. 状态管理2. 元素操作3. 实用工具函数4. 浏览器API封装5. 传感器相关 实战示例&#xff1a;构建一个拖拽上传组件性能优化技巧与原生实现对比常见问题解答总结 引言 在现代前端开发…

【论文阅读】A Survey on Multimodal Large Language Models

目录 前言一、 背景与核心概念1-1、多模态大语言模型&#xff08;MLLMs&#xff09;的定义 二、MLLMs的架构设计2-1、三大核心模块2-2、架构优化趋势 三、训练策略与数据3-1、 三阶段训练流程 四、 评估方法4-1、 闭集评估&#xff08;Closed-set&#xff09;4-2、开集评估&…

vue3 elementplus tabs切换实现

Tabs 标签页 | Element Plus <template><!-- editableTabsValue 是当前tab 的 name --><el-tabsv-model"editableTabsValue"type"border-card"editableedit"handleTabsEdit"><!-- 这个是标签面板 面板数据 遍历 editableT…

Linux的进程概念

目录 1、冯诺依曼体系结构 2、操作系统(Operating System) 2.1 基本概念 ​编辑 2.2 目的 3、Linux的进程 3.1 基本概念 3.1.1 PCB 3.1.2 struct task_struct 3.1.3 进程的定义 3.2 基本操作 3.2.1 查看进程 3.2.2 初识fork 3.3 进程状态 3.3.1 操作系统的进程状…

计算机单个进程内存布局的基本结构

这张图片展示了一个计算机内存布局的基本结构&#xff0c;从低地址&#xff08;0x00000000&#xff09;到高地址&#xff08;0xFFFFFFFF&#xff09;依次分布着不同的内存区域。 代码段 这是程序代码在内存中的存储区域。它包含了一系列的指令&#xff0c;这些指令是计算机执行…

我的电赛(简易的波形发生器大一暑假回顾)

DDS算法&#xff1a;当时是用了一款AD9833芯片搭配外接电路实现了一个波形发生&#xff0c;配合stm32f103芯片实现一个幅度、频率、显示的功能&#xff1b; 在这个过程中&#xff0c;也学会了一些控制算法&#xff1b;就比如DDS算法&#xff0c;当时做了一些了解&#xff0c;可…

算法题(149):矩阵消除游戏

审题&#xff1a; 本题需要我们找到消除矩阵行与列后可以获得的最大权值 思路&#xff1a; 方法一&#xff1a;贪心二进制枚举 这里的矩阵消除时&#xff0c;行与列的消除会互相影响&#xff0c;所以如果我们先统计所有行和列的总和&#xff0c;然后选择消除最大的那一行/列&am…

printf函数参数与入栈顺序

01. printf()的核心功能 作用&#xff1a;将 格式化数据 输出到 标准输出&#xff08;stdout&#xff09;&#xff0c;支持多种数据类型和格式控制。 int printf(const char *format, ...);参数&#xff1a; format&#xff1a;格式字符串,字符串或%开头格式符...&#xff1a;…

仿生眼机器人(人脸跟踪版)系列之一

文章不介绍具体参数&#xff0c;有需求可去网上搜索。 特别声明&#xff1a;不论年龄&#xff0c;不看学历。既然你对这个领域的东西感兴趣&#xff0c;就应该不断培养自己提出问题、思考问题、探索答案的能力。 提出问题&#xff1a;提出问题时&#xff0c;应说明是哪款产品&a…

Go语言语法---输入控制

文章目录 1. fmt包读取输入1.1. 读取单个值1.2. 读取多个值 2. 格式化输入控制 在Go语言中&#xff0c;控制输入主要涉及从标准输入(键盘)或文件等来源读取数据。以下是几种常见的输入控制方法&#xff1a; 1. fmt包读取输入 fmt包中的Scan和Scanln函数都可以读取输入&#xf…

CSS- 4.3 绝对定位(position: absolute)学校官网导航栏实例

本系列可作为前端学习系列的笔记&#xff0c;代码的运行环境是在HBuilder中&#xff0c;小编会将代码复制下来&#xff0c;大家复制下来就可以练习了&#xff0c;方便大家学习。 HTML系列文章 已经收录在前端专栏&#xff0c;有需要的宝宝们可以点击前端专栏查看&#xff01; 点…

Seata源码—6.Seata AT模式的数据源代理一

大纲 1.Seata的Resource资源接口源码 2.Seata数据源连接池代理的实现源码 3.Client向Server发起注册RM的源码 4.Client向Server注册RM时的交互源码 5.数据源连接代理与SQL句柄代理的初始化源码 6.Seata基于SQL句柄代理执行SQL的源码 7.执行SQL语句前取消自动提交事务的源…

计算机科技笔记: 容错计算机设计05 n模冗余系统 TMR 三模冗余系统

NMR&#xff08;N-Modular Redundancy&#xff0c;N 模冗余&#xff09;是一种通用的容错设计架构&#xff0c;通过引入 N 个冗余模块&#xff08;N ≥ 3 且为奇数&#xff09;&#xff0c;并采用多数投票机制&#xff0c;来提升系统的容错能力与可靠性。单个模块如果可靠性小于…

Spring Boot 与 RabbitMQ 的深度集成实践(一)

引言 ** 在当今的分布式系统架构中&#xff0c;随着业务复杂度的不断提升以及系统规模的持续扩张&#xff0c;如何实现系统组件之间高效、可靠的通信成为了关键问题。消息队列作为一种重要的中间件技术&#xff0c;应运而生并发挥着举足轻重的作用。 消息队列的核心价值在于其…