Springboot入门实战个人学习笔记1-论坛项目

BV1r4411r7au/AV65117012-码匠笔记

问题1:创建springboot时read timed out
解决:重复关闭/启动防火墙操作,总之确保check connect成功。



管理所有的包以及其依赖



自动生成的git的忽略文件,记录不想推送到github上的。


放置各种.java文件


springboot内置了tomcat,这个文件是启动文件,免除了生成war,部署tomcat等一系列操作,所以调试时只需要运行这个文件即可(含main方法)。

spring用容器管理beans,springboot有一个默认的方式即是application会加载同一级或下一级下所有的带有注解的文件


放置静态文件,下面的templates放置html等web文件,.properties文件项目的配置文件、基本路由、端口号、自定义等配置。



https://spring.io/guides:手把手教咱利用springboot写各种东西。


该方法从浏览器获取参数信息,model为内置的一个类;
return "greeting" 会在templates中寻找同名文件,然后解析渲染呈现出来


问题2:依赖添加失败
解决:在设置中maven》runner下勾选"delegate IDE build/run actions to Maven

idea快捷键:


根据提示文档创建有Github登录API的app


根据文档提示编写前两步:获取从github处返回的code,之后解析code编写access_token返回github.

关于github授权登录流程文字叙述:
1-用户点击登录按钮的同时向指定网址发送携带指定信息的请求。
2-github携带参数code+state重定向到预先设计好的"http://***/callback"网址(我们的网址)。
3-在对应界面我们结合需要的参数以及刚刚拿到的code+state向github指定网址发送请求以取得令牌access_token
4-在官网返回access_token后我们即可用该令牌代替用户向github网址发送请求以取得用户的相关信息保存在本地。



application.properties配置

可以在配置文件中配置常量,然后再用注解@Value(${})赋予到对应的变量

问题3:GitHub最后一部使用令牌access_token登录时始终报错”Must specify access token via Authorization header“或”Requires authentication“
解决:按照官网提示将其作为header中的参数进行传输,需要注意的是token后面有个空格(踏马的,就是这个空格让我坐了一个晚上(╬▔皿▔)╯)




登录成功以后保持登录态

cookies不能跨域,所以说每个cookies有与之对应的域名、路径、过期时间(可以保存的时间)。cookies的name、Value参数最为重要。每次一个请求地址。

cookies浏览器保持,与服务器端同步会话

session是在httpservletRequest中拿到的,springboot自动将上下文的request传到方法中供使用


java的session_id,如果不手动指定cookies的key(名字)的话会手动生成一个key以及其Value,其做法便是将JSESSIONID拼到请求头里面发到服务器端,发到服务器端后通过cookie的key去找request_session里面对应的session,session的对象里面本身就有一个JSESSIONID的ID。


重定向




idea中自动集成了各种数据库,且可以手动画表



cookie通过resquest获取,并通过response传递到浏览器



flyway Migration:自动将多个用户的数据库版本集成为一个数据库版本


flyway Migration帮助执行sql脚本,所以需要先把建立好的数据库删掉


通过不断创建新的migration让flyway migration自动管理数据库实现多人共同管理(每个人新写的migration在执行后都有对应的码做标记)




在编写前端页面的时候可以通过检查功能一边修改一便调整,最后复制即可。

model常用于在前端和后端之间传输信息:后端通过设值的方式向前端传。




Lombok:

可以通过@Data注解简化代码量,自动生成set、get方法,但在IDEA上需要Lombok插件




Service中间层的作用是使得Spring会自动管理这个类,如图所示,在里面可以同时使用QuestionMapper、UserMapper-起到组装的作用(这两个mapper对应向两个不同的数据库做操作)。当一个请求需要组装User-question的时候便需要service(习惯将中间层这么叫)




jsonfast会自动将网络中收到的json对象的中的_分割方式转换为驼峰分割方式


此处是关于html中时间的展示方法,其格式受sql的语法控制




Developer Tools:自动部署工具

Spring热部署:两个classloader,一个加载不变的类,另一个加载变化的类,项目启动的时候新的自动加载,老的回收

JRebel热部署:把每个变化的字节码做热替换,所以不会重启项目,但会收费



