9/1 Spring学习博客

今天先完成了SpringMVC的简易训练,还顺便认识了前后端交互的一些过程

接口定义:

服务提供方:
(1)提供什么服务
(2)提供服务时,需要什么参数
(3)处理之后,需要给对方什么响应

客户端角度:
1.我需要什么服务
2.服务端要求的参数,我是否有
3.对方给我提供的信息,是否能满足我的需求

简易用户登录

接口定义
一、用户验证
/login/check

参数: userName,password

响应: 用户 和 密码 是否正确

true:用户和密码正确
false:密码错误

二、获取登录的用户
/login/index

参数:无

响应:登录的用户

后端代码实现:

@RestController
@RequestMapping("/login")
public class LoginController {
    @RequestMapping("/check")

    public Boolean check(String userName, @RequestParam("password") String passWord, HttpSession session){
        System.out.println("接收到参数:"+userName+","+passWord);
        //校验 账户密码是否为空
        if(userName == null || userName.isEmpty() || passWord == null || passWord.isEmpty()){
            return false;
        }
        //检验 账户密码是否正确
        //数据模拟
        if("admin".equals(userName)&&"123456".equals(passWord)){
            session.setAttribute("userName",userName);
            return true;
        }
        return false;

    }

    @RequestMapping("/index")
    public String index(HttpSession session){//这里session 等于 session = request.getSession(true); 没有session会自动创建
        String userName = (String) session.getAttribute("userName");
        return userName;
    }
}

对于前端则是重在了解
主要是认识ajax的格式
$.ajax({
type :"",
url:"",
data:{},
})

还有 响应成功时候的回调函数

success:function(参数自定义 代表返回的响应){
}

login.html 部分实现:

<body>
<h1>用户登录</h1>
用户名:<input name="userName" type="text" id="userName"><br>
密码:<input name="password" type="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({
            type :"post",
            url:"/login/check",
            data:{
                userName:$("#userName").val(),
                password:$("#password").val()
            },
            success:function(result){
                if(result==true){
                    //用户密码正确
                    location.href="index.html"
                }
                else{
                    alert("用户名和密码错误!")
                }
            }
        });

    }

</script>
</body>

3051a2bfafd7d98b60a49a451ccb710d

9a781623420d819fdd1eb4075a61028a

index.html部分代码实现:

<body> 登录人: <span id="loginUser"></span>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script>
    $.ajax({
        url:"/login/index",
        type:'get',
        success:function(result){
            $("#loginUser").text(result)//这里是给文本赋值 
        }
    });
</script>
</body>

用户可以输入/选择的数据,一般用 .val();页面上普通显示的文字,一般用 .text()。

简易留言板

接口定义
1.提交留言
URL:/message/publish

参数:
from 发表人
to 接收人
message 信息

响应: 提交成功/失败
true:成功
false:失败

2.获取留言
URL:/message/getList

参数:无

返回: 全部的留言信息 List

在实现代码之前 先认识下Lombok组件

引入lombok依赖
1)新项目
直接引入依赖

223e2575e9ae465059ce2b2909771a0a

2)老项目
pom.xml添加

7bdc138b239a7b1d6b99929865c6ca2b

lombok作用如图
c01ca9ff3933d788ce5321bf353e4514

@Data就相当于这些的结合
d597e708fab5e164bc517b65f858108f

有时候不想使用lombok里面这么多的方法 可以用单个注解
842c4489686e704d0c2272d6f7e48c5a

后端实现:

MessageInfo

package com.bite.spring;

import lombok.Data;

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

MessageController

@RestController
@RequestMapping("/message")
public class MessageController {

    private List<MessageInfo> messageInfos = new ArrayList<>();

    @RequestMapping("/publish")
    public boolean publishMessage(MessageInfo messageInfo){
        if(!StringUtils.hasLength(messageInfo.getFrom())
        ||!StringUtils.hasLength(messageInfo.getTo())
        ||!StringUtils.hasLength(messageInfo.getMessage())){
            return false;
        }
        //暂时存放在内存中
        messageInfos.add(messageInfo);
        return true;

    }


    @RequestMapping("/getMessage")
    public List<MessageInfo> getMessage(){
        return messageInfos;
    }
}

接口测试:

提交留言:

08a4163e3457afa6ad18c6657a7e8771

获取留言:

9570d05d0611a922f8d39e70a36b681c

部分前端代码讲解:
6eac38aa807eb8e8abe1a15ceaa2d3e2

上面的代码全部挤在一起,耦合太高。所以 认识下 应用分层这个概念

应用分层

把整体架构分为表现层业务逻辑层数据层。这种分层方式也称之为:三层架构

1.表现层:就是展示数据结果和接受用户指令的,是最靠近用户的一层;
2.业务逻辑层:负责处理业务逻辑,里面有复杂业务的具体实现;
3.数据层:负责存储和管理与应用程序相关的数据

b5d28d3ecc1df6281b5ac5a3d305ed67

MVC和三层架构共同点:解耦 高内聚(模块内 关系尽量紧密),低耦合(模块间 关系尽量关联低)

ef4117cb77fcab988d472fe7cad20254

图书管理 预备

这里先实现 两个功能 因为还没涉及数据库操作 所以练习都是先模拟数据

1.登录 2.图书列表

接口定义
1.登录
URL: /user/login

参数:用户名和密码
userName
password

返回:
true:用户名和密码正确
false:用户名和密码错误

2.图书列表
URL:/book/getList

参数:无

返回:图书列表List

后端代码实现:
model:

BookInfo:

