2010-04-15 134 views
2

我必须使用一些不是真正MVC的代码(即,它不使用显式框架等)。现在我们做一些将数据传递给服务的servlet。MVC实现/最佳实践问题

这是我的问题。我正在收到一个包含大量地址数据的servlet的文章,我必须将其保存到数据库中。数据显然在HttpServletRequest对象中。我的问题是,我如何将这些数据传递给服务?我不愿意这样做:

AddressService.saveAddress(request); 

因为我不认为服务应该有一个依赖于请求。我的另一种选择是做这样的事情:

String addressLine = request.getParameter("addressLine"); 
.. 
.. about 7 other parameters 
.. 
String zip = request.getParameter("zip"); 

AddressService.saveAddress(addressLine, ... 7 other parameters ..., zip); 

,但我不喜欢用的参数数量庞大的功能无论是。我正在考虑创建一个名为AddressData的中间对象,该对象将保存请求中的数据,然后将其传递到服务中。这是一种可以接受的做事方式吗?

回答

2

是的,这是消除这种依赖性的已知方法。我无法从头脑中回想起确切的来源,但有几本书包含了这种技术。

这样做的一个变种是使AddressData成为一个包装,它不是自己复制和保存所有需要的请求数据,而只是保留一个私人引用,并将所有调用转发给它。这可能更灵活和更清洁,特别是如果有许多请求参数和/或参数改变/新频繁引入。

1

使用接口脱钩:

型号:

public interface Address { 
    String getLine1(); 
    String getLine2(); 
    ... 
    String getZip(); 
} 
public class AddressBase implements Address { 
    public AddressBase(String line1, String line2, ..., String zip) { 
     ... 
    } 
    ... 
} 
public class AddressService { 
    void saveAddress(Address address); 
} 

现在控制器(S)有自己的选择和模型由控制器执行保护:

控制器选项1:

// wrap - lazy interrogator 
class AddressRequestWrapper implements Address { 
    ... 
    AddressRequestWrapper(HttpRequest request) { 
     this.request = request; 
    } 
    String getLine1() { return request.get(LINE_1_FIELD_ID); } 
    ... 
} 

控制器选项2:

// "wrap" - eager interrogator 
class AddressRequestWrapper extends AddressBase { 
    AddressRequestWrapper(HttpRequest request) { 
     super(
      request.get(LINE_1_FIELD_ID), 
      request.get(LINE_2_FIELD_ID), 
      ... 
      request.get(ZIP_FIELD_ID) 
     ); 
    } 
    ... 
} 

控制器选项3:

// Just use AddressBase directly 
Address address = 
    new AddressBase(
      request.get(LINE_1_FIELD_ID), 
      request.get(LINE_2_FIELD_ID), 
      ... 
      request.get(ZIP_FIELD_ID) 
    ); 
AddressService.saveAddress(address);