【springboot】sprinMVC练习

Spring MVC练习

1. 加法计算器练习

前端页面:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script><script src="https://cdn.staticfile.org/axios/0.18.0/axios.min.js"></script>
</head><body><div id="app"><h1>计算器</h1>数字1:<input v-model="num1" type="text"><br>数字2:<input v-model="num2" type="text"><br><button @click="add()">点击相加</button><div v-if="flg">两数相加之和:{{result}}</div></div>
</body>
<script>new Vue({el: '#app',data: {flg: false,num1: "",num2: "",result: 0},methods: {add: function () {axios.post('calc/sum', {"num1": this.num1,"num2": this.num2}).then(response => (this.flg = true, this.result = response.data)).catch(function (error) { // 请求失败处理console.log(error);});}}})
</script></html>

后端代码:

@RestController
@RequestMapping("/calc")
public class CalController {@RequestMapping("/sum")public Integer add(@RequestBody Map<String,Integer> map){System.out.println(map);return map.get("num1") + map.get("num2");}
}

2. 登录练习

前端代码:

登录页面login.html核心代码:

<body><div id="app"><h1>用户登录</h1>用户名:<input v-model="username" name="userName" type="text" id="userName"><br>密码:<input v-model="password" name="password" type="password" id="password"><br><button @click="login()">登录</button></div><script>new Vue({el: '#app',data() {return {username: "",password: ""}},methods: {login: function () {axios.get('user/login', {params: {"username": this.username,"password": this.password}}).then(response => {if (response.data == true) {location.href = "/index.html";} else {alert("账号或密码错误登录失败");}}).catch(function (error) { // 请求失败处理console.log(error);});}}})</script>
</body>

用户登录首页index.html核心代码

<body><div id="app">登录人: {{username}}</div><script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script><script src="https://cdn.staticfile.org/axios/0.18.0/axios.min.js"></script><script>new Vue({el: '#app',data() {return {username: ""}},mounted() {//钩子函数axios.get('user/getUserInfo').then(response => {if(response.data != ""){this.username = response.data;}else{this.username = "没有用户登录";}}).catch(function (error) { // 请求失败处理console.log(error);});}})</script>
</body>

接口定义:

1. 登录接口/user/loginusername=?&password=?返回校验:校验成功/失败true:登录成功false:登录失败
2. 获取用户登录信息/user/getUSerInfo接口返回:当前登录用户的名称
前端需要注意的是,用axios发送请求,post请求是在body中,是json格式。get请求的参数是在URL参数中。

后端代码:

@RestController
@RequestMapping("/user")
public class UserController {@RequestMapping("/login")public boolean login(String username, String password, HttpServletRequest request){if(!StringUtils.hasLength(username)||!StringUtils.hasLength(password)){return false;}if (username.equals("admin") && password.equals("admin")){//存储sessionrequest.getSession().setAttribute("username",username);return true;}return false;}@RequestMapping("/getUserInfo")//获取sessionpublic String getUserInfo(@SessionAttribute(required = false) String username){return username;}
}

3. 留言板

接口定义

1. 提交留言/message/publish参数:MessageInfo(from,to,message)返回结果:true
2. 查看所有留言/message/getMessageList参数:无返回结果:List<MessageInfo>

前端代码:

<body><div id="app"><div class="container"><h1>留言板</h1><p class="grey">输入后点击提交, 会将信息显示下方空白处</p><div class="row"><span>谁:</span> <input type="text" v-model="messageInfo.from" id="from"></div><div class="row"><span>对谁:</span> <input type="text" v-model="messageInfo.to" id="to"></div><div class="row"><span>说什么:</span> <input type="text" v-model="messageInfo.message" id="say"></div><button id="submit" @click="submit()"> 提交 </button><div v-for="(item,index) in messageList" :key="index">{{item.from}} 对 {{item.to}} 说: {{item.message}}</div></div></div><script src="https://cdn.staticfile.org/vue/2.4.2/vue.js"></script><script src="https://cdn.staticfile.org/axios/0.18.0/axios.min.js"></script><script>new Vue({el: '#app',data: {messageInfo: {from: "",to: "",message: ""},messageList: []},mounted() {//钩子函数axios.get('message/getMessageList').then(response => {this.messageList = response.data;}).catch(function (error) { // 请求失败处理console.log(error);});},methods: {submit: function () {if (this.messageInfo.from == '' || this.messageInfo.to == '' || this.messageInfo.message == '') {return;}axios.post('message/publish', this.messageInfo).then(response => {if (response.data == true) {//alert("留言发布成功");this.messageList.push({from: this.messageInfo.from,to: this.messageInfo.to,message: this.messageInfo.message});//清空输入框中的值this.messageInfo.from = "";this.messageInfo.to = "";this.messageInfo.message = "";} else {//添加失败alert("留言发布失败");}}).catch(function (error) { // 请求失败处理console.log(error);});}}})</script>
</body>

后端代码

实体类代码:

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

controller代码:

@RestController
@RequestMapping("/message")
public class MessageController {List<MessageInfo> messageInfoList = new ArrayList<>();@RequestMapping("/publish")public boolean publishMessage(@RequestBody MessageInfo messageInfo){System.out.println(messageInfo);if (!StringUtils.hasLength(messageInfo.getFrom()) ||!StringUtils.hasLength(messageInfo.getTo()) ||!StringUtils.hasLength(messageInfo.getMessage())){return false;}messageInfoList.add(messageInfo);return true;}@RequestMapping("/getMessageList")public List<MessageInfo> getMessageList(){return messageInfoList;}
}

4. 图书管理系统简单练习

这里只做简单的练习,后面会补充练习

接口定义

1. 登录URL:/user/login参数:username=?& password=?响应:true/false
2. 图书列表展示URL:/book/getBookList参数:无响应:List<BookInfo>

前端核心代码

登录页面:

<body><div id="app"><div class="container-login"><div class="container-pic"><img src="pic/computer.png" width="350px"></div><div class="login-dialog"><h3>登陆</h3><div class="row"><span>用户名</span><input type="text" v-model="username" name="userName" id="userName" class="form-control"></div><div class="row"><span>密码</span><input type="password" v-model="password" name="password" id="password" class="form-control"></div><div class="row"><button type="button" class="btn btn-info btn-lg" @click="login()">登录</button></div></div></div></div><script src="js/jquery.min.js"></script><script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script><script src="https://cdn.staticfile.org/axios/0.18.0/axios.min.js"></script><script>new Vue({el: '#app',data() {return {username: "",password: ""}},methods: {login: function () {axios.get('user/login', {params: {"username": this.username,"password": this.password}}).then(response => {if (response.data == true) {location.href = "/book_list.html";} else {alert("账号或密码错误登录失败");}}).catch(function (error) { // 请求失败处理console.log(error);});}}})</script>
</body>

列表页(目前只实现查询列表):

<table><thead><tr><td>选择</td><td class="width100">图书ID</td><td>书名</td><td>作者</td><td>数量</td><td>定价</td><td>出版社</td><td>状态</td><td class="width200">操作</td></tr></thead><tbody><tr  v-for="(item,index) in bookList" :key="index"><td><input type="checkbox" name="selectBook" value="1" id="selectBook" class="book-select"></td><td>{{item.id}}</td><td>{{item.bookName}}</td><td>{{item.author}}</td><td>{{item.count}}</td><td>{{item.price}}</td><td>{{item.publish}}</td><td>{{item.statusCN}}</td><td><div class="op"><a :href="baseUrl + item.id">修改</a><a href="javascript:void(0)" onclick="deleteBook(item.id)">删除</a></div></td></tr></tbody>
</table>
<script>new Vue({el: '#app',data: {baseUrl:"book_update.html?bookId=",bookList: []},mounted() {//钩子函数axios.get('book/getBookList').then(response => {this.bookList = response.data;}).catch(function (error) { // 请求失败处理console.log(error);});},methods: {}})
</script>

后端代码:

实体类:

@Data
public class BookInfo {private int id;private String bookName;private String author;private int count;private BigDecimal price;private String publish;//状态 0-⽆效 1-允许借阅 2-不允许借阅private Integer status;private String statusCN;
}

用户controller类

@RestController
@RequestMapping("/user")
public class UserController {@RequestMapping("/login")public boolean login(String username, String  password, HttpSession session){if (!StringUtils.hasLength(username) || !StringUtils.hasLength(password)){return false;}if ("admin".equals(username) && "admin".equals(password)){session.setAttribute("username",username);return true;}return false;}
}

图书controller类

@RestController
@RequestMapping("/book")
public class BookController {@RequestMapping("/getBookList")public List<BookInfo> getBookList(){//1.获取图书数据//2.对图书数据进行处理//3.返回数据//mock:表示虚拟的假数据List<BookInfo> bookInfos = mockData();for (BookInfo bookInfo:bookInfos) {if (bookInfo.getStatus() == 1){bookInfo.setStatusCN("可借阅");}else {bookInfo.setStatusCN("不可借阅");}}return bookInfos;}private List<BookInfo> mockData(){//优化小Tips:对于已知的数据量,或者大于这个集合的数据时,创建list时,建议指定初始化容量。List<BookInfo> bookInfos = new ArrayList<>(15);for (int i = 0; i < 15; i++) {BookInfo bookInfo = new BookInfo();bookInfo.setId(i);bookInfo.setBookName("图书" + i);bookInfo.setAuthor("作者" + i);bookInfo.setCount(new Random().nextInt(200));bookInfo.setPrice(new BigDecimal(new Random().nextInt(100)));bookInfo.setPublish("出版社" + i);bookInfo.setStatus(i % 5 == 0 ? 2: 1);bookInfos.add(bookInfo);}return bookInfos;}
}

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

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

相关文章

Go语言中的同步原语:ErrGroup、Semaphore和SingleFlight

1. 并发基础 并发是同时发生多个计算或事件的能力。并发通常通过同时执行多个任务或进程来实现&#xff0c;这些任务或进程共享相同的资源&#xff08;例如内存或处理器&#xff09;。并发使用的基本机制被称为锁。在Go语言中&#xff0c;锁是一个类型变量&#xff0c;它包含一…

ubuntu nginx安装部署

上传nginx-1.18.0.tar.gz mv nginx-1.18.0.tar.gz /usr/local/ #解压 tar -zxvf nginx-1.18.0.tar.gz #安装 cd nginx-1.18.0 #安装依赖包apt-get install build-essential zlib1g-dev libpcre3 libpcre3-dev libssl-dev libxslt1-dev libxml2-dev libgeoip-dev openssl libgd…

【开源】基于JAVA+Vue+SpringBoot的医院门诊预约挂号系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 功能性需求2.1.1 数据中心模块2.1.2 科室医生档案模块2.1.3 预约挂号模块2.1.4 医院时政模块 2.2 可行性分析2.2.1 可靠性2.2.2 易用性2.2.3 维护性 三、数据库设计3.1 用户表3.2 科室档案表3.3 医生档案表3.4 医生放号…

【目标检测】YOLOv5算法实现(七):模型训练

本系列文章记录本人硕士阶段YOLO系列目标检测算法自学及其代码实现的过程。其中算法具体实现借鉴于ultralytics YOLO源码Github&#xff0c;删减了源码中部分内容&#xff0c;满足个人科研需求。   本系列文章主要以YOLOv5为例完成算法的实现&#xff0c;后续修改、增加相关模…

2023一带一路暨金砖国家技能发展与技术创新大赛“网络安全”赛项省选拔赛样题卷①

2023金砖国家职业技能竞赛"网络安全" 赛项省赛选拔赛样题 2023金砖国家职业技能竞赛 省赛选拔赛样题第一阶段&#xff1a;职业素养与理论技能项目1. 职业素养项目2. 网络安全项目3. 安全运营 第二阶段&#xff1a;安全运营项目1. 操作系统安全配置与加固任务一Linux …

机器学习和深度学习检测网络安全课题资料:XSS、DNS和DGA、恶意URL、webshell

开源算法 XSS 机器学习识别XSS实践使用深度学习检测XSS使用深度学习检测XSS(续)DNS&DGA检测 使用CNN检测DNS隧道 探秘-基于机器学习的DNS隐蔽隧道检测方法与实现 DNS Tunnel隧道隐蔽

Go语言中的Channel

1. 简介 Channel是Go语言中一种重要的并发原语&#xff0c;它允许goroutine之间安全地交换数据。Channel是一个类型化的队列&#xff0c;它可以存储一个特定类型的值。goroutine可以通过发送和接收操作来向channel中写入和读取数据。 2. Channel的类型 Channel的类型由其元素…

第一次面试复盘

这个秋招到目前为止第一次拿到了面试机会&#xff0c;虽然是小公司&#xff0c;但是人家是有官网的&#xff01;&#xff01;&#xff01;很爱&#xff01;先赶紧复盘一下&#xff0c;因为还有很多笔试没有复盘。 你们的数学建模解决了什么问题&#xff1f;你觉得你们为什么能拿…

CompletableFuture、ListenableFuture高级用列

CompletableFuture 链式 public static void main(String[] args) throws Exception {CompletableFuture<Integer> thenCompose T1().thenCompose(Compress::T2).thenCompose(Compress::T3);Integer result thenCompose.get();System.out.println(result);}// 假设这些…

【Oracle】Oracle编程PLSQL

Oracle编程 一、PL/SQL 1、PL/SQL概述 PL/SQL&#xff08;Procedure Language/SQL&#xff09;是 Oracle 对 sql 语言的过程化扩展&#xff0c;使 SQL 语言具有过程处理能力。 基本语法结构 [declare -- 声明变量 ]begin-- 代码逻辑 [exception-- 异常处理 ]end;2、变量 …

centos7下升级openssh9.4p1及openssl1.1.1v版本

背景&#xff1a;客户服务器扫描出一些漏洞&#xff0c;发现和版本有关&#xff0c;漏洞最高的版本是9.3p2&#xff0c;所以我们安装一个openssh9.4p1版本及openssl1.1.1v版本 虽然我们进行了镜像备份&#xff0c;为了安全先安装telnet以防止升级失败无法通过ssh连接服务器 一…

【会议征稿通知】第二届数字化经济与管理科学国际学术会议(CDEMS 2024)

第二届数字化经济与管理科学国际学术会议&#xff08;CDEMS 2024&#xff09; 2024 2nd International Conference on Digital Economy and Management Science&#xff08;CDEMS 2024&#xff09; 2024年第二届数字经济与管理科学国际会议(CDEMS 2024) 定于2023年4月26-28日…

如何使用统计鸟网站统计分析网站流量来源?

统计鸟官网地址&#xff1a;https://www.tongjiniao.com/ 站长必备&#xff01;网站数据统计&#xff0c;流量监测平台 提供网站数据统计分析、搜索关键词、流量访问来源等服务 深入分析用户点击习惯&#xff0c;为智能化运营网站提供更好的用户体验 目录 一、注册账号信息 二…

基于博弈树的开源五子棋AI教程[3 极大极小搜索]

基于博弈树的开源五子棋AI教程[3 极大极小搜索] 引子极大极小搜索原理alpha-beta剪枝负极大搜索尾记 引子 极大极小搜索是博弈树搜索中最常用的算法&#xff0c;广泛应用于各类零和游戏中&#xff0c;例如象棋&#xff0c;围棋等棋类游戏。算法思想也是合乎人类的思考逻辑的&a…

Flask+ Dependency-injecter+pytest 写测试类

最近在使用这几个在做项目&#xff0c;因为第一次用这个&#xff0c;所以不免有些问题。总结下踩的坑 1.测试类位置 首先测试类约定会放在tests里面&#xff0c;不然有可能发生引入包的问题&#xff0c;会报错某些包找不到。 2. 测试类依赖注入 这里我就用的真实的数据库操作…

Js--数组(三)

1.什么是数组&#xff1f; 数组&#xff1a;(Array)是一种可以按顺序保存数据的数据类型 2.为什么要数组&#xff1f; 思考&#xff1a;如果我想保存一个班里所有同学的姓名怎么办&#xff1f; 场景&#xff1a;如果有多个数据可以用数组保存起来&#xff0c;然后放到一个变量…

MacBook安装Docker

MacBook安装Docker dmg包安装 官方下载dmg安装包: https://docs.docker.com/desktop/mac/install/ 点击安装&#xff0c;然后启动 二进制安装 官方下载二进制包: https://download.docker.com/mac/static/stable/x86_64/ tar -zxvf docker-20.10.0.tgz#将解压出来的docke…

Apppium driver的一些比较重要操作,原生APP和H5 APP(WEBVIEW)

1.reset() //重置app 这时候driver会重置&#xff0c;相当于卸载重装应用。所以本地缓存会失效 driver.reset() 2.start_activity(包名,activity名) //启动app的某一个activity 例如&#xff1a;driver.start_activity("com.wuba.zhuanzhuan","./presentatio…

9个Linux网络命令

这些命令用于监控连接、排除网络故障、路由选择、DNS 查询和接口配置。 1. ping – 向网络主机发送 ICMP ECHO_REQUEST ping 是用于测试网络连接的最流行的网络终端工具。ping 有很多选项&#xff0c;但在大多数情况下&#xff0c;您将使用它来请求域或IP地址&#xff1a; p…

【AI视野·今日CV 计算机视觉论文速览 第285期】Mon, 8 Jan 2024

AI视野今日CS.CV 计算机视觉论文速览 Mon, 8 Jan 2024 Totally 66 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers Denoising Vision Transformers Authors Jiawei Yang, Katie Z Luo, Jiefeng Li, Kilian Q Weinberger, Yonglong Tian, Yue…