@Data
public class BookInfo {
    private Integer id;
    private String bookName;
    private String author;
    private Integer count;
    private BigDecimal price;
    private String publish;
    private Integer state;//1 - 可借阅 2-不可借阅
    private String stateCN;
}

Controller:

UserController

@RequestMapping("/user")
@RestController
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)&&"123456".equals(password)){
            //存session
            session.setAttribute("userName",userName);
            return true;
        }
        return false;

    }
}

BookController

@RequestMapping("/book")
@RestController
public class BookController {
    @RequestMapping("/getList")
    public List<BookInfo> getList(){
        //1.从数据库中获取数据
        //数据采用Mock方式
        BookService bookService = new BookService();
        List<BookInfo> bookInfos = bookService.getBookInfoList();
        //3.返回数据
        return bookInfos;
    }
    
}

service:

BookSevice

public class BookService {
    public List<BookInfo> getBookInfoList(){

        BookDao bookDao = new BookDao();

        List<BookInfo> bookInfos = bookDao.mockBookData();
        //2.对数据进行处理:状态处理
        for(BookInfo bookInfo:bookInfos){
            if(bookInfo.getState()==1){
                bookInfo.setStateCN("可借阅");
            }
            else if(bookInfo.getState()==2){
                bookInfo.setStateCN("不可借阅");
            }
        }
        return bookInfos;
    }
}

dao:

BookDao

public class BookDao {
    public List<BookInfo> mockBookData(){
        List<BookInfo> bookInfos = new ArrayList<>();

        for(int i=1;i<15;i++){
            BookInfo bookInfo = new BookInfo();
            bookInfo.setId(i);
            bookInfo.setBookName("图书"+i);
            bookInfo.setAuthor("作者"+i);
            bookInfo.setCount(i*15);
            bookInfo.setPrice(new BigDecimal(new Random().nextInt(100)));
            bookInfo.setPublish("出版社"+i);
            bookInfo.setState(i%5==0?2:1);

            bookInfos.add(bookInfo);
        }

        return bookInfos;

    }
}

前端部分代码实现:

 getBookList();
            function getBookList() {
                $.ajax({
                   type:"get",
                   url:"/book/getList",
                   success:function(books){
                       var finalHtml=""
                       for(var book of books){
                           //拼接html
                           finalHtml+='<tr>';
                           finalHtml+='<td><input type="checkbox" name="selectBook" value="'+book.id+'" id="selectBook" class="book-select"></td>';
                           finalHtml+='<td>'+book.id+'</td>';
                           finalHtml+='<td>'+book.bookName+'</td>';
                           finalHtml+='<td>'+book.author+'</td>';
                           finalHtml+=' <td>'+book.count+'</td>';
                           finalHtml+='<td>'+book.price+'</td>';
                           finalHtml+='<td>'+book.publish+'</td>';
                           finalHtml+=' <td>'+book.stateCN+'</td>';
                           finalHtml+='<td>';
                           finalHtml+=' <div class="op">';
                           finalHtml += '<a href="book_update.html?bookId=' + book.id + '">修改</a>';
                           finalHtml += '<a href="javascript:void(0)" onclick="deleteBook(' + book.id + ')">删除</a>';
                           finalHtml+='</div>';
                           finalHtml+='</td>';
                           finalHtml+='</tr>';
                       }

                       $("tbody").html(finalHtml);

                }
                });

SpringMVC的基本学习总结

1.学习Spring MVC,其实就是学习各种Web开发需要用的到注解

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.Cookie 和Session都是会话机制,Cookie是客户端机制,Session是服务端机制.二者通过Sessionld来关联.

Spring MVC内置HttpServletRequest, HttpServletResponse两个对象.需要使用时,直接在方法中添加对应参数即可, Cookie和Session可以从HttpServletRequest中来获取,也可以直接使用HttpServletResponse设置Http响应状态码

Spring IOC和DI 初步认识

Spring 是包含众多工具的IOC容器

tomcat:web容器
list/map:数据容器
学校:学生容器

Spring容器:装的是对象

IOC:控制反转 它是一种设计思想 对象控制权的转移

image

例子:
52f1cd9e2cc08a439e472233b0146a47

image

在传统的 Java SE 程序设计中,我们直接在对象内部通过 new 的方式来创建对象,是程序主动创建依赖对象;

而在Spring程序设计中,IOC 是有专门的容器去控制对象。

所谓控制就是对象的创建、初始化、销毁。
创建对象:原来是 new 一个,现在是由 Spring 容器创建。

初始化对象:原来是对象自己通过构造器或者 setter 方法给依赖的对象赋值,现在是由 Spring 容器自动注入。

销毁对象:原来是直接给对象赋值 null 或做一些销毁操作,现在是 Spring 容器管理生命周期负责销毁对象。

所谓反转:其实是反转的控制权,前面提到是由 Spring 来控制对象的生命周期,那么对象的控制就完全脱离了我们的控制,控制权交给了Spring 。

总结!!!
IoC(控制反转)的核心是把对象创建和依赖管理的控制权,从对象自身转移给外部容器。传统方式中,一个对象需要其他对象时通常自己通过 new 创建,因此对象之间耦合较强;使用 IoC 后,对象只需要声明自己依赖什么,由外部容器创建依赖对象并注入进来。这样可以降低对象之间的耦合,提高代码的可维护性和可扩展性。DI(依赖注入)就是实现 IoC 的一种主要方式。

IoC = “我需要什么我告诉 Spring,但我不自己 new,由 Spring 创建并塞给我。”

posted @ 2026-09-01 18:18  曾章吉的浩吧  阅读(1)  评论(0)    收藏  举报