粉丝61获赞464

第一个问题,你好,目前二本,大二通信工程,我大一是听了一些国外的公开课入门的,在大一下打南桥杯,但是只是省二,目前已经学了五个月的家法,后端差不多基础的都学了,但不够深入,并且跟着敲了几个项目。 感觉我学 java 很 功利性,随大流,其他方向也没有尝试过,就一头扎进了 java。 包括我大一看一些国外公开课,也仅仅是因为太过焦虑了,后面感觉太学院派了,就放弃了,于是最近在看一些书提高兴趣。 java 训练机网络是怎么连接的?包括想尝试一下在开源项目上做贡献。最近这图简历感觉丝毫没有竞争力,目前还没有面试。我的问题是推荐我接下来要学前端三件套加 vue 提高竞争力吗?构员怎么样呢?对我的方向又有什么建议吗? 好,选择大二二倍的印象通信公产选择的是 java 这个方向。是的,首先 java 这个方向呢,它是一个非常好的方向,它既好学又好用, 而且它确实产品化也非常快。我认为呢,在后面整个结合的情况下面,在应届生的群体里面,大家选择 java 呢,功利性他是很正常的,就是你选择 java, 其实来说你就会去放弃一些这种没必要的原理性的东西。嗯,像 操作系统相关的东西,你就没有必要太多的去深入。那后面来说面试需求,那背点八股文嘛,那核心来说就是你把 java 的 技能练好, 怎么去做好 java 的 技能?其实我也跟你讲一下我的观点,我认为做一两款产品结合了具体需求,你就比如说你用 java 做一个,你就比如做一个这种你们食堂的这种问卷调查,然后能够在你们学校用这个也行,你把它性能测好,它能够解决具体问题。 就比如说你做一个你们学校同届学生,然后比如选择各个技术方向的人群有哪些,做这样一个问卷调查他也 ok, 他 能够解决具体问题。这时候你就会考虑数据库怎么建,表怎么存,以及这些功能作为一款能够实际用的东西,能够去解决具体问题,这一样 我认为他对你的技术会有很大提升。不是说你去看很多很多书籍,很多朋友学技术有一个误区, 认为通过看书,首先书我认为他是要看,但是绝大多数你的实践能力以及你的技术能力,他不是通过看书而来的,是当你有了很多实践之后, 你再去看书,你会发现书他就能够打通你的任督二脉,因为你实践了很多,你会发现你缺少一种理论,通过书通过别人整理出来的书籍资料,然后你再去整理原来他这个体系化的思维,他就能构建起来。如果你在没有这种项目经验的情况下直接啃书, 那兄弟我说,哎,这个技术他是很难提升的。那接下来再往后面看我的问题,接下来要我要去学前端三件套以及 vue 提高竞争力吗?我说你可以通过去做一两款产品, 然后后面在这个产品过程如果需要前端你就做前端,需要有前端的东西你就去做,做完之后主要是为了把你的项目做到能够给别人用,做的好看这样而已。然后 go 语言怎么样? go 和 java 它是一个平级的。然后 go 呢?不是从学校走出来的,如果在应届群体选择 go 呢?他当然会没有 java 这么人多, 也没那么卷。当然雇的岗位肯定没有扎波多。其实这里到底要不要选择雇呢?没有什么决定性的。结练了一线三年。加关注提出你的问题。

不就是配个 i e 吗?你到底会不会做啊?到底做好了没有啊?晚上就要上线啊,接口怎么又超时了?单元测试都没有超过百分之三十啊,接口又把表给锁了, 服务器内存又爆了。这么简单的代码你都还没有敲完, jvm 调 u 怎么还没有完成啊?检测到接口注入安全漏洞了, 客户投诉查询太慢了,分布式锁又失效了,你能不能快点改,我赶时间啊。嗯?我为什么要帮你改,我看大家都在找你,所以哈哈哈。

