【Spring】Springmvc学习Ⅲ

news2024/11/28 20:50:44

# Springmvc学习Ⅲ

文章目录

    • 一、图书管理系统
    • 1. 功能
      • 1.1 登录
        • 前端接口
        • 前端代码
        • 后端接口
        • 后端代码
      • 1.2 图书列表展示
        • 步骤:
        • 图书类代码
        • mock数据代码
        • 控制层调用代码
        • 服务层代码(存储除数据库中需要存储的数据)
    • 2. 分层控制
      • 2.1 三层架构
      • 2.2 代码重构
    • 二、MVC总结
      • 1. 注解
      • 2. 获取请求和响应

一、图书管理系统

1. 功能

1.1 登录

能够对于用户输入的账号密码进行验证,正确则登录成功,错误则登录失败。

前端接口

路径: /user/login

方式 : post

请求 : 账号 密码

响应 : 正确 错误

前端代码
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="css/bootstrap.min.css">
    <link rel="stylesheet" href="css/login.css">
    <script type="text/javascript" src="js/jquery.min.js"></script>
</head>

<body>
    <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" name="userName" id="userName" class="form-control">
            </div>
            <div class="row">
                <span>密码</span>
                <input type="password" name="password" id="password" class="form-control">
            </div>
            <div class="row">
                <button type="button" class="btn btn-info btn-lg" onclick="login()">登录</button>
            </div>
        </div>
    </div>
    <script src="js/jquery.min.js"></script>
    <script>
        function login() {
            console.log($("#userName").val());
            console.log($("#password").val());
          $.ajax({
            url:"/user/login",
            type:"post",
            data:{
                userName:$("#userName").val(),
                password:$("#password").val()
            },
           success : function (result) {
                if(result==""){
                    location.href = "book_list.html";
                }else{
                    alert("密码错误");
                }
            }
          });
    }
    </script>
</body>

</html>
后端接口

响应数据:成功-“” 失败-“登录错误”

数据类型:String

后端代码
package com.example.springbook.controller;


import jakarta.servlet.http.HttpSession;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RequestMapping("/user")
@RestController
public class UserController {
    @RequestMapping("/login")
    public String login(String userName, String password, HttpSession httpSession) {
        if (!StringUtils.hasLength(userName) || !StringUtils.hasLength(password)) {
            return "账号或密码为空";
        }

        // 校验
        if (!"admin".equals(userName) || !"admin".equals(password)){
            return "密码错误";
        }
        System.out.println(userName + " " + password);

        httpSession.setAttribute("userName", userName);
        return "";
    }
}

1.2 图书列表展示

正规的方式应该是将图书数据保存到数据库中,然后每次都是从数据库中读取,此处只使用mock进行测试。

步骤:
  1. 创建用于描述图书信息的实体类
  2. 创建List用于存储图书列表
  3. 在控制层将列表读出
  4. 反馈给前端
图书类代码
package com.example.springbook.model;

import lombok.Data;

import java.math.BigDecimal;

@Data
public class BookInfo {
    private Integer id;
    private String bookName;
    private String author;
    private Integer num;
    private BigDecimal price;
    private String publish;
    private Integer status;// 1-正常 2-不可借阅
    private String statusCN;
}

mock数据代码
package com.example.springbook.dao;

import com.example.springbook.model.BookInfo;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

public class BookDao {
    /**
     * 模拟数据
     * @return
     */
    public List<BookInfo> mockData() {
        List<BookInfo> bookInfos = new ArrayList<>();
        for (int i = 0; i < 15; i++) {
            BookInfo bookInfo = new BookInfo();
            bookInfo.setId(i);
            bookInfo.setBookName("图书" + i);
            bookInfo.setAuthor("作者" + i);
            bookInfo.setNum(i * 2 + 1);
            bookInfo.setPrice(new BigDecimal(i * 3));
            bookInfo.setPublish("出版社" + i);
            if (i % 5 == 0) {
                bookInfo.setStatus(2);
            } else {
                bookInfo.setStatus(1);
            }

            bookInfos.add(bookInfo);
        }
        return bookInfos;
    }
}

控制层调用代码
package com.example.springbook.controller;


import com.example.springbook.dao.BookDao;
import com.example.springbook.model.BookInfo;
import com.example.springbook.service.BookService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

@RequestMapping("/book")
@RestController
public class BookController {
    @RequestMapping("getBookList")
    public List<BookInfo> getBookList() {
        BookService bookService = new BookService();
        return bookService.getBookList();
    }
}

服务层代码(存储除数据库中需要存储的数据)
package com.example.springbook.service;

import com.example.springbook.dao.BookDao;
import com.example.springbook.model.BookInfo;

import java.util.List;

