Spring MVC和Spring Boot

上节已经提到过请求,这次梳理响应。

响应

响应基本上都要被@Controller所托管,告诉Spring帮我们管理这个代码,我们在后面需要访问时,才可以进行访问,否则将会报错。并且其是由@RestController分离出来的,@RestController分离出来了@Controller来返回视图,随着现在前后端的彻底分离,现在返回视图所需要的数据,还分离出@RestponseBody来进行返回数据。

1.返回静态页面

@Controller进行对其的托管,并且这个注解只能修饰类,Spring 容器会将其实例化并管理起来,使得它可以接收并处理客户端的请求,并且一般负责负责接收和处理 HTTP 请求,调用业务逻辑完成业务处理,生成视图并返回给客户端,处理异常情况等。

切记在return的后面加上/来确保其是以url的格式 进行返回

@Controller
public class text {@RequestMapping("index")public String teturnIndex(){return "/index.html";}
}

在响应不加@Controller进行托管,直接就会报错

2.返回数据

@RestsponseBody注解来进行修饰,可以修饰类和方法,修饰类时表示这个类下的所有方法返回的都是数据,修饰方法时,表示该方法返回的是数据。所以如果一个类的所有方法都是返回数据直接加到类上,避免重复性操作。

@ResponseBody@RequestMapping("/returnData")public  String returnData(){return "返回数据";}

3.返回html的代码片段

@RestsponseBody注解来进行修饰

   @ResponseBody@RequestMapping("/returnHtml")public  String returnHtml(){return "<input type=\"button\" value=\"提交\" id=\"checkCaptcha\">";}

4.返回JSON

当我们的接口返回的是String时, content-Type是text/html
 

    @ResponseBody@RequestMapping("/returnHtml2")public  String returnHtml2(){String name = "zhangsan";return  name;}

当我们的接口返回的是对象时, content-type自动设置为application/json Map

    @ResponseBody@RequestMapping("/returnJson")public  Person returnJson(){Person person = new Person();person.setAge(12);person.setName("zhangsan");return person;}

5.返回设置状态码

    @ResponseBody@RequestMapping("/setStatus")public  String setStatus(HttpServletResponse response){response.setStatus(404);return  "设置状态码";}

6.设置Header 

默认是返回html,可以改成json。但是还需要匹配,不匹配仍然报错。

 consume:限制响应的提交内容类型(Content-Type),例如applicationljson, text/html;,如果指定application/sor
produces:设置返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回
(???)在哪里用到了

    @ResponseBody//@RequestMapping(value = "r1")不设置返回类型默认html@RequestMapping(value = "/r1",produces = "application/json; charset=utf-8")//设置返回类型Json,但仍然需要匹配public  String r1(HttpServletResponse response){return  "{'ok':1}";}

三层架构

三层架构主要将程序代码分为三个部分来进行分别书写,减少代码的耦合性,将应用程序分为表示层、业务逻辑层和数据访问层,每一层都有明确定义的责任,彼此不互相干扰。

1.表现层:接收请求,返回结果业务
2.业务逻辑层:主要处理业务逻辑

3.数据层:处理数据,包含数据的存储,获取(增删改查)

在代码中一般将其三层放在这三个对应的包内

Controller:接收请求,参数是否合法,结果响应

Service:处理请求(主要干活的部分)
Dao:数据部分(将数据从数据库中取处理让Service进行处理)

MVC注重数据和视图的分离。

三层架构注重从不同方向上取处理。

两者都是为了更好书写的代码,将代码通过自己的思想将不同的部分进行分离出来,使最终写成的程序可以有更好的可维护性,扩展性等。二者在进行一个系统设计时可以分别使用,也可以一起使用。

例如一起使用时,可以将MVC中的视图作为表示层的实现,将控制器作为业务逻辑层的门面,将模型作为业务逻辑层的实现。这样做的好处是可以更加紧密地结合业务逻辑和用户界面,提高系统的开发效率和可维护性。

例如分别使用时,可以首先设计并实现三层架构,将系统分为表示层、业务逻辑层和数据访问层,然后在每一层中使用MVC进行设计和实现。这样做的好处是可以更加清晰地分离不同层次的责任,使系统的架构更加模块化和灵活。