我们下来的话就是对这个,对这个项目的一个核心代码进行一个讲解。就我们可以看一下这个项目架构嘛,它一个项目的核心无非就是像实体类 entity, 还有我们的这个控制层嘛,也就是控制器嘛, 然后再就是业务层,也就是服务层这个 service 嘛,还有就是数据库的这个持久层,也就数据库访问层这个 map 嘛。 好,然后我们这个功能就是对一个它的扩展名为 txt, 还有我们这个 csv 的 一个文件进行解析嘛,所以也是有这样一个解析层,就是把这个文件一一解析,然后去存储到我们的数据库当中嘛。 我们现在来看一下这个代码,我们先看一下这个实体类啊,就实体类的话它就是映射我们数据库的一个字段,看我们我们可以看到数据库就是内幕真的,然后缝看,我们可以看到这边就是映射字段, 然后我们这边用的是 logbook 的 一个 datacenter 注解,也就是自动生成我们的 get set 方法。还有就是这个 table name, 就是 对应的我们数据库里边哪张数据表, 我们可以看一下,就是,呃,我们这个数据库也就是一张表嘛,员工表,也就是这个 employee 表,然后我们可以看一下这个 table name, 也就是对应的它那个 employee 表, 然后这个 table id 的 话,这个也就是指定它的主键嘛,我们不是主键自增嘛,可以看到也就是这个 id 就是 它是自增的嘛。好好。 然后下来的话,我们看一下我们那个数据解析器,也就是 pass, 对, 就是这两个, 然后这个数据解析器的话,它是什么作用呢?就是它就是像我,它就是将我们这个拓展名为 txt 还有 csv 的 这样一个单行文本嘛, 就是把它去进行一个解析嘛,解析成什么呢?解析成我们这个 employee 这个对象嘛,就是解析成单个的嘛,它不是一行数据嘛?我们可以看一下, 我们看看一下这个 test 一, 它不是一行数据吗?对,所以我们就把它去抽出来,像内幕,然后 h 还有我们的缝去抽出来,抽成单行的吗? 是不是?然后就是,嗯,把这个我们这这个文本数据去转化成我们数据库存储的这样一个核心转换层吧,可以这样理解, 我们看一下这里边的核心代码,核心代码的话就是这个,就是这些, 我们可以看一下,就是这这一步的话就是一个文本预处理嘛,像这一步就是就是我们的数据它 我们可以看一下它里边可能是有空格的,所以说是这个时候我们要怎么解决呢?也就是用我们的代码去解决嘛,就是去去就是去去除他的首尾空格嘛, 然后就是删除我们的这个逗号嘛,我们可以看一下只有这个是拿逗号去进行一个分开的嘛,所以说是我们肯定是要去去除逗号的嘛,是不是我们可以看到这里是去除逗号的嘛? 然后我我再看一下还有没有什么核心功能。好,这个的话就是,嗯,我就是前面已经把它的字段去抽取出来了,然后这个的话就是跟我们那个 employee 的 这个实体类进行一个映射嘛,我们可以看到它是扭了一个 employee 的 这样一个对象嘛, employees 就是 员工的意思,就就是拗了一个员工的对象嘛,然后去把它取出来的字段去 set 进去嘛,然后我们 java 里边取字段,零是第一个嘛,然后一就是第二个嘛,这个大家应该都是知道的。 然后的话就是一个日期解析嘛,就是我们可以看到我们这里的日期是二零二零杠零,三杠一五,然后我们存储进来的是不是也是这样子的?但是我们取出来的话,肯定是要进行一个日期解析的嘛, 也就是这样的一个步骤, y y 四个 y 两个 m, 两个 d 去把它去解析出来,不然会乱码的。 好,这就是这个人。然后这个的核,他的一个核心逻辑的话,就是进行一个简单的预处理嘛,然后过滤我们无效的空格,然后逗号这些的,然后就是一个自断校验,然后日期适配这些的。 好,下面的话就是我们的这个控制层,也就是控制层好,就是这个 employee 的 这个 control 嘛, 我们找一下核心代码,好这一步的话就是,嗯,我们输入 local house 的 八零八零,然后就让它返回到我们这个 index html 里边,在这个配置文件里面都已经写好了,这个一会我做一个简单的讲解, 我们可以看一下这一段的话,就也就是我们的核心代码了,这就是处理的一个文件上传的这样一个功能嘛, 就是首先的话,我们是不是要判断它的文件是否为空,是不是,如果为空的话就是 return 一下嘛,就是让用户去重新上传嘛, 然后下面的话就是一个自断校验嘛,就是判断它的扩展名是以点 txt 结尾还是以点 csv 结尾的这样一个文件嘛,然后根据不同的这个扩展名,我们去,嗯,用不同的方法去解析嘛, 如果不是的话,就是他肯定是会返回一个嗯,仅支持 txt 或者 csv 的 嘛,因为我这里也标明了这也是我们大多数业务场景所需要的这样一个扩展名的格式。 然后下面的话就是调用了我们 service 业务层的这样一个嗯,业务层的一个处理,那它的主要的核心逻辑也就是在我们的业务层里边的嘛, control 了层,它就是跟前端进行一个嗯,数据交互好 就是好。那我们简单说一下这个 control 乐层吧,它的核心的话就是接受我们前端上传的一个文件嘛,然后做一个基础娇艳,像飞空,或者说是它的扩展名的类型。 然后的话就是调用我们业务层的一个方法进行一个处理嘛,就是已经在业务层去处理好了,它就是调用一下,因为是需要给前端去返回一个结果的嘛。 好,这个的话就是我们文件上传的这样一个嗯,控制层,然后还有一个就是结果展示的一个控制层, 也就我们 result 嘛,就是我刚才不是上传好,因为这个嗯电话号不能是一致一样的,所以我把这个删一下,我重新给大家再上传一下。 好,我们是不是有一个 result 的 这样一个就是结果的一个页面嘛,那么结果页面肯定也是需要一个结果页面的这样一个 control 乐的嘛,我们可以看一下 它就是做了一个简单的防 xss 的 这样一个处理,然后的话就是返回到我们 result, 好看,我们返回上一层,这个的话就是接受我们解析结果的一个参数嘛, 然后下面的话也就是我们最核心的一部分了,就是我们的 service 层嘛。嗯,我找一下 service 层,好,我们这里是一个接口,一个实现类嘛,接口的话就是定一个方法,主要的核心还是在我们的实现类里边 啊,这个核心作用的话,它就是,嗯,像我们控制城传来的一个文件的请求嘛。然后我们不是刚才 control 了去调用了一下这个 service 业务层嘛,所以说它这个业务层里面就是完成了一个文件读取, 然后,嗯,也就是然后就是调用我们的那个解析器嘛。解析器一开始不是给大家说就是这个 pass pass 嘛,调用解析器,然后再就是批量入库这样的一个流程嘛, 我们看一下核心代码, 嗯,好,这一步的话就是 看一下好这些的话就是核心代码了, 我们可以看一下它这一步,这一步是相对来说重要一点,它就是一个我们这一个逐行去读取一个文件,就这一步底下它是一个逐行去读取文件, 然后就是避免中文乱码嘛, 我们可以看到这边是不是有一个 u t f 杠八,就是避免中文乱码, 然后我再看看 好这一步,这一步的话就是我们调用解析器了嘛, 看,我们可以看到是 employee 这个 pass, 也就是我前面给大家刚简单讲解的这个解析器嘛,调用了解析器就是解析器,它已经把数据算是取出来了,然后我们这一步就是,嗯,通过调用解析器把我们的文本去转化成我们 employee 的 这样一个对象嘛。 然后我们看一下这,这个,这个也就是实现了我们一个批量入库的这样一个功能嘛,就是一个一个的去把它艾特进去。 好,那么这个 service 层的核心功能就是这个这些了。然后它这个核心逻辑的话就是,嗯,就是要用我们的解析器,然后去把我们的文本去转化成我们的一个对象, 然后就是处理一个日常,处理一个日制嘛,我们可以看到 s l f four g 嘛,然后的话这个就是我们的后端逻辑嘛。这个 map 这个持久层就没有什么可说的,我们调用的是 mybenchplus 嘛。好,然后我们看一下我们的前端, 前端的话,这个 index html 就是, 也就是我们现在能看到的这个主页面,这个首页面嘛, 然后它就是文,我们文件上传的一个页面,这前面都是 css 嘛。好,从这里开始它就是我们文件上传的一个页面。好,我们可以看到, 然后它就是 css, 然后 js html 去实现了一个,然后的话就是我们结果 result 的 这样一个页面,也就是我,嗯,上传完成了之后,它去它会返回,我们到底是解析成功还是解析失败?我刚才的那个不是解析成功吗? 然后最后一个的话就是我们的一个配置文件嘛,这里的话就是定义了端口是八零八零嘛,当然八幺八幺这些的都是可以的。 然后这个的话就是你单文件最大的一个限制,嗯,我这边设置的是十 m b, 如果说是我们大家有像十几万,十几万的,十几万行的这样一个数据,或者是五六万行的一个数据,那么它的这个文本的, 嗯,文本的这个肯定是过我们十 mb 了嘛,至少也是十几 mb, 所以 说我们把这里修改成二十也是可以的,这个就是它最大的限制就是你超过十五 mb, 十 mb 的 话,它这个就没办法进行解析,没办法进行上传。 然后这一个的话就是 max request size 的 话,它就是我们单次请求最大文件的大小, 就是你一次请求的最大文件的大小,这个的话就是怎么说呢?就是防止超大文件的一个上传吧,这个 file size 就是 防止超大文件的一个上传。 然后这个 data source 这个 url 的 话,也就是我数据库三三零六 log house 三三零六,然后 test test 一 数据库的 employee 的 这样一张表嘛, 后面的话是设置了一个时区,像 server times one 设置了一个时区。还有的话就是防乱码嘛, 然后 user name 还有 password, 也就是你数据库的这样一个用户名跟密码嘛。然后下面的话是连接我们 mac 的 一个驱动嘛, 然后再下面就是 mybudgetsplus 的 这样一个配置嘛,像这里的话是它叉没有叉叉 m l 的 一个位置。 然后的话就是实体类的一个别名包嘛,我就是在 com 加 southwind 加 entity 的 这个底下放的是实体类嘛? com 加 southwind entity 底下放了一个实体类嘛, 然后 confluence 也就是定义了一个我们的这样一个驼峰式的命名嘛。什么是驼驼峰式的命名?就是就是命名的话可以是比如说我们 time zone, time, 然后 time zone 这样的话是下划线式的一个命名,然后我们 我们在 z 这里的话给一个大写,就是它是由两个单词组成的嘛,一个 time, 一个 so, 所以 这样子的话就是驼峰式命名。比如说再来一个 time, 再来一个 so, 就是 它是由多个单词去组成的,然后每个单词的首字母大写,然后这整个单词的首字母不用大写,这个的话就是驼峰式命名嘛。 下面的话,这个的话就是我们的一个日制嘛。好,我们在还有最后一个就是 power 依赖嘛,我们这个功能都需要哪些依赖?就是首先就是 spring boot web 的 这样一个依赖, 然后就是 mybedsplus 的 一个依赖,然后就是 my circle 的 一个依赖,这里我使用的是 my circle 八点零的这样一个版本,然后就是 luma 还有我们的测试依赖。 好这个像这个功能的话是很简单的实现了一个文件的这样一个接,从从文件上传 到进行后端进行解析,然后再到我们数据库的这样一个存储,然后再打印在我们的控制台的日期,再返回给前端这样的一个数据,就是返回前端这样一个结果,数据就实现了一个数据交,嗯,交互吧。


