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

声明

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

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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值