我有一个java webapp,它有一个servlet doPost接受一些json POST。让我们称之为" Person"。所以它会收到类似{name:" Joe",年龄:35}的内容。然后还有杰克逊的数据绑定类,可以捕获这个......就像
一样public class Person {
public String name;
public int age;
}
我目前在Servlet类中发生了数据库事务。因此,就像servlet接收请求一样,将其反序列化为Person对象,然后获取结果对象并创建JDBC连接并运行插入。构建这个的最佳方法是什么?这样可以吗?我觉得持久性应该更多地与对象本身相关联而不是与servlet相关联。我应该将数据库功能放入Person obj吗?或者创造一些新的东西&#34;处理它?</ p>
答案 0 :(得分:1)
我觉得持久性应该更多地与对象本身相关联 而不是servlet。
两者都不正确,基本上,我们需要正确分层应用程序,即,我们应该不要混淆前端(用户界面)问题和业务逻辑,并在下面查看有关分层的更多说明网络应用程序。
我应该将数据库功能放入Person obj吗?或者创造一些 处理它的新“事”?
不,您需要像使用DAO(数据访问对象)或存储库层一样单独处理数据访问层。
通常,Web应用程序架构的工作方式如下:
HTML / JSP - &gt; Servlet&amp;控制器类 - &gt;服务层 - &gt; DAO层 - &gt;数据库强>
这些层中的每一层都是出于其自身原因,我们不应该混淆这些问题。
现在专门讨论DAO层(看这里DAO模式如何工作),有各种框架可以使事情变得更容易,而ORM(对象关系映射)是你可能感兴趣的概念。简而言之,流行的ORM框架是Hibernate和Spring data JPA。
<强>更新强>
因此,servlet接受请求,将数据反序列化为某些请求 数据绑定与JSON模式匹配的类。然后它传递给那些 一些“服务层”,它进行某种操作和生成 与表结构匹配的DAO对象并将其保存下来?
你几乎就在那里,唯一缺少的是DAO对象是单例类(它们不包含数据,只提供访问数据库的方法),模型/实体bean实际上用于保存数据。
您可以参考以下简单示例,假设它正在访问数据库中的PRODUCT
表:
ProductDAOImpl类(单例对象):
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应该是分开的,即,不是跨这两个层共享bean的好方法,因为一个处理业务逻辑和另一个是用户界面(前端),两者都应该松散耦合。