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热部署:把每个变化的字节码做热替换,所以不会重启项目,但会收费
将这两次此处勾选,完成之后,点击build,便可以实现自动热部署(页面的样式变化不会重启服务),但是页面自动刷新还需要另装插件
拼接语法
问题4:
页面的交互效果是依赖于jqurey库的,jquery里面封装了很多方便的方法,以便我们操作js、html中的一些属性时候更方便,不需要html的原生方法.
解决:将官网的文件拷贝一份到js目录下,并在html中引用。
上面是js原生方法,下面的是jquery的方法
thymeleaf支持将模块分离、封装为方法,以供调用,如此处便是将
按照此方法引入封装,navigation.html是封装的文件名
ps:据说还有th:replace等操作
图一是当前文件的同级目录,图二为当前文件的上一级目录(一般指根目录)
此处目录非文件内存存储目录,而是指地址的映射目录
问题5:css配置文件无效
解决:css配置层级关系的时候需要空格来隔开,如下图
thymeleaf下url的拼接方式,section是后端通过model传过来的控制url的参数,同时可见url中的文件目录与参数之间不需要‘/’分离
拦截器-interception:
在此项目中页面return是String是因为使用了模板,如果没有使用模板,做一些接口,返回json的时候需要用到“@ResponseBody”,这个东西
使用方法
方法中的第二行的.addPathPatterns();方法指的是请求的时候对哪些地址进行拦截后面的.excludePathPatterns();方法指的是对哪些地址不进行拦截
通过实现拦截器当中的抽象方法实现在网页请求特定地址的时候(拦截请求),做一系列下一步操作的预处理或者上一步操作的后续处理,又或者是进行一系列操作判断是否需要拦截该请求。
问题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的,后者在复杂时方便
这些配置中根据官方文档,有的标签是可有可无的,有的标签需要改的
配置完后控制台运行: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语句
此后若需要添加新表,只需要添加
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,而是为空
解决:解决个鸡毛,没解决,手动赋值,以免出错。