如何将请求参数发送到业务逻辑

时间:2015-11-29 12:36:25

标签: java servlets business-logic application-server

我知道将业务逻辑嵌入到servlet中是个坏主意,它已被接受在应用服务器端进行。有时您的请求中有很多参数,并且您需要将所有参数发送到代表业务逻辑的类。怎么会这样做更好? (我想到了JavaBeans,但它们是为另一个purpouse而设计的。) 感谢。

1 个答案:

答案 0 :(得分:1)

您应该将业务逻辑分离到一个单独的类中,该类实现一个接口,而servlet类应该负责将输入流反序列化为某种请求对象,将其传递给业务逻辑对象,然后序列化响应。如果添加一点DI魔术,那么找到并构建要使用的业务逻辑类的正确实现会变得相当简单。

实施例

public interface TheBusiness {
    MyBusinessResponse doProcess(MyBusinessRequest request);
}

public final class MyBusinessClass implements TheBusiness {
    @Override
    public MyBusinessResponse doProcess(MyBusinessRequest request) {
        // all  the complex logic goes here.
        return response;
    }
 }

 public class MyBusinessServlet extends HttpServlet {
     private final TheBusiness theBusiness;
     private final ObjectMapper objectMapper;

     public MyBusinessServlet() {
         theBusiness = // locate and construct implementation.
         objectMapper = // Initialise Jackson deserialisation.
     }

     public void doGet(HttpServletRequest request, HttpServletResponse response) {
         final MyBusinessRequest requestBody = objectMapper.readValue(
                                              request.getInputStream(), MyBusinessRequest.class);
         final MyBusinessResponse responseBody = theBusiness.doProcess(requestBody);
         objectMapper.writeValue(response.getOutputStream(), responseBody));
     }
 }

这里唯一棘手的事情是实例化你的MyBusinessClass。有不同DI框架的模式可以帮助那里。大多数情况下,它们涉及使用框架提供的servlet为您执行所有编组和解组操作,您只需编写业务逻辑代码并适当地注释类。 Spring-MVC和Jersey都这样做。重要的是servlet类处理所有HTTP类型的交互和序列化,而逻辑被封装在接口后面的其他地方 - 所以每个类都可以单独进行很好的测试。