SpringBoot教程(第4版)课件 第2章 Spring Boot开发入门_第1页
SpringBoot教程(第4版)课件 第2章 Spring Boot开发入门_第2页
SpringBoot教程(第4版)课件 第2章 Spring Boot开发入门_第3页
SpringBoot教程(第4版)课件 第2章 Spring Boot开发入门_第4页
SpringBoot教程(第4版)课件 第2章 Spring Boot开发入门_第5页
已阅读5页,还剩111页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第2章SpringBoot开发入门——从开发典型实例说起SpringBoot实用教程(第4版)目录01从登录功能说起1.设计系统结构2.创建数据库和表3.创建SpringBoot项目4.配置数据库连接从登录功能说起【实例2.1】实现“商品信息管理系统”商家登录功能。设计登录页面,包含用户名和密码输入文本框和“登录”和“重置”按钮。用户输入用户名和密码,单击“登录”,系统在netshop(网上商城)的数据库的supplier(商家)表中查询是否包含该用户记录。如果没有找到,根据用户名和密码匹配情况,显示相应用户不存在或者密码错。如果找到对应记录,转到另一个网页,显示该商家用户的注册信息。从登录功能说起1.设计系统结构系统运行在单一的Web服务器(SpringBoot内部的Tomcat)上;由Thymeleaf模板引擎实现前端页面,客户端用浏览器直接访问Web服务器上的网页;后台JavaEE程序分为控制器、业务层和持久层;底层用JDBCAPI操作MySQL数据库,如图2.1所示。从登录功能说起2.创建数据库和表在你的计算机上准备数据库操作环境:(1)在开发SpringBoot的计算机上安装MySQL8.0/5.x数据库(根用户root、口令123456)。(2)安装NavicatforMySQL或者NavicatPremium15可视化工具。(3)打开Navicat,创建MySQL服务器连接。(4)打开连接,在查询编辑器中执行SQL语句:CREATEDATABASEIFNOTEXISTSnetshop DEFAULTCHARACTERSET=gbk DEFAULTCOLLATE=gbk_chinese_ci ENCRYPTION='N'; /*(a)*/USEnetshop; /*(b)*/CREATETABLEsupplier /*(c)*/( SCode char(8) NOTNULLPRIMARYKEY, /*商家编码*/ SPassWord varchar(12) NOTNULLDEFAULT'888’, /*商家密码*/ SName varchar(16) NOTNULL, /*商家名称*/ SWeiXin varchar(16) CHARACTERSETutf8mb4NOTNULL, /*微信*/ Tel char(13) NULL, /*电话(手机)*/ Evaluate float(4,2) DEFAULT0.00, /*商家综合评价*/ SLicence mediumblob NULL /*营业执照图片*/);从登录功能说起(5)为了后面测试程序需要,往supplier表中录入一条商家用户的信息记录,执行SQL语句:USEnetshop;INSERTINTOsupplier(SCode,SPassWord,SName,SWeiXin,Tel)VALUES('SXLC001A','888','陕西洛川苹果有限公司','8123456-','0911-812345X');netshop数据库supplier表数据记录如图2.2所示。从登录功能说起3.创建SpringBoot项目在IDEA中创建SpringBoot项目,步骤如下。(1)启动IDEA,在初始窗口中点“NewProject”新建项目。(2)从窗口左侧选择项目类型为“SpringInitializr”,“Name”栏填写项目名为mystore,“Java”栏选择所使用的JDK版本,注意一定要与开发机器上安装的JDK版本一致(这里是8),其他栏保持默认,点“Next”继续。(3)出现界面供用户选择项目所用SpringBoot的版本以及要集成的框架或依赖库。从登录功能说起选择使用的SpringBoot正式版(不带任何文字标注的),在下方“Dependencies”列表中勾选项目所要集成的框架或依赖库。DeveloperTools:勾选Lombok、SpringBootDevTools。Web:勾选SpringWeb;TemplateEngines:勾选Thymeleaf。SQL:勾选JDBCAPI、MySQLDriver。选择完成后,在右侧“Addeddependencies”列表栏里可见已选中的组件名称。点“Finish”按钮开始创建SpringBoot项目。从登录功能说起4.配置数据库连接perties中的内容写成“键名=值”的形式,其中,“键名”可以是Spring/SpringBoot及其他第三方框架或依赖库内部所支持的配置项,也可以是用户自定义的全局配置项名称(程序中必须引用一致);“值”则是任意的字符串、数值或布尔型(true/false)。这里配置Spring框架内部对MySQL数据库的连接,内容如下:spring.datasource.url=jdbc:mysql://localhost:3306/netshop?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=truespring.datasource.username=rootspring.datasource.password=123456spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.jackson.serialization.indent-output=true目录02分

计1.持久层开发2.业务层开发3.表示层开发4.运行测试分层设计严格按照JavaEE标准的三层架构来设计程序,分为表示层、业务层、持久层,程序结构如图2.3所示,图中画出了程序中各个类、接口、对象、方法所属的层次和所在的源程序包,并标注了它们各自在系统中扮演的角色及相互作用关系。分层设计下面结合上图,就即将开发的这个程序来简要介绍一下它各个部分的交互工作原理。表示层:包括两个页面index.html(初始页,含用户名和密码输入框)和home.html(欢迎页,显示用户注册信息)、一个控制器和一个模型Supplier(商家用户模型)。页面以HTML5编写,其上需要显示动态数据的地方都嵌入了Model(SpringMVC的模型接口);控制器是一个SupController类,其中有两个方法init()和loginCheck()。业务层:有一个服务实体SupServiceImpl类,它实现SupService业务接口,其中的checkSupplier()方法专门负责处理对登录商家用户信息进行验证的业务功能(表示层控制器就是调用该方法执行验证的),验证结果通过实例化包装进Result响应实体中返回给前端。持久层:定义了一个数据接口SupRepository,它是持久层对业务层暴露的“操作界面”,业务层调用其中的findSupplier()方法查询到用户数据。SupRepositoryImpl类实现了该数据接口,通过JDBC存取MySQL中的数据。分层设计1.持久层开发进入项目工程目录树的src→main→java→com.example.mystore节点,右击,选择“New”→“Package”项,出现提示框中输入包名,如图2.4所示。分层设计在“NewPackage”文本框中默认前缀“com.example.mystore.”后加repository回车,创建一个名为repository的包,如图2.5所示。1)定义数据接口右击新创建repository包的节点,选择“New”→“JavaClass”项,在提示框列表选中“Interface”,上方框内输入接口名称为“SupRepository”,如图2.6所示。