ctrl-shift-alt-?

将这两次此处勾选,完成之后,点击build,便可以实现自动热部署(页面的样式变化不会重启服务),但是页面自动刷新还需要另装插件


LiveReload插件




拼接语法



问题4:

页面的交互效果是依赖于jqurey库的,jquery里面封装了很多方便的方法,以便我们操作js、html中的一些属性时候更方便,不需要html的原生方法.

解决:将官网的文件拷贝一份到js目录下,并在html中引用。



上面是js原生方法,下面的是jquery的方法





thymeleaf支持将模块分离、封装为方法,以供调用,如此处便是将<nav>模块封装了


按照此方法引入封装,navigation.html是封装的文件名
ps:据说还有th:replace等操作




图一


图二

图一是当前文件的同级目录,图二为当前文件的上一级目录(一般指根目录)
此处目录非文件内存存储目录,而是指地址的映射目录


问题5:css配置文件无效
解决:css配置层级关系的时候需要空格来隔开,如下图




thymeleaf下url的拼接方式,section是后端通过model传过来的控制url的参数,同时可见url中的文件目录与参数之间不需要‘/’分离




拦截器-interception:


Spring官方文档

在此项目中页面return是String是因为使用了模板,如果没有使用模板,做一些接口,返回json的时候需要用到“@ResponseBody”,这个东西


使用方法
方法中的第二行的.addPathPatterns();方法指的是请求的时候对哪些地址进行拦截后面的.excludePathPatterns();方法指的是对哪些地址不进行拦截

通过实现拦截器当中的抽象方法实现在网页请求特定地址的时候(拦截请求),做一系列下一步操作的预处理或者上一步操作的后续处理,又或者是进行一系列操作判断是否需要拦截该请求。


@AutoWired

问题6:加了拦截器之后,网页的css等样式没了
解决:通过源码了解到,拦截器通过配置方法的默认实现把静态资源也给拦截了,把webConfig类中的“@EnableWebMVC”去掉。或者重写拦截器的配置方法,不拦截静态资源。




Mybatis Generate:自动的根据数据库的表,自动的生成mapper

根据具体的配置,该插件会具体生成一个类去匹配表结构,如生成一个类匹配表的主键,生成一个类动态选择、升级或删除功能。

同时MBG将生成与MyBatis3兼容的SQL map XML文件,MBG为配置中的每个表上的简单CRUD函数生成SQL,如(insert、update by primary key、update by example、delete by primary key、delete by example、select by primary key、select by example count by example)其中example的将会使用动态where子句

Mybatis的使用方式有使用注解的,和使用XML的,后者在复杂时方便


配置1-maven插件


配置2-依赖


Parameter Reference



XML文件配置

这些配置中根据官方文档,有的标签是可有可无的,有的标签需要改的

配置完后控制台运行:mvn -Dmybatis.generator.overwrite=true mybatis-generator:generate


成功后根据配置生成如图四个文件,以User表为例
UserMapper.xml:sql语句的具体实现
User:User对象
UserExample:完成各种sql的拼接
UserMapper:与UserMapper.xml通过配置实现映射,使得UserMapper中的抽象方法被UserMapper.xml中的

之前通过@Mapper注解,使得spring获取mapper上下文

引入Mybatis-generator后通过spring-boot-start,在Application下引入@MapperScan(basePackages="mapper所在包路径"),这样spring便自动路由过去


同时配置如图设置,使得spring获取其它两个生成的文件在哪。


根据如图所示的方式拼接sql语句

此后若需要添加新表,只需要添加<table></table>标签即可


Mybatis中有RowBounds插件支持分页,网上也有国人写的pagehelper插件,此项目参考官方文档的意见。




综合处理错误的接口

错误处理

前后端分离的Content-type一般是application/json,非前后端分离的是text/html

ControllerAdvice-ExceptionHandler处理所有上下文中的异常

ErrorController处理所有没有截获到的MVC的异常。


当我们在controller中写业务时,从前端返回的一般都是ModelAndView,


