粉丝2098获赞4378


来看一下 javaio 使用 pass 访问资源。我们先介绍传统的 file 类。在 java 中有两种方式表示文件系统中的文件和路径。第一种是传统的 file 类, 这个类虽然在过去广泛使用,但现在建议尽量避免使用,除非确实有特殊原因。相反,应该更倾向于使用 pass 接口,因为它提供了更多的功能和更好的性能, 尤其在访问较大文件和目录时。尽管如此,由于 feo 类在旧代码中仍然被广泛使用,凭借它的基本概念仍然是有必要的。我们来看一下 feo 类的主要概念。 feo 类的实力可以表示文件上系统的任何内容,例如一个文件目录符号链接,相对路径,绝对路径。 在需要注意的是,这个时域呢,只是一个抽象概念创建它并不会在文件系统中参加任何实际的文件和目录。目录类可以查询文件系统状态,但需要明确调用相应的方法。我们来看一下 file 类的局限性, 它无法直接访问文件内容。通过 fill 类的实体,你只能检查文件的属性,比如是否存在是我可读而不能读取或修改文件的内容。另一个是文件路径的表示。一个文件路径由多个元素组成,这些元素通过文件系统的分割符。在 windows 中,分割符是反斜杠。 在 linux 和 unix 系统中,控制符是正写的。文件的第一个元素可能是驱动符的标识符。 delete c 版在 unix 的 目录是正写的。我们来写用 feel 来演示一下操作文件。 用你创建一个表对象,然后呢?判断它是否存在, 然后再判断文件是否可读,然后我们来做出文件的路径 运行方法,可以看见文件存在,文件可读,然后再看一下文件的绝对路径啊,都打印出来。 然后为什么要用 pass 接口来代替 field 类?虽然 field 类在过去非常有用,但它有很多不足之处,尤其是处理现代文件和较大文件时,再把 nio 的 pass 接口引入,解决这些问题。与 field 类相比, pass 具有以下的缺点,首先是异常处理。 field 类中的许多方法在操作时不会抛出异常,导致错误信息缺失。 pass 接口通过了 fields, 提供了更健壮的异常处理机制,并更快捷地处理文件中的错误。 另外, pass 接口在处理单文件和目录时表现良好,尤其需要低归文件目录时显得更优越。 pass 接口还解决了非主流在不同操作系统上的路径问题,提供了更一致的 api。 我 们用 pass 接口来写了事例, 用 pass 接口先获取文件对象,我们判断文件是否存在,用 fill 类,然后我们也打印它的绝对路径。然后呢,也可以读取文件的内容,用 try 这里用 list 尺寸读取每一行的内容。然后呢,将 pass 对 象传入,并且 void 循环输出键。然后我们在文件里面加几行数据, 我们读取一下,可以看到没有问题啊。通过这个视例呢,我们看到如何使用 pass 接口来检查文件是否存在,获取文件的绝对路径,以及如何读起文件内容。 与 file 类相比啊, pass 接口更简洁,更强大。最后我们总结一下,那尽管 file 类曾经是 java 文件的操作主力啊,但现在呢,我们使用 pass 接口和 files 类来处理文件的系统操作。 pass 接口提供了更好的性能。随着访问文件 a p s。 扩展,我们建议我们在新的系统当中使用 pass 接口,而非传统的系统类,这是非常类。

我已经开启环境了, 直接进行端口探测,我喜欢 u napp, 发现八零八八端口开启,我们访问 一个登录页面,这个是息肉,我是通过抓包响应出现 remember 字断判断的。我这边直接张贴过来 工具,就是出了点问题,我是一个个是的。 ok, 打进去了, 我们把答案填一下, 这里直接我打内存码进去了。 ok, 好 了,上线工具配置一下, 进来了, cat, etc, password, 零数字 root 权限跑不了, 下载到桌面上。 好了, 它是二禁制文件打不开的 five minutes later。 好 了,接下来就是找文件了, 找到了,路径和密码都在。