注:

命名建议
大驼峰: BookDao
类名使用大驼峰
小驼峰: bookDao
变量名小驼峰
蛇形: book_dao
数据库,字段命名用蛇形
串形: book-dao

 

Spring的核心思想之一IOC
 

Spring是一个包含众多工具的loC容器
容器就是用来存储各种数据的东西。

list/map装各种数据类型的容器
tomcat装web的容器
Spring容器,装的是对象

Spring容器中存的是对象,对象这个词,在Spring的范围内,称之为bean

loC:控制反转(控制权反转)就是创建对象的控制权,交给了Spring。

例如下面代码中,如果想要让这个车能正常行驶起来行驶,并且想要生产不同的车轮大小,需要将在最开始就将车轮胎的代码传输过去,其耦合性极高,中间一个代码出现问题,全寄。

class Car {private Framework framework;public Car(int size) {framework = new Framework(size);System.out.println( "car init. .. ");}public void run() {System.out.println( "car run. . . ");}
}
class Framework {private Bottom bottom;public Framework(int size) {bottom = new Bottom(size);System.out.println( "framework init. . .." );}
}class Bottom {private Tire tire;public Bottom(int size) {tire = new Tire(size);System.out.println("bottom init.. ." );}
}
class Tire {private int size;public Tire(int size) {this.size = size;System.out.println("tire init. . .size : "+size);}
}

所以这样进行设计就可以将生产汽车的各个组件隔离开来,哪里发生问题即刻就可以知道。减少了其耦合。一个寄不会全寄。


class Car {private Framework framework;public Car() {framework = new Framework();System.out.println( "car init. . . " );}public void run() {System.out.println( "car run. . ." );}
}
class Framework {private Bottom bottom;public Framework(){bottom = new Bottom();System.out.println( "framework init. . .. " );}
}
class Bottom {private Tire tire;public Bottom() {tire = new Tire();System.out.println( "bottom init. .. " );}
}
class Tire {private int size = 21;public Tire() {System.out.println( "tire init. . ."+size );}
}


Spring帮我们管理对象
1.告诉Spring,帮我们管理哪些对象 (存)
2.知道如何取出来这些对象(取)

Spring的loC思想实现了这种事情,通过DI最终来进行了实现。

DI把依赖对象取出来,并在DI实现的这个类中直接赋给该对象的属性

下面代码就进行了实现,可以看到要在一个类中使用另外一个类时,使用@Autowired这样的注解就不用在重复性的在这个类中去创建对象了。直接去使用。


@Component
@Data//可以不写setter和getter等创建类时的重复性操作
class Student {//存到Spring中private  String name;private  Integer age;// 添加构造函数和 getter、setter 方法}@Controllerclass StudentCard {@Autowiredprivate Student student;//从Spring中去取,public void text() {// 可以在这里使用注入的 student 对象System.out.println("Student name: " + student.getName());System.out.println("Student age: " + student.getAge());}}

DI的具体实现依靠于两大注解类型

存注解:

类注解@Controller、@Service、@Repository、@Component、@Configuration.

方法注解@Bean

取注解:@Autowired@Resource@Qualifier@Inject@value 

取注解一般使用@Autowired

Spring上下文

Spring上下文和DI的实现是紧密相关的,Spring上下文作为DI的实现载体,负责管理Bean之间的依赖关系,从而实现了IoC容器的功能。具体来说Spring上下文负责创建、管理和组织应用程序中的Bean,它会根据Bean之间的依赖关系,在需要的时候将依赖注入到相应的对象中。通过DI机制,Spring上下文实现了控制反转,将对象的创建和管理交给了Spring容器。

@controller注解的作用

从context中获取类的对象,@controller将类存入Spring之后就被称为bean对象。

通过getBean来获取我们的类的对象。,并且通过这个对象去访问类中的方法。