public class BookService {
    public List<BookInfo> getBookList() {
        BookDao bookDao = new BookDao();
        // 从dao层获取数据
        List<BookInfo> bookInfos = bookDao.mockData();
        for (BookInfo book : bookInfos) {
            if (book.getStatus() == 1) {
                book.setStatusCN("可借阅");
            } else {
                book.setStatusCN("不可借阅");
            }
        }

        return bookInfos;
    }
}

2. 分层控制

2.1 三层架构

  1. 表示层:负责用户界面和展示数据。
  2. 业务逻辑层:处理具体的业务逻辑。
  3. 数据访问层:也称为持久层。负责数据访问操作,包括数据的增、删、改、查。

与之前学习的MVC模式对应关系:

在这里插入图片描述

2.2 代码重构

在这里插入图片描述

二、MVC总结

1. 注解

a. @RequestMapping:路由映射

b. @RequestParam:后端参数重命名

c. @RequestBody:接收JSON类型的参数

d. @PathVariable:接收路径参数

e. @RequestPart:上传⽂件

f. @ResponseBody:返回数据

g. @CookieValue:从Cookie中获取值

h. @SessionAttribute:从Session中获取值

i. @RequestHeader:从Header中获取值

j. @Controller:定义⼀个控制器,Spring框架启动时加载,把这个对象交给Spring管理.默认返回
视图.

k. @RestController:@ResponseBody+@Controller返回数据

2. 获取请求和响应

HttpServletRequest: 请求

HttpServletResponse: 响应

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

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

相关文章

C语言实现简单的日历功能

开篇 本篇文章的题目来源于《编程珠玑》第三章课后习题的第四个问题&#xff0c;也是我会手动实现的本章的最后一个功能。 问题概要 给定月和年&#xff0c;使用字符数组生成该月的日历&#xff08;含有周几的日历&#xff09;。 思路分析 为了生成给定年份中某个月的日历&…

【光线重塑技术】小姐姐,美得不可方物——lllyasviel/ic-light

在英伟达自18年宣布光追技术之后&#xff0c;RTX显卡也成了目前Steam游戏的常客。就连 AMD、Intel 和 Apple Silicon 都宣布要在GPU上支持光追算法。这次我要介绍的是huggingface上比较火的relight技术—— ic-light 介绍 IC-Light 是一个操纵图像照明的项目。 IC-Light &qu…

商务分析方法与工具(十):Python的趣味快捷-公司财务数据最炫酷可视化

Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&#xff01; 喜欢我的博客的话&#xff0c;记得…

【FreeRTOS 快速入门】-- 1、STM32工程移植FreeRTOS

目录 一、新建STM32工程 为了示范完整的移植过程&#xff0c;我们从0开始&#xff0c;新建一个标准的STM32点灯工程。 &#xff08;本篇以CubeMX作示范&#xff0c;CubeIDE操作近同&#xff0c;可作对比参考&#xff09; 1、新建工程 选择 芯片型号 新建工程 2、搜索芯片型号…

Pytest自动化测试框架完美结合Allure

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 简介 Allure Framework是一种灵活的、轻量级、多语言测试报告工…

weblogic [WeakPassword]

一、漏洞描述 开放了wblogic端口&#xff0c;进去发现有任意读取文件漏洞&#xff0c;配合解密工具读出密码&#xff0c;登录后台传入webshell 二、影响版本 当前版本 三、影响组件 weblogic 四、漏洞判断 hello/file.jsp?path/etc/passwd 发现有任意文件下载 五、漏洞…

C++牛客周赛题目分享(2)小红叕战小紫,小红的数组移动,小红的素数合并,小红的子序列求和

目录 ​编辑 1.前言 2.四道题目 1.小红叕战小紫 1.题目描述 2.输入描述 3.输出描述 4.示例 5.题解与思路 2.小红的数组移动 1.题目描述 2.输入描述 3.输出描述 4.示例 5.题解与思路 3.小红的素数合并 1.题目描述 2.输入描述 3.输出描述 4.示例 5.题解与思…

2024年淘宝天猫618超级红包领取口令活动时间是从什么时候开始到几月几号结束?

2024年淘宝天猫618活动&#xff0c;将于2024年5月19日开始&#xff0c;今年618淘宝天猫取消了预售环节。同时&#xff0c;618淘宝天猫也提供了多项优惠活动&#xff1a;超级红包、跨店满减、官方立减、全程价保及草柴APP领优惠券拿购物返利等多重优惠活动。 2024年淘宝天猫618…

【C语言】指针(一)

目录 一、内存 1.1 ❥ 理解内存和地址的关系 1.2 ❥ 编址 二、指针变量 2.1 ❥ 取地址操作符&#xff08;&&#xff09; 2.2 ❥ 指针变量和解引用操作符&#xff08;*&#xff09; 2.3 ❥ 指针变量的大小 三、指针类型的意义 3.1 ❥ 指针的解引用 3.2 ❥ 指针-整数 3…

