Spring Boot / Spring MVC 入门实践 (四) :需求记录网站的实现
2016-10-27 22:24
716 查看
声明
本系列文章系本人原创,欢迎转载,转载请注明出处。本系列文章通过具体的例子,介绍如何通过spring Boot来帮助简化Spring MVC开发Web Application的过程,旨在通过具体的实践,使读者能够入门利用Spring Boot开发Web Application。
对于文章中贴出的代码,本人均在本地测试过,如果大家对代码有疑问,欢迎在评论区指出。如果大家发现了文章中描述不对的地方,也欢迎指出,以便大家共同进步。
一、需求记录网站的实现
项目的源代码可以从GitHub上获取(由于GitHub上的这个项目是在本系列文章之前写的,可能会与本系列文章中的代码不完全一致,但是项目框架与用到的技术是类似的,所以在这里提供链接以供读者参考):https://github.com/linux-subscribe/simplerequirementtracker.git
我们这个演示项目中,需求是按模块化分的,比如下面这个例子:
如图,一个购物网站的建设可能包含前台和后台,而前台又可能包含页面布局和色彩样式。这样一层层下去就会得到一个树型结构,这整个树形结构就是我们一个完整的需求。
这个树形结构中的每一个节点对应为一个Java类 : Module, 在Module类中,我们定义了如下成员变量:
//树形结构中每个节点的唯一标识 private String id; //父节点的id private String parentModuleId; //所有子节点id的list private List<String> subModuleIdList; private String name; private String description; private String status; //每个模块都有可能包含需求文档,所以我们在Module类里面加了这个attachmentPathList,来存储该模块所有文档的地址 private List<String> attachmentPathList; //省略了一些常见的实现起来很简单的get/set/add/remove/equals/hashcode等方法,详情请下载项目代码。
接下来我们来看一下怎样把Module对象持久化到数据库中。数据库我们使用MongoDB。
和前面的章节中讲到的MySQL一样,我们把MongoDB的配置存在src/main/resources/application.properties里面。(这里我们不深入讨论MongoDB的安装及配置,有兴趣的读者可以自行搜索资料安装配置,然后将下面的语句根据自己的环境作适当修改后添加到该文件中):
spring.data.mongodb.uri=mongodb://dba:dba@127.0.0.1:27017/srt
接下来是数据库操作的实现类:
@Repository public class SimpleModuleRepository implements IModuleRepository{ @Autowired private MongoTemplate mongo; @Override public void updateModule(Module module) { mongo.findAndModify(Query.query(Criteria.where("id").is(module.getId())), Update.update("name", module.getName()) .set("description", module.getDescription()) .set("status", module.getStatus()) .set("parentModuleId", module.getParentModuleId()) .set("subModuleIdList", module.getSubModuleIdList()) .set("attachmentPathList", module.getAttachmentPathList()), Module.class); } //添加一个Module对象 @Override public void addModule(Module module) { mongo.insert(module); } //查找所有Module对象 @Override public List<Module> getAllModules(){ return mongo.findAll(Module.class); } //根据moduleId查找Module对象 @Override public Module getModuleByModuleId(String moduleId) { return mongo.findById(moduleId, Module.class); } //根据moduleId删除Module对象 @Override public void removeModuleByModuleId(String moduleId) { mongo.findAndRemove(Query.query(Criteria.where("id").is(moduleId)), Module.class); } }
可以看到,通过Spring提供的MongoTemplate,常见的增删改查操作可以很方便的完成,有兴趣的读者可以拿这个Java类和我们在之前的章节中用来向MySQL中存User信息的Java类做比较,便可看出这个类是多么的简单。
至此,所有与MongoDB交互所要做的配置及代码便完成了。
在该网站中,用户可以通过点击“+”来添加一个需求模块,点击“-”来删除一个需求模块,并且可以向服务器上传某个需求模块的文档,这些也是通过Spring实现的(前台使用AngularJs实现的,这里不做深入探讨)。我们以添加一个需求模块为例来简要说明:
@Controller public class AddModuleController { @Autowired private IModuleRepository moduleRepository; @RequestMapping(value="addModule", method=RequestMethod.POST) //注意这里的@ResponseBody和@RequestBody public @ResponseBody ModuleWrapper addModule(@RequestBody Module module){ moduleRepository.addModule(module); if(module.getParentModuleId()!=null && (!module.getParentModuleId().isEmpty())){ Module parentModule=moduleRepository.getModuleByModuleId(module.getParentModuleId()); parentModule.addSubModuleId(module.getId()); moduleRepository.updateModule(parentModule); } return new ModuleWrapper(module); } }
这就是处理添加一个需求模块请求的代码,非常简单。当服务器接收到”addModule”的POST请求的时候(如:http://localhost:8080/addModule,根据环境的不同URL可能会有所不同),便会执行这里的addModule方法。
这里的(@RequestBody Module module),表示Spring会将这次请求的请求体(Request Body)转换成Java的Module对象,就是方法中的module局部变量。下面是笔者在调试时候截取的addModule请求:
{"parentModuleId":"58120062d4c6e124cb2058f3","name":"testName","description":"testDescription.","status":"testStatus"}
可以看到,请求体(Request Body)是json格式的,Spring就是把这段json转化成我们的Module对象的。
同理,@ResponseBody指出该方法的返回值作为服务器响应的响应体(Response Body),为了方便大家更好的理解,下面是笔者调试时候截取的响应:
{ "module": { "id": "58120afcd4c6e124cb2058f7", "parentModuleId": "58120062d4c6e124cb2058f3", "subModuleIdList": null, "name": "testName", "description": "testDescription.", "status": "testStatus", "attachmentPathList": null }, "subModuleWrapperList": null, "name": "testName", "id": "58120afcd4c6e124cb2058f7", "description": "testDescription.", "parentModuleId": "58120062d4c6e124cb2058f3", "subModuleIdList": null, "attachmentPathList": null, "status": "testStatus" }
可以看到,响应体(Response Body)也是json格式的,我们的js脚本会在接收到这段json后进行处理,并最终将最新的信息展示在浏览器上。
二、总结
至此,本系列所有文章便全部完结了。可以看出,Spring Boot在一定程度上减轻了开发人员的工作量,尤其是减轻了以前冗长的配置和样板式代码。由于笔者水平有限,可能有些地方讲的不是很到位,大家可以下载源码亲自调试看看,有问题的话欢迎大家在评论区指出,大家可以一起讨论一起进步。相关文章推荐
- Spring Boot / Spring MVC 入门实践 (四) :需求记录网站的实现
- Spring Boot / Spring MVC 入门实践 (二) :MVC与Spring MVC简介
- Spring Boot / Spring MVC 入门实践 (一) :环境搭建与第一个项目
- Spring Boot / Spring MVC 入门实践 (三) : 入门项目介绍与用户注册登录的实现
- Spring Boot / Spring MVC 入门实践 (二) :MVC与Spring MVC简介
- Spring Boot / Spring MVC 入门实践 (三) : 入门项目介绍与用户注册登录的实现
- spring-boot集成spring-security的oauth2实现github登录网站的示例
- Spring Boot / Spring MVC 入门实践 (一) :环境搭建与第一个项目
- 【spring boot】9.spring boot+spring-data-jpa的入门使用,实现数据持久化
- spring4学习记录05-spring mvc实战之框架构建测试jpa借助spring-data实现自动化jpa
- spring 3.x 学习笔记_spring mvc、spring jdbc 实现网站的登录注册功能
- springboot 入门教程(6)--- 整合Spring data JPA实现CRUD(附源码)
- spring boot 最佳实践(四)--Spring MVC
- springboot 自定义注解+AOP 实现日志记录
- SpringBoot入门:新一代Java模板引擎Thymeleaf(实践)
- SPRING-BOOT入门学习记录
- spring-boot快速入门实践代码
- SpringBoot+Maven项目实战(6):整合Log4j和Aop,实现简单的日志记录
- [SpringBoot实践]spring-data-mongo自定义Repository接口及其实现
- spring-boot之入门实践