2017-04-11 75 views
1

我有一个Java Web应用程序,它有一个接受一些JSON POST的servlet doPost。让我们称它为“人”。所以它会收到类似于{name:“Joe”,年龄:35}的内容。再有就是也为杰克逊数据绑定类抓住了这个......就像Java servlet和持久性结构

public class Person { 
    public String name; 
    public int age; 
} 

我目前拥有的DB​​的东西Servlet类内部发生。所以就像servlet接收请求一样,将它反序列化为一个Person对象,然后接受这个结果对象并创建一个JDBC连接并运行一个插入。什么是最好的方式来构建这个?这样好吗?我觉得持久性应该更多地链接到对象本身而不是servlet。我应该把DB功能放到Person obj中吗?或者创造一些新的“东西”来处理它?

回答

1

我觉得持久性应该更多地链接到对象本身 比servlet。

他们都不是正确的,基本上,我们需要层应用程序正确,即,我们应该不能混淆这两个前端(用户界面)的担忧和业务逻辑及以下检查更多的解释上层叠的Web应用程序。

我应该把DB功能放到Person obj中吗?或者创建一些 新的“东西”来处理它?

不,您需要像使用DAO(数据访问对象)或存储库层一样分别处理数据访问层。

一般而言,web应用程序的体系结构是这样的:

HTML/JSP - >的Servlet & Controller类 - >服务层 - > DAO层 - >数据库

这些层中的每一个是出于其自身原因,我们不应该混淆关注。

现在特别谈论DAO层(看看这里的DAO模式是如何工作的),有各种框架可以让事情变得更容易,而ORM(对象关系映射)是您可能感兴趣的概念。仅举几例,流行的ORM框架是HibernateSpring data JPA


UPDATE:

所以,小服务程序接受该请求时,数据解串相匹配的JSON模式,一些 数据绑定类。然后将它们传递给 某些“服务层”,它会执行某种操作并生成与表结构相匹配的DAO对象并将其保存起来?

你就要成功了,你缺少的唯一的事情就是DAO对象是单实例类(不保存数据,只是他们提供的方法来访问数据库)和模型/实体Bean是真的用于保存数据。

可以参考下面的简单的例子假设它正在访问在数据库中的PRODUCT表:

ProductDAOImpl类(singleton对象):

public class ProductDAOImpl implements ProductDAO { //or ProductRepository 

    public boolean save(Product product) { 
     //add implementation 
    } 

    public List<Product> queryProducts() { 
     //add implementation 
    } 

    public Product queryUniqueProduct(String productId) { 
     //add implementation 
    } 

    //etc...any other methods you would like 
} 

产品类(一个对象每个客户/用户的要求):

public class Product { //It is an Entity class 

    private String id; 

    private String name; 

    private int price; 

    //all other fields 

    //getters and setters 
} 

如果请求和数据模型之间不匹配,该怎么办?

始终,确保两个表现层Bean和实体(数据库)模型bean应该是独立的,即,它是不共享跨越这两层豆,因为一个处理业务逻辑等是一个很好的做法对于用户界面(前端),两者应该是松耦合

+0

因此,servlet接受请求,将数据反序列化为一些匹配json模式的数据绑定类。然后它将这些传递给一些“服务层”,它执行某种操作并生成与表结构相匹配的DAO对象并将其保存下来? – MichaelB

+0

添加了一个示例,请看上面的 – developer

+0

如果请求和数据模型之间存在不匹配,那么该怎么办......比如说,您将收到“person”json的POST,如“{name:joe,age:21,address:{street :假的,城市:西雅图}}发送给“人”的控制,创造一个“人” POJO和“的PersonDAO”,然后利用了“一个AddressDao”做任何数据操作 – MichaelB