java - 如何向业务逻辑发送请求参数

标签 java servlets business-logic application-server

<分区>

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

最佳答案

您应该将您的业务逻辑分离到一个单独的类中,该类实现一个接口(interface),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 类型的交互和序列化,而逻辑封装在接口(interface)后面的其他地方 - 因此每个类都可以单独进行良好测试。

关于java - 如何向业务逻辑发送请求参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33982820/

相关文章:

java - 将 char 数组列存储到字符串中以进行比较

Java 子串迭代问题

android - 在从android发送的servlet中检索json

sql - 使用数据库的主键作为业务对象标识符是一个坏主意吗?

php - 将工作时间添加到时间戳

java - Android:RelativeLayout 中不能存在循环依赖

java - 为什么 javac 有时会创建不必要的变量副本?

java - Jetty设置Servlet与JSP页面通信

java - 如何将对象参数从 servlet 传递到 jsp 页面?

c# - 业务验证逻辑代码异味