Spring Boot / Spring MVC 入门实践 (四) :需求记录网站的实现

来源:互联网 发布:男士 护肤品牌 知乎 编辑:程序博客网 时间:2024/05/29 17:02

声明

本系列文章系本人原创,欢迎转载,转载请注明出处。

本系列文章通过具体的例子,介绍如何通过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

接下来是数据库操作的实现类:

@Repositorypublic 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实现的,这里不做深入探讨)。我们以添加一个需求模块为例来简要说明:

@Controllerpublic 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在一定程度上减轻了开发人员的工作量,尤其是减轻了以前冗长的配置和样板式代码。由于笔者水平有限,可能有些地方讲的不是很到位,大家可以下载源码亲自调试看看,有问题的话欢迎大家在评论区指出,大家可以一起讨论一起进步。

0 0
原创粉丝点击