智能制造装备业项目数字化管理之项目模板管理

智能制造装备&#xff0c;作为工业4.0的核心组成部分&#xff0c;正日益受到全球制造业的关注。这类装备融合了信息技术和制造技术&#xff0c;旨在提高生产效率、降低成本并增强产品的个性化。然而&#xff0c;随着智能制造装备行业的飞速发展&#xff0c;项目管理复杂性也在不…

AI图像生成-原理

一、图像生成流程总结 【AI绘画】深入理解Stable Diffusion&#xff01;站内首个深入教程&#xff0c;30分钟从原理到模型训练 买不到的课程_哔哩哔哩_bilibili 二、如果只是用comfy UI生成图片 1、找到下面几个文件&#xff0c;把对应模型移动到对应文件夹即可使用 2、选择对…

大学c语言基础很差,能不能学51单片机?会不会很困难?

开始前我分享下我的经历&#xff0c;我刚入行时遇到一个好公司和师父&#xff0c;给了我机会&#xff0c;一年时间从3k薪资涨到18k的&#xff0c; 我师父给了一些51单片机学习方法和资料&#xff0c;让我不断提升自己&#xff0c;感谢帮助过我的人&#xff0c; 如大家和我一样…

Springboot项目如何创建单元测试

文章目录 目录 文章目录 前言 一、SpringBoot单元测试的使用 1.1 引入依赖 1.2 创建单元测试类 二、Spring Boot使用Mockito进行单元测试 2.1 Mockito中经常使用的注解以及注解的作用 2.2 使用Mockito测试类中的方法 2.3 使用Mockito测试Controller层的方法 2.4 mock…

5分钟学设计模式:简单工厂与美食街的不期而遇

大家好&#xff0c;我是知微。 写代码好几年&#xff0c;是不是还纠结于这些问题&#xff1a; 面对一堆if-else&#xff0c;代码越写越长&#xff0c;维护起来比攀登珠穆朗玛峰还难每次只敢小心翼翼改个小功能&#xff0c;生怕程序突然“嘭”一声&#xff0c;全炸了想学习大佬…

基于SPWM控制策略的二极管钳位型NPC逆变器的并网simulink仿真

本人搭建了二极管钳位型NPC并网逆变器simulink仿真模型&#xff0c;该模型型采用d、q轴&#xff0c;电压前馈解耦控制&#xff0c;三相逆变并网&#xff0c;PI控制&#xff0c;仿真复现&#xff0c;效果优异&#xff0c;适合新手学习使用。 模型获取链接&#xff1a;基于SPWM…

探秘钱塘高中,筑梦未来之旅————杭州市钱塘高级中学

晨曦微露&#xff0c;书生琅琅&#xff0c;古韵今风交织在这方学府&#xff0c;滔滔的钱塘江畔&#xff0c;杭州市钱塘高级中学屹立于此。这所学校自1958年建校伊始&#xff0c;走过几十年的光辉岁月&#xff0c;一直致力于提供优质的教育资源。 近年来&#xff0c;学校获得多项…

鸿蒙内核源码分析(消息封装篇) | 剖析LiteIpc(上)进程通讯内容

基本概念 LiteIPC是OpenHarmony LiteOS-A内核提供的一种新型IPC&#xff08;Inter-Process Communication&#xff0c;即进程间通信&#xff09;机制&#xff0c;为轻量级进程间通信组件&#xff0c;为面向服务的系统服务框架提供进程间通信能力&#xff0c;分为内核实现和用户…

电商数据接口|如何获取电商数据?

随着互联网的发展&#xff0c;电商的运营方式也逐渐数据化&#xff0c;在大数据的影响下&#xff0c;电商领域很大程度上改变了传统的运营模式。很多商家如今都非常重视数据&#xff0c;并将数据贯穿于整个店铺的运营之中。 那么&#xff0c;具体来说电商大数据有哪些妙用呢&a…

C++ 对象型参数和返回值

对象型参数和返回值 1.对象型类型作为函数的参数2.对象型参数作为函数的返回值 1.对象型类型作为函数的参数 使用对象类型作为函数的参数或者返回值&#xff0c;可能会产生一些不必要的中间对象 例子&#xff1a; // 使用对象类型作为函数的参数 void test1(Car car) {}完整代…

空号检测-号码批量检测API接口-关机停机风险号检测

手机空号检测分为普通空号检测和实时检测两种类型&#xff1a; 普通空号检测返回结果&#xff1a;实号、风险号、空号、沉默号 。 1.普通版的检测不会实时更新数据&#xff0c;因此其数据库中的信息可能不是最新的。 2.覆盖基础运营商的数据库&#xff0c;检测范围相对有限&…