设计模式其实没那么难学,今天就带着大家来快速搞定最后一个创建型设计模式,圆形模式。圆形模式的核心就是用已有的对象作为原型,通过复制粘贴的方式去创建新的对象,避免重复编辑对象的创建逻辑。在 java 中,使用圆形模式总共 就三步,第一步,需要被复制的类去实现 cloneable 这个标记接口。第二步,重写 clone 方法,那这个方法就是返回 复制出来的对象,注意访问修饰符一定要是 public。 第三步,我们调用 call 方法来获得新对象。使用原型模式有什么好处呢?第一个当然就是调用和了,只需要调用对象的 call 方法,无需关心对象具体的创建细节,将对象的生成逻辑 与使用逻辑进行解偶,这使得我们的代码可维护性和可扩展性都更强,即使后续对象的创建过程发生了变化,我们的调用代码也无需做任何修改。第二就是 性能高效,圆形模式直接复制了现有对象的状态,避免了复杂的构造逻辑,尤其适合那些抽象过程耗时比较长的对象。那圆形模式有没有什么问题呢?最主要的问题就是 深浅拷贝问题,浅拷贝时仅复制基本类型数据,引用类型的数据只复制了引用地址,克隆对象和圆形对象指向了同一块内存区域,这就导致了修改克隆对象的属性 也会影响到原对象。申考背虽然能够保证克隆对象跟原对象的完全独立,但需要手动递归复制所有的引用类型的属性,包括嵌套对象和集合等等,实现申考背时,稍有不慎就可能遗漏了某个层级的对象的复制,导致了我们整体的数据 不一致。那什么时候需要来使用原型模式呢?第一就是复杂对象的快速创建。当对象出场需要大量的参数或者复杂逻辑,比如涉及到了网络请求啊,数据库查询, 直接去克隆炫耀对象就是更高效的选择。比如在电商订单系统中,一份订单通常包含了用户信息、商品信息、配送信息等等众多复杂数据,如果每次生成新订单,都要从头开始获取和设置这些信息,效率极低。 如果我们基于一个订单模板,利用圆形模式快速克隆,只需要根据实际情况修改部分信息,就能够迅速的生成多份订单了。第二呢, 就是隔离对象的创建逻辑。那如果开发者希望隐藏对象的创建细节,那圆形模式就派上作用了。在我们的 spring 系列框架中,对于圆形域中的 b, 每次请求时, spring 容器都会通过克隆的方式返回一个新的势力。 隐藏了复杂的 bin 的 创建过程,使得我们在开发时无需关心 bin 是 如何创建和配置的,只需要拿来使用即可, 降低了调用端与对象创建逻辑的藕合度。当然,我们在初学的时候也不用怕什么过度设计,感觉来了,你想用就用,不被骂几次哪能有成长?原型模式,现在你搞懂了没有?

很多同学连 java 工程里面的分层啊,命名规则都不明白,今天我一个视频从前到后给你们讲清楚 java 工程里面每一层每一个类的后缀,比如 service 到 entity, 到底是什么意思啊?第一个 controller 包,是 web 项目中的控制层,负责接收 web 请求, nvc 加包中的 c, 比如外部掉了一个什么接口,这个接口往往就是指 controller 类里面的某一个带 request mapping 注入的一个方法。还有老的项目呢,叫 action 层。第二个是 map 或者到层啊,这个是项目中的数据库操作类, 那以前呢,我们都叫到层 d o 就是 data access, object 数据库访问对象。现在呢,都基本叫 map, 因为 mybites 框架里边的设计习惯就是 map 接口啊,所以大家现在都习惯叫做 map 了,其实呢, map 和到是一个意思。第三层是 service 层, 这一层要特别注意啊,以前呢,我们一般会把业务逻辑都写在 service 层,但是呢,现在一般公司里面会把 service 层分成两个包, 分别是 service, b i z 或者 manage 啊, bo 啊这类名字由 service 层呢来包装到层的方法组成,最基本的数据库单元能力或者抽象能力。然 把业务逻辑都写在 b i z 啊, manager 啊, build 啊这一层,好处呢是职责更加清晰。上层呢,写具体的业务,下层呢,写抽象的业务,由 b i z 层调到 service 层,并且把事物也放在 b i z 层。 第四个是 common 公共的包,一般呢,写一些常用的类,比如美举类啊,公共参数啊这些东西。第五个啊,是 job 或者 schedule 包,这些呢,一般写定时任务的一些类。第六个啊,是 youtube 包,一般呢写工具类,比如日期处理类加解密类。类名呢,基本上都以 youtube 来结尾,方法呢,基本上都是 static 的。 第七个是 entity 包,实体包,一般呢放实体对象可能包含的类有 poo, d o, d o, entity, d t o, v o, b o 这些类。下面呢,我分别解释一下,上面这些 o 是 什么意思啊? poo 九的意思是最基本的 java 对 象,没有任何业务属性或者技术属性。下面什么 po 啊, d o 啊什么都是它的子集。 po, d o, entity 这三个呢,一般是一个意思啊, 指的是数据库,持久对象和表呢,是一一对应的。 d t o 呢是数据库传输对象,一般呢用在跨系统间进行传输, 比如啊, r p c 调用中的参数。 v o 呢是试图对象是 control 了,用来去接收前端参数和返回结果的。所以呢,一般命名可能是叉叉叉 request v o 或者叉叉 respond v o 是 业务对象,一般会组装多个数据库对象。 p o 在 上面说了这个 b i c 层里面去用。 最后说明一下,上面这些 o 啊,只是命名规范和开发习惯,如果你能够 hold 得住的话,那可以用一个 entity 就 从头写到尾。


