张 雷, 王 悦
(广东科贸职业学院, 广东 广州 510630)
随着软件技术的飞速发展,软件产品的功能、需求、技术规模等方面越来越大,庞大的“体魄“使得产品内部模块之间产生了较大的耦合,对于软件的更新与迭代造成了巨大的资源负担,为了降低软件产品的耦合,像 Web Service、RESTful、Web Socket等技术不断做出改进,微服务软件架构在此前提下应运而生。
微服务是一种新兴起的软件设计架构,它通过将庞大的软件产品细分为多个零散的小型应用,很好的解决了高耦合的弊端,细分后的应用工作简便有序,大大降低产品耦合的同时,降低了开发难度,减少了研发经费。
微服务最大的优势在于通过扩展组件的形式来处理功能上的瓶颈问题,从而更好的利用了各类计算资源,使得开发人员不再需要部署一个全方位的应用环境来发布一个新迭代的软件版本,达到资源利用率大幅提高的目的。
由于细分应用,对于软件产品更新也变得更加快速,无论从产品迭代到代码测试都按照细分后的应用规模进行,从而大大降低产品更新周期。
在云计算领域微服务也起到了不可或缺的作用,在事件驱动计算方面,类似于AWS Lambda这样的功能让开发人员能够编写的代码处于休眠状态,当有事件触发时方可执行。
Spring开源框架是现在市场占有率最高的基于JEE框架的研发型软件产品,其推出的SpringMVC框架被广泛的应用于各类Web产品的研发当中。Spring先后发布了多个版本,但各个版本之间最大的不同在于繁琐的配置工作随着版本的更新在逐步的减少,也就是说,Spring框架一直致力于解决繁琐的配置工作问题。
SpringBoot项目是Pivotal团队开发一个全新Spring框架,其开发的目的在于解决Spring开发过程中的复杂配置操作,最终实现零配置为目标,SpringBoot作为Spring项目组的微服务产品,正在大规模的占领软件市场,其简化的应用开发搭建过程,使得开发人员从繁琐的配置文件中解脱出来,大量的精力投入到项目逻辑研发当中,其致力于成为快速应用开发领域的领导者。
独立应用:每一个SpringBoot App都是独立存在的个体应用,可以是一个Jar文件,也可以是一个war文件,只需要基本Java运行环境即可满足部署要求,SpringBoot App内部嵌入了Tomcat,从而无需部署Web容器。
Maven项目:SpringBoot项目实际上是一个Maven项目,在第三方插件的使用上完全可以通过依赖maven或者Gradle来实现,大大简化部署量。
Spring配置自动化:基于Spring4.X,配置工作可以完全通过Java注释的方式来实现,从而实现自动化配置。
生产就绪功能:指标、健康检查、外部配置。
去XML化:可以完全取消配置文件。
SpringBoot实际上是大量开源库的集合,可以非常方便的将插件部署到Eclipse等IDE中从而实现项目的开发,也可以通过spring提供的基于eclipse的开发工具Spring Tool Suite来进行开发,另外Spring也提供了在线创建项目的功能,将该创建的项目无缝对接到相应的IDE中。关于SpringBoot项目创建的更多信息可以关注http://projects.spring.io加以了解。
目录结构说明:
*src/main/java目录:Java原生代码的存放位置。
*src/main/resources目录:是前端视图相关的模板、资源存放的位置,其中templates子目录存放由Thymeleaf产生的视图模板等,static存放各类资源文件
*src/test/java目录:测试目录
图1 SpringBoot项目的目录结构
*JRE System Library:JRE的库目录
*Maven Dependencies:Maven的依赖库目录
*src目录:源码目录
*target目录:项目打包后的目标目录
*pom.xml:Maven的依赖文件
我们在进行各类软件开发过程当中,为了更加高效的进行产品的研发,往往我们需要对过往开发的产品的经验加以总结和提炼,尤其在降低人员成本、提高开发效率、缩短开发周期等方面。
随着互联时代的到来,Web应用开发需求越来越大,为了“流水线化”、“项目化”的开发需求,各个组织、机构或者个人都在研究一种科学有效的高效能设计模式,从而大大提高此类产品的研发效率,MVC就是业内十分推崇的设计模型。
MVC 全称是 Model、View、Controller,即模型、视图、控制器。用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
MVC开始是存在于桌面程序中的,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。比如一批统计数据可以分别用柱状图、饼图来表示。C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新。
随着Web应用开发的繁荣,MVC已经随着各类框架占据了市场的主导位置,各大开源框架源组织均推出自己的MVC框架,其中主要的有,JEE(Jsp+Servlet+Model),SpringMVC,Asp.net MVC,Spring BootMVC,Struts MVC等等。
MVC设计模型的优势是:耦合度低、重用性高、部署快、可维护性高、生命周期成本低、可维护性高、利于工程化管理、市场占有率高等优势。
MVC设计模型的缺点是:无明确定义、不适合小型、中等规模的应用程序、增加系统结构和实现的复杂性、视图与控制器间的过于紧密的连接、视图对模型数据的低效率访问、一般高级的界面工具或构造器不支持模式。
SpringBoot框架下有着完善的MVC设计模型支持,其在SpringMVC4.x基础上进行了简化操作,对于项目的配置工作采用自动化配置的方式,使得在SpringBoot环境下进行MVC模式的开发变得尤为简单。
SpringBoot下的MVC基本由Controller+Thymeleaf+Model组成,Controller控制器起到在View和 Model间衔接作用,Thymeleaf是 View,Model有专门的类与其对应,对于数据的操作则完全通过Model来完成。下面我们详细的介绍MVC各个组成部分。
1.视图层Thymeleaf(百叶窗)
(1)简介
Thymeleaf is a modern server-side Java template engine for both web and standalone environments.这是其网站上的准确定义,从其解释来看,Thymeleaf是一个新式的服务器端的Java模板引擎,其运行的环境可以是Web环境,也可以是脱机环境中。
Thymeleaf主要的目的在于将优雅、自然的模板带入到你的Html工作流程中,使Html正确的显示在浏览器中,同时可以工作在静态的原型中,从而强有力的支持开发团队的协调工作。结合Spring框架下的模块,您可以添加自己的插件到Thymeleaf中,将您喜欢的工具集成起来,Thymeleaf是现在支持Html5较好的Java开发集。当然Thymeleaf还有其他较好的功能。
Eclipse,IntelliJ IDEA,Spring,Play甚至Java EE 8也支持Thymeleaf。
添加了Thymeleaf的Html页面和原有的Html模板没什么太大区别,甚至您可以在原有项目的基础上添加Thymeleaf,也不会太多的改变原有Html模板.我们一起来看下添加了Thymeleaf的Html模板。
代码1说明:
●${...}变量表达式
●*{...}选择变量表达式
●#{...}消息表达式
●@{...}链接url表达式
●Thymeleaf是嵌入到Html的标签当中,引入标识是th:开头。
●<th th:text="#{msgs.headers.name}">Name</th>:是将由后台传递过来的信息头中的name属性值显示在<th>标签中
●<tr th:each="prod:${allProducts}">:是准备将后台对象allProducts的内容进行循环遍历,每次循环遍历的对象为prod。<tr>下面的标签为循环体内容,本例中其下面包括了两个<td>标签
●<td th:text="${prod.name}">Oranges</td>:同样是循环体中的内容,在这个<td>标签中将输出本次循环对象prod的name属性。
图2 SpringBoot的MVC系统架构图
(2)Thymeleaf下载与部署
Thymeleaf是以Jar包的形式由项目中引入的插件库,引入的常用方式有两种:
●第一种:从Thymeleaf网站下载Jar包,然后由Ide导入到项目当中,目前发布的稳定版本是3.0.2发布版。下载地址:http://forum.thymeleaf.org/Thymeleaf-3-0-2-JUST-PUBLISHED-td4029985.html
●第二种:使用Maven或者Gradle,通过设置依赖的方式自动导入项目当中。
我们可以在Maven或者Gradle的poe.xml文件中导入下面代码
代码2:
代码2说明:
●<dependency>:依赖标签
●* <groupId>org.thymeleaf</groupId>:
引入的组织Id
●<artifactId>thymeleaf</artifactId>: 引入的具体产品
●<version>3.0.2.RELEASE</version>: 产品的版本标识
(3)Thymeleaf模板的创建
Thymeleaf模板的创建实际是创建Html文档的过程,需要在文档中标记相应的Thymeleaf标记。
创建步骤:
●创建SpringBoot项目
●在项目目录下找到resources下的
template目录,在其下面创建login.HTML模板
●在login中添加标识<html xmlns:th="http://www.thymeleaf.org">,到此我们可以添加相关的Thymeleaf代码到Html模板中了。
图3 Thymeleaf模板
当在项目的该目录下创建相应的Html模板后,系统在运行前将自动检索模板,并根据模板的名称记录在后台,当有控制器调用Thymeleaf模板时只需以字符串的形式条用模板名字(无需后面的扩展名)即可。具体调用过程,将在控制器中进行分析及演示。
2.控制器 Controller、RestController
当我们设计了前端视图后,需要将前端用户的请求进行处理、响应时,视图需要将请求内容提交给后台服务器,接收该内容的即是MVC中的”C”控制器,Controller是在Model和View之间进行交流的中央枢纽,当View传递信息给Model时,或者Model将处理结果传递给View时,都是通过Controller来中转,调度,处理的。
(1)Controller简介
在SpringBoot框架中,Controller完全由代码注释的形式存在(如果大家习惯了配置文件的方式,需要去了解下Java的注释技术及Spring的注释配置技术,此文不做详解)。
分类:在SpringBoot框架下,主要包括两种Controller,分别如下:
●Controller:基本的控制器,用于接收、传输纯字符串信息,调用业务模型处理信息,也是SpringBoot主要的控制器,它可以完成大部分MVC模型中Controller的工作,接收和返回信息均是以字符串的形式。
●RestController:该控制器是 SpringBoot将WebService技术与常用的数据封装格式整合在一起,通过一定的技术规则,将原来较为复杂的数据封装技术简化为十分方便的几个步骤来实现WebService功能,常用的数据封装格式(例如:Json、Xml)在RestController中均有支持。该控制器常常用在各类移动App的数据业务和大型综合信息系统的数据统一管理平台中使用。随着移动App和大数据时代的来临,以WebService方式的数据提供、管理模式得到了更多的企业和应用的喜悦。
图4 Controller的创建
(2)Controller的创建
从图4可知Controller的创建是通过代码注释的方式,以Java类的形式存在的一个实体类,具体步骤如下:
●创建实体类:在项目下的src/main/java目录下创建相应的项目包,在包下创建控制器的实体类ControllerA
●在ControllerA中声明注释Controller
●创建方法indexs,在其上添加注释
RequestMapping(“/index”),/index代表该控制器的相对Url地址,当要访问该控制器时,通过该地址进行访问。
●方法indexs书写具体功能,可在其中接收前端提交的Request信息,也可以通过Respose对象返回前端信息,同时也可以通过Model对象传递信息给到前端。在以上代码中return“index“语句表示跳转到名称为index的Thymeleaf前端视图模板。
(3)RestController的创建
从图5可知,RestController和一般的Controller的创建步骤基本一样,将注释改为RestController,同时方法的返回结果必须是一个List实例或者一个List实例转换的字符串对象。
图5 RestController的创建
(4)Controller接收View信息
Controller接收View信息的方式与传统的Web应用开发模式相同,可以通过以下几个主要的方式进行View向Controller的信息提交和接收:
View端的提交方式汇总如下:
●View端以表单形式提交信息:表单(Form)是最为常见的用户信息提交方式,广泛应用在各类Web技术体系中,其主要的提交方式有两种Post和Get,其中的区别不在本文中进行介绍,有需要的读者可以参考相关资料。
●View端以超链接形式提交信息:此类方式也较为常见,相对于表单其具有代码简单无需设置视图控件等特点,可以迅速搭建提交信息格式。
●View端采用 Js、JQuery等前端技术通过Http协议进行底层的数据封装后进行信息的提交,该种提交方式在用户体验性较高的Web应用体系中较为常见,其实现的Web应用的用户体验更加的接近于桌面应用程序。前两种方式必须通过页面间的跳转方能实现提交信息,从而牺牲了用户体验性。该种提交方式采用页面局部刷新的方式,使得用户在本页面中就可以实现数据的刷新,从而提高用户体验性。
●源码提交的方式,也即是通过Java、Asp等语言技术体系中调用Http处理协议进行数据的提交,该种技术目前较为少用,在对于底层技术要求较高的大型应用及各类框架技术中,出于保密等目的被普遍使用。
以上内容基本可以包括了较为常见的几种View端的提交方式,对于Session方式并不是View向服务器端提交信息,而是直接在服务器端进行信息的处理,不在此进行讨论。
接下来我们看看Controller中接收View的方式如下:
●Controller端通过Jee框架下的内置对象request来接收数据,其中主要的方法有getParametor,getHeader两个方法。
●源码接收:通过源码的方式接收View端提交的信息,在这里主要方式是通过Http方式进行接收
下面我们可以通过一个实例来展示如何实现View向Controller提交和接收数据的全过程。
3.模型Model
(1)Model的作用
Model是MVC设计模型中的重要组成部分,其主要的工作是解决实际的业务需求,例如:数据的增加、插入、修改、删除;各类业务的逻辑和算数运算;项目外各类网络接口的调用;服务器端硬件资源的调度等等。
图6 View向Controller提交和接收数据的全过程(1)
图7 View向Controller提交和接收数据的全过程(2)
(2)Model的存在形式
Model的存在形式在SpringBoot框架中是采用面向对象的理念,将Model主要完成的任务进行类化封装,每个类对应一个功能完整的模型,类中的各个方法对应模型的某一个功能点,当Controller需要调用Model解决实际的业务需求时,只需要调用Model对应的类,创建对象,调用方法即可实现。
(3)Model类
在SpringBoot框架中设置了一个专门的模型类Model,用于向View传递信息,下面我们可以通过一段代码来展示Model类的使用方式。
图8 Model类的使用方式
图8可知,在控制器中的requestlist方法当有请求时,将信息封装到一个list实例中,并加入到model属性中,传递给前端,页面直接跳转到list模板中。
图9为模板list,其中x代表接收到的model传递过来的参数x,y代表每次读取的list的值。
由图8和图9我们可以看出,Model在后台向前端传递信息时起到了巨大的作用。
综上所述,SpringBoot框架下的微服务架构,基于MVC模型的应用创建工作变得尤为简便,大大提高项目的开发效率,缩短开发周期,降低开发成本,随着互联网科技的迅猛发展,SpringBoot必将发挥重要作用。
图9 list模板