版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Spring boot基础文档在IDEA环境下创建一个 Spring boot 程序、点击New Project后,选择Spring Initializr 。如下图所示,此时, 如果右侧你的JDK自动出现了,那可以省很多事。如果没有自动出现, 则需要你点击New,去选择你JAVA的安装目录。(为什么需要这样?因为Spring的运行需要JAVA,所以IDE需要知道你的JAVA安装目录。)Spring boot基础文档Spring boot基础文档、进入下一步后,会让你设置一下你工程的名字等基本信息。O' L'" OName:demoTypE:Maven Project
2、匚enerate a Mave IP ackaging:JarJava Version:1.8Lan guage:JavaCroup:com.exam plwArtifact:demoVersion:OOl-SNAPSHOTDescription:Demo project for Spring BootP ackage:com.exam pie三、然后这个界面比较重要,它的作用是在开始的时候,自动下载一些jar包。你勾选一个,他就会自动下载。请按照需求勾选。O' * oSpring Boot Version: 1331,Dep endencies CoreSecurity0 AOPCa
3、che DevToolsRetry Lombok Web7 Web WebsockeRatpack VaadinRest Repositories HAL Browser Mobile Template Engines Freemarker Velocity Mustache SQLbjPA JOOQHSQLDBn Apache De NoSQLMongoDB Cassandra1 四、填写工程名Project name:demoProject locatfon; D:.proictdemo卜 Wor*Previl五、OK ,现在Intellij就自动为我们创建好一个 Springboot 的
4、程序了哦如下图所示:Spring boot基础文档Spring boot基础文档Spring boot 写一个 Hello world 现在开始写第一个Hello World看下图:F Qblog -/IdeaProjects/blog Q .idea D .mvn Qsrc Q main Djavacom.example硒 DemoApplication Cs resources也 static templates 唱 ap plication, prop erties Q test0 blogJml0 mvnw0 mvnwxmd ft? pom.xmlh Ih External Libra
5、ries.上图中的com.exampie 是一个包名,为了代码可读性高,我们会使用MVC的开发模式,在com.exampie 这个包下面,再新建几个包,分别用来写不同的代码。需要新建的包如下:con troller包:用来写控制器代码,控制器对应不同的请求,是网络请求的第一层。model包:里面每个class可以对应一个数据表,当你写好class,并且运行工程时,Springboot和Hibernate 会自动为你在数据库里创建表。rep ository 包:这里封装了所有对数据表的增删改查操作。以后你需要操作数据库,其实就是使用这里的接口。service包:比如把登录、注册等一
6、个完整的逻辑,封装为一个service,供controller调用,可以极大地简化开发,同时代码也具有更高的可读性。F面,让我们来建立这四个包吧 -在com.example 这个包上右键,然后new 个包出来。如图所示:Spring boot基础文档Spring boot基础文档我这里创建好包名后,目录结构是这样的:0 Kroject2 千 I 辛簟 I 口 blog -ZldealPrqjects/blog Q .idea D -mvn D src D main Djava com.example 也 controller 也 model ELl repository 也 se rvice
7、&审 DemoApplication B resourcesILl staticE templates0 application.pr op erties DtestD blogJmlQ mvnwB mvnw.cmdn? pom.xml Ih External LibrariesSpring boot基础文档好了,到这一步,我们终于可以开始写代码啦在本文里,我们将不会用至J service、model、repository ,只会用至J controller来写一个 简单的Hello World 。让我们开始写吧:首先,在controller这个包上点击右键,新建一个class,名字就
8、叫 nana,如下图所示:Spring boot基础文档严格按照前面的教程来,你的包名可能和我的不一样, 所以这个代码复制过去后,请自己检查一遍!】P ackage com.exa mp le.c on troller;imp ort org.s pri ngframework.boot.autoc on figure.E nableAutoC on figurati on;import org.s pri ngframework.web.b in d.a nno tati on .RequestMa pping;imp ort org.s pri ngframework.web.bi nd.
9、a nn otatio n.RequestMethod;imp ort org.s pri ngframework.web.bi nd.a nn otatio n.RestC on troller;/* * Created by lon gge93 on 16/4/14.*/ RestCo ntroller En ableAutoCo nfigurati on p ublic class nana RequestMa ppin g(value="/",method = RequestMethod.GET)p ublic String in dex()return "
10、;Hello World-"然后我们来运行以下我们的工程,运行方法如下图所示:Spring boot基础文档Spring boot基础文档写代码的过程都是不顺利的 虽然我们点了运行,但是下面的控制台里却提示我们运行失败了,从上图的下面看出,是hiber nate 出错了。为什么呢?因为我们在 Maven里包含了 MySQL的jar包,但是却没有配置数据库连接需要的账号和密码等信息。所以hibernate 会报错 因为我们这篇文章里,只是为了输出hello world ,用不着数据库。所以我们先去pom文件里注释掉数据库相关的jar包应该就0K 了。我注释完后,我的pom文件是这样的,
11、请仔细检查:<?xml versio n="1.0" en codi ng="UTF-8"?><pr oject xmln s="" xmln s:xsi=""xsi:schemaLocati on=""><modelVers ion> 4.0.0</modelVers ion><grou pl d>com.exa mp le</grou pld><artifactld>demo</artifactld&g
12、t;<versio n>0.0.1-SNA PSHOT</versio n><p ackagi ng>jar</packagi ng><n ame>demo</name<descri pti on >Demo p roject for Spring Boot</descri pti on><parent><grou pld>org.s pri ngframework.boot</grou pld><artifactld>s prin g-boot-start
13、er -paren t</artifactld><versio n>1.3.3.RELEASE</versio n><relative Path/<!- looku p p are nt from rep ository</parent><prop erties><p roject.build.sourceE ncod in g>UTF-8</pr oject.build.sourceE ncod ing><java.versi on >1.8</java.vers ion>
14、</prop erties><de penden cies><dependency><grou pld>org.s prin gframework.boot</grou pld><artifactld>s pri ng-boot-starter-a op</artifactId></dependency><!-<de penden cy>-><!-<grou pld>org.s pri ngframework.boot</grou pld><
15、;!-<artifactId>s prin g-boot-starter-data-j pa</artifactld><!-</de pendency<!-<de penden cy>-><!-<grou pld>org.s pri ngframework.boot</grou pld><!-<artifactId>s prin g-boot-starter-jdbc</artifactld><!-</de pendency<!-<de pendenc
16、y<!-<grou pld>org.s pri ngframework.boot</grou pld><!-<artifactId>s prin g-boot-starter-redis</artifactId>-><!-</de pendency<dependency><grou pld>org.s prin gframework.sessi on</grou pld><artifactld>s pri ng-sessi on</artifactld>&l
17、t;/dependency><dependency><grou pld>org.s prin gframework.boot</grou pld><artifactld>s pri ng-boot-starter-thymeleaf</artifactld></dependency><dependency><grou pld>org.s prin gframework.boot</grou pld><artifactld>s pri ng-boot-starter-we
18、b</artifactld></dependency><!-vde pendency<!-<grou pld>mysql</grou pl d>-><!-<artifactId>mysql-c onn ector-java</artifactId>-><!-vsc op e>ru ntime</sc ope:<!-</de pendency<dependency><grou pld>org.s prin gframework.boot<
19、;/grou pld><artifactld>s pri ng-boot-starter-test</artifactld><sc op e>test</sc ope></dependency></de penden cies><build><p lugi ns><p lug in><grou pld>org.s prin gframework.boot</grou pld><artifactId>s prin g-boot-mave n-p l
20、ugi n</artifactld></p lug in></p lugi ns></build>此时,依然报错:</p roject>Cannot determ ine embedded database driver class fordatabase type NONE解决办法:注释掉 pom 文件中jap和 session,在完成以后, pom 配置如下<?xml versio n="1.0" en codi ng="UTF-8"?> <pr oject xmln s=
21、"" xmln s:xsi=""xsi:schemaLocati on=""><modelVers ion> 4.0.0</modelVers ion><grou pl d>com.exa mp le</grou pld><artifactld>demo</artifactld><versio n>0.0.1-SNA PSHOT</versio n><p ackagi ng>jar</packagi ng>&l
22、t;n ame>demo</name<descri pti on >Demo p roject for Spring Boot</descri pti on><parent><grou pld>org.s pri ngframework.boot</grou pld><artifactld>s prin g-boot-starter -paren t</artifactld><versio n>1.3.3.RELEASE</versio n><relative Path
23、/<!- looku p p are nt from rep ository</parent><prop erties><p roject.build.sourceE ncodi ng>UTF-8</pr oject.build.sourceE ncod ing><pr oject.re portin g.out putE ncod in g>UTF-8</project.re portin g.out putE ncodi ng><java.versi on >1.8</java.vers ion
24、></prop erties><de penden cies><dependency><grou pld>org.s prin gframework.boot</grou pld> <artifactld>s pri ng-boot-starter-a op</artifactld></dependency> <dependency><grou pld>org.s prin gframework.boot</grou pld> <artifactld&
25、gt;s pri ng-boot-starter-web</artifactld></dependency> <dependency><grou pld>org.s prin gframework.boot</grou pld> <artifactld>s pri ng-boot-starter-test</artifactld><sc op e>testv/sc ope></dependency> <dependency><grou pld>org.s p
26、rin gframework.boot</grou pld> <artifactld>s pri ng-boot-starter-thymeleaf</artifactld></dependency></de penden cies><build><p lugi ns><p lug in><grou pld>org.s prin gframework.boot</grou pld> <artifactId>s pri ng-boot-mave n-p lug in
27、</artifactld></p lug in></p lugi ns></build> </p roject>然后我们再点击那个三角形运行,你会发现运行成功啦如下图所示:Spring boot基础文档Spring boot基础文档起来后,其实就相当于跑起来一个网站。 现在让我们去网页里看看我们的Hello World 有没有正常工作吧-在浏览器里,打开,你会发现输出了Hello World来源:Spring boot 在 Spring mvc 下接入微信在我们搭建好Spring boot环境后,可以很容易的使用 Spring mvc
28、,不需要复杂 的配置,只需要做一些基本的注解就行了。这一章讲述如何在Spring mvc下去接入微信。一、接入微信需要一个公网IP,这里我们使用的是ngrock内网穿透工具。运行-cmd,进入ngrock解压目录,输入命令 ngrok -subdoma in yxpeng kn fig二n grok.cfg 80 其中yxpeng是可以自己配置的子域名,8080端口通常设置为你的项目运行 的端口,因为我这边默认的是 8080,所以我设置成了 8080.59 Cf;wiridow5Mystem32imd.e-Ke 口 | 国(Ct r-L-l-C to quit?U ine1 Statusnr
29、L:t - pJersion1,7/1 .7ForuArdinglittp:/yxpeng hn-atn.con-> :89S0ForuArdlnglittps -Z/ifxpeng.lin-atn.con-> i2?00i活胎9>Jeb Interface127,6,0.1:4646tt Conn6Fivgr Conn Time五 61 24insHTTP Reyuests/*wec hatzchec EXyxpGET Zuec liatZc hec kZyxpGET Zuechat/checkZyxp2Q6Z2QB3EI Zfauicon,ico2QBG
30、ET /200GET zuee hat/chee k/yxp266二、与用servlet接入微信一样的,我们需要接受到微信后台通过get请求传过来的几个参数。首先,写了一个model,其中封装了这四个参数。 Package com.exampie.model|;/*微信接入校验信息model* Created by Admi nistrator on 2016/11/8 0008. */p ublic classCheckModel p rivateString sig nature ;privateLong timestamp ;p rivateLong non ce;privateStri
31、ng echostr ;publicStringgetSignature () return sig nature ; p ublic void setSig nature (Stri ng sig nature) this . sig nature = sig nature ; p ublic Long getTimesta mp () returntimestamp ;public voidsetTimestamp (Long timestamp) this . timestamp 二 timestamp ;p ublic Long getN once() retu rnnon ce;p
32、ublic voidsetN once(Long nonce) this . nonce = nonce ;public String getEchostr () return echostr ;public voidsetEchostr (String echostr) this . echostr = echostr ;创建一个controller类,其中添加一个 validate方法,用来接收这个 model并进行处理p ackage com.example.c on trollerimport com.example.model.webModel.User ; import com.e
33、xa mp le.service.UserService ;import org.s prin gframework.bea ns.factory.a nn otatio n.Autowiredimport org.s prin gframework.boot.autoc on figure.E nableAutoC on figurati on import org.s prin gframework.web.bi nd.a nn otatio n.P athVariable;Import org.s prin gframework.web.b in d.a nno tati on .Req
34、uestMa pping import org.s prin gframework.web.b in d.a nno tati on .Res pon seBody;import org.s prin gframework.web.bi nd.a nn otatio n.RestCo ntroller/* Created by Admi ni strator on 2016/11/9 0009.*/RestCo ntrollerRequestMappin©"/user") En ableAutoC on figurati on p ublic classUserC
35、 on troller Autowiredprivate UserService userService ;RequestMa ppin g "/check/ name")public ResponseBodyString addUser( PathVariable ("name") String n ame)User user = new User();user.getUserNameQ ;user.setUserName(name); user.setPassword( "123"); user.setRealName( ” 喻学
36、鹏”); userService .saveUser(user); returnpublic ResponseBodyString findUserByName( PathVariable (”name") Stri ng n ameHnull;User u 二u 二 userService .findByUserName(name);if (u 匸 null )return u.getRealName(); else return "未找到"在tokenService中,分离出这四个参数,然后对token,timestamp 和nonce这三个参数进行字典排序,
37、然后进行SHA1加密,将密文与sig nature对比,如果相同就返回echostr.package com.example.service ;import com.example.model.CheckModel ;import com.example.util.E ncoderHa ndler;import org.s prin gframework.stereot yp e.Service;import org.s prin gframework.tra nsactio n.a nno tatio n.Tran sactio nal import java.util.Arrays/* *
38、 Created by Admi nistrator o n 2016/11/8 0008.*/Servicepublic class Toke nService /*微信接入数据验证p aramwxToke n* paramtokenModel* return*/Tra nsacti onalpublic String validate (String wxToken , CheckModel tokenModel) String sig nature = toke nModel.getSig natureO;Long timestamp = toke nModel.getTimestamp
39、O;Long nonce =toke nModel.getN once():String echostr = toke nModel.getEchostr();,timestamp+"”,nonce+"" ;if (signature!= null &×tamp! =null &nonce!= null ) Strin gn str = wxToke n二、登录微信公众平台 开发-基本配置基亟配置请填写接口配逼信目曲信目寵琴悔掏肓目己的服务影施泯 埴写的URL需要正确响应微信发送的Token验证请阅凑寺人垢南.URLhtTp:/x
40、peng.hnnatm-com/wec ha t/check/yx p必疯LMh呼或dug历T头,分別支持go端口和443猛CLTokenyxp£殖为英袞弼宁,长度为于交字符直 什么是TokEH ?EncodingAESKeyL 5F 0 6vJrVG4F7PFQ 0 ruQjjpsdiy&ZQxGVx nlTUfTp 43/43礎机生成消息加密密钥由42fF宅符细戍,可随护慈改J宁苻范围为A-2 ” a-z "T曰 什么是EncodingAESKey F消息SC碍方武请根据业务題选择消慝加翼冒类型,后用后籽立即生效明文樓弍明立模式下,不(吏用;肖息体力Dm功能,安
41、全崇魏较f氐薛容樟弍-| nn-rJ-i- .zj. JLX-/ -H-,E-rrtxi+J口 jfFm填写好URL和token后,点击提交,微信后台就会想填写好的URL发送GET请求。如果校验无误,就会提示接入成功。Jp aRe pository来源:什是 Repository ?2.1 Repository (资源库):通过用来访问领域对象的一个类似集合的接口,在领域与数据映射层之间进行协调。这个叫法就类似于我们通常所说的DAO,在这里,我们就按照这一习惯把数据访问层叫Rep ositorySpring boot基础文档Spring Data给我们提供几个 Repository,基础的Re
42、pository提供了最基本的数据访问功能, 其几个子接口则扩展了一些功能。它们的继承关系如下:Spring自动扫描Repository :仅仅是一个标识,表明任何继承它的均为仓库接口类,方便 识别CrudRepository : 继承 Repository,实现了一组 CRUD 相关的方法PagingAndSortingRepository:继承 CrudRepository,实现了一组分页排序相关的方法比较特殊,不属于 Repository体系,实现一组 JPA Criteria查JpaRepository :继承 PagingAndSortingRepository,实现一组 JPA 规
43、范相关的方法JpaSpecification Executor询相关的方法 我们自己定义的 XxxxRepository 需要继承JpaRepository,这样我们的XxxxRepository 接 口就具备了通用的数据访问控制层的能力。2.2 Jp aRe pository 所提供的基本功能2.2.1 CrudRe pository<T, ID exte nds Serializable>:这个接口提供了最基本的对实体类的添删改查操作T save(T entity);/保存单个实体Iterable<T> save(lterable<? exte nds T&g
44、t; en tities);/保存集合T findOne(ID id);/ 根据 id 查找实体boolean exists(ID id);/ 根据id判断实体是否存在 lterable<T> findAII();/ 查询所有实体,不用或慎用! long count();/查询实体数量void delete(ID id);/ 根据 Id 删除实体void delete(T en tity);/ 删除一个实体void delete(Iterable<? exte nds T> en tities);/删除一个实体的集合void deleteAIIO;/删除所有实体,不用或
45、慎用! 2.2.2 P agi ngAn dSort in gRe po sitory<T, ID exte nds Serializable这个接口提供了分页与排序功能lterable<T> fin dAII(Sort sort);/排序P age<T> fin dAII( Pageable pageable);/分页查询(含排序功能)2.2.3 Jp aRe po sitory<T, ID exte nds Serializable |这个接口提供了JPA的相关功能List<T> findAII();/ 查找所有实体List<T>
46、 findAII(Sort sort);/排序 查找所有实体List<T> save(IterabIe<? exte nds T> en tities);/保存集合void flush();/执行缓存与数据库同步T saveA ndFlush(T en tity);/强制执行持久化void deletel nBatch(lterable<T> en tities);/删除一个实体集合3.S pring data 查询3.1简单条件查询:查询某一个实体类或者集合_按照Spring data 定义的规则,查询方法以find|read|get开头涉及条件查询时,条
47、件的属性用条件关键字连接,要注意的是:条件属性以首字母大写其余字母小写为规定。例如:定义一个 Entity实体类class User p rivate String first name;Spring boot基础文档p rivate String last name;使用And条件连接时,应这样写:fin dByLast nameA ndFirst name(Stn ng last name,Stri ng first name);条件的属性名称与个数要与参数的位置与个数 对应3.2使用JPA NamedQueries(标准规范实现)这种查询是标准的 JPA规范所定义的,直接声明在Entit
48、y实体类上,调用时采用在接口中定义与命名查询对应的method,由Spring Data根据方法名自动完成命名查询的寻找。(1 )在Entity实体类上使用 NamedQuery 注解直接声明命名查询。En tityNamedQuery (n ame = "User.fi ndByEmailAddress",query = "select u from User u where u.emailAddress = ?1") p ublic class User 丨注:定义多个时使用下面的注解NamedQueries(value = |NamedQuery(
49、 name = User.QUERY_FIND_BY_LOGIN,query = "select u from User u where u." + User. PROP_LOGIN + " = :user name"),NamedQuery (n ame = "getUser name PasswordToke n",query=com.ace on a.weibo.vo.Toke nBO(u.user name, u.p assword)User. PROP_LOGIN"selectnewfrom User u wher
50、e u." + " = :user name")(2 )在in terface中定义与 对应的方法P ublic in terface UserRe po sitory exte nds Jp aRe pository<User, LongList<User> fin dByLast name(Stn ng last name);User fin dByEmailAddress(Stri ng emailAddress);3.3使用Query自定义查询(Spring Data提供的)这种查询可以声明在Rep ository 方法中,摆脱像命名查询
51、那样的约束,将查询直接在相应的接口方法中声明,结构更为清晰,这是Spring data的特有实现。例如:p ublic in terface UserRe po sitory exte nds Jp aRe positoryvUser, LongQuery("select u from User u where u.emailAddress = ?1")User fin dByEmailAddress(Stri ng emailAddress);J3.4 Query 与Modifying 执行更新操作这两个annotation 起声明,可定义个性化更新操作,例如只涉及某些字
52、段更新时最为常用,示例如下:Modifyi ngQuery(" up date User u set u.first name = ?1 where u.l ast name = ?2") int setFixedFirst nameFor(Stri ng first name, String last name);3.5索引参数与命名参数(1)索引参数如下所示,索引值从1开始,查询中” ?X”个数需要与方法定义的参数个数 相一致,并且顺序也要一致Modifyi ngQuery(" up date User u set u.first name = ?1 where u.l ast name = ?2")int setFixedFirst nameFor(Stri ng first name, String last name);(2 )命名参数(推荐使用这种方式)可以定义好参数名,赋值时采用Param(”参数名”),而不用管顺序。如下所示:first nameor u.last namep ublic in terface UserRe po sitory exte nds Jp aRe pository<User, LongQuery("select u from U
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 探讨小学信息技术对学生核心素养的培养
- 学校与实习单位签订实习基地协议书(2篇)
- 浅谈中药材市场电子商务发展
- 爱心传承约定:遗嘱遗产协议
- 《企业员工降级管理协议》
- 电梯日常巡检记录制度
- 水泥厂扬尘监测与治理方案
- 建筑设计院的造价评估制度
- 高标准农田灌溉系统建设方案
- 绿色节能建筑材料采购方案
- 漆包线检验方法介绍
- 工商管理论文提纲模板
- 餐厨废弃物处置登记表
- 雕塑施工方案
- 80T水泥罐安装方案9.18
- ASTM_A29/A29M热锻及冷加工碳素钢和合金钢棒
- 社区委员的辞职报告 社区两委辞职报告
- 简历常用icon图标Word简历模板
- 社区老年人群保健与护理PPT课件
- 【行业】电动车动力电池包高清大图赏析
- F1等级砝码标准报告
评论
0/150
提交评论