我发现很多人背八古文真是纯硬背,背的那叫一个难。等面试时人家冷不丁再问你一个场景设计题,立马就懵嘚了。这就好比是花大钱上泰国,结果找了个人妖主打一个,难上加难呐。 就比如死不人事物在什么场景会失效?这个比茅坑里的石头还臭的问题,只要稍微的变一变,就肯定有人答不上来。今天新哥就带你给他盘的明明白白。首先先来点简单的方法的访问,修饰符必须是 public 的 事物才能生效, 还有就是事物方法不能被 final 修饰,当然也不能被 static 修饰,要不然就成了静态方法,都不归这个对象管了。 还有就是方法内的逻辑被捕获住了,当发生了异常时,只会打印一行日制 spring 感应不到有这个异常,那自然也不会回滚了。既然提到了异常,那就要好好知道 transaxenal 这个注解, low backfall 是 指定发生哪些异常,会执行回滚, 默认是只有 run time exception 和 i o 这两种会回滚。 run time exception 是 非受检异常,那么对应就有受检异常,而 i o exception 就是 其中一种,所以这种异常发生就不会回滚。 所以在使用 transacconal 注解时,都是把 low back four 给直接指定成 exception。 其实这些啊,都只是开胃小菜而已,大家肯定都知道了, 重点要说的就是当有多个方法来回调用时,事物到底生不生效。这就很多人开始懵嘚了。 首先第一个例子,在 a service 中有 test a 一 和 test a 二这两个方法, test a 一 中调用 test a 二这两个方法都有事物注解,两个方法肯定都有事物。好,那接下来就开始玩玩花活了。 test a 二要是去掉了事务注解,只在 test a 一 上有,那这种还有事务吗?那我们再改一下,又比如 test a 一 没有事务注解, test a 二有,那这样的话还有事务吗? 还能再接着变 test a 一 有事务注解,但这里调的就不是 test a 二了,再添加一个 b service, 有 个 test b 一 方法,也有事务注解, 在 test a 一 中调用这个 test b 一 的方法,这种的话还有事物吗?那如果把 test b 一 的事物注解去掉呢? 还有事物吗?要是再变一下 test b 一 有事物注解,但是 test a 一 没有注解了,那这种还有事物吗?怎么样?各种方法变来变去,这你要硬背的话,可不就得蒙嘚了吗?所以要知道事物的本质到底是什么? 其实啊,事物也是要 a o p 实现的,只不过这个切面的过程是 spring 自己去给你做了,当确定有这个切面后, spring 就 会根据这个对象来生成一个代理对象出来,把事物切面和我们自己的切面放在代理对象中的一个链路里,也就是责任链模式, 可以抵 bug。 看一下,能看到这个 service 的 对象和普通的不太一样,后面有这一大串,这就是代理对象了,而这个就是代理对象中的责任链,能看到这里面有事物切面和我们自己的切面,他就会挨个的执行这些切面。 知道了原理,再回到代码中。首先就是 test a 一 和 test a 二的调用, test a 一 有事务注解,执行时,就是代理对象在执行这个方法,也就是有事务 注意,等执行到 test a 二时,这个是 base 调用,所以这时就是普通对象了,也就是 test a 二上面的注解是不生效的, 但没关系,因为传播行为是默认的 require 的, 所以泰斯 a 二直接用的泰斯 a 一 的事物,这里先把自己的切面去掉,那么如果泰斯 a 一 没有事物,泰斯 a 二有的话,自然也好理解了。 泰斯 a 一 没有事物注角,那就没有事物切面。执行的时候,责任链就是没有东西的,那么也就是普通对象在执行,可以抵 bug。 看一下责任链, 发现责任链中确实是没有内容,也说明了 test a 一 是没有事务的,而 test 调用 test a 二这个调用肯定是普通对象了,那么整个过程也就是没有事务的。 那要是把调用 test a 二换成 b service 中的 test b 一 呢? test a 一 还是没有事务注解,执行时还是普通对象。 但 test b 一 可就不一样了,它可不是 days 调用的,它是由 b service 调用的,这个可是直接从 spring 拿的, test b 一 就有事务, test b 一 有事务,那 b service 就是 代理对象了。 b bug 看一下,确实 b service 就是 代理对象在执行。再告诉你一个硬核的知识点,其实 spring 的 这些事务管理信息,什么隔离级别、传播行为等等一些关键的信息都是放在 threadlocal 中来存储的, 可以看一下原码,能看到这些信息还是非常多的,因为紫外 logo 本身的特征,这就导致了如果是在不同的县城下,事物就不能附用了。还是回到这个例子中, test a 二改成县城池调用,那么 test a 二就不能附用 test a 一 的事物了, 到这里还没有完,还有个更加硬核的东西,很多人呐,都栽在了这里。当 type a 一 调用 type b 一 时,如果把 type b 一 方法中的异常给补货了,那么肯定是 type a 一 和 type b 一 都不能回滚了,这个没有什么好说的, 但是如果把补货的位置给换一下呢?改成在 type a 一 调用 type b 一 时,在这里给补货住。 那么当 test b 一 有异常时, test a 一 和 test b 一 这两个方法还能回滚吗? 估计啊,有很多人会说 test b 一 会回滚, test a 一 不会,可真实的情况是,这两个方法都会回滚,并且会输出这么一行的信息出来。知道到底是什么原因的小伙伴可以把你的答案打在评论区上。

