spring framework
官网
添加链接描述
spring副产品
这么老多呢
老师说先把他讲的看完了,再去看其他的(我要是没看尚硅谷的那个springMvc实现,我都学不懂那个底层,真的,我肯定要看)
框架是以应用为主的技术,先会用,有能力的基础上再去学底层,理解不了就不去理解了,不会昨天的内容,我就不能用mybatis写项目了吗??
我只有四五个月的时间,钻牛角尖要不得
以后我在工作当中,生活当中会遇到很多很多的问题,是我暂时理解不了,暂时解决不了的。那怎么办,就非要钻进那里面去?
该放要放过去
一般不用最新的正式版本,用它上一个正式版本(GA)
SHAPSHOT shapshot
记住了啊,有问题先看他
他那个手册是英文的,就算翻译的信达雅,你尽快看不懂那些技术词汇
spring框架的作用
这麦克风翻译
spring用来管理项目中的架构层面的相关对象(那四层架构)controller service dao view
MVC的意思
1、这些对象应不应该单例
老师说应该单例,为什么?我记得一阶段的时候老师跟我说这些应该不是单例的
1、这东西不适合随用随new
2、他只是一个实体类,不需要承载数据
3、里面有各种各样的方法,用来执行方法逻辑的
4、随用随new的话,对象就重复了
多例这么写
总结一下为什么要有这个框架,因为十五六年前内存可能就128M,都是论字节来省的。
java有自动垃圾回收机制,所以new 多了也无所谓,但是像C或C++ 就需要自己回收。
所以使用这个spring框架,就是为了省内存,规制java奢华的浪费机制,要是一个项目里面有几千个实现类,就能省很多内存
万一这一个实现类里面有1000个方法,new一次的内存和时间都能节省下来
虽然会被c或c++ 鄙视,但自己要有些追求
就算早期也不是直接new 的,就像我之前那样通过反射去new 的,但是方便理解,这么写
用哪个直接调用
之前在二阶段的时候,实现类都是随用随new不管回收,也不管重复与否。
IOC部分
问题1、在各个类中出现
随着业务的变更,我的服务类 他的构造器改变了(比如需要实参了),那其他有这个实现类的地方到处都要改,要改的地方可能非常多,维护起来特别麻烦
就算是多例
改这一个地方就可以了
本来应该单例的对象在内存中重复了多次,还有可能在for循环里面new,我超,笑死
好处:好维护,好升级,像这种架构层的对象,90%都可能是单例的
什么叫解耦
上层只依赖于下层的抽象接口,不依赖他具体的实现类
就算我不用接口多态的形式,一点区别也没有
如果是依赖实现类的方式,当我升级的时候,就要去一个一个的去改
这样controller就依赖,就是上层依赖于下层的具体实现类了,就没有达到==通过 接口,把controller 和 服务类 隔离开的目的 ==
我想让他真正的隔离其实是这样的
只有这样的代码,才是让控制层依赖了真正的抽象服务层
记录一下老师描述的耦合 和 解耦
耦合,手拉着手,她动我也动,他往左,我也往左
解耦,就是卡了一个板,我和她各牵一个绳,她想走,把绳子松开就是了
虽然还有依赖关系,但是依赖关系很松了就是
目的就是可替换,妈的,白悲伤了
中间隔个板,他两牵着绳,下层松手了,换了个人。因为隔着个板子,所以上层是不知道下层变了的
就是为了service变动,控制层不用动
后续居然能项目拆分????!!!!
后续会把controller作为一个独立的项目
service 作为一个独立的项目
dao作为一个独立的项目来存在的
也就是一个个独立的jar包的方式
如果还是耦合很严重的话,我的天啊,下层的service变动,我上层的controller还要重新打包,懂了,原来是这个原因
spring还能管理sqlSessionFatory druidDataSource (连接池对象),所谓的交由它来管理是指:spring来进行对象的new ,来进行对象依赖关系的维护(就是依赖注入啦)
依赖注入逻辑
controlller 类
维护关系的类,就行那个配置文件
用的时候直接从工厂里面拿就行了
工厂就是管理其他对象(生产对象和关系维护)
上面那个代码只是一个非常小的工厂,spring容器框架,是一个大而全的工厂,现在能懂这句话了吧
spring的包
spring-bean
Spring beans 是那些形成Spring应用的主干的java对象。它们被Spring IOC容器初始化,装配,和管理。这些beans通过容器中配置的元数据创建。比如,以XML文件中 的形式定义。
spring-context
Context可以理解为对BeanFactory的封装.包含BeanFactory选择/配置/Bean来源加载/定义容器启动流程,为其提供上下文以及丰富的拓展,这是直面使用者的接口.
spring-core
还真是核心
详细内容,和核心包内容
spring-expression
啊???这是个表达式??
我的天啊,对不起,我以为spring很简单,我去看spring1去吧,太复杂了吧
Spring Expression Language(简称 SpEL)是一个支持查询和操作运行时对象的强大的表达式语言。贯穿着整个 Spring 产品组的语言。
commons-logging
就是一日志。。希望我不被打脸
Jakarta Commons-logging(JCL)是apache最早提供的日志的门面接口。提供简单的日志实现以及日志解耦功能。
开始了
一旦我们的项目里面有了spring环境,就是jar包
我们就能创建spring配置文件了
记住,今天学完spring之后,所有架构层面的对象,都不会再去new了
而是要从这个容器里面去取
spring测试
程序运行
NB啊,读取配置文件的那一瞬间,所有东西都弄好了,很难不不想象这里面到底有多少步骤,多么深的核心逻辑
defaultListableBeanFactory 可遍历的bean工厂
完了,classPathXmlApplicationContext里面又是一个大类
beanFactory 里面的map集合有每一个实现类实例化对象,和他的详细参数,比如是否单例,之类的
getBean
之前咱们的getBean 要根据不同的参数名去获得
他这里面直接就一个方法,传参进去就行
你信不信这个getbean 如果他能做的话,他能给你做出来一个下拉列表来
接口的实现类里面有值
getBean的两种方法,并且维护的是单例对象,这个是可以自己设置的,我先学过了
主要代码就两行
spring真NB
获得容器里的对象,看来还是直接使用(类对象)好一点,不用转换
使用名字方便一点,就类似别名一样,我的话,把名字起的和类一样把,如果没有别的需求的话
我不行了,记笔记严重的影响了我的学习进度,
非必要不记笔记
ioc容器不止spring一家 JFINAL
啊?老师说把mybatis和spring 整合在一起之后,mybatis的玩法就变了,就不用写那一堆:1、读配置文件 2、build()3、openSession 之类的,就简单了,我蛮好奇的
网上说spring本来有点复杂,但是springboot 一出来,就把其他框架比下去了,还记得我去学黑马的springboot,看那个注解感觉有点难,好期待学完了springboot的课,再去看黑马的是什么感觉
啊?可以把所有的mapper提前拿到容器里面吗??!!?!?!?!卧槽,好期待,我想试试
这些都能整合到spring里面,卧槽,老师说这事平台性的东西,真牛比啊
IOC的方式有三种吗????
好多新知识啊,我好兴奋
application 和 ClassPathApplicationContext 是实现关系,中间隔了六层,我去^%@%$,就是一层一层套
查看继承类的方法,点进去方法,进去了构造,然后,往上翻,翻到他的类头
翻到这里,然后慢慢爬吧
application接口还有其他实现类,之后会接触到的
IOC方式
1、bean标签方式
犯的错,tama的,null,null,null,笑死了
今天开始除了实体类,其他类就不要再new了!从今天,我的心是冷的,刀是冷的
居然可以不指定名字??
不指定名字,可以直接用.class去调
原型??photoType 这是什么?有点像vue里面给对象挂载对象的东西
设计模式里面有一个模式,叫做原型模式
容器里面存的只是一个代码的模板,我们每一次从容器里面get的对象,都是从原型的对象里面拷贝了一份出来了,是深拷贝
深拷贝:
深拷贝不会拷贝引用类型的引用,而是将引用类型的值全部拷贝一份,形成一个新的引用类型,这样就不会发生引用错乱的问题,使得我们可以多次使用同样的数据,而不用担心数据之间会起冲突。
拷贝出来,就是一个新对象了就是
spring指定为原型模式之后
打印日志
就像是懒加载一样 啊,这就是多例模式啊,行吧。我想多了
基本是不用多例的,因为架构层的对象就应该是单例的,但是有例外
Strtus2 框架(控制层框架) 向spring里面整合的时候(这个好像已经被淘汰了)
要求控制层的框架必须是多例的,如果是单例会有线程安全问题
初始化 和 销毁方法
xml里面配置
想起来了,我还记得调用一个方法,告诉容器即将死亡了,让他去调用销毁的方法
init 方法可以复制 销毁方法,可以释放资源,释放容器bean里面的资源‘’
这东西的用处
老师来解释Init 和 destoy 的作用
导了一个druid包进去,加了一个项目环境
啊?都是实例化了,磨磨唧唧半天里面居然没有连接??
啊???居然还能这么配置spring xml 对象???(震惊)
其实和上面的代码差不多,看来我还是只是不熟悉xml这种语言罢了
还是空的
这个连接池需要调用 init方法,才有值的吗??
所以,要陪这两个方法
为什么连接池需要close
可以看到localhost一直处于响应状态,即使退出想重新进入到主页面也是一直处于响应状态,并没有跳转到主页面。所以,使用完数据库一定要切记,关闭或者释放掉数据库连接!!!
大概是这个意思
添加链接描述
只不过如果客户端不主动关闭,服务器可能花很长时间才能侦测到连接断了—服务器是依靠超时做这个事情的。
2、自定义工厂注册复杂对象
比如注册mybatis 的 SqlsessionFactory 对象到容器
这样,肯定不行
因为它的构造器需要configuration
这是个极为复杂的对象,不是我能用手init的出来的
给他一个空壳子没有用的
新的设计模式:工厂(静态工厂,实例工厂)
静态工厂注册bean
把配置文件导入进来
天啊,日志,二级缓存,懒加载我都快忘了怎么回事了
哈,果然简单
他的意思是把这个类里面的方法执行了,返回的结果放回到容器里面
不是吧这个类实例化了放 容器里面
哦,NB啊,他是通过 这个类对象 去 容器里面找 对应的东西
就是这种方式
实例工厂注册bean
非静态的话,就不能通过类名.方法名了
包扫描创建方法
!!!注意,只有自定义的类才能用注解,比如Mybatis,你总不能去jar包里面加注解把
建立配置文件,然后手打这个,千万不要打错!!!!!!
一定要用后缀为context 的那个 属性名为 组件扫描的那个东西
模板文件,上面这些链接看着 有点吓人,不敢动,其实居然是模板文件?????????
到底能不能有点高大上的东西啊
记得要让xml 自动生成,它会在上面引入模板文件
如果不这样做,你写的标签spring不识别,啊,还有这一种说法
看来这些标签,不止是自动补全的作用啊,还有解析的作用
哦,所谓包扫描,就是用注解来标记,让他自动去扫描啊
注解说明
是直接加在实现类上面的啊
@Controller
@Service
@Repository 数据仓库对象 持久层的意思
暂时没用到 其他组件对象
使用包扫描要导入一个包,用到了这个aop包里面的某个东西,老师也不知道用到了哪个,因为这个包主要是做切面编程的
他可能仅仅是使用了aop这个包里面的某个东西
以为是从 com.javasm大范围开始扫描的 识别到不一定就把它注册到容器里面了,要看类上面有没有标志
老师问这个controller 里面的service 里面有值没有
居然没有值,因为没有依赖注入!
看看容器里面,这四个使我们自己的,其他的是spring内部的一些对象
对注解进行识别,或者监听器对象
对于spring来说,这四个注解对于spring来说没有任何区别,你就是用companent 都没问题
在spring里面是一样的,但是在其他框架,比如springMvc里面就不一样了
那么注解bean的id是什么呢? 默认是类名首字母的小写
居然可以点开注解,看里面的东西
看里面的那个value值
不要写,因为他默认的那个首字母小写,就可以了
瞬间变多例了
初始方法和销毁方案
构造器完成之后执行的方法 @PostConstruct
销毁对象前执行的方法 @PreDestroy
这个初始化方法,在实际项目中,是非常有用的方法
指定一个类里面,一个bean里面的初始化方法,实在是太有用了
当然,指定初始化方法,出了PostConstruct 之外还有其他方式
,后续再来说
Spring的注解大概有30多个
依赖注入部分
这个我之前已经学过了,依赖注入进什么list 什么单个值,之类的,我基本都完了,今天把spring的部分弄完了,然后明后两天敲代码,加油!!!!冲啊!!!!
依赖注入就是维护对象之间的依赖关系
set注入,这个我还记得
就是最经典的这种,要求去类中必须有set方法
因为它底层就是在调用setUrl setDriverClassName setUsername
引用其他bean的id 用ref 引用对象
简单数据类型用 value
另一种写法 😛 我超,可以==ALT+ENTER ==引入那个p标签
老师说不要用这个,排版比较乱,认识就可以了
:p 也有两种不同的引入值方式
引入对象
引入值
construction 构造器注入
就是要依赖构造函数
现在没有无参构造了
没有无参构造,所以报错!
构造注入的方式(用的比较少)(有些jar里面不提供无参构造,就要用这个)
name 和 index 二选一
index 好方便啊,但是如果后期更改的话,改变了次序的话,有点小麻烦
ref 和 value 二选一
使用name
使用index
集合注入(极其重要)
就是怎么给集合的value赋值
他¥@%的听错了,原来是极其不重要,啊,笑死
array list map
set 和 construction 可以混着用
效果
内部bean注入 (之前第四阶段才用springboot,这个还有点用,现在第三阶段就用spring Boot,这个没用了)
常规service 和 dao 引用的方法
内部bean注入(就是把ref 标签挪进来。。大无语了,家人们)
像不像匿名内部类
注意!!内部bean没有注册到容器当中,
仅仅是赋值了引用所以没什么用,id也不用给他
自动装配(重要)
是基于包扫描的
@Autowired
你看那个IUserService.class 是不是和 我手动去获取对象那个,差不多
我懂了,前提是容器里面要有一个类型是IUserService的对象
因为注解是直接加在实现类上的,所以自动装配了实现类
!!如果我去掉了 service 实现类上面注解,会怎么样
这个时候因为去掉了serviceImpl的注解,容器里面没有这个对象,所以会报错
报了这个错,这个错误每天对会遇到
NoSuchBeanDefinitionException 没有bean定义的异常
假如我现在有两个service 的实现类,实际项目中不会出现这种情况
spring不会知道去找那个
NoUniqueBeanDefinitionException(实际项目中基本不会出现这个错误,知道一些我有好处)
解决办法
1、 从容器当中,先 byType查找对象,如果有两个,然后再byname
@Resource (和Autowired相反,Aotuwired是先byType ,再byName)
这两个想用哪个都行,反正我用第一个
其他方式
给Spring的配置文件指定外部信息
看清楚了,一定别导错了,先看后缀
通过表达式 来拿值
错误,有些人的表达式内容会报红
不用管它,直接用,能运行为主
记住了, 直接用jdbc.xx,因为后面的东西是文件类型
placeholder占位符
spring-test 组件
就是Spring和 测试组件 junit整合
可以把两步省了
需要导入包
classPath:表示根路径,项目根路径
这几行代码的意思
注解:本类当中会帮我们加载配置文件来创建容器,同时把
测试类也加载到容器当中
所有的东西都从容器里面拿出来注入就行了
刚开始会难以适应spring 慢慢习惯,有个大前提就是什么东西都不能new了
我知道你现在看代码晕,但我现在没有时间去练!!他和你平时写代码没有一点不同!!!就是不new东西,加油,今天干完这些鬼东西,明后天把进度一下子拉回来!!!
用sqlsession来写
我是谁,我在听什么,这三个注解是什么
???什么鬼,我怎么,我在听什么?? 从头捋一下
包扫描
context 为什么是这个关键字
引子:添加链接描述
我们经常在编程中见到 context 这个单词,当然每个人有每个人的理解,它被理解为:上下文、容器等等。我想说的是,context 理解为上下文最为合适。为什么呢?我以一个在计算机系统的例子来解释一下。
曹,这个笔记到底要没有用啊,为什么用context,上面不是都写着呢吗
spring-context
Context可以理解为对BeanFactory的封装.包含BeanFactory选择/配置/Bean来源加载/定义容器启动流程,为其提供上下文以及丰富的拓展,这是直面使用者的接口.
你看这句话 BeanFactory选择/配置/Bean来源加载/定义容器启动流程 那我包扫描肯定要使用这个啊
spring 里面也能引入标签 或者或xml都要这个特性?
里面是这样的
好了包扫描理解了
我要弄懂这两个注解
@Resource (和Autowired相反,Aotuwired是先byType ,再byName) 说白了就是自动装配的依赖注入
@RunWith什么意思?
@RunWith(SpringJUnit4ClassRunner.class),让测试运行于Spring测试环境
建议使用,因为虽然没有扩展任何功能
@contextConfiguration 的作用
它的作用应该就是用在测试类里面的
@ContextConfiguration Spring整合JUnit4测试时,使用注解引入多个配置文件
第一官方提倡不写xml,有java类代替
这个注解指向的这个配置文件
他把所有类都扫描成bean了
所以这个的意思就是
我差不多懂了,因为运行test类,想不每次都写,从配置文件中创建容器,和从容器里面拿东西,所以用了这个上下文参数注解
在这个测试类里面,通过读取里面的文件,类加载容器
同时把测试类也加载到容器里面了,不要为他是怎么加进去的,我不管
把测试类注进容器里面,我才能在容器里面找到他,然后把依赖注入进去,啊,我死了,他这个设计怎么这么精巧!!!
他应该是测试类专用注解,那他应该就有这个功能
怎么使用什么serivce impl 之类的,直接依赖注入,自动装配
wired (与计算机系统)联网的,连线的; autoWired
老师这个是先匹配名字,匹配不到,再去匹配类型
笑死我了,老师已经解释了这个,但是我没听懂,果然听课和理解吸收,是两个步骤啊
ioc复习
导包
老师说这四个包必须记下来
bean context core expression
commons-logging 日志包
spring aop 现在是用于包代理扫描用的
配置文件
开启包扫描
druid配置文件
加载druid配置文件
第一件事就是注册容器
自动装配
原来直接打 @Test 他就能给我导包,是maven做的,快说谢谢maven
先有junit环境才能去打注解
contextConfiguration 默认去test 文件夹下找配置文件
classPath的意思
对于SpringBoot项目来说,classpath指的是src.main.java和src.main.resources路径以及第三方jar包的根路径,
老师可能也没说错,因为他们编译后最终都会在这个文件夹下
1227springmvc
1.dom4j解析xml
properties文件解析:new Properteis().load(InputStream in)
- 添加dom4j.jar
- SAXReader对象实例化,read方法加载xml输入流,返回Document对象,getRootElement方法获取根标签
2.springmvc的作用
springmvc是spring中的web支持组件。对servlet技术进行了二次封装,提高代码开发效率。
servlet开发存在的问题:getParameter,非NULL判断,转型,封装对象。一个servlet只能处理一个业务。返回json数据。
3.40分钟入门
- 添加spring环境;4个核心包,1个日志包,1个spring-aop包
- 添加spring-web;spring-webmvc;jackson的三个包;
- 创建了UserController控制器对象,使用RequestMapping注解一个方法。
- 在springmvc.xml配置文件中,配置springmvc注解的识别。
<!--springmvc中会保存 一个Map<String,HandlerMethod>.put("/h","userController.hellomvc()")-->
<!--处理器映射器对象:解析控制层bean中的RequestMapping注解进行url映射-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>
<!--当用户请求/h时,RequestMappingHandlerMapping负责根据url找到HandlerMethod-->
<!--处理器适配器对象:负责执行HandlerMethod,从容器中找到bean对象,执行方法,得到方法返回值-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>
<!--视图解析器:根据处理器方法返回值,得到完整的视图路径:request.getRequstDispatcher(/pages/hello.jsp).forward(req,resp)-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/pages"></property>
<property name="suffix" value=".jsp"></property>
</bean>
- 在web.xml配置Springmvc的前端控制器加载springmvc.xml,创建容器,解析Controller层的RequestMapping注解进行url映射。
4.分析入门代码
- DispatchServlet:在tomcat启动时,init方法中加载指定的xml配置文件,初始化了WebApplicaitonContext容器对象,由于容器中RequestMappingHandlerMapping处理器映射器对象,对Controller层的bean对象进行深度解析,解析此类bean中的RequestMapping注解,进行url映射,把url字符串映射到一个处理器方法上。
- 当用户发起请求时,请求进入DispacherServlet,该对象去容器中获取RequestMappingHandlerMapping处理器映射器对象,根据url获取到处理器方法。
- 找到处理器方法后,disaptcherServlet去容器中获取RequestMappingHandlerAdapter处理器适配器对象,该对象负责执行处理器方法。
- 在执行处理器方法之前,springmvc通过HttpMessageConverter消息转换器对象做了请求参数的获取,转型,封装工作。
- 当请求参数通过消息转换器处理完成后,才执行处理器方法。
- 处理器方法有返回值,在同步开发模式下,返回值是一个视图名称。通过ViewResolver视图解析器对象,得到完整的视图路径,最终服务器做视图转发操作。
HttpMessageConverter读取到url,请求体中的参数;
servlet 执行顺序
先实例化,在初始化,在分发方法
调整servlet初始化时间
servlet 初始化参数
我以为这个初始化参数是给什么值的,原来是用来给配置文件的,对不起,我狗眼看人低了
获取init-param 参数
啥!!!改配置文件不需要编译的吗??难道可以在运行中通过修改配置文件,来改变程序吗
能不写死的东西,不要写死,大型项目编译一次会非常麻烦
哦,我大概懂了,配置文件的话不要重新编译,只需要重新启动应用即可
NB啊,请求头就是快递单上面的信息,请求体就是快递里面的货物
以后最好指定一下 数组容量 和集合容量 就不要让他一点点扩容了
居然能返回读取的个数。。神了
因为数组长度是1024,只有前面5个字符是有值的,所以
返回视图,就是使用 动态jsp语法 来渲染页面的
5.接收k=v格式数据
k=v:url?k=v&k=v 或者 请求体k=v&k1=v1
-
处理器方法添加简单类型形参,形参名与表单参数名保持一致;
-
处理器方法添加复杂对象类型形参,对象成员变量名与表单参数名一致,一定要有set方法。
-
可以通过@RequestParam为简单类型参数赋默认值;
6.接收json格式的数据
MappingJackson2HttpMessageConverter把请求体中的json字符串转到形参类型的对象。
-
要接收json数据,形参不能是简单类型(String,Double,Interger);形参不能有多个。只能有一个复杂对象型(实体,集合,map)。
-
形参使用@RequestBody注解,表示使用MappingJackson2HttpMessageConverter这个json消息转换器把请求体中的json字符串转目标对象。
7.返回视图(只在同步开发中使用,不重要)
- 配置视图解析器对象到容器,指定视图的统一前缀与后缀。
- 处理器方法返回视图。
1.处理器方法返回视图名字符串;
2.如果要渲染动态数据到视图中,添加形参Model对象或者改返回值为ModelAndView对象。
@RequestMapping("h")
public ModelAndView hellomvc(){
ModelAndView mv = new ModelAndView();
mv.setViewName("hello");
mv.addObject("loginuser","fyt");
mv.addObject("u",new Sysuser(1,"aa","bb1123123"));
System.out.println("hello springmvc!");
return mv;
}
8.返回json数据
MappingJackson2HttpMessageConverter把对象转字符串
-
方法1:在处理器方法或处理器类(控制层bean对象)加@ResponseBody注解。不建议使用
-
方法2:使用RestController替换Controller注解,该注解是复合注解,Controller+ResponseBody,建议使用
-
方法3:处理器方法返回值类型改为ResponseEntity对象。该对象可以指定响应头。响应体。
@RequestMapping("add")
public ResponseEntity add(@RequestBody Sysdept d){
// return ResponseEntity.ok(AxiosResult.suc());
HttpHeaders headers = new HttpHeaders();
headers.add("customHeader","myname:fyt");
return new ResponseEntity(AxiosResult.suc(),headers,HttpStatus.OK);
}
9.servlet对象获取
添加Request,response,session形参即可。
@RequestMapping("dologin")
public AxiosResult dologin(@RequestBody Sysuser u, HttpServletRequest request, HttpSession s){
if("root".equals(u.getUname())){
//把登录成功的用户对象放在session。便于执行登录过滤。
s.setAttribute("login_user",u);
userService.ss(s);
return AxiosResult.suc();
}else
return AxiosResult.error(E.UNAME_ERROR);
}
10.服务端限定请求提交方式
在类上使用RequestMapping注解做第一层url映射;
在方法上使用GetMapping,PostMapping做第二层url映射;限定前端请求方式只能是get或post
总结:
开启mvc注解识别;
@RestController:取到Controller,表示方法返回值转json字符串返回前端
@RequestMapping:做url映射,不限定请求方式
@GetMapping:限定get请求
@PostMapping:限定post请求
@RequestParam:为k=v格式的参数指定默认值
@DateTimeFormat:为k=v格式的日期字符串指定日期格式,便于转为Date对象
@RequestBody:接收请求体的json字符串,转形参对象
@ResponseBody:表示方法返回值转json字符串返回前端
@JsonFormat:为json格式参数的日期字符串转date对象指定日期格式
@JsonInclue:非null序列化
一个对象:ResponseEntity:指定响应头。
postman:
params:在url上拼接?k=v
headers:请求头添加数据。
同步:客户端提交请求到服务器,服务器处理请求,服务器找到对应的视图资源,服务器转发请求到jsp视图文件,把jsp视图生成静态html字符串返回给前端;
异步:客户端提交请求到服务器,服务器处理请求,得到处理结果数据,服务器把数据转json字符串返回前端。