        ApplicationContext context = SpringApplication.run(Demo9Application.class,args);Student bean = context.getBean(Student.class);bean.student();

但是如果Student类中如果没有@Controller则是不能取到对象的,错误如下

Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.example.demo9.Student' availableat org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:351)at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:342)at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1178)at com.example.demo9.Demo9Application.main(Demo9Application.java:13)

@severive也和上面一样,这些存注解,都会将其存入到Spring中,想去取得时候就可以通过getBean来获取我们的类的对象。

@Controller、@Service、@Repository、@Component、@Configuration,这些注解都是component的衍生类或者是他的本身所建立出来的。

但是@Controller是被赋予了一些其他注解没有的功能,其在Spring MVC中具有特殊的作用,它用于标记一个类作为控制器(Controller),用于处理HTTP请求。

以及必需使用@Controller代码的入口才能正常加载,否则会报如下错误

并且上述五大注解只能放类上,只能加在我们自己写的代码上。如果我引入了一个第三方Jar包,也希望交给Spring管理,是没有办法加五大注解。

这些都是针对于一个对象来进行管理,但是如果对于一个类,定义多个对象时,比如数据库操作,定义多个数据源,就需要使用@Bean来进行操作了
Bean是方法注解
@Bean必须搭配五大注解来使用

否则单独使用的话会报如下的错误,大致意思是程序没有找到bean对象。加上五大注解就意外着向Spring容器上传,接下来使用时,就会找到


 

并且使用@bean注解时,bean的名称必需是类名,否则不能找到对应的bean对象。

注:如果需要的Bean的类型,对应的对象只有一个时,就直接赋值如果有多个时,通过名称去匹配

SpringBoot特点;约定大于配置其中之一体现:就是扫描路径

其默认扫描路径是:启动类所在的目录及其子孙目录。但是我们可以通过这个注解可以指定扫描路径@ComponentScan( "com.bite.demo" ),如果没有指定那就是默认路径。

DI的依赖注入

依赖注入总共有三种

1.属性注入2.构造方法注入3.Setter方法注入

@Autowired
private test test;//属性注入//Setter方法注入@Autowiredprivate test test;@Autowiredpublic getBean(test test){//构造this.test = test;}//构造方法注入private  test test;@Autowiredpublic getBean(test test){this.test = test;}

都是将存入Spring容器中bean对象放到类中来进行使用。

属性注入以类型进行匹配,与注入的属性名称无关但是如果一个类型存在多个对象时,优先名称匹配,如果名称匹配不上,寄报错。
无法注入一个Final修饰的属性,想要注入1.定义时就进行赋值2.构造方法中进行赋值

如果存在多个构造函数时,需要加@AutoWired注明使用哪个构造函数
如果只有一个构造函数,@AutoWired可以省略掉

属性注入:先将其里面的属性创建成功之后,其才能被创建好

如果里面的属性是被static修饰的话,不用这样

当程序中同一个类型有多个对象时,使用@AutoWired会报错(一些情况下)
解决方法
1.属性名和你需要使用的对象名保持一致

2.使用@Qualifier

@Controller
class UserController4 {
//注入@Resource(name = "user1" )private User user;public User getUser( ){return user;}
}



3使用@Resource注解

 

@Controller
public class UserController5 {
//注入@Autowired@Qualifier(value = "user2")private User user;public User getUser() {return user;}}

依赖注入的主要目的之一就是让类能够获取到由Spring容器管理的对象实例或其他依赖项,从而解耦组件之间的关系,不需要知道如何创建它所依赖的对象,只需定义它们所需的接口或抽象类型。

 

@Autowird 与@Resource的区别
@Autowired是spring框架提供的注解,而@Resource是JDK提供的注解
@Autowired 默认是按照类型注入,而@Resource是按照名称注入.相比于@Autowired 来说,@Resource支持更多的参数设置,例如name 设置,根据名称获取 Bean。

Bean的存
使用五大注解和@Bean时, Spring会给一个默认的名称
1.五大注解
五大注解: BeanName是类名的小驼峰表示法(首字母小写)
特殊情况:如果前两位字母都为大写,BeanName为类名

如果在五大注解之中添加名称之后,就会更改五大注解bean的名称,Spring会使用程序员定义的Bean的名称。在启动类中获取对象时需要的就是BeanName。

同理也可以修改@Bean的名称

Bean的取

1.属性注入@AutoWired
⒉.构造方法注入
如果只有一个构造方法,@AutoWired可以省略
3. Setter方法注入

@AutoWired存在问题
同一个类型的存在多个对象时,可能会出错解决思想:指定Bean的名称
指定Bean
1.修改@AutoWired修饰的属性名为需要的Bean的名称
3.使用@Qualifity指定Bean的名称

4.使用@Resource




 


 

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

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

相关文章

java使用trim方法和replaceAll方法去除空格之后,还存在空格

今天使用其他人的一个功能&#xff0c;发现生成的映射少了一个&#xff0c;后面去代码里面debug发现是字符串中左边空格没有去除导致。查看代码&#xff0c;里面是使用了字符串.trim().replaceAll(" ", "")去除空格的。这个代码虽然能去除&#xff08;半角…

[Java EE] 多线程(四):线程安全问题(下)

1.5 volatile关键字 我们在了解这个关键字之前,我们首先要把产生线程安全的第4个原因补齐,我们来说说由于内存可见性引起的线程安全问题. 我们来看下面这样一段代码: import java.util.Scanner;public class Demo16 {public static int count 0;public static void main(Str…

深度学习算法简介(一)

目录 ⛳️推荐 前言 1、深度神经网络&#xff08;DNN&#xff09; 2、卷积神经网络&#xff08;CNN&#xff09; 3、残差网络&#xff08;ResNet&#xff09; 4、LSTM&#xff08;长短时记忆网络&#xff09; 5、Word2Vec 6、Transformer 7、生成对抗网络&#xff08;…

kmeans实现图像像素分类

代码 import tkinter as tkfrom tkinter import filedialogfrom PIL import Image, ImageTkimport numpy as np import random import mathclass Cluster(object):def __init__(self):# pixels是像素的意思&#xff0c;这里定义一个像素组用来存放像素的值self.pixels []# 创…

HubSpot功能有哪些?

HubSpot是一个功能丰富的平台&#xff0c;主要涵盖市场营销、销售、客户服务和客户关系管理&#xff08;CRM&#xff09;等领域。以下是HubSpot的一些主要功能&#xff1a; 市场营销自动化&#xff1a;HubSpot允许用户制定和执行多渠道的市场营销活动&#xff0c;包括创建和管…

力扣HOT100 - 105. 从前序与中序遍历序列构造二叉树

解题思路&#xff1a; 分治 以中序遍历为参照&#xff0c;用前序遍历的节点构建二叉树。 root 1 index - left表示前序遍历右子树的开始节点&#xff0c;即当前节点的下一个节点左子树长度。 class Solution {int[] preorder;HashMap<Integer, Integer> map new Ha…

C#基础:WPF中常见控件的布局基础

一、用ViewBox实现放缩控件不变 二、布局代码 <Window x:Class"WpfApp1.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"Title"MainWindow"…

小瓶清洗桶抗酸碱耐高温PFA清洗器半导体实验清洗用

PFA清洗桶&#xff0c;也叫PFA清洗器、PFA小瓶清洗桶&#xff0c;主要用于清洗浸泡实验室小型PFA溶样罐和烧杯等&#xff0c;带有密封螺纹盖&#xff0c;可以用于摇晃&#xff0c;高纯耐高温材质可放置电热板上加热使用。 特点&#xff1a;可拆卸倒酸口&#xff0c;可安全倒出酸…

ctfshow菜狗杯 web 无算力以及easyPytHon_P

web签到题 error_reporting(0); highlight_file(__FILE__);eval($_REQUEST[$_GET[$_POST[$_COOKIE[CTFshow-QQ群:]]]][6][0][7][5][8][0][9][4][4]);套娃传参 中文要编码 Cookies &#xff1a;CTFshow-QQ%E7%BE%A4:a POST:ab GET:?bc&c[6][0][7][5][8][0][9][4][4]syste…

干货收藏:CRM系统帮助中心设计教程

CRM系统&#xff0c;也就是客户关系管理系统&#xff0c;是企业运营中的得力助手&#xff0c;但太复杂的CRM系统有时候用起来也挺让人头疼的。所以&#xff0c;一个好用、易懂的帮助中心就显得尤为重要啦&#xff01;今天我来跟大家分享一下关于CRM系统帮助中心的设计教程。 1.…

09 MySQL--操作真题

1. not in 用一条 SQL 语句&#xff0c;查询出每门课程都大于 80 分的人。 分析&#xff1a; 去重查询出存在课程小于 80 分的人&#xff0c;设为集合A查询不在集合 A 中的人 # 第一步&#xff1a;找小于等于80分的学员姓名 select distinct name from t_student where fens…

Transformer - 特征预处理

Transformer - 特征预处理 flyfish 原始数据 train_data.values [[ 5.827 2.009 1.599 0.462 4.203 1.34 30.531][ 5.76 2.076 1.492 0.426 4.264 1.401 30.46 ][ 5.76 1.942 1.492 0.391 4.234 1.31 30.038][ 5.76 1.942 1.492 0.426 4.234 1.31…

Linux命令超详细介绍

目录 安装 Linux的目录结构&#xff1a; Linux命令入门&#xff1a; Linux命令的基础格式&#xff1a; 例子&#xff1a; ls 参数 选项 注意&#xff1a; 目录切换命令&#xff1a;cd/pwd cd: pwd: 相对路径和绝对路径&#xff1a; mkdir 不用参数&#xff1a; …

【Node.js工程师养成计划】之打造自己的脚手架工具

一、创建全局的自定义命令 1、打开一个空文件夹&#xff0c;新建一个bin文件夹&#xff0c;在bin文件夹下新建cli.js文件&#xff0c;js文件可以命名为cli.js&#xff08;您随意&#xff09; 2、在cli.js文件中的开头&#xff08;&#xff01;&#xff01;&#xff09;写下面这…

NeRF in the Wild: Neural Radiance Fields for Unconstrained Photo Collections

NeRF in the Wild: Neural Radiance Fields for Unconstrained Photo Collections(野外的 NERF: 用于无约束照片采集的神经辐射场&#xff09; Abstract 我们提出了一种基于学习的方法来合成新的视图的复杂场景使用只有非结构化的收集野生照片。我们建立在神经辐射场(neRF)的…

对于地理空间数据,PostGIS扩展如何在PostgreSQL中存储和查询地理信息?

文章目录 一、PostGIS扩展简介二、PostGIS存储地理空间数据1. 创建空间数据表2. 插入空间数据 三、PostGIS查询地理空间数据1. 查询指定范围内的地理空间数据2. 计算地理空间数据之间的距离3. 对地理空间数据进行缓冲区分析 四、总结 地理空间数据是指描述地球表面物体位置、形…

11、【桥接模式】让将抽象和实现分离,使得它们可以独立地变化

你好&#xff0c;我是程序员雪球。 今天我们来聊聊 23 种设计模式中&#xff0c;一种常见的结构型模式&#xff0c;桥接模式。聊聊它的设计思想、应用场景&#xff0c;以及如何使用。 一、设计思想 桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#…

Python slice切片

1. 切片简介 取一个str、list、tuple的部分元素是非常常见的操作 切片 译自英文单词slice,指的是一部分切片 根据 步长step 从原序列中取出一部分元素组成新序列切片适用于 字符串、列表、元组 2. 切片的格式 字符串[开始索引:结束索引:步长] 包含开始索引, 不包含结束索…

vue+springboot实验个人信息,修改密码,忘记密码功能实现

前端部分 新增Person&#xff08;个人页面&#xff09;&#xff0c;Password&#xff08;修改密码页面&#xff09;&#xff0c;还需要对Manager&#xff0c;login页面进行修改 router文件夹下的index.js&#xff1a; import Vue from vue import VueRouter from vue-router i…

在 vue3 中使用高德地图

前言&#xff1a;定位地图位置所需要的经纬度&#xff0c;可以通过 拾取坐标 获取。 一&#xff1a;快速上手 1. 安装依赖 npm install amap/amap-jsapi-loader # or pnpm add amap/amap-jsapi-loader # or yarn add amap/amap-jsapi-loader 2. 创建组件 src/components/Ma…