当你的面试官让你谈一谈对于 m v c 的 一个理解的时候,如果你一上来就照搬模型,试图控制器这三个词虽然说没错,但是却很难出彩。想拿出亮点呢?我们不妨先用一句话来概括本质,比如说 spring m v c 是 spring 框架对于经典的 m v c 设计模式的一种实现以及拓展, 基于 server-app 去进行构建,并通过前端控制器模式将 web 层开发标准化、自动化,显著地简化了我们基于 h t d p 的 一个请求的处理流程。 在传统的 mvc 中, model, view, controller 各司其职,而在 spring 的 体系中,这一结构将被进一步的细化。业务逻辑通常我们会放在 service 层, 而数据访问则交由我们的 repository 层,也就是我们的仓储层。而 control 呢,则由专注于 web 请求的一个协调以及响应。而这种分层虽然不属于 mvc 的 原始定义,但是在 spring 的 全家桶当中已经成为 一个事实上的一个架构约定。而 spring mvc 的 核心机制是前端控制器模式,它是由 dispatch service 担任总调度的一个角色,他统一接收所有的请求,再根据我们的配置映设规则将所有的请求 分发给对应的旁圈的注解进行一个处理。而控制器完成了之后,通常会返回一个 model and view 对 象,随后由我们的 view resource 去进行试图的解析,最终则渲染成为我们 html 的 一个页面,反 返回给客户端。不过要注意的是什么呢?如今大多数的架构已经转向了一个前后端分离的一个架构, control 呢?不一定返回我们所谓的页面,如果你使用了,比如说 rest control, 或者说我们的 converter, 自动地将返回值转换成为 jason 或者叉 ml 的 一个格 是直接响应给前端。可以说 three m v c 是 对于原生 sublet a p i 的 一个高级封装。开发者不需要手动地编辑多个 sublet, 维护繁琐的 u r l 的 映设参数,我们去进行提取, 而是借助了 dispatch serverlight 统一进行调度,它实现了请求分发、数据绑定验证、异常处理与试图渲染等流程的标准化。总结来看,如果回答这个问题的时候,我们如果机械地去重复性的描述 mvc 三个字幕,其实没有任何的意义。 你要讲清楚 springmvc 是 如何基于 serverlight 容器进行工作的,如何通过 dispatch serverlight 实现了解偶以及 拓展如何适应我们的一个现代的前后端分离的开发需求。那么理解了这几点之后,面试官就能看到你不仅懂概念,更明白他的一个设计意图以及实现的机制。


