- 博客(44)
- 收藏
- 关注
翻译 超详细!利用SpringBoot+SpringCloud做一个问答项目(十六)
一、发表答案--持久层运行代码生成器项目,输入表名answer,并将生成的各文件复制到对应的项目中,并修改代码中的错误,由于接下来还会开发“评论”相关功能,再次运行代码生成器项目,输入表名comment,重复制刚才的步骤,将各代码文件复制到正确的位置。发表答案时持久层需要执行操作是“插入答案数据”,该功能在Mybatis Plus框架中已经实现了,无须开发!在执行发表答案之前,还应该检查对应的“问题”是否存在,如果“问题”不存在,是不允许发表的!这项检查可以通过此前已经完成的Questio...
2021-01-06 15:55:18
400
翻译 超详细!利用SpringBoot+SpringCloud做一个问答项目(十五)
目录一、服务器端向客户端响应“问题”的标签列表数据【续】二、显示“我的问答”分页链接三、显示问题详情--显示页面四、显示问题详情--持久层五、显示问题详情--业务层六、显示问题详情--控制器层七、显示问题详情--前端页面一、服务器端向客户端响应“问题”的标签列表数据【续】当已经把各标签数据存入到Redis中,则在需要获取标签数据时,直接从Redis中获取即可!目前,服务器端响应到客户端的数据中交不包含“标签列表”,只有各“问题”对应的“标签的id的列表”:所以
2021-01-06 15:54:53
284
翻译 超详细!利用SpringBoot+SpringCloud做一个问答项目(十四)
一、服务器端向客户端响应“问题”的标签列表数据目前,每个“问题”数据都包含tagIds数据,值例如"1, 2"、"8, 10, 15",在客户端显示数据时,需要显示出对应的标签名称,例如需要得到"Java基础"、"JavaOOP"等字样,则服务器端向客户端响应“问题”数据时,应该包含该“问题”的标签数据!由于标签数据的数量较小,并且这些数据被修改的频率非常低,查询频率偏高,可以将所有的标签数据都存放在Redis中,便于提高查询效率!要使用Redis查询标签数据,首先,需要将每一个标签都存入到Re
2021-01-06 15:53:58
267
翻译 超详细!利用SpringBoot+SpringCloud做一个问答项目(十三)
目录一、热点问题列表---持久层二、热点问题列表---业务层三、热点问题列表---控制器层四、热点问题列表---前端页面1.在主页通过模拟数据显示“热点问题列表”2.使用真实数据显示“热点问题列表”3. 在其它页面复用“热点问题列表”五、显示“我的问答”列表--持久层六、关于PageHelper框架七、显示“我的问答”列表--业务层八、显示“我的问答”列表--控制器层附:关于GET与POST一、热点问题列表---持久层查询热点问题列表时,需要执行的SQ
2021-01-06 15:53:22
633
翻译 超详细!利用SpringBoot+SpringCloud做一个问答项目(十二)
一、文件上传1.使用Ajax实现文件上传首先,需要在页面中引入jQuery框架,先准备一个jQuery的.js文件,放到静态资源目录下,然后,在HTML文件中引用:为了避免点击按钮时提交同步请求,先将按钮的类型改为button,然后绑定单击事件:此时,启动项目,点击按钮时,即可弹出警告!测试无误后,在以上函数中实现异步提交:2.处理多文件上传在处理多文件上传时,首先,必须明确这多个文件的数量、定位是否明确!假设需要实现的功能是“上传身份证照片的正反面照片”,.
2021-01-06 15:48:27
191
翻译 超详细!利用SpringBoot+SpringCloud做一个问答项目(十一)
一、发布问题---控制器层当前用户登录是在straw-gateway的服务器上处理的,当登录成功后,表示该用户的信息的Session数据将保存在straw-gateway的服务器的内存,而其它服务器(例如straw-api-question)需要读取Session中的数据以识别用户的身份,及读取相关信息,但是,其它服务器不可能访问straw-gateway服务器的内存!为了实现共享Session,可以在登录成功时,将用户的Session数据保存到Redis服务器中,而不再是保存在内存中,当其它服务器需要
2021-01-06 15:47:03
367
翻译 超详细!利用SpringBoot+SpringCloud做一个问答项目(十)
一、标签列表---前段页面【续】目前,启动所有项目,通过 http://localhost/api-question/v1/tags 可以获取标签列表数据,通过 http://localhost 可以打开主页,且,在主页的偏顶部位置会显示模拟数据的“标签列表”,接下来,应该通过Vue向服务器端发送请求,获取真实的标签列表数据,然后将数据绑定到Vue属性中,使得网页中显示这些数据 :let tagsApp = new Vue({ el: '#tagsApp', data: {
2021-01-06 15:41:22
357
翻译 超详细!利用SpringBoot+SpringCloud做一个问答项目(九)
目录一、Redis的基本使用二、SpringBoot中的计划任务三、定期向Redis中更新标签列表四、从Redis中获取标签列表五、通过网关转发访问以上控制器六、标签列表---前端页面一、Redis的基本使用在Windows系统中,当安装了Redis后,会自动启动Redis的服务,每次开机时Redis就会启动,是可以直接使用的,检验的标准可以通过“登录Redis客户端的控制台”来判断:如果已经登录了,但并不确定当前Redis是否正在运行,也可以通过ping命令来.
2021-01-06 15:37:20
240
翻译 超详细!利用SpringBoot+SpringCloud做一个问答项目(八)
目录一、使用网关验证登录并授权【续】7.使用Spring Security实现登录二、完善注册功能三、使用自定义的登录页面四、标签列表---持久层五、标签列表---业务层六、关于Redis附:关于Slf4j附(二):相关软件一、使用网关验证登录并授权【续】7.使用Spring Security实现登录在使用Spring Security实现登录验证时,如果需要使用 UserDetailsService ,必须自定义一个 WebSecurityConfigure
2021-01-06 15:31:20
293
翻译 超详细!利用SpringBoot+SpringCloud做一个问答项目(七)
目录一、使用网关验证登录并授权1.思路2.网关配置3.查询某用户的信息4.根据用户名查询用户的权限信息5.在业务层实现查询用户详情及权限列表6.通过用户名获取用户基本信息和权限列表一、使用网关验证登录并授权1.思路网关是服务器的集群中的第一入口,也是唯一入口,应该在这个入口就直接检查用户的登录信息,如果登录成功,授权也应该直接完成,而不是在集群中其它的服务器中进行登录验证和授权,因为如果用户登录信息有误,一开始都不允许执行到集群之内,而是在网关就直接回绝用户的请求!所
2021-01-06 15:29:12
313
翻译 超详细!利用SpringBoot+SpringCloud做一个问答项目(六)
目录一、处理密码加密二、关于Spring Security框架验证登录三、使用Spring Security框架验证授权访问四、使用UserDetails验证用户信息一、处理密码加密使用Spring Security框架可以实现Bcrypt算法加密,是非常安全的对密码进行加密处理的算法!关于Spring Security框架的依赖参考代码是:<!-- https://mvnrepository.com/artifact/org.springframework.boot
2021-01-06 15:20:13
343
翻译 超详细!利用SpringBoot+SpringCloud做一个问答项目(五)
目录一、关于Eureka注册中心1.相关术语2.Eureka Server集群3.Eureka Server的自我保护机制二、Zuul网关三、处理注册页面附一:关于$.ajax()函数附二:关于密码加密一、关于Eureka注册中心1.相关术语Eureka Server:Eureka服务器项目,也称之为“注册中心”; Eureka Client:Eureka客户端项目,在分布式集群中,只要是会在Eureka Server中注册的,都是Eureka Client,在
2021-01-06 15:08:19
244
翻译 超详细!利用SpringBoot+SpringCloud做一个问答项目(四)
目录基于SpringMVC框架统一处理异常【续】补:不允许注册相同的手机号码一、调整R类以增加代码的可读性二、通过Spring Validation检查数据的有效性三、搭建Eureka注册中心四、Eureka客户端注册附:常用的正则表达式1. 用户名正则2. 密码强度正则3. 整数正则4. 数字正则5. Email正则6. 手机号码正则7. 身份证号正则8. URL正则9. IPv4地址正则10. 十六进制颜色正则12. QQ号码正则
2021-01-06 14:58:51
2053
翻译 超详细!利用SpringBoot+SpringCloud做一个问答项目(一)
前言本次的项目名为稻草问答,关于项目的最终结构:一、创建主项目新建项目,选择SpringBoot的创建向导。二、创建子模块项目因为当前项目将采取分布式项目的开发模式,会将1个项目拆分为若干个微服务项目,但是,它们终究是会结合在一起运行的,所需要使用的技术体系甚至所需要使用的依赖的版本都应该是相同的,所以,需要使用一个父项目来管理各子模块项目(微服务项目)所使用的依赖及版本!所以,在刚才创建出来的straw项目中,所有与运行相关的文件及文件夹都可以删除,直接..
2021-01-06 14:50:46
835
1
翻译 超详细!利用SpringBoot+SpringCloud做一个问答项目(三)
一、关于业务【续】关于业务层设计的方法:在普通用户的眼里,每个业务就是1个“功能”,例如注册、登录、修改密码等,但是,在程序中进行数据处理时,可能是由多项数据操作来组成的,例如注册就至少由“根据用户名查询用户数据”和“插入用户数据”组成; 业务方法的返回值:仅以操作成功为前提来设计返回值类型,如果操作失败,抛出异常即可; 业务方法的名称:自定义,推荐根据所设计的业务功能作为参考,例如“注册”时使用reg作为关键字来设计名称,“登录”时使用login作为关键字来设计名称; 业务方法的参数列表:
2021-01-06 14:50:10
415
翻译 超详细!利用SpringBoot+SpringCloud做一个问答项目(二)
一、测试数据库连接在straw-api-user的test下,默认就已经存在StrawApiUserApplicationTests测试类,并且测试类中已经存在contextLoads()测试方法,先直接执行该方法的单元测试:由于以上测试中没有任何代码,所以,执行单元测试是应该能通过测试的,如果没有通过测试,一定是开发环境出了问题,例如jar包文件是损坏的,正常的执行效果例如:当以上测试通过后,自定义方法,执行“连接数据库”的测试:如果在application.propertie
2021-01-06 14:44:51
325
转载 validation注解及自定义注解
Bean Validation 中内置的 constraint:@Null被注释的元素必须为 null @NotNull被注释的元素必须不为 null @AssertTrue被注释的元素必须为 true @AssertFalse被注释的元素必须为 false @Min(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值 @Max(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值 @DecimalMin(value)被注释的元素必须是一个数字...
2020-09-24 20:28:42
935
1
原创 关于SringBoot中上传图片
目录一、关于summernote富文本编辑器二、基于SpringMVC的文件上传1.创建项目2.文件上传测试3.设置上传文件大小的限制4.关于上传文件的文件名5.关于MultipartFile的API6.关于保存上传文件的文件夹一、关于summernote富文本编辑器在HTML的原生标签中,适用于输入文本的只有<input type="text" />和<textarea>这2种控件,这些控件都只能输入普通的文本,不支持复杂的排版,更加不可以显
2020-09-20 19:29:15
279
原创 关于Mybatis内置的缓存机制
Mybatis框架是内置缓存机制的,区分为一级缓存和二级缓存。所有的缓存机制都是为了提高查询/获取数据的效率而存在的。 1.一级缓存Mybatis的一级缓存也称之为SqlSession会话缓存,该缓存是Mybatis自动管理的,不需要开发人员自行维护或管理。2.二级缓存Mybatis的二级缓存是基于namespace的,所以也称之为namespace缓存,它针对是对应某个接口的XML文件(因为每个配置SQL语句的XML文件的根节点都需要配置namespace属性),如果需要开启na..
2020-09-17 21:33:07
438
原创 浅谈SpringMVC的核心执行流程
目录一、关于SpringMVC二、SpringMVC核心执行流程1.DispatcherServlet2.HandlerMapping3.Controller4.ModelAndView5.ViewResolver6.Response一、关于SpringMVCSpringMVC 主要作用:主要解决的接收请求、给予响应的问题;其根本在于解决在中大型项目中随着项目越大随之创建的 Servlet 越多带来的一系列问题,如:不便于管理、消耗内存、配置映射文件繁琐...
2020-09-16 20:57:30
391
原创 在IntelliJ IDEA中打包SpringBoot项目
一、确保pom.xml配置的父级没有<relativepath />节点在需要打包的项目的 pom.xml 中,检查 <parent> 节点下有没有<relativepath /> 节点,如果存在, 则删除并更新Maven,如果不存在,则跳过此步骤:二、执行打包在侧边栏的Maven面板中,展开需要打包的项目,在 LiftCycle 中执行 package :打包成功后,在控制台输出的结果例如:如果出现:在对应的父级pom...
2020-09-16 17:18:07
1466
原创 关于对单例模式的分析(下篇)
单例模式--懒汉式饿汉式的单例模式的特点是:当类被加载时就直接创建了单例的对象,即使接下来很长的时间里都没有调用过getInstance()方法(也可以是别的名字,指的就是获取对象的方法),这个单例的对象也是存在的,可能形成一些资源浪费。懒汉式的单例模式的特点是:不到逼不得已,不会创建对象!也就是说,当类被加载时,单例的对象是没有被创建出来的,仅当第1次获取对象时,才会创建对象!public class UserService { private static UserSer
2020-09-08 08:38:06
120
原创 关于对单例模式的分析(上篇)
单例模式--饿汉式单例模式是设计模式中的一种,百科资料显示有23种设计模式,每种设计模式都是为了解决特定的某个问题而设计的一套相对固定的编码流程!设计模式也区分为多种不同的类型,例如生产对象型、桥接型、代理型等,单例模式属于生产对象型的设计模式。单例(单一实例,实例=对象)模式的目标:在同一时间,某个类的对象最多只可能存在1个,不会存在2个或更多个对象!假设存在UserService类:public class UserService {}则可以随意创建若干个对象:UserSer
2020-09-05 20:55:10
156
原创 实现一个简易版的Tomcat(十七)
前言此版本将会完善项目的一些细节,如:表单提交请求为post等...一、支持post请求提交form表单页面上要提交用户输入内容我们使用了form表单,而form表单的提交方式是通过method属性设置的,默认值为GET。还有一种提交方式为POST请求,使用这种方式提交表单时,数据会被包含在请求的消息正文中。因此服务端如果想获取POST形式提交的数据,需要在HttpRequest中实现解析消息正文的工作。通常页面上用户提交的数据包含敏感信息,比如密码。或者表单中包含附件信息时就要使用PO
2020-09-04 22:50:10
336
3
原创 实现一个简易版的Tomcat(十六)
前言完成二维码生成功能过程:用户访问生成二维码的页面,并输入要在二维码上显示的内容,并点击生成按钮提交数据。服务端将该请求交给生成二维码的Servlet来处理,在其中我们获取到用户输入的信息并生成二维码数据,然后通过设置响应回复给浏览器显示该二维码图片。实现:1:在webapps/myweb目录下新建一个页面:createQR.html并在index.html页面中添加超链接访问这个页面,再新建两个成功和失败的页面(过于简单,不再展示代码)2:createQR.html上定义一个表单,
2020-09-04 21:29:24
147
原创 实现一个简易版的Tomcat(十五)
前言使用thymeleaf,生成动态页面。关于动态页面和静态页面:动态资源(数据):通过程序生成的数据,比如:验证码。 静态资源(数据):事先准备好的,不会变的。比如图片,html页面等。本版本需求:在一个页面上显示所有注册用户的信息。该页面上展示的用户数据来源于user.dat。该文件随着用户做注册修改等操作在随时变化,因此展示注册用户的页面不可能是事先准备好的不变的内容。因此该页面上的用户数据是程序每次根据请求该页面时生成并体现到页面中。thymeleaf是一个用于生成动态页面...
2020-09-04 21:11:39
183
原创 实现一个简易版的Tomcat(十四)
前言此版本实现登录业务(流程与注册相像)登录的流程:1:用户访问登录页面(可以在首页上点击超链接进入登录页面)2:在登录页面输入用户名和密码并点击登录按钮提交表单3:表单提交路径action="loginUser"<!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8"> <title>登录</title>
2020-09-04 19:02:58
151
原创 实现一个简易版的Tomcat(十三)
前言本版本开始,完成业务的处理,这里先以注册用户为例开始实现。需要了解的知识点:1:浏览器如何将用户在页面上输入的信息提交给服务端了解页面的"表单"元素。2:服务端如何通过浏览器发送过来的请求解析到用户提交的数据本版本先将上述两个工作完成,因为这个步骤时通用的,无论用户将来完成什么业务,只要提交数据,解析工作是一样的。这一步完成后,再在下个版本中实现具体的处理注册用户的业务步骤。实现:1:在webapps/myweb/下新建一个页面:reg.html 注册页面在这里我们学习...
2020-09-04 18:53:11
208
原创 实现一个简易版的Tomcat(十二)
前言上个版本中我们设计了一个类HttpContext,并在其中定义了一个静态属性mimeMapping,这里面在初始化时存放了6组键值对,保存了6中不同资源后缀与对应的Content-Type的值。但是实际上资源后缀有1000多种,我们需要将它们全部支持,才可保证任何资源都可以给客户端正确响应。本版本将解决如何解析XML文件。实现:TOMCAT的安装目录下有一个config目录,在该目录下有一个web.xml文件,这个文件中记录了所有的资源类型。我们直接使用这个文件将内容解析出来初始化mimeM
2020-09-04 16:09:59
159
原创 实现一个简易版的Tomcat(十一)
前言上一个版本中为了让服务端支持根据浏览器请求的资源的实际类型发送响应头Content-Type可以有对应正确的值,我们在Clienthandler中添加了一个Map。随之而来的问题:由于每次请求都会创建一个ClientHandler,那么这个Map也会随之每次创建,但是其内容则是固定不变的,因此没有必要每次都创建,所有要将其定义为静态的,全局一份即可。实现:1.创建HttpContext:在com.webserver.http包中新建一个类:HttpContext使这个类保存所有和HTT
2020-09-04 15:12:16
143
原创 实现一个简易版的Tomcat(十)
前言本版本要对响应中发送响应头的工作做两个重构:首要解决的问题是,不能让HttpResponse发送响应头的工作中只固定发送两个头,因为随着后期的扩展,服务端可以发送更多响应头,因此响应头内容应当是可扩展的。 发送响应头Content-Type时的值应当随着客户端请求的资源类型不同而产生变化,让浏览器理解其请求的资源。问题一的解决:要想让response发送响应头的内容可以扩展,我们可以在响应对象HttpResponse中定义一个响应头相关信息的属性:private Map<Strin
2020-09-02 18:30:49
129
原创 实现一个简易版的Tomcat(九)
前言在页面上显示一张图片,从中了解页面中含有其他资源时,浏览器与服务端的交互过程。实现:1:在webapps/myweb目录下保存一张图片,名字任意。2:在webapps/myweb目录下的index.html页面上添加图片的展示。3:通过浏览器访问服务端该页面查看图片的显示。通过测试发现,当一个页面上含有其他资源时,浏览器要通过多次请求将这些资源全部下载后才能完整显示页面,而由于我们的服务端目前只接收一次请求,所以导致页面不能正确被下载以便展示。解决办法:由于服务端已
2020-09-01 23:02:14
160
原创 实现一个简易版的Tomcat(八)
前言上个版本我们处理了响应404页面,此版本我们将对代码进行重构。重构思想:与请求一样,既然响应也是由三部分构成,我们可以设计一个类, 取名:HttpResponse,并用这个类的每一个实例表示客户端发送的 相应内容。将来可以根据实际响应内容不同,对响应的对象中各部分 信息进行设置,最终发送给客户端。实现:1.新建类HttpResponse2.定义结构定义HttpResponse的结构,以及方法flushflush方法用于将当前响应对象的各部分信息最终以标准的Http响应格式
2020-09-01 22:34:14
187
原创 实现一个简易版的Tomcat(七)
前言上个版本我们处理了客户端请求的页面路径的问题,此版本我们将完成响应404页面的工作。实现:1.在webapps目录下新建一个子目录root,并在这个目录下新建404页面,起名:404.html注意:root目录用于保存所有网络应用中公用的内容,比如404页面...无论用户访问哪个网络应用中的资源都可能存在该资源不存在的情况,我们都应当响应404页面,因此这个页面就是共用页面了,没有必要在每个网络应用目录下都新建这个404页面。页面如下(能表达意思即可^_^)<!DOC
2020-09-01 22:20:51
110
原创 实现一个简易版的Tomcat(六)
前言此版本完成根据客户端请求的页面进行响应本版本的几个思考点: 浏览器想请求服务端webapps目录下某个网络应用中的页面,地址栏中"???"部分应该写什么:http://localhost:8088/??? 上面地址栏中输入的路径中"???"部分内容在request对象中哪个属性上保存? 能否根据request中得到这部分的路径,并在创建File时根据它定位到这个文件并进行响应。 解决思考点1:”http://localhost:...
2020-09-01 22:09:36
141
原创 对Java异常处理机制的基本理解
前言异常机制是指当程序出现错误后,程序如何处理。具体来说,异常机制提供了程序退出的安全通道。当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器(下一篇继续WebServer)。所有异常,都继承自java.lang.Throwable类。Throwable有两个直接子类,Error类和Exception类。一、Error和Exception?1.Error(错误)Error(错误):是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作
2020-08-31 17:29:24
295
原创 实现一个简易版的Tomcat(五)
前言此版本测试给客户端响应一个页面回去在这个版本中我们要了解两个知识点:1:HTML页面的基本语法。2:HTTP响应的格式定义。因为只有基于该格式要求才能给客户端发送响应。实现:一、创建页面 在项目目录下新建一个目录webapps. 这个目录用于保存服务端所有的网络应用(webapp),每个网络应用在webapps下单独以一个目录形式保存。目录命名就作为网络应用的名字。 注意:每个网络应用相当于一个"网站",会包含如:页面、素材、以及用于 处理业务的逻辑代码。 在we
2020-08-28 19:05:02
169
原创 实现一个简易版的Tomcat(四)
前言上一个版本中已经测试完成了读取客户端发送过来一行字符串的操作,因此,本版本开始完成解析请求。由于一个请求包含信息比较多,因此我们设计一个类:HttpRequest并用该类的每一个实例表示客户端发送过来的一个Http请求内容。实现:一、com.webserver.http新建一个包com.webserver.http注意:将来有关http协议的类都放在这个包里二、HttpRequest在http包中新建一个类:HttpRequest 即:请求对象 这...
2020-08-28 18:47:55
332
原创 实现一个简易版的Tomcat(三)
前言此版本开始完成解析请求的工作上一个版本中我们在WebServer里测试与浏览器的连接,并且读取了浏览器发送过来的请求内容。一个请求由三部分构成,其中请求行和消息头都是由一行字符串构成的,特点都是以回车符换行符结尾。因此在正式开始解析钱先测试读取一行字符串的操作。实现:一、创建类ClientHandler在com.webserver.core包下创建类:ClientHandler这个是线程任务,用于处理一个客户端的交互 其中start方法中的代码需要改为如下: ...
2020-08-25 22:38:01
219
原创 实现一个简易版的Tomcat(二)
前言本文开始将借助IDEA开发工具详细阐述Tomcat的底层实现原理一、创建Maven项目关于Maven项目的创建在之前的文章中有详细介绍,这里就不再过多赘述二、创建WebServer主类我们可以通过创建的WebServer主类测试与浏览器的连接,并且读取后续浏览器发送过来的请求在WebServer主类中我们需要一个无参构造,一个start方法,一个main方法代码如下:public class WebServer { private ServerSocke...
2020-08-25 22:25:05
217
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人