2017-04-11 95 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