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>


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)新项目
直接引入依赖

2)老项目
pom.xml添加

lombok作用如图

@Data就相当于这些的结合

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

后端实现:
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;
}
}
接口测试:
提交留言:

获取留言:

部分前端代码讲解:

上面的代码全部挤在一起,耦合太高。所以 认识下 应用分层这个概念
应用分层
把整体架构分为表现层、业务逻辑层和数据层。这种分层方式也称之为:三层架构
1.表现层:就是展示数据结果和接受用户指令的,是最靠近用户的一层;
2.业务逻辑层:负责处理业务逻辑,里面有复杂业务的具体实现;
3.数据层:负责存储和管理与应用程序相关的数据

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

图书管理 预备
这里先实现 两个功能 因为还没涉及数据库操作 所以练习都是先模拟数据
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:控制反转 它是一种设计思想 对象控制权的转移

例子:


在传统的 Java SE 程序设计中,我们直接在对象内部通过 new 的方式来创建对象,是程序主动创建依赖对象;
而在Spring程序设计中,IOC 是有专门的容器去控制对象。
所谓控制就是对象的创建、初始化、销毁。
创建对象:原来是 new 一个,现在是由 Spring 容器创建。
初始化对象:原来是对象自己通过构造器或者 setter 方法给依赖的对象赋值,现在是由 Spring 容器自动注入。
销毁对象:原来是直接给对象赋值 null 或做一些销毁操作,现在是 Spring 容器管理生命周期负责销毁对象。
所谓反转:其实是反转的控制权,前面提到是由 Spring 来控制对象的生命周期,那么对象的控制就完全脱离了我们的控制,控制权交给了Spring 。
总结!!!
IoC(控制反转)的核心是把对象创建和依赖管理的控制权,从对象自身转移给外部容器。传统方式中,一个对象需要其他对象时通常自己通过 new 创建,因此对象之间耦合较强;使用 IoC 后,对象只需要声明自己依赖什么,由外部容器创建依赖对象并注入进来。这样可以降低对象之间的耦合,提高代码的可维护性和可扩展性。DI(依赖注入)就是实现 IoC 的一种主要方式。
IoC = “我需要什么我告诉 Spring,但我不自己 new,由 Spring 创建并塞给我。”

浙公网安备 33010602011771号