当前位置: 首页 > 面试题库 >

服务层和控制器:谁来照顾什么?

麻桐
2023-03-14
问题内容

在课堂上,我们现在学习如何构建Spring应用程序,即使没有直接涉及spring,我们也学习了如何为DAO和服务层对象创建接口。

如果我错了,请纠正我:DAO层是非常抽象的:它仅包含CRUD操作,并且还用于读取数据(即:获取所有对象,获取特定对象等)

服务层:包含用于创建事物和删除事物的服务,这是业务逻辑应该存在的地方。

现在,所有这些对于服务层来说都是有意义的。除了“更新”对象。您是否只是放置了一个“更新”功能,将对象保存在数据库中?还是您还需要在其中定义逻辑?这就是我的困惑所在,我的理解是Spring中的对象只是POJO的对象。现在,谁来验证数据?

比方说,我有一个对象“孩子”有:NameSurNameGenderPhotoBirthdate
领域。我将如何命名服务?还是让控制器负责验证,这对我来说似乎不合适。另一方面,将每个需要调用的setter委托给服务层似乎也不对。

所以基本上就可以了:帮助我定义如何通过服务层保存对象。


问题答案:

如果希望控制器能够持久保存对Child对象的更改,那么传统上您将在服务中拥有一个名为的方法,例如ChildService.update(Child newchild),该方法将处理调用正确的DAO以持久化此Child的新版本。

控制器可以自由地为孩子请求服务,更改字段(可能基于某些用户输入)-理智的设计将使控制器对子POJO进行一些工作,然后要求服务保留更改。POJO模型应该对控制器,服务或DAO一无所知,而只是按照您的建议简单地保存数据-
当然,您不希望每次调用setName()setGender()自动导致数据库更新。

相反,控制器和/或服务应获取一个Child对象,对该对象在其工作单元中进行所需的任何工作,然后请求服务(然后由DAO)保留更改。

验证可以分几层进行-
html" target="_blank">控制器可能想要验证来自Web用户的任何输入,服务可能想要验证它是否具有有效Child对象,然后再将其持久化。如果您想以其他功能重用此服务(例如公开REST接口,不同的前端等),则在两层进行某种程度的验证尤其有意义。



 类似资料:
  • 问题内容: 在课堂上,我们现在学习如何构建Spring应用程序,即使没有直接涉及spring,我们也学习了如何为DAO和服务层对象创建接口。 如果我错了,请纠正我:DAO层是非常抽象的:它仅包含CRUD操作,并进一步用于读取数据(即:获取所有对象,获取特定对象等) 服务层:包含用于创建事物和删除事物的服务,这是业务逻辑应该存在的地方。 现在,所有这些对于服务层来说都是有意义的。除了“更新”对象。你

  • 我使用Spring Boot和Spring数据。 我认为把存储库层和服务层分开是没有问题的 null null 在我的控制器中,我必须从UserService调用方法,有时还必须从UserRepository调用方法。目前,我将两者都注入到控制器中,并调用service或repository 我只是问,因为我混淆了在同一个类中注入两者和调用其中一个或另一个 另一方面,这意味着在服务层重复方法,如下

  • 访问控制器 ThinkPHP引入了分层控制器的概念,通过URL访问的控制器为访问控制器层(Controller)或者主控制器,访问控制器是由\think\App类负责调用和实例化的,无需手动实例化。 URL解析和路由后,会把当前的URL地址解析到 [ 模块/控制器/操作 ],其实也就是执行某个控制器类的某个操作方法,下面是一个示例: <?php namespace app\index\contro

  • 问题内容: 我已经阅读了几篇有关angularjs实体正确用法的文章:服务,工厂,控制器和指令。 我特别关心的是控制器和服务的比较。但是,没有一个帖子告诉我什么是控制器可以执行服务不能执行的操作,反之亦然。 可以列出它吗?或者仅仅是在angular的用法上规范? 问题答案: 控制器 通常用于绑定视图。控制器管理视图的生命周期,应将其视为视图控制器。将为视图的每个实例创建一个新的控制器,这意味着,如

  • 在相当长的一段时间里,我试图找出在Spring MVC应用程序中应该在哪里对用户输入进行验证。在许多在线博客和教程中,我基本上读到控制器应该验证用户的输入,如果无效,则通过显示包含错误消息的页面来响应用户。然而,我目前对Spring和Spring MVC分层系统的理解是,控制器只是应用程序逻辑(服务层)和“Web世界”之间的一个浅层接口,允许从Web使用服务层。而且,就我所见,Spring MVC

  • 问题内容: 我一直看到在AngularJS中创建控制器和服务的不同示例,我很困惑,有人可以向我解释两种方法之间的区别吗? 还有一个控制器示例: 问题答案: 第一个将污染全局名称空间,从长远来看,这不是您想要的。 第二个将控制器的作用域限定为该模块实例。它也可以注射。最好还是使用数组符号(如下所示),因为这会在最小化后继续存在。 (角度)服务与工厂之间的差异似乎很小。服务包装了工厂,工厂使用$ in