首先何为跨域?跨域呢?其实字面意思啊,很好理解,就是我跨了不同的域名,假如啊,我从 google 点 com, 然后这个域名呢?去访问百度点 com, 这肯定能访问的,但是呢,它域名不同,那么这个呢,就是跨域了,当然了,除了域名以外,比如说协议不同, 从 h t p 到 h t p s, 端口不同等等,都属于跨越。那什么是跨越问题呢?为了帮大家更系统性的准备面试,我整理了包括各阶段的面试题,找到面试突击学习路线,以及精选的简历模板,需要的小伙伴。跨越问题啊,大家在工作中呢,应该或多或少啊,都见过。 假如说前端我们用阿贾克斯去访问跨域的接口的时候会报错,访问不了,我们来看一个简单的例子啊,假如现在我这里有两个程序,一个程序呢,是八零八零的端口好,然后八零八的端口呢?我有一个接口啊,假如说就是 info, 我 通过一个 id 呢,我去查询我的一个详细信息,我们可以简单的来访问一下 local 八零八零的端口,对不对?好, info, 假如说 id 十六,你看我是能查出来的。 那么假如说我从另外一个服务的前端的 htm 去访问我的这个接口,然后呢,假如说我现在有一个简单的页面啊,这个页面呢,其实就是一个按钮,这个按钮呢,我去通过阿贾克斯去请求我刚刚的这一个接口, 然后我会返回我的一个结果,然后这个结果呢,有个产品对吧?然后弹出一个产品名称,那么按照正常的逻辑,如果没有问题的话,你看我会把这个给弹出来,对不对?好,那么现在我们来模拟一下,假如说对吧?这一个服务他的端口啊,是八零九零,好,我去访问这个页面,好, 然后简单的测试通过阿贾克斯,我去调用我的这一个接口,他们是跨了不同的端口的,八零九零跳到八零八零,这时候我们测试一下,好,我们发现一个点,发现怎么样呢?哎,没有弹出来,并且他报错了, 那报了一个什么错呢?我们可以去看一下,这个就是我们的跨域问题,就是我们通过阿贾克斯浏览器去访问我们跨域的一些地址的时候,这些脚本会被限制。 那么为什么会有跨域问题呢?就是浏览器啊,他有个同源策略,什么叫同源策略?就是为了安全考虑,他限制了从一个源加载的文档或者脚本与另外一个源的资源进行交互的能力,那么这个呢,主要是为了安全考虑对不对? 所以啊,这是浏览器的同源导致的,那么跨域问题呢?也只有在前端浏览器才会产生,那么我们后端如果说去跨域请求,那么这是没有问题的,那么我们怎么解决呢?解决办法呢?有几种啊?那么第一个就是 jason p, jason p 呢,它是一个比较古老的方式, 我们只需要把前端的请求的 date type 改成 jsonp 就 可以了,我们来试一下,刚刚不是有一个前端去请求,对不对?前端去请求通过阿贾克斯,原来是 json, 那 么现在我把它改成 jsonp 好, 但是改成 jsonp 以后还不行,我们可以启动看一下, 好,启动了,那么这个时候我们再去测一下,他不会报错了,但是呢,他同样的没有返回我想要的结果,并且他有个提示,这是因为什么呢?你看他这一个请求,他把这个请求发现跟我这个请求不一样了,或者说跟我在阿贾克斯里面写的请求有点不一样了,他自己啊写的请求是这个, 但是他加了一些参数,看到他加了一些参数,就是有一个 callback, 然后呢有个值,那么这个是自动生成,这就是接收皮,他的一个原理, 就是我浏览器生成一些规则,我要跟后端去交互,他们要进行一次验证,但是这个时候发现还是不行,虽然前端给了他一个参数,但是呢,我们的后端还是不支持,因为他需要前后端去握手,去交互,但是呢后端是没有给你这个响应,那么我们后端呢,也需要去进行一个支持, 也很简单,你不是接受你的 callback 这个参数,假如说 spring, 对 吧?那这个名字呢?你可以去设置的,虽然默认他是 callback, 但是你是可以指定的,在我们的阿贾克斯里面可以去指定,那么怎么指定呢?其实也很简单,改成 callback, 那 么这个呢,就是去指定我的参数名,假如说叫灰灰,好,这个时候他就会变成灰灰了,这个参数名他就变了,就是你自己指定的。好,我们启动一下,我们可以去看一下他的请求, 这时候你看啊,我们去请求,对不对?测试好啊,这个时候是服务挂了,对不对?好,我们去服务停一下,其实我以为会会去接受就可以了,我们先不去管了,我们先验证一下这个参数名是否变更了。 好,启动了是不是?好,然后这个时候我们去测试。好,你会发现,你看它的参数名变成了会,会,那么后端我怎么样去接收 json b 的 请求呢?很简单,你看我接受后的这个参数,然后返回,我要返回 json p 的 一个格式。好,那么这个时候你看,我就不能返回 version 了,它是一个 json p 的 object。 好,然后呢,我们去扭一个 json p object。 好, 这个时候你看啊,我要把这个对象给他,并且把参数给他,灰灰,然后呢,它的对象是 product, 对 不对?好,这个时候啊,我们可以看一下,它的返回内容是不一样的, 原来是一个 json 的 格式,对不对?那么现在呢,我们可以去请求看一下,它的内容是不一样的,它支持了 json p。 好, 我们去请求一下,我们启动,对不对? 好,然后我们来看一下,我们改动以后,它返回的一个格式是不一样的,如果我们按照正常的去请求啊,那么这个时候你看它是会报错的。好,我们要怎么办呢?因为它缺少一个参数,我们可以去看一下后端的提示, 你看它缺少一个参数,对不对啊? nullpoint exception, 那 么怎么办呢?我们有一个灰灰嘛,对吧?截屏 p 的 格式有个灰灰,我们必须要把灰灰给加上去,这是它的参数有个二三,这回。 好,那么这时候你看它就是一个接收 p 的 格式了。好,那么这个时候我们再来去测试啊,去请求一下,你会发现我就能正常的去弹出来接收 p, 它解决了一个跨越的问题。好,那么第二种呢?比第一种更好,第一种是接收 p, 那 么它会有些问题啊,因为很多浏览器啊,可能不兼容, 并且呢我后端必须要返回一个接收 p 的 格式,假如说这个接口我在很多的一些不同的地方去用的话,它藕合性是比较高的, 那怎么办呢?就是我们用另外的方式叫 c o r s 一个策略 course origin resource sharon, 翻译过来就是跨资源共享,它允许浏览器向跨资源的一个服务器发起 h t 请求, 从而克服了阿贾克斯啊只能同源使用的限制,只需要服务端去变动就可以了,那么我们简单的来去看一下怎么样去做,那么这里呢,我们直接啊就把它改回来,不要用 j c p 的 格式了, 返回 pad。 然后参数呢,我们也不需要去接受,因为我不需要跟前端去交互,前端都不需要改,对不对?那么我们把前端呢也改掉,不要改成 json p 了,就 json 就 可以了。好,后端,那么这个时候 你看我要改服务器,我要允许浏览器来向我去发起跨域的一个请求共享,那么怎么办呢?来这个接口有几种方式啊?第一个呢叫 crossword 注解,我们可以加到我们的这个注解里面,那么死 我容易去指一个呢,那么这里呢,我可以去指定啊,哪一个方法,对吧?然后跨越呢,这里面有个参数,那么你可以去指定什么哪一个域名,哎,可以跨越过来请求,对不对?那么假如说现在你看是我的前端那个接口是这个接口,对, 这个页面,你看 ip 端口可以跨越请求。好,那么我只要去设置这个能跨越的端口 ip 就 可以了,那这个时候呢,你看我们后端启动看一下,前端我们已经改成 jason 的 格式,我们可以看一下, 你看时间层的格式,那么这个时候改回去了以后,你看我就能正常请求了。好,但是呢,我去设置了跨域,你看这个也是能弹出来的, 他不会有跨域的问题。好,这个呢,我只能在一些控制类或者方法上面去使用一些注解。对,那么假如说我想去自定义跨域, 就包括跨域的接口啊,哪些域名啊,或者说方法类型啊等等。那么这个时候呢,我们可以再通用一点,我们可以用一个呃 filter, 或者说实现 ybl 维 c 里面的 config 去实现进行跨域拦截。那么怎么办呢?那这里我们先注视掉啊, 我们来看,假如说我们自定,其实呢很简单啊,那么我们只要去实现歪编 vc config, 然后按 cross mapping 这个方法就可以了。假如说我叫灰灰掰折,我们去实现歪编 vc, 然后呢肯定我要把它作为一个 configuration 给它配置,那这个时候啊,你看它会有一个方法,我们可以去看一下,有一个,你看在这里面 cross map, 去设置一些跨域的一些规则,对不对?好,那么这里呢,假如说我们去把它加过来,去实现这个方法, 然后这里你看我可以去指定,首先呢哪些接口,对不对?你看这是我的音符,音符就是这个接口,对不对?然后呢哪一个域名?你看就是这个,然后哪个类型?你看这是 get 方法,所以我去加一个 get 方法, 然后呢我再去启动看一下,我这里面的注解,已经没有了。对,我现在是通过一个什么拦截器,或者说叫做一个配置,然后一个全局配置,这个时候我们再启动, 现在通过我们也可以看一下,他还是不会有问题,因为他是支持跨域的。好,现在还没有请好,你看还是没有问题,对不对?那么这个呢?就是第二种,当然呢全驱配置呢?还有一种 porsche 啊,其实也比较简单。好吧,假如说我现在再去建一个啊,叫做灰,灰到了, 呃,叫做啊,好吧,好,那么这个时候可以通过 cosine 把这个 cosine 放到我们的 ic 容器里面,并且可以去设置它相关的参数。好,我们可以通过 configuration 加 bin 的 注解, 把我们的 post filter 去设置好,并且放上去,这时候我们可以看一下 post filter 呢,这里同样的我们去设置一些配置, 比如说就是我支持哪些接口,然后以及这是哪些头,这是哪些方法,包括我的一些域名等等。好,那么这里呢,我都可以设置,设置完了以后,那么这时候我把这个给删了,这是我所有的,对吧?所有的我都可以支持跨域。好,那么这时候我们再启动一下, 你看原来的那个配置,我已经删掉了的,好,可以了,对不对?好,启动了,然后我们再去测试,你看还是没问题。好,那么这个呢,就是我们在服务端改,第一种是分层批,我通过前后端都要改,对吧?他们藕合性非常高。第二种方式呢,就是非常非常对点, 那么我只需要后端的变更,那么后端变更呢?我有几种办法路解啊,然后包括配置类啊,互测点啊等等。那么还有一种呢,更好一点。为什么更好一点呢? 因为像这种在服务里面去改动呢,我作为一个业务开发,那我一般不会去关注这些东西。那么还有呢,藕合的更低的一种方式就是 ngx, 那 么 ngx 呢?就是他不关心业务了,对不对?你业务只要做业务事情,服务端你不需要去关注任何向什么宽裕的问题, 我可以在 ngx 里面,反向代理里面去做。那么其实也比较简单,我只要去设置他的一些话语响应头就可以了。好吧,那么这个呢,就是解决更多实用干货知识。我是灰灰,我们下期再见。