分层设计回车,“SupRepository.java”接口代码如下:packagecom.example.mystore.repository;

importcom.example.mystore.entity.Supplier; //(b)

publicinterfaceSupRepository{publicSupplierfindSupplier(Suppliersupplier); //(a)}说明:(a)加黑部分为用户输入接口的定义,声明接口中的方法findSupplier。它将Supplier类的supplier实例作为参数带入,结果以Supplier类的形式返回。因为Supplier类在表示层才定义,所以目前会以红色显示。(b)导入实体(entity)类Supplier。如果Supplier类已经创建,在输入(a)后系统会自动生成本行。分层设计可以直接输入上述代码取代系统生成的初始代码。其中:Supplier类我们在com.example.mystore.entity包中创建。代码为:packagecom.example.mystore.entity;

importlombok.Data;

@DatapublicclassSupplier{privateStringscode; //商家编码privateStringspassword; //商家密码privateStringsname; //商家名称privateStringsweixin; //微信privateStringtel; //电话(手机)privateFloatevaluate; //商家综合评价}分层设计2)开发接口实现类右击repository包节点,选择“New”→“JavaClass”项,出现提示框下面列表选中“Class”,上方框内输入类名称。创建接口SupRepository的实现类SupRepositoryImpl,代码显示。说明:(a)Stringsql="SELECT*FROMsupplierWHERESCode=?":根据商家编码查询商家记录的SQL语句。(b)Objectargs[]={supplier.getScode()}:由传入findSupplier方法的Supplier对象参数中获取商家编码实参值。(c)RowMapper<Supplier>rowMapper=newBeanPropertyRowMapper<Supplier>(Supplier.class):RowMapper是JdbcTemplate提供的类,用于将查询数据库得到的多列数据映射到一个具体的模型类(本例就是Supplier类)上。(d)SuppliersupObj=jdbcTemplate.queryForObject(sql,args,rowMapper):调用JdbcTemplate模板的queryForObject方法执行查询,需要提供三个参数:执行的SQL语句、实参(存于对象数组args)以及行数据映射对象rowMapper。分层设计2.业务层开发(1)设计响应实体Result类在项目工程目录树的com.example.mystore节点下创建core包,其中定义Result类。说明:(a)privateintcode:code是返回码,标识登录验证通过与否,若验证通过,返回200;若失败则视具体情况返回403(密码错)/404(用户不存在)。(b)privateStringmsg:msg是字符串形式的消息,描述客户端请求执行的情况,若成功,填写成功信息;若失败,简单说明失败原因,这样用户就可从返回的消息内容中得知登录失败的原因,便于纠正错误重新登录。(c)privateObjectdata:这个里面存储的才是从数据库得到的数据内容,以Java对象的形式存储,传回前端后由表示层控制器解析为模型对象,供前台页面Model使用。分层设计(2)定义业务接口在项目工程目录树的com.example.mystore节点下创建service包,其下定义名为SupService的接口,代码为:packagecom.example.mystore.service;

importcom.example.mystore.core.Result;importcom.example.mystore.entity.Supplier;

publicinterfaceSupService{ publicResultcheckSupplier(Suppliersupplier);}(3)开发服务实体在service包下创建业务接口的实现类SupServiceImpl,代码显示。分层设计3.表示层开发(1)设计模型本例针对数据库supplier(商家)表设计一个商家用户模型Supplier。在项目工程目录树的com.example.mystore节点下创建entity包,其中创建模型类Supplier,代码为:packagecom.example.mystore.entity;

importlombok.Data;

@DatapublicclassSupplier{ privateStringscode; //商家编码 privateStringspassword; //商家密码 privateStringsname; //商家名称 privateStringsweixin; //微信 privateStringtel; //电话(手机) privateFloatevaluate; //商家综合评价}分层设计说明:①传统JavaEE数据模型类的设计代码必须遵循严格的规范写,类的各个属性对应于要显示的数据记录的各个字段(数据库表的列名),每一个属性都对应有一对get/set方法。②实际开发时可根据应用需求灵活调整模型属性的数目,并非数据库表的所有列都要有其属性。可以看到,这里暂未定义supplier表的“SLicence”(营业执照图片)列属性,因为本例用不到,即只要保证程序要用的列在模型里有对应的属性就可以。分层设计(2)设计前端页面右击项目工程目录树的src→main→resources→templates节点,选择“New”→“HTMLFile”项,出现提示框下面列表选中“HTML5file”,创建前端页面,上方框内输入页面名称。如图2.7所示。本例要创建两个页面:index.html和home.html。①index.html是初始的登录页,页面代码显示。②home.html是登录成功后的欢迎页,页面代码显示。(3)开发控制器在项目工程目录树的com.example.mystore节点下创建controller包,其中创建控制器类SupController,代码显示。分层设计4.运行测试(1)启动项目点IDEA工具栏的启动按钮(位于开发环境界面右上绿色三角

),底部窗口出现SpringBoot的启动信息,稍候片刻,显示“StartedMystoreApplicationin1.747seconds(JVMrunningfor2.75)”(时长秒数会有不同)就表示启动成功,如图2.8所示。分层设计(2)访问页面此时打开浏览器,地址栏输入http://localhost:8080/index回车,看到登录页面如图2.9所示。(3)验证失败的提示输入错误的用户名或密码提交,页面在对应文本框后显示红色的“用户不存在!”或者“密码错!”信息。分层设计(4)登录成功输入正确的用户名(SXLC001A)和密码(888),点“登录”按钮,成功登录后页面显示欢迎文字和该商家用户的注册信息,如图2.10所示。目录03URL请求参数传递1.形参名(无注解)接收参数2.路径(@PathVariable)传递参数3.用@RequestParam映射参数URL请求参数传递在SpringBoot中,将URL映射到后台程序是通过注解@RequestMapping处理的。URL映射其实就是用控制器定义要访问的URL路径,用户通过输入路径来访问控制器的某个方法,如图2.11所示。【实例2.2】商家登录“商品信息管理系统”通过输入URL提交用户名密码,浏览器返回JSON格式的响应实体(内含用户注册信息);若失败则返回的JSON实体中含消息提示原因。URL请求参数传递1.形参名(无注解)接收参数这是最简单的方式,用控制器中的方法形参名直接接收来自URL的请求参数。(1)控制器编程修改控制器SupController,代码如下:...@RestController@RequestMapping("index")publicclassSupController{ @Autowired privateSupServicesupService;

@RequestMapping("/check") //处理URL映射的注解语句 publicResultloginCheck(Stringscode,Stringspassword){ Suppliersupplier=newSupplier();supplier.setScode(scode);supplier.setSpassword(spassword); Resultresult=supService.checkSupplier(supplier); returnresult; }}URL请求参数传递(2)运行启动项目,打开浏览器,地址栏输入http://localhost:8080/index/check?scode=SXLC001A&&spassword=888回车,看到以JSON格式返回的响应实体数据如图2.12所示。URL请求参数传递若故意将URL携带的用户名或密码写错,提交后返回的JSON数据中也会含错误码及失败原因的提示文字(用户不存在、密码错),此时JSON数据键(data)显示值为空(null),如图2.13所示。URL请求参数传递(3)说明①用形参接收参数,要求控制器方法的形参名必须与URL携带的参数名完全一致且严格对应,URL中既不能省略某个参数也不能凭空多出额外的参数。②URL携带的参数均以“参数名=值”的形式写在路径之后,与路径之间隔一个“?”,各参数之间以“&&”(或“&”)分隔。③SpringBoot用来处理URL映射的注解语句有多种不同形式的写法,本例代码中的“@RequestMapping("/check")”还可以写成如下几种形式:@RequestMapping(value="check",method=RequestMethod.GET)@GetMapping("/check")@GetMapping(value="check")URL请求参数传递2.路径(@PathVariable)传递参数当下互联网应用流行的RESTful风格接口,要求客户端将请求参数值直接写在访问URL的路径中,如“http://地址/路径/值1/值2/.../值n”的形式,这种情况只能依靠路径自身传递参数值,在SpringBoot中用@PathVariable注解参数。(1)控制器编程在控制器SupController中添加一个loginCheckByPath方法,代码如下:@RequestMapping("/checkbypath/{scode}/{spassword}") //处理URL映射的注解语句publicResultloginCheckByPath(@PathVariableStringscode,@PathVariableStringspassword){ //@PathVariable注解参数 Suppliersupplier=newSupplier();supplier.setScode(scode);supplier.setSpassword(spassword); returnsupService.checkSupplier(supplier);}(2)运行启动项目,打开浏览器,地址栏输入http://localhost:8080/index/checkbypath/SXLC001A/888回车,看到以JSON格式返回的响应实体数据与前图2.12的一样。URL请求参数传递(3)说明①用“@RequestMapping("/checkbypath/{scode}/{spassword}")”注解语句处理URL映射,在访问“http://localhost:8080/index/checkbypath/SXLC001A/888”时,SpringBoot会自动将URL中的模板变量{scode}、{spassword}绑定到通过@PathVariable注解的同名参数上,从而获取到路径中的参数值。处理URL映射的注解语句也可以写成如下几种等效的形式:@RequestMapping(value="checkbypath/{scode}/{spassword}",method=RequestMethod.GET)@GetMapping("/checkbypath/{scode}/{spassword}")@GetMapping(value="checkbypath/{scode}/{spassword}")②控制器方法“publicResultloginCheckByPath(@PathVariableStringscode,@PathVariableStringspassword)”用@PathVariable注解声明参数,还可以写成如下两种形式:publicResultloginCheckByPath(@PathVariable("scode")Stringscode,@PathVariable("spassword")Stringspassword)publicResultloginCheckByPath(@PathVariable(value="scode")Stringscode,@PathVariable(value="spassword")Stringspassword)其中,@PathVariable(value="xxx")中的“xxx”为参数名,它必须与注解语句“@RequestMapping("/checkbypath/{xxx}/...")”中的模板变量名相一致,但与其后声明的参数名可以不同,比如,写成下面这样也是正确的:publicResultloginCheckByPath(@PathVariable(value="scode")Stringcode,@PathVariable(value="spassword")Stringpassword)URL请求参数传递3.用@RequestParam映射参数为适应这类应用需求,SpringBoot专门提供了@RequestParam注解来支持程序间参数的映射和默认赋值,下面简单演示这种用法。(1)控制器编程在控制器SupController中添加一个loginCheckByPara方法,代码如下:@RequestMapping(value="checkbypara",method=RequestMethod.GET)publicResultloginCheckByPara(@RequestParam(value="scode")Stringscode,@RequestParam(value="spassword",required=false,defaultValue="888")Stringspassword){ Suppliersupplier=newSupplier();supplier.setScode(scode);supplier.setSpassword(spassword); returnsupService.checkSupplier(supplier);}URL请求参数传递(2)运行启动项目,打开浏览器,地址栏输入http://localhost:8080/index/checkbypara?scode=SXLC001A(省略了密码)回车,看到以JSON格式返回的响应实体数据与前图2.12的一样。若故意写错用户名,提交后返回含错误码404及“用户不存在!”提示消息的JSON数据体。(3)说明①处理URL映射的注解语句“@RequestMapping(value="checkbypara",method=RequestMethod.GET)”也可以写成下面几种等效的形式:@RequestMapping("/checkbypara")@GetMapping("/checkbypara")@GetMapping(value="checkbypara")②用@RequestParam注解声明参数还可以写成如下两种形式:publicResultloginCheckByPara(@RequestParam("scode")Stringscode,@RequestParam(value="spassword",required=false,defaultValue="888")Stringspassword)publicResultloginCheckByPara(@RequestParamStringscode,@RequestParam(value="spassword",required=false,defaultValue="888")Stringspassword)目录04项目打包部署项目打包部署下面以【实例2.1】介绍SpringBoot项目打包部署的操作步骤。(1)用IDEA打开需要打包的【实例2.1】项目工程。在IDEA开发环境中,选择主菜单“File”→“ProjectStructure...”,弹出“ProjectStructure”窗口,如图2.14所示。项目打包部署(2)点“CreateJARfromModules”对话框“MainClass”栏右侧的按钮,弹出“SelectMainClass”框,选中项目com.example.mystore包下的主类MystoreApplication,点“OK”,如图2.15所示。项目打包部署(3)继续点“OK”,回到“ProjectStructure”窗口,如图2.16所示,界面上列出了即将打包的名称、类型、输出目录、包中元素的层次布局等相关信息,确认无误后单击“OK”按钮。(4)点击IDEA开发环境右侧边栏上的“Maven”标签按钮,在出现的“Maven”子窗口中双击“mystore”→“Lifecycle”→“package”项启动打包过程,如图2.17所示。项目打包部署(5)此时,下方控制台子窗口中输出一系列信息,稍候片刻,待出现“BUILDSUCCESS”文字就表示打包成功了,如图2.18所示。项目打包部署在控制台输出信息中,还有一行(图中特别框出):Buildingjar:C:\Users\...\mystore\target\mystore-0.0.1-SNAPSHOT.jar它提示用户打包生成的JAR包的存放位置,通常是放在项目target子目录下,该子目录由IDEA在打包过程中自动生成,进入项目目录就可以看到,如图2.19所示。项目打包部署(6)进入target子目录,可看到一个名为mystore-0.0.1-SNAPSHOT.jar的文件,它就是打包得到的JAR包,可直接在JVM上运行。将这个文件复制到某个特定的目录下,通过Windows命令行进入其所在目录,执行语句:java-jarmystore-0.0.1-SNAPSHOT.jar控制台输出如图2.20所示的信息,可见SpringBoot已经启动开始工作了,与在IDEA开发环境下的启动信息一样。项目打包部署说明:打包生成的JAR包文件mystore-0.0.1-SNAPSHOT.jar可以根据需要重命名,只要运行时命令语句“java-jar”后面跟的文件名与之一致即可。JAR包文件可以部署到任何计算机上启动运行,只要该机器安装有版本匹配的JDK就行。若想结束程序运行,只须直接关闭启动JAR包的这个命令行窗口。如果项目在先前已经打过包,再次打包前需要先清理原来旧的target目录。方法是:点击IDEA开发环境右侧边栏上的“Maven”标签按钮,在出现的“Maven”子窗口中双击“mystore”→“Lifecycle”→“clean”项。①③④②第2章SpringBoot开发入门——SpringBoot项目结构SpringBoot实用教程(第4版)SpringBoot项目结构用IDEA开发的SpringBoot项目有着固定的结构,【实例2.1】项目的结构如图2.21所示。SpringBoot项目结构1.程序开发目录(1)总程序包用于分门别类地存放程序各个模块(层次)的源代码,本例的总程序包名为com.example.mystore,这个名称是在创建项目的时候由向导根据用户设置内容自动生成的,如图2.22所示,生成规则为:Group.Artifact,其中Group为组名,默认com.example,当然也可以由用户自己命名;Artifact是项目整体的模块包名,默认也就是项目名。(2)主启动类这是整个SpringBoot项目的运行启动类,相当于主程序入口,该类也是由向导在创建项目时自动生成的,类名构成规则为:项目名+Application,如本例项目名为mystore,主启动类名就是MystoreApplication(注意首字母大写)。一般在开发时不要对主启动类的代码进行任何修改。SpringBoot项目结构2.资源文件目录这个目录是专门用来存放项目前端页面及用到的各种资源的,位于项目目录的src→main→resources路径下(与程序开发目录同级),其中包含一个static和一个templates子目录、一个perties配置文件。(1)static目录用于存放项目静态资源,如需要在页面上显示的图片等。(2)templates目录用于存放前端页面源文件,如HTML5、CSS样式文件等。(3)perties配置文件这是项目中唯一的配置文件,主要用来配置程序全局要使用的变量、框架属性等。SpringBoot项目结构3.测试目录IDEA开发的SpringBoot项目支持单元测试,即在尚未完成整个项目开发的阶段就对某个已开发好的模块(如控制器类)提前单独地进行测试和调试,为此,在与src→main同级的项目路径下自带了一个测试目录(src→test),其中含有与程序开发目录几乎一模一样的结构:一个总程序包和一个主类,程序包的名称也是com.example.mystore,只不过主类名成了MystoreApplicationTests(后跟Tests表示测试类),用户可将开发好的模块先放进测试目录下对应层次的包中,再在主类中编写测试代码(以@Test等注解标注),然后启动测试主类,系统就会模拟真实环境的请求处理过程对目标模块执行测试,SpringBoot本身也提供了一些现成的测试框架方便开发者使用。4.依赖配置文件pom.xmlSpringBoot发明的初衷就是为了简化传统Spring开发繁琐复杂的XML配置,故它的项目中去除了一切不必要的配置文件,所有要用的组件都由SpringBoot框架本身自动配置注入,项目中仅仅保留一个依赖配置文件pom.xml,本例的该文件完整内容。第2章SpringBoot开发入门——SpringBoot注解SpringBoot实用教程(第4版)目录01入口类注解1.@SpringBootApplication2.@Configuration/@SpringBootConfiguration3.@EnableAutoConfiguration4.@ComponentScan入口类注解从上节项目结构可见,SpringBoot应用都有一个名为xxxApplication(xxx为项目名,首字母大写)的程序入口类,例如,【实例2.1】的入口类MystoreApplication.java代码如下:packagecom.example.mystore;

importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplicationpublicclassMystoreApplication{

publicstaticvoidmain(String[]args){SpringApplication.run(MystoreApplication.class,args);}}入口类注解1.@SpringBootApplication它是SpringBoot的核心注解,用于标注SpringBoot项目的入口,该注解将MystoreApplication标注为整个应用的启动类,一个项目有且仅有一个启动类,故源代码中也只能存在一个@SpringBootApplication注解。@SpringBootApplication是一个组合注解,它组合了@Configuration/@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan这三个注解,各自发挥不同的作用。2.@Configuration/@SpringBootConfiguration@Configuration是SpringBoot应用的配置注解,它声明当前的类是一个配置类,Spring容器处理这个配置类来为我们的应用实例化和配置Bean,故该注解的作用相当于传统Spring开发中所配置的一个XML文件。在SpringBoot应用中推荐使用@SpringBootConfiguration注解替代@Configuration,它能够自动找到配置所在。入口类注解3.@EnableAutoConfiguration@EnableAutoConfiguration注解可以让SpringBoot根据当前项目所依赖的JAR包自动配置与之相关的组件,它借助注解@Import,将所有符合自动配置条件的@Configuration配置的Bean都加载到IoC容器中。例如,在SpringBoot项目的pom.xml文件中有一个spring-boot-starter-web依赖,SpringBoot就会进一步添加并自动配置与之关联的Tomcat和SpringMVC依赖。4.@ComponentScan该注解的功能是让SpringBoot自动扫描入口类的同级包及其下所有子包中的配置,所以建议将入口类直接放在项目程序开发目录的总程序包(本例是com.example.mystore)下,这样就可以确保SpringBoot能够自动扫描到项目所有包中的配置。入口类注解在开发中,用以上三个注解替代核心注解@SpringBootApplication也是合法的,例如,入口类的代码也可以写成如下形式:packagecom.example.mystore;

importorg.springframework.boot.SpringApplication;importorg.springframework.boot.SpringBootConfiguration;importorg.springframework.boot.autoconfigure.EnableAutoConfiguration;importorg.springframework.context.annotation.ComponentScan;

@SpringBootConfiguration@EnableAutoConfiguration@ComponentScanpublicclassMystoreApplication{

publicstaticvoidmain(String[]args){SpringApplication.run(MystoreApplication.class,args); }}目录02常

解常用注解(1)@Controller标注在控制器类上,声明此类是一个SpringMVCController对象。该注解所标注控制器内的方法返回的是一个字符串(String),指向前端某个页面,例如:@ControllerpublicclassSupController{ ...@GetMapping("/index")publicStringinit(Modelmodel){ ...return"index";}}(2)@Service标注一个业务层服务实体,声明此类是一个业务处理类(实现业务接口),专用于处理业务逻辑。例如,【实例2.1】中SupServiceImpl类实现SupService接口,处理登录验证逻辑:@ServicepublicclassSupServiceImplimplementsSupService{...}常用注解(3)@Repository标注一个持久层数据库访问类(实现数据接口),例如,【实例2.1】的SupRepositoryImpl类实现SupRepository接口,从MySQL中查询用户信息:@RepositorypublicclassSupRepositoryImplimplementsSupRepository{...}(4)@Component这是个通用的注解,标注在无法用@Controller、@Service、@Repository描述但又必须交由SpringBoot管理的类上,将类实例化到容器中。它可配合CommandLineRunner使用,以便在程序启动后执行一些基础任务。常用注解(5)@Autowired标注在类的属性上,表示被修饰的属性需要注入对象。SpringBoot会扫描所有被@Autowired标注的属性,然后根据其类型在IoC容器中找到匹配的对象进行注入。属性所属的类可以是控制器、业务层服务实体、持久层数据库访问类等,例如:@ControllerpublicclassSupController{ //控制器类@AutowiredprivateSupServicesupService; //注入服务实体对象 ...}

@ServicepublicclassSupServiceImplimplementsSupService{ //服务实体@Autowired privateSupRepositorysupRepository; //注入数据库访问对象 ...}

@RepositorypublicclassSupRepositoryImplimplementsSupRepository{ //数据库访问类@Autowired privateJdbcTemplatejdbcTemplate; //注入JDBC模板组件 ...}常用注解(6)@RequestMapping它用来处理请求地址映射,在程序中可标注在类和/或方法上。如果用在类上,表示该类中所有响应请求的方法都是以该注解中的地址作为父路径的;如果仅用在某个方法上,就只有此方法以注解的地址为路径;如果同时用在类及其中的方法上,则类注解的地址要加上方法自身注解的地址才是完整的响应路径。例如,【实例2.1】的控制器仅在loginCheck方法上注解:publicclassSupController{ ...@RequestMapping("/check") publicStringloginCheck(Modelmodel,Suppliersupplier){...}运行时请求提交到http://localhost:8080/check(前端页面代码为<formaction="/check"method="post">)。而【实例2.2】的控制器在类和方法上都加了注解:@RequestMapping("index")publicclassSupController{ ...@RequestMapping("/check") publicResultloginCheck(Stringscode,Stringspassword){...} ...}常用注解运行时的访问路径就变为http://localhost:8080/index/check(测试URL为http://localhost:8080/index/check?scode=SXLC001A&&spassword=888)。@RequestMapping还可以附带属性,它有6个属性,如下:params:指定Request中必须包含某些参数值,才让该方法处理。headers:指定Request中必须包含某些指定的header值,才让该方法处理。value:指定请求的实际地址,可以是URITemplate模式。method:指定请求的方法类型,如GET、POST、PUT、DELETE等。consumes:指定处理请求的提交内容类型(Content-Type),如"application/json,text/html"。produces:指定返回的内容类型。只有当Request请求头中的Accept类型中包含该指定类型时才返回。@RequestMapping(value="check",method=RequestMethod.GET)例如,用属性设定请求参数:常用注解(7)@Requestbody/@ResponseBody@Requestbody标注在方法参数前,常用来处理application/json、application/xml等内容类型(Content-Type)的数据,意味着HTTP消息是JSON/XML格式,需将其转化为指定类型参数处理。通过@Requestbody可以将请求体中的(JSON/XML)字符串绑定到相应的Bean上,也可以将其分别绑定到对应的字符串上。@ResponseBody通过转换器将控制器中方法返回的对象转换为指定的格式(JSON/XML)后,写入Response对象的body数据区。它常用来返回JSON格式的数据,使用该注解后,数据直接写进输入流,不需要进行视图渲染。例如,【实例2.1】返回的商家用户信息是显示在页面上的,如果我们未开发前端页面,而又想从浏览器看到数据内容,就要以JSON格式返回,在控制器中添加代码:@RequestMapping("/login")@ResponseBodypublicResultloginCheck(Suppliersupplier){ returnsupService.checkSupplier(supplier);}常用注解(8)@RestController这也是用于标注控制器类的,作用相当于@ResponseBody加@Controller,但它返回的是JSON/XML格式的数据而非HTML页面。例如,【实例2.2】是通过URL携带的参数发起请求,而返回数据也未用页面渲染(直接JSON格式),故其控制器要以@RestController修饰。(9)@Override这是Spring的系统注解,用于修饰方法,表示此方法重写了父类(或接口)的方法。例如,【实例2.1】的服务实体SupServiceImpl实现业务接口的checkSupplier方法、数据库访问类SupRepositoryImpl实现数据接口的findSupplier方法,都必须在方法前加注解如下:publicclassSupServiceImplimplementsSupService{ ...@Override publicResultcheckSupplier(Suppliersupplier){...}}

publicclassSupRepositoryImplimplementsSupRepository{ ...@Override publicSupplierfindSupplier(Suppliersupplier){...}}常用注解(10)@Data这是三层架构开发中常用的Lombok框架的注解,标注在模型实体类上,在编程时就可以省略模型类的get/set方法以达到简化代码的目的,注意该注解在使用前一定要先导入Lombok的Data库,如下:importlombok.Data;

@DatapublicclassSupplier{ //模型中各属性的声明 ...}(11)@Bean标注在方法上,声明该方法的返回结果是一个由Spring容器管理的Bean。常用注解(12)@PathVariable标注在方法参数前,将URL获取的参数映射到方法参数上以获取路径中的参数,例如,【实例2.2】的URL请求参数传递方式二:@RequestMapping("/checkbypath/{scode}/{spassword}") //处理URL映射的注解语句publicResultloginCheckByPath(@PathVariableStringscode,@PathVariableStringspassword){...}(13)@Value标注在属性上,用于获取配置文件中的值。目录03其他注解其他注解(1)@Deprecated:用于修饰方法,表示此方法已经过时,经常在版本升级后会遇到。(2)@SuppressWarnnings:告诉编译器忽视某类编译警告。它有以下一些属性:unchecked:未检查的转化。unused:未使用的变量。resource:泛型,即未指定类型。path:在类中的路径。原文件路径中有不存在的路径。deprecation:使用了某些不推荐使用的类和方法。fallthrough:switch语句执行到底,不会遇到break关键字。serial:实现了Serializable,但未定义serialVersionUID。rawtypes:没有传递带有泛型的参数。all:代表全部类型的警告。(3)@Resource:标注在类名、属性或构造函数参数上,作用与常用的@Autowired类同,两者都可以用来装配Bean,但@Resource默认是按名称注入对象的。(4)@Transactional:用于处理事务,它可以标注在接口、接口方法、类及类方法上。但SpringBoot不建议在接口或者接口方法上使用该注解,因为该注解只有在使用基于接口的代理时才会生效。其他注解(5)@Qualifier:标注在类名或属性上,为Bean指定名称,随后再通过名字引用Bean。它的意思是“合格者”,用于标注哪一个实现类才是需要注入的。需要注意的是,@Qualifier的参数名称为被注入的类中的注解@Service标注的名称。(6)@EnableScheduling:标注在入口类/类名上,用来开启计划任务。Spring通过@Scheduled支持多种类型的计划任务,包含Cron、fixDelay、fixRate等。(7)@EnableAsync:标注在入口类/类名上,用来开启异步注解功能。(8)@Aspec:用于标注切面,也可以用来配置事务、日志、权限验证等。(9)@ControllerAdvice:标注在类名上,包含@Component,可以被扫描到。统一处理异常。(10)@ExceptionHandler:标注在方法上,表示遇到这个异常就执行该方法。第2章SpringBoot开发入门——SpringBoot配置SpringBoot实用教程(第4版)目录01配置文件的读取方式1.通过Environment类2.通过@ConfigurationProperties注解3.通过@Value注解配置文件的读取方式【实例2.3】用三种方式分别从perties文件中读取商家用户基本信息并显示。(1)创建SpringBoot项目,项目名为ConfigReader,在出现的向导界面“Dependencies”列表中仅需要勾选“Web”→“SpringWeb”、“DeveloperTools”→“Lombok”。(2)在项目perties中编辑用户基本信息如下:supplier.scode=SXLC001Asupplier.spassword=888supplier.sname=陕西洛川苹果有限公司配置文件的读取方式(3)在项目工程目录树的com.example.configreader节点下创建entity包,其中创建模型类Supplier,代码为:packagecom.example.configreader.entity;

importlombok.Data;

@DatapublicclassSupplier{ privateStringscode; privateStringspassword; privateStringsname;}配置文件的读取方式1.通过Environment类Environment是一个通用的读取应用程序运行时的环境变量的类,它用getProperty方法以key-value(键-值)的形式读取数据,语句为:Environment对象.getProperty("键名")Environment常用于SpringBoot程序获取全局变量的配置值。在项目工程目录树的com.example.configreader节点下创建controller包,其中创建控制器类EnvReadController,代码显示。运行程序,访问http://localhost:8080/readenv,显示结果如图2.23所示。配置文件的读取方式2.通过@ConfigurationProperties注解(1)先对模型实体代码进行修改,在模型类Supplier代码中添加注解,如下:packagecom.example.configreader.entity;

importlombok.Data;importperties.ConfigurationProperties;importorg.springframework.stereotype.Component;

@Data@Component@ConfigurationProperties(prefix="supplier")publicclassSupplier{ privateStringscode; privateStringspassword; privateStringsname;}配置文件的读取方式(2)在项目工程目录树的com.example.configreader.controller包中,创建控制器类CfgReadController,代码如下:packagecom.example.configreader.controller;

importcom.example.configreader.entity.Supplier;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;

@RestControllerpublicclassCfgReadController{@Autowired Suppliersupplier; //注入模型实体

@RequestMapping("/readcfg") publicSupplierreadCfg(){ returnsupplier; //注入后直接就可以返回显示了 }}配置文件的读取方式3.通过@Value注解用@ConfigurationProperties注解整体载入模型数据的方式虽然简单有效,但它也存在局限性,就是要求配置文件中的属性名、顺序和数目必须与程序模型的严格一一对应,否则就无法正确加载数据。而且有的时候,程序只须用到对象实体的一个或少数几个属性,用整体注入的方式既没必要又浪费内存,这种情况下适合用@Value注解获取单个属性赋值给程序中的变量,用法为:@Value("${键名}")private类型变量名;在项目工程目录树的com.example.configreader.controller包中,创建控制器类ValReadController,代码显示。配置文件的读取方式注意:为防止程序读取配置文件中的中文出现乱码,需要对SpringBoot项目进行配置,操作方法是:IDEA环境选择主菜单“File”→“Settings...”,弹出“Settings”窗口左侧选中“Editor”→“FileEncodings”,确保右边界面上“GlobalEncoding”、“ProjectEncoding”栏及下部“PropertiesFiles(*.properties)”所属“Defaultencodingforpropertiesfiles”栏的当前选项均为“UTF-8”,如图2.24所示,同时勾选上“Defaultencodingforpropertiesfiles”栏后面的“Transparentnative-to-asciiconversion”项,点“OK”按钮。目录02Properties配置Properties配置【实例2.4】用户登录信息(商家编码和密码)预先存储在perties中,程序初始化时就将配置文件中的登录信息读取出来填写在页面表单上,方便用户直接登录。本例在前面已经完成【实例2.1】项目基础上修改而成。(1)在perties配置文件中添加用户登录信息,如下:spring.datasource.url=jdbc:mysql://localhost:3306/netshop?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=truespring.datasource.username=rootspring.datasource.password=123456spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.jackson.serialization.indent-output=true

supplier.scode=SXLC001Asupplier.spassword=888(2)在控制器中通过@Value注解读取配置文件中的登录信息,同时修改init方法,将读取的商家编码和密码用addAttribute方法添加到页面Model属性。Properties配置控制器SupController.java的代码改为如下:...@ControllerpublicclassSupController{ @Autowired privateSupServicesupService; @Value("${supplier.scode}") privateStringscode; //商家编码

@Value("${supplier.spassword}") privateStringspassword; //密码

@GetMapping("/index") publicStringinit(Modelmodel){ Resultresult=newResult();result.setCode(100);result.setMsg("初始状态");model.addAttribute("result",result); //从配置文件读取的用户信息自动填写在前端页面上model.addAttribute("scode",scode);model.addAttribute("spassword",spassword); return"index";} ...}Properties配置(3)运行程序,浏览器访问http://localhost:8080/index,可以看到登录页的表单里已经自动填上了用户名和密码,可直接点“登录”按钮进行提交,如图2.25所示。目录03YAML配置YAML配置SpringBoot也支持使用YAML语言编辑配置文件,创建的文件格式是application.yml,需要遵循如下语法规则:(1)以冒号分隔键名和值,且在冒号后一定要跟一个空格,写成:键名:(空格)值例如:scode:SXLC001A(2)所有数据以树状结构组织,用空格的缩进来控制层级关系,只要是左对齐的一列数据就是同一层级。例如:supplier:sname:陕西洛川苹果有限公司contactway:sweixin:8123456-tel:0911-812345XYAML配置(3)对于有多个属性的对象,可在首行先定义对象名,再从下一行开始依次分行罗列对象的各属性和值(注意缩进);也可以以“对象名:值”的形式写在同一行上,但“值”部分的所有属性要用一个大括号括起来,其中每个属性也是“键名:(空格)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论