好,给大家展示一下这个功能吧,就是一个员工数据解析上传的这样一个功能, 就是我们首先就是先看一下我们这个扩展名为 txt 的 一个,也就是一个记事本, 然后我们可以看到就是有名字,然后性别、电话号这些的。好,然后我们给大家展示一下效果,就是数据库的话,现在是 就是只有结构,但是是没有数据的,然后我选择一下这个文件,这个文件就是 test 一。 好,然后我点击开始解析。好,已经是解析成功了,然后我们再来刷新一下数据库。 好,可以看到我已经把我这个记事本里边的数据已经成功的导入到我们数据库了,然后我们再看一下后端,后端也是已经以日制的形式去输出了。 好,那么这个功能的话,就是像在我们的这个实际开发中吧,有这些场景是可以用到的嘛,像前后端数据交互, 然后文件上传与处理,然后数据解析校验这些的,然后数据库的批量操作,就是我这里的模拟数据,也就是我们的测试数据只有十条左右,但是就是我们可以根据就是你实际开发里面的业务, 就你可以放一万条,可以放两万条,甚至十万条,都是可以去上传到我们这个 mac 数据库的。 好,这个主要的功能的话,它就是去接收用户上传的这个扩展,名为 txt 或者是 csv 的 这样一个格式文件。对,我们可以看到这边是可以选择文件的嘛。 好,然后就是解析它里边的这样一个信息,然后去保存到我们 my sql 数据库中嘛,然后最后返回一个解析结果, 然后这个系统的话,系统的话我们可以看一下,它是一个就是分层架构设计嘛,像我们的 html 的 前端,然后还有我们的控制器、服务层、数据库,访问层这些组建嘛, 然后就是实现了一个完整的文件上传,然后解析存储这样的一个流程嘛, 然后大家根据自己的这样一个业务需求是可以更改数据的。就我这里的话用的数据是模拟了一个员工的数据吗?然后你们像比如说学校啊之类的这些学生信息的这些数据都是可以进行一个变更的吗? 好,然后我们的基础站简单做一个讲解,就是后端的话采用的是 spring boot 二,然后我们的这个 oim 框架用的是 mybites plus, 然后前端的话用的是 themilife 这个技术, 然后网页组成就是 html 五,然后 css 三,还有我们的这个 js, 然后数据库的话就是 my circle, 然后我这里用的是 my circle 八点零的一个环境,然后工具类的话就是 loanbook, 还有 s, f, s, l, f, four, four g。 然后项目的结构的话我刚才也给大家看了,对,就这里我也给大家已经打出是标出来了,然后数据库的话字段名也就是跟我们这里是对应的。 好,就是 id 的 话是没有展示出来,因为 id 是 一个自增嘛,主键自增,然后像内幕,内幕就是王伟嘛,我把这个往上一点,大家可以看到。 好,这样一看是不是就已经对比出来了?好,这个的话就是,嗯,我对项目做了一个简单的讲,就是简单的演示。