来给大家讲解一下我们写代码的整体思路。首先呢这个代码是先要有底层,然后有上面的表示层这两种形式,之前呢我们画过一个关于系统模块的实线图,就这里 这个总体来说呢,他们在最底层是有一个数据库啊,先写一个数据库,建数据库表,那根据我们的一二图来建表,建完表之后呢,我们需要有一个系统后端来对接这个数据库来访问它, 从这里面请求以及返回数据,这是一个关于数据库的管理啊,有了这个数据库跟我们的系统的服务端,也就是后端, 有了这两个基础之后呢,我们就可以在上面去建立两个前端页面,一个是用户用的 app 端,还有一个就是 我们网站管理员用的网站管理后台这两种这上面是对应着两个不同的请求,比如用户的请求来访问 app, app 来访问系统后端, 系统后端访问数据库啊数据库同时逐个的在返回,返回给我们的用户 app 展示出来。 然后在我们的网站端呢,也是有管理员发起请求,请求访问我们的网站后台,然后到我们的系统后台,再到数据库,并依次的返回给我们的网站管理进行展示,这是一个整体的思路, 有了这个思路之后呢,我们写代码也是按照这个思路来写,所以我们首先要写的就是我们的 后端代码,有了我们的后端代码来访我们的数据库表,有了数据库表之后啊,就可以对他进行增删改查的处理, 然后我们再写整个的前端,所以我们先写后端,后端里面呢他会有一个分腾思想在的,这个分腾思想呢, 就是他需要有一个这个总的一个控制层来负责分发,然后有个服务层, 服务层呢来负责处理具体的业务,还有这个访问数据库层,这个数据库层呢负责和业务对接啊,这个并层呢就是我们的尸体,就是对象,把我们的 java 的 对象封装到里面,方便我们去调用啊。一共是这四层, 这个是配置文件,因为我们 spring boot 的 基础呢,就是要写一些配置文件,还有启动类来加载我们整个项目。 有了后端之后呢,我们写前端,比如我们写前端,把我们的页面写进去,然后丰富我们的 ui 设计。 app 端呢,也是同样的道理, 有了这些之后呢,我们来访问这个数据库,用我们的后端来连接数据库并返回数据。前端呢是请求我们的后端这样来做通信。 等我们都写好之后呢,我们就需要做一个测试了,比如我们访问一下前端,请求后端看这个数据通不通啊,如果通的话就能完成, 这是一个写一个单个例子的一个过程啊。写完这个案例的之后呢,我们就可以写一个标准的案例了,就是我们比如我们的用户管理,因为什么项目都离不开用户管理,因为有用户吗? 包含了用户的登录、查询、修改、删除等等,这是整个基础部分。有了这个之后呢,这个项目就完成了有一半了, 剩下的一半呢就是我们通过复制这个用户管理的这个例子,比如我们管理员管理,还有我们的饮食管理、菜单管理等等这些功能呢,都可以复制我们的用户管理,因为他们基础上都是增删改查的一个案例,复制完之后我们就可以去 加一些什么其他功能,比如我们可以加一些算法,还有设备接口, 有了这些之后呢,这个项目就算是完善了。然后我们做一个整体测试,逐渐的把这个项目去写完,这就是我们写项目的一个整体思路,后续呢我们也按照这个思路呢来往下进行。

