Java 如何为不同的表示层设计应用程序?

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

我是使用专有mvc框架开发web应用程序的团队的一员。 这个框架的行为有点像穷人的struts!它有一个中央控制器,在属性文件中进行配置,生成类似torque的数据库操作类,并且没有表单bean

假设您有一个用户帐户编辑屏幕,下面是开发人员正在编写的一段典型代码: 公共类处理程序扩展了StupidFrameworkBaseHandler{

// 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);
    }

    }
我觉得这种总体设计很糟糕,原因有很多:

  • UserBO是一个没有状态的类。 它只是一组具有 程序守则
  • 如果将其称为层, 那么每一层都不应该依赖于 另一个:UserBo总是 每种类型需要一种FormBean 方法,如果忽略HTML 并重新使用来自 独立java应用程序,我会 没有创造就永远不能成功 FormBeans作为参数
  • 代码看起来很恐怖,而且 无法维护
  • 因此,我的问题是:

    您不应该开发一个独立于表示层的业务层吗?我宁愿用适当的状态、验证和异常抛出来编写业务对象的代码?

    上面提供的代码不是很糟糕的非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。