前后端是怎么交互的呢?(Jvav版)

一.什么是前端

在网上,我也去找了一些观点,其实都是应用层面的,什么使用一个地址,回车以后就能拿到 .html文件等等

说的也没问题,前端简单点说呢,就是负责展示和美化的页面,大部分在网上我们所看到的就是页面,它是显示,我们每个人都是可视的

 比如上面的淘宝网页面,它都是前端展示出来的,

我们可以清清楚楚的看到有些什么东西,有些什么颜色

它的描述语言就有:

HTML,CSS,JavaScript,Objectvie C,Vue,等等

二.什么是后端

后端的就是负责逻辑处理的,

我们可以从上面的淘宝网图片推出有很多后端的东西

比如图片,文字等等,内容都是后端交给前端来展示的,前端更多的都是展示的框架,那些内容如何展示,就是前端的

而后端是逻辑处理,比如前端传来用户请求,需要计算一些等式,后端就计算,然后传回给前端反馈用户,没有人会使用HTML去计算 1 + 1 =?多少吧

后端还要负责页面的调度,我们在使用淘宝网的时候,你有经常使用地址栏去挑选商品吗?都是页面自己在换来换去的,这些都是后端在调度,你每一次点击,都是后端在做反馈

后端还会负责数据库端的连接,因为数据库中存储着大量的数据,文字,图片,视频等等,需要后端去连接以后给加载出来

后端常用的描述语言:

Java,JavaScript,PHP,C#等等

三.前后端的关系

 如上图,我们前后端的关系就是如上所示

前端的网站,APP,小程序等等展示的内容的应用,我们就举例网站的展示,客户需要计算一个 1+ 1这个等式的值是多少,那么它在当前页面填写了以后,点击提交按钮

这时表单就会以请求的方式,去请求 action 属性后面的地址,这个地址很重要,是后端处理的驱动程序,也叫接口API,一定不能写错,通过这个接口API,处理器会在它的注册文件里去找对应的地址,匹配上了以后就调用这个API的Java处理逻辑

我们 1+ 1等式就会以参数的形式去到这个接口API,经过Java的处理逻辑,然后又它的处理逻辑打包参数返回给前端,此时前端可以通过EL表达式等等,来取到这些参数

这些操作就是前端和后端的一次关联

代码实现操作(部分逻辑展示):

我们先些一个页面:

做了一个简单的表单,计算两数字的加法计算,一旦点击开始计算按钮,就会把数据提交给后端

当然是通过地址映射去找后端的,我们使用的是表单,所以action属性后面就是映射的地址,

我们来看看表单的地址写的是什么:

<div id="di1">
    <form action="${pageContext.request.contextPath}/Index/addNumber" method="post">
        <input type="text" name="num1" placeholder="请输入数字">
        <br>
        <br>
        +
        <br>
        <br>
        <input type="text" name="num2" placeholder="请输入数字">
        <br>
        <br>
        <input type="submit" value="开始计算">
        <br>
        <span id="sp1">${answer}</span>
    </form>
</div>

 

 action="${pageContext.request.contextPath}/Index/addNumber"

可以看到action属性后面紧跟的一串字符串,他就是我们要去xml文件匹配的地址,也可以叫接口API,如果你不是Java程序员,可以不用关注${pageContext.request.contextPath},它的意思就是当前项目的绝对路径的意思,

后面的   /Index/addNumber  才是重点,不管你是那个语言的编程人员都应该知道这串字符串的意思,就是请求地址,这串字符串才是要去后端配置的xml文件中匹配的,

现在我们就假设提交的是 1+ 1,然后点击开始计算,那么紧跟着,它便要去后端找到xml文件,看API接口映射到那个Java.class文件的,交由Java.class文件处理

 如上图:

xml文件中,有一项和我们的请求API是一摸一样的,那就是 url-pattern 项,它就是地址映射,通过这一项就可以确定处理的class文件在哪里

有个东西出现了两次,细心的小伙伴一定看到了,那就是  servlet-name 这对标记是成对出现的,一个表示Java的class文件路径,一个表示接口API

所以通过servlet - name  就可以找到 servlet - class 这一项,我们可以看到它的位置是 top.lostyou.service.addNumber

top.lostyou是我们的项目名称

service是我的项目包名,表示是服务层,用来专门处理请求的

addNumber就是我们的Java代码,也就是要找的class文件

上面描述的操作就是前后端的连接最重要的一环 - - - - - - 地址映射,做完这一步就好办了

找到了对应的class文件,就可以开始处理请求了,还记得我们的请求吗,传进来两个参数 1 和 1,对它们进行加法计算

 这就是我们的Java处理逻辑,request  来获取前端带过来的参数 ,num1  和  num2 然后一段简单加法计算代码,相信程序猿都应该看的懂,

然后看到一句话:req.getSession().setAttribute("answer","答案是:"+sum); 

这就是参数封装,我们把一段字符串封装到一个  新建对象 answer中,把计算的结果封装在里面

在通过  resp.sendRedirect("/test.jsp");   这句代码实现的是重定向到那个页面,肯定是重定向到原页面展示数据啊

上面的描述就是一次前端和后端连接和响应,来看看最后的成品效果吧:

 

 前端传参给后端的方式:

前端传参给后端的方式一般有两种,post和get

两种传参的区别在于:post是不把参数显示在地址栏,而get传参是吧参数显示在地址栏

先看看post方式的地址栏:

http://localhost:8080/test.jsp

 

