Java 如何为不同的表示层设计应用程序?
我是使用专有mvc框架开发web应用程序的团队的一员。 这个框架的行为有点像穷人的struts!它有一个中央控制器,在属性文件中进行配置,生成类似torque的数据库操作类,并且没有表单bean 假设您有一个用户帐户编辑屏幕,下面是开发人员正在编写的一段典型代码: 公共类处理程序扩展了StupidFrameworkBaseHandler{Java 如何为不同的表示层设计应用程序?,java,oop,object,Java,Oop,Object,我是使用专有mvc框架开发web应用程序的团队的一员。 这个框架的行为有点像穷人的struts!它有一个中央控制器,在属性文件中进行配置,生成类似torque的数据库操作类,并且没有表单bean 假设您有一个用户帐户编辑屏幕,下面是开发人员正在编写的一段典型代码: 公共类处理程序扩展了StupidFrameworkBaseHandler{ // This is analogous to Struts Action // Handlers are invoked by your controlle
// This is analogous to Struts Action
// Handlers are invoked by your controller.
public void execute() {
// get form elements
}
}
}
为了引入表单bean的概念,声明了一个抽象的getFormBean()方法来扩展StupidFrameworkBaseHandler类。BaseHandler类将调用此方法。因此,目前代码如下所示:
public class Handler extends ExtendedStupidFrameworkBaseHandler {
public void execute() {
UserEditFormBean bean = (UserEditFormBean) baseBean;
// business layer classes.
}
public BaseBean getFormBean() {
// get HTTP Request parameters and build an object.
UserEditFormBean bean = new UserEditFormBean();
bean.setUser(httpRequest.getParam("whatever"));
// other setters...
}
return bean;
}
public UserBO extends BaseBO {
public void validateUserDetailsAndSave(UserEditFormBean bean) {
UserDAO dao = factory.getDao("user");
// call getters on bean, do some validations, throw business exceptions.
User objUser = new User();
object.setUserName(bean.getUserName());
// few more setters here on User -> that is the model.
dao.update(objUser);
}
}
在使用此框架开发的早期应用程序中,编码人员会将所有内容编码到处理程序中——获取数据库连接、业务逻辑等,以改变我当前应用程序中引入的业务和DAO层概念
最后的代码看起来有点像这样:
public class Handler extends ExtendedStupidFrameworkBaseHandler {
public void execute() {
UserEditFormBean bean = (UserEditFormBean) baseBean;
UserBO busObj = new UserBO();
busObj.validateUserDetailsAndSave(bean); // I know this sucks..
}
public BaseBean getFormBean() {
// grab user input from form and return a form bean instance.
}
}
业务层如下所示:
public class Handler extends ExtendedStupidFrameworkBaseHandler {
public void execute() {
UserEditFormBean bean = (UserEditFormBean) baseBean;
// business layer classes.
}
public BaseBean getFormBean() {
// get HTTP Request parameters and build an object.
UserEditFormBean bean = new UserEditFormBean();
bean.setUser(httpRequest.getParam("whatever"));
// other setters...
}
return bean;
}
public UserBO extends BaseBO {
public void validateUserDetailsAndSave(UserEditFormBean bean) {
UserDAO dao = factory.getDao("user");
// call getters on bean, do some validations, throw business exceptions.
User objUser = new User();
object.setUserName(bean.getUserName());
// few more setters here on User -> that is the model.
dao.update(objUser);
}
}
我觉得这种总体设计很糟糕,原因有很多:
上面提供的代码不是很糟糕的非Java方式吗?我建议您看看。它有一个IoC容器(控制反转)的概念并且严重依赖依赖依赖注入模式。后一种模式在解耦对象方面非常有用,这是构建应用程序层时必须确保的主要事项。层应完全独立。因此,例如,业务层永远不应引用演示文稿中的内容层。以确保您可以处理以下情况,即web表示层和独立客户端应用程序(表示层)具有相同的业务层。如果可能的话,您将走上正确的道路 要分离层,您应该始终通过相应的接口定义清晰的“契约”。因此,例如,您应该使用业务(或服务)层类MyService.java和相应的IMyService.java(或您喜欢的myserviceinpl.java和MyService.java),其中IService.java是定义MyService类的实际实现所公开的方法的接口,MyService类基本上包含您的业务逻辑。因此,您的表示层将只使用该接口连接到您的业务层。这就是Spring使用其依赖项注入的地方。在演示层上,您将拥有:
...
public void someMethod(..){
IService service = new MyService();
service.doSomething(...);
..
}
如您所见,这将通过使用MyService()对象再次耦合您的层。因此,通常避免此类实例化,并使用工厂使其更加独立(您已经做了类似于我所看到的事情),例如在配置文件中声明性地定义它等。Spring为您做了这件事。我计划写一篇文章,介绍使用Spring的分层体系结构的这些优点,但由于我目前很忙,所以不能在7月份之前写
希望这能让您大致了解应该如何做。您认为应该将业务层和表示层分开,这是正确的
我支持Spring Framework的建议,但鉴于您使用的是web应用程序,我认为您会特别感兴趣,因为它提供了您似乎正在寻找的所有功能。关于使用Spring的好处,我完全同意您的看法。但是,我没有使用它的特权。您怎么不呢hink这个问题最好不要依赖开源DI框架来解决。如果你不能使用它,为什么不模仿它呢?你的处理程序类非常类似于SpringWebMVC控制器,而你的UserBO类似于SpringValidator。