gpt4 book ai didi

java - 如何在 servlet 应用程序中实现服务层

转载 作者:行者123 更新时间:2023-11-29 07:19:03 25 4
gpt4 key购买 nike

假设我想为使用 servlet 的 Web 应用程序创建一个服务层,我应该怎么做?(我没有使用 Web 应用程序框架。所以,请多多包涵)。我应该将其实现为一个监听器?该服务旨在进行数据库访问。也就是说,我应该能够从我的 servlet 中调用

class MyServlet{
...
doPost(...){
...
MyEntity entity = dbAccessService.getMyEntity(someId);
...
}
}

dbAccessService 应该在哪里处理 hibernate session 、事务等。以前我曾经在 dao 方法中执行所有这些操作,但有人告诉我这不是一个好主意。

欢迎提出建议

谢谢

标记

下面给出了示例代码片段

    class DBAccessServiceImpl{
...
private MyEntity getMyEntity(Long id){
Transaction tx = null;
MyEntity me = null;
Session session = HibernateUtil.getCurrentSession();
try{
tx = session.beginTransaction();
return entitydao.findEntityById(id);
}catch(RuntimeException e){
logger.info("problem occurred while calling findEntityById()");
throw e;
}
}
...
}

然后创建监听器实例化DBAccessService

class MyAppListener implements ServletContextListener {

@Override

public void contextInitialized(ServletContextEvent ctxEvent) {

ServletContext sc = ctxEvent.getServletContext();
DBAccessService dbservice = new DBAccessServiceImpl();
sc.setAttribute("dbAccessService",dbservice);

}
}

在web.xml中添加监听

...
<listener>

<listener-class>myapp.listeners.MyAppListener</listener-class>

</listener>
...

最佳答案

假设您不想引入框架,有两种选择(在我看来)是有意义的:

  1. 使用无状态 EJB session bean 定义您的服务层。您需要一个 EJB 容器。
  2. 一如既往地使用 OO 语言,创建接口(interface)和相应的实现:

定义接口(interface)

public interface BusinessService {
abstract public BusinessObject performSomeOperation(SomeInput input);
}

和实现

public class BusinessServiceImpl implements BusinessService {
public BusinessObject performSomeOperation(SomeInput input) {
// some logic here...
}
}

您有多个实例化服务的选项。如果您从头开始使用一个小型应用程序,则只需在您的 Web 应用程序中实例化该服务就足够了:

BusinessService service = new BusinessServiceImpl();
service.performSomeOperation(...);

顺便说一句:稍后您可能想要围绕服务实例化(工厂模式、依赖注入(inject)等)重构和实现一些抽象。此外,在大型系统中,您可能必须将服务层托管在其自己的基础架构上以实现可伸缩性,以便您的 Web 应用程序通过开放协议(protocol)(无论是 RESTful 还是 Web 服务)与服务层进行通信。

无论 future 如何,拥有一个定义良好的接口(interface)来定义您的业务功能,可以让您在应用程序增长时“轻松”向前推进。

对您更新的回应:我不会将服务本身实现为监听器,这没有意义。尽管如此,您的示例代码似乎是合理的,但您必须区分服务(在本例中为DBAccessService)和您实例化/检索它的方式(监听器)。您实现的监听器实际上扮演着 ServiceLocator 的角色。能够找到特定的服务。如果您将服务实例存储在 servlet 上下文中,您必须提醒服务实现必须是线程安全的。

您必须小心,不要过度设计您的设计 - 只要您无法预见进一步的复杂需求,就应保持简单。如果它还不复杂,我建议使用简单的静态工厂方法封装实现:

public final class ServiceFactory {

public static DBAccessService getDBAccessService() {
DBAccessService service = new DBAccessServiceImpl();
return service;
}
}

可以使用复杂的替代方案来实现 ServiceFactory,现在有些人称它为反模式。但只要你不想从依赖注入(inject)(等)开始,这个仍然是一个有效的解决方案。服务实现 DBAccessServiceImpl 只能在一个地方(工厂)访问。正如我之前提到的 - 密切关注多线程......希望这会有所帮助!

关于java - 如何在 servlet 应用程序中实现服务层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6881280/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com