就是一个很简单的路径,其它的什么都看不出来,可以得知,其实他是十分安全的,对于使用者而言,不知道地址栏做了些什么,也不需要它们知道

然后就是get方式的地址啦:

http://localhost:8080/test.jsp?num1=1&num2=1#

 

get方式相对来说就不是很安全了,因为它的参数我们一眼就看完了,有哪些,是多少,都很清楚的可以看到

最后补充一下 a 标签的跳转,它的跳转方式是也是get,它在地址栏的信息就是我们a标签自己填的那些信息

a标签的填写:

<a href="/test.jsp?num1=1&num2=2">a标签</a>

 

a标签在地址栏的显示:

http://localhost:8080/test.jsp?num1=1&num2=2

 

以地址栏的展示来看,其实前端提交数据给后端无非两种,一种是显示传输参数,一种隐式传输参数,

再者有肯能会用到的ResultFul风格传参,它注重的是参数,而不是展示,它的传参风格很独特,后面我可以去深入讲一下

静态页面:

相信大家初学计算机就应该知道静态页面和动态页面,它们二者的区别就是有没有交互性,

像常考的题就是有视频,动画,语音等等动态效果的页面是不是动态页面啊,肯定不是

今天的学习,我们就应该知道什么是动态页面了,那就是有没有后端反馈的页面,

静态页面它就是一个普通的前端,没有后端给它实时处理反馈,而动态页面就是标准的前后端一起,有反馈的页面

四.疑问

上述的例子,计算1+1=?,难道前端自己不可做吗?或者说,所有的逻辑计算,前端都不能做吗?

其实大部分后端做的事情,前端都可以做,并且实现起来也很简单,

就比如那个 1+1=?的例子,我们使用前端来实现一遍:

这里我使用的是js实现

<script>
    function fun1() {
        let n1 = $('#num1').val();
        let n2 = $('#num2').val();
        let sum =0;
        sum = parseInt(n1)+parseInt(n2);
        $('#sp1').text(sum);
    }
</script>

 

相信大家一定不陌生js的代码,它也是前端三要素的一种,即网页的行为,还有HTML,即网页的骨架,CSS即网页的美化

使用js来处理的逻辑是:

用jQuery指向id选择器,然后拿到文本框的内容,也就是1和1

然后简单的计算,

再通过选择器选择到要展示答案的一行,通过text关键字写入节点,依旧可以算出答案

 结果如上图:

答案也没有问题,回到我们的疑问,既然后端可以做的事情,为什么还要分前后端呢?不能写到一起吗?

这就要涉及到互联网发展伴随着的服务开发

Java的开发发展中有几个代表性的时代:model one ,model two ,微服务时代

model one时代:

在model one时代,我们页面和处理逻辑是写在一起的,不管是什么语言描述,都是一个功能的所有代码都写在一起,无什么前后端之分

这样的开发方式高效,并且难度低,实用性高,自己写的功能知道要写那些页面,怎么处理页面上的需求,以及数据怎么展示,

并且那个时代,互联网的美化刚需不高,无非就是对数据进行增删改查,对代码逻辑都不需要过高的要求

就比如Java的jsp,它就是html和Java代码一起写的,

我们可以来简单看看是怎么写的:

 如上图:

前面就是简单的HTML语言

注意点在 <%  %>之间,那里面写的是Java代码,这就是我们说的model  one时代,前端后端是写在一起的,我还可以在Java代码后面写HTML代码,

也可以把Java代码写在最前面,都是可以的,这种代码风格就是完全嵌套在一起,这只是一个简单加法实现,你要想,要是实现一个应用功能,代码量右如何呢?

后面,随着互联网的发展,网络平台越来越大,框架体系也越来越多,一个单文件下的代码量也越来越多,逻辑复杂,伴随的即使排错十分麻烦

我们的开发人员就开始着手于model two时代了

model two时代:

model  two时代可以说就是我们现在正在经历的时代,也是使用最多的,

它就是大名鼎鼎的前后端分离,典型代表就是MVC框架

 如上图,就是我们前后端分离的框架

其中

view:视图层,依旧负责数据展示,还有递交请求,请求全部递交到controller层,它来负责到底谁来处理这个请求,这个就是前端

controller和model统称为后端

controller:它就不用多描述了吧,就是负责请求转发的

model:也可以叫服务层,专门用来处理前端的请求的,处理完成后交给controller,由他进行参数回显

从上面看,是不是感觉MVC框架已经很合理了,但是现在,当下最流行的又变成了微服务了

微服务:

实现微服务的框架大家应该都知道,Java实现微服务框架包括:Spring Boot 和 vue

微服务的思想指的是把原来的model层继续拆分,

以前是面向请求,一个请求可能跨越多个服务,是一连串的服务

现在微服务是面向服务编程,以一个服务为单位来处理

 如上图:

这是国外的大佬级人物Martin Fowler和James Lewis,他们两个最早系统的讲解了什么是微服务

从图片也可看出来,以前的服务是按部分扎堆存在的,而现在微服务阶段,不同的服务都是分开的

详细内容可以参考:

https://martinfowler.com/articles/microservices.html

Martin Fowler和James Lewis的原文地址

总结:

为什么现在不用前后端写在一起的框架了?

  • 逻辑复杂,维护不便
  • 互联网的发展,对不同的请求处理规范变化
  • 前端的工程化,系统化是趋势
  • 模块化的开发,便于后期维护

一句话总结:就是为了适应技术和业务发展的需求

 

posted @ 2023-06-17 20:57  回忆也交给时间  阅读(1141)  评论(0编辑  收藏  举报