好,今天看一下给另外一个客户调试的一个演示过程,还是打开我们的这个安装工具, 然后输入授权编码,授权编码是我发给你们的,这个项目里面都会有一个唯一的一个编码,然后选择复制粘贴 好,这里识别成功。识别成功之后呢,这里就是我们这个下载环境的一个目录,然后这个就是我们的一个项目目录, 这个就是我们的项目,然后同样改成中文,改成英文,改成英文,然后复制一下这个项目的路径。嗯,这个客户电脑是没有 d 盘,他选择装在了 c 盘,所以说这个地方改成 c 盘, 然后一键开始, 然后我们依旧等待这个安装 这个过程,我们可以把这个 nevercut 给它创建到桌面,方便下次使用的时候直接打开。 然后安装完之后呢, id 会自动开启,然后我选一下默认的配置, 然后这里项目已经导入了。啊,我直接双击, 然后我们直接右键 prom, 选择 add s main project, 就是 说添加为 main 项目, 然后我们这个地方看一下我们的 j t k 一 点八已经配置好了, 同样看一下我们的每晚 好,这里也已经都配置好了。 这里数据库如果说你要手动导入的话,就直接复制 ctrl c, ctrl c, 然后打开你的 netcat, 然后我们看一下刚才配的这个 macbook 的 端口是三三零七,我们连接一下,连接成功,代表数据库已经安装好了,默认的这个密码是一二三四五六。 好,那我们在 netcat 里面把你的数据库连接一下, 端口是三三零七,然后密码是一二三四五六,设置连接 ok, ok 的 话, 然后双击,然后 ctrl v 粘贴一下我们刚才复制的色控文件,这样的话就可以导入,然后刷新,这就是我们的这个导入的数据库,这是我们数据库里面所用到的表。 好,然后我们看一下 id, 依旧是等待这个网络下载没有环境, 等待这个没有依赖,下载之后,下好之后,我们这个项目直接点击右上角有一个三角,直接点击启动就可以。 然后我们这个项目的这个 application 这个配置文件,这里有关数据库的配置都会给你配置好,这里如果没改的话,就改成三三零七, 然后重新启动一下 项目启动之后,如果说出现这个界面,代表项目已经启动成功了。 tomcat start on put 八零八零,说明这个你项目已经在八零八零端口启动了。

家人们在招吧开发时,很多人会碰到县城安全的问题,啥是县城安全问题呢?简单来讲,当多个县城同时访问共享资源,并且对这些资源进行读写操作时,就可能会产生数据不一致或者程序出现异常的情况。打个比方, 就像好几个人同时去修改一份文件,如果没有一定的规则约束,最后文件内容可能就乱套了。在招挖里共享资源,就好比这份文件多个县城同时操作,他要是不做处理,程序就会出错。解决县城安全问题的方法有很多, 使用 synchronize 的 关键字,它能保证同一时刻只有一个县城可以访问被它修饰的代码块或者方法。就像是给文件上了一把锁,一次只允许一个人修改。还可以使用 lock 接口,它比 synchronize 更加灵活。掌握这些方法,就能让我们的 java 程序在多现成环境下更稳定。 最后,买卖二手机到密回收小程序,还可以搜番茄石领取一张加价券。大家在开发中遇到过县城安全问题吗?快来评论区说说!