在业务代码中一般会出现异常,出现异常的时候通过RunTimeException将异常抛出来,在抛出来的过程中便可以在通用的处理方式中拦截或截获,但不希望每次都重写同样的错误码-错误信息。于是封装一个接口,封装了一个具体的错误码-错误信息的类继承该接口(枚举的),然后每当接口中的方法被调用的时候便去到其具体实现的地方,返回错误信息。


java上下文中用实例来传递数据,在js与java中可以用object传递数据,而在不同语言中约定用json来传递数据。

json支持数组(方括号)、object(大括号),key-value保存。

前端传过来请求的时候,服务器端拿到json,然后反序列化为自己的一个对象,然后操作,回给前端的时候,返回一个java的object,spring传化为json


spring自动的将json对象转化为类,存到commentDTO,需注意的是这样写的话这个接口便是json的接口,所以传的请求的header需要是content=application/json

postMan:https://chrome.google.com/webstore/detal/coohjcphdfgbiolnekdpbcijmhambjff
用于测试接口用


这样写的话(@ResponseBody),返回的对象便会自动的序列化为json对象,与RequestBody混合使用实现json-对象在前后端互换。


(关于异常信息还有待调试)



事务:捆绑操作,一起成功,一起失败。 

问题7:登陆信息获取失败,仍然成为了一个用户登进了网络
解决:在用户是否登录那里作了个验证,但那个验证的方式是
“if(githubUser!=null)”,所以问题的所在就是对象的引用为空和对象的实例域为空是两回事,而这里的情况便是对象存放的引用不为空,但引用的对象的实例域为空。


Spring提供的一个注解,为整个方法体增加一个事务,使得方法体当中的内容会一起成功或者一起失败。

通过Transactional源码,该注解可以打在任意方法体上,在什么都没配置的情况下,会在出现RuntimeException和Error的时候回滚。其中涉及AOP的原理(待了解)。当启动事务的时候根据AOP的原理,把当前所有以Transactional的anotation作为注解扫描进来,然后在运行方法的时候开启事务,然后执行方法里面所有的逻辑,如果出现异常则直接completeTransactionAfterThrowing方法,然后在其中执行rollbackOn方法。(面向切面的概念是什么,有人在说)




Jquery:封装了JS的类库,可以快速的通过#加一个属性名来获取属性对应的值。

浏览器network界面的信息是所有的浏览器向服务器端请求的图片资源、异步请求。

json.stringify():使用该方法可以将javaScript对象转换为字符串,然后向服务器端发送数据与服务器端交换数据。将想传的json数据作为stringify()中value的参数传递进去就行。



前端debugger的方式,便是添加debugger语句。


此时会像打断点一样停在此处。

同时在此之后可以在服务器端选择任何一个变量点击右键,选择“Evaluate selected text in console”对变量在控制台进行其它命令



window中的localStorage可以在本地存储数据。所以可以起到控制状态转换的作用,如下图

首先在调用方法的时候在localStorage中设置参数值,然后再在对应页面打开的时候,通过localStorage值的状态决定是否做相应操作。localStorage只能手动删除,且数据在客户端。


这个依赖下面有很多方便字符串判断的包,如StringUtils.isBlank()可以判断字符串是否为空或者null。


控制页面刷新。


Mybatis的拼接语法,此处意在拼接sql排序语法(按照时间倒叙排序)



关于Jquery语法:

(暂略)



页面导入moment.js可以控制jquery的时间显示格式,与其它语法不同的地方在于,该js的控制语句需要大写。

在js端控制heml页面的语法比较繁琐,主要为$("",{}),前者标签,后者属性,当下的前后端分离不这么搞。

js抽取变量的时候变量前面加#与不加#的区别。



logstash可以同步多张相同表结构的数据表到同一个索引:即当数据库当中多个结构相同时,可以把所有相同表的数据同步到同一个es索引中

问题8:a标签太大了,在它之外都能点到。
解决:找个容器包裹起来。


问题9:数据库中定义dufault为0的字段在新增的时候没有自定义为0,而是为空
解决:解决个鸡毛,没解决,手动赋值,以免出错。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,186评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,858评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,620评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,888评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,009评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,149评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,204评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,956评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,385评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,698评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,863评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,544评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,185评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,899评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,141评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,684评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,750评论 2 351

推荐阅读更多精彩内容