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

今天我们来一个大练习,我们要实现一个登录界面,登录进去了先获取到登录人信息,可以选择计算器和留言板两个功能,另外我们是学后端的,对于前端我们会些基础的就行了,知道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,登录功能实现

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

java 复制代码
@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;
    }
}

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

html 复制代码
<!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,跳转界面实现

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

html 复制代码
<!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,计算器功能实现

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

先来看后端代码:

java 复制代码
@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 复制代码
<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,留言板功能实现

java 复制代码
@Data
public class MessageInfo {
    private String from;
    private String to;
    private String say;
}

先来publish:

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

java 复制代码
@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}";
    }

}
html 复制代码
    <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,

javascript 复制代码
 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方法,这个方法的主要目的就是我们刷新之后自动加载我们之前写的内容,容器是存活在内存中,所以关机或者长时间不使用都会发生错误的;

后端代码:

java 复制代码
    @RequestMapping("/getList")
    public List<MessageInfo> getList(){
        return arrayList;
    }

前端代码:ajax:

javascript 复制代码
   $.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);
                }
            }
        })

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

相关推荐
涡能增压发动积21 小时前
同样的代码循环 10次正常 循环 100次就抛异常?自定义 Comparator 的 bug 让我丢尽颜面
后端
云烟成雨TD21 小时前
Spring AI Alibaba 1.x 系列【6】ReactAgent 同步执行 & 流式执行
java·人工智能·spring
Wenweno0o21 小时前
0基础Go语言Eino框架智能体实战-chatModel
开发语言·后端·golang
于慨21 小时前
Lambda 表达式、方法引用(Method Reference)语法
java·前端·servlet
石小石Orz21 小时前
油猴脚本实现生产环境加载本地qiankun子应用
前端·架构
swg32132121 小时前
Spring Boot 3.X Oauth2 认证服务与资源服务
java·spring boot·后端
从前慢丶21 小时前
前端交互规范(Web 端)
前端
tyung21 小时前
一个 main.go 搞定协作白板:你画一笔,全世界都看见
后端·go
gelald1 天前
SpringBoot - 自动配置原理
java·spring boot·后端
CHU7290351 天前
便捷约玩,沉浸推理:线上剧本杀APP功能版块设计详解
前端·小程序