如何向业务逻辑发送请求参数
How to send request parameters to business logic
我知道在您的 servlet 中嵌入业务逻辑是个坏主意,但在应用程序服务器端这样做是可以接受的。有时您的请求中有很多参数,您需要将所有这些参数发送到代表您的业务逻辑的 类 。怎么做会更好? (我想到了 JavaBeans,但它们是为另一个目的而设计的。)
谢谢。
您应该将您的业务逻辑分离到一个单独的 class 中,它实现了一个接口,而 servlet class 应该只负责将输入流反序列化为某种请求对象,传递它到业务逻辑对象,然后序列化响应。如果您添加一点 DI 魔术,那么定位和构建要使用的业务逻辑的正确实现会变得相当简单 class。
例子
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 为您完成所有编组和解组,您只需要编写业务逻辑代码并适当地注释 class。 Spring-MVC 和 Jersey 都这样做。重要的是 servlet class 处理所有 HTTP 类型的交互和序列化,而逻辑封装在接口后面的其他地方 - 所以每个 class 都可以单独测试。
我知道在您的 servlet 中嵌入业务逻辑是个坏主意,但在应用程序服务器端这样做是可以接受的。有时您的请求中有很多参数,您需要将所有这些参数发送到代表您的业务逻辑的 类 。怎么做会更好? (我想到了 JavaBeans,但它们是为另一个目的而设计的。) 谢谢。
您应该将您的业务逻辑分离到一个单独的 class 中,它实现了一个接口,而 servlet class 应该只负责将输入流反序列化为某种请求对象,传递它到业务逻辑对象,然后序列化响应。如果您添加一点 DI 魔术,那么定位和构建要使用的业务逻辑的正确实现会变得相当简单 class。
例子
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 为您完成所有编组和解组,您只需要编写业务逻辑代码并适当地注释 class。 Spring-MVC 和 Jersey 都这样做。重要的是 servlet class 处理所有 HTTP 类型的交互和序列化,而逻辑封装在接口后面的其他地方 - 所以每个 class 都可以单独测试。