重构 Java Servlet - 寻找一个好的命名方案

发布于 2024-11-27 10:19:24 字数 1188 浏览 0 评论 0原文

我正在重构一个现有的 (Ajax) Java Web 应用程序,该应用程序目前直接在 servlet 中保存许多逻辑。 (servlet 甚至使用一些令人讨厌的技巧互相调用......)

重构本身很痛苦,但非常简单(现在重构所有内容以使用依赖注入)。

我的问题是,我真的无法想出完美的命名方案:

重构的 Servlet 现在只包含最少量的逻辑(仅处理 ServletRequest 和 ServletResponse、发送 HTTP 错误代码等)。 ),然后他们将我当前所说的称为处理器(好/坏名字?!?),它可以被多个 Servlet、测试类重用……处理器执行以下操作所需的逻辑:动作,类似于如果我们使用 EJB,那么会话 Bean 就可以了。

我从来没有想过,“Session Bean”会是一个好名字。而且我也不太热衷于定义一个单一的“外观”。我主要是在寻找一个比“Processor”更好的名称,或者可能是关于如何构建 Servlet 处理代码的一些想法。

示例

这是一个简化的示例(真正的应用程序使用 GWT 和 Gilead,...但这并不那么重要):

public class UserRegistrationServlet extends HttpServlet {

@Inject
UserRegistrationProcessor userRegistrationProcessor;

@Override
protected void doPost(final HttpServletRequest req, 
        final HttpServletResponse resp)
        throws ServletException, IOException {

    RegistrationRequest registrationRequest = parseRegistrationRequest(req);

    RegistrationResult registrationResult = 
                userRegistrationProcessor.process(registrationRequest);

    pw.print(toJson(registrationResult));

    ...
}
}

正如示例所示,我更喜欢拥有专门的处理器,它们仅负责一项任务(或者可能是一些非常重要的任务) :强相关的任务) - 与处理许多不同操作的大类相反。

I'm refactoring an existing (Ajax) Java Web application, which currently holds lots of its logic directly in the servlets. (The servlets even call each other, using a few nasty tricks ...)

The refactoring itself is painful, but pretty much straightforward (refactoring everything to use Dependency Injection now).

My problem is, that I really can't come up with the perfect naming scheme:

The refactored Servlets are now holding just a minimum amount of logic (just so much that they process the ServletRequest and ServletResponse, send an HTTP error code, etc.), then they call what I currently refer to as Processors (good/bad name?!?), which can be reused by several Servlets, Test classes, ... The processors perform the logic required for the action, similar to what a Session Bean would do if we were using EJBs.

I never thought, that "Session Bean" would be a good name anyway. And I'm also not very keen on defining a monolithic "Facade". I'm looking primarily for a better name than "Processor", or maybe some ideas how you structure your Servlet processing code.

Example

This is a simplified example (the real application uses GWT with Gilead, ... but that's not so important):

public class UserRegistrationServlet extends HttpServlet {

@Inject
UserRegistrationProcessor userRegistrationProcessor;

@Override
protected void doPost(final HttpServletRequest req, 
        final HttpServletResponse resp)
        throws ServletException, IOException {

    RegistrationRequest registrationRequest = parseRegistrationRequest(req);

    RegistrationResult registrationResult = 
                userRegistrationProcessor.process(registrationRequest);

    pw.print(toJson(registrationResult));

    ...
}
}

As the example suggests, I prefer to have specialized processors, which are responsible for one task only (or maybe a few very strongly related tasks) - opposed to a big class that handles lots of different actions.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

你的背包 2024-12-04 10:19:24

这是我基于之前讨论的示例:

public class UserRegistrationServlet extends HttpServlet {

    @Inject
    private UserRequestExtractor userRequestExtractor;

    @Inject
    private UserRegistrationService userRegistrationService;

    @Override
    protected void doPost(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {
        PrintWriter pw = response.getWriter();
        pw.print(createResponse(userRequestExtractor.extract(request)));
    }

    protected String createResponse(User newUser) {
        if (newUser == null) {
            return "{'message' : 'the user parameters are not valid'}";
        }
        else {
            UserRegistrationResult result = userRegistrationService.register(newUser);
            switch (result) {
                case SUCCESS:
                    return "{'message' : 'hurray'}";
                case EMAIL_IN_USE:
                    return String.format("{'message' : 'the email address %s is already in use'}", newUser.email);
                case USERNAME_IN_USE:
                    return String.format("{'message' : 'the user name %s is already in use'}", newUser.username);
                default:
                    return "{'message' : 'an error occurred'}";
            }
        }
    }
}

public class User {
    private String username;
    private String email;

    public boolean isValid() {
        return username != null && email != null;
    }
}

/**
 * Extractor which instantiates an object of type T from a request
 * 
 * @param <T>
 */
public interface RequestExtractor<T> {
    public T extract(HttpServletRequest request);
}

public class UserRequestExtractor implements RequestExtractor<User> {
    public User extract(HttpServletRequest request) {
        User user = new User();
        user.username = request.getParameter("username");
        user.email = request.getParameter("email");
        // validation could also be a responsibility of the RequestExtractor
        if (!user.isValid()) {
            return null;
        }
        return user;
    }
}

public interface UserRegistrationService {
    public UserRegistrationResult register(User user);
}

// implementation of UserRegistrationService omitted

public enum UserRegistrationResult {
    SUCCESS, EMAIL_IN_USE, USERNAME_IN_USE;
}

/**
 * Unit test
 */
public class UserRegistrationServletTest {

    @Test
    public void test() {
        UserRegistrationServlet cut = new UserRegistrationServlet();
        User user = new User();
        user.username = null;
        user.email = "[email protected]";

        String response = cut.createResponse(user);

        Assert.assertEquals("{'message' : 'the user parameters are not valid'}", response);
    }
}

希望这会有所帮助。

Here is my example based on previous discussion:

public class UserRegistrationServlet extends HttpServlet {

    @Inject
    private UserRequestExtractor userRequestExtractor;

    @Inject
    private UserRegistrationService userRegistrationService;

    @Override
    protected void doPost(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {
        PrintWriter pw = response.getWriter();
        pw.print(createResponse(userRequestExtractor.extract(request)));
    }

    protected String createResponse(User newUser) {
        if (newUser == null) {
            return "{'message' : 'the user parameters are not valid'}";
        }
        else {
            UserRegistrationResult result = userRegistrationService.register(newUser);
            switch (result) {
                case SUCCESS:
                    return "{'message' : 'hurray'}";
                case EMAIL_IN_USE:
                    return String.format("{'message' : 'the email address %s is already in use'}", newUser.email);
                case USERNAME_IN_USE:
                    return String.format("{'message' : 'the user name %s is already in use'}", newUser.username);
                default:
                    return "{'message' : 'an error occurred'}";
            }
        }
    }
}

public class User {
    private String username;
    private String email;

    public boolean isValid() {
        return username != null && email != null;
    }
}

/**
 * Extractor which instantiates an object of type T from a request
 * 
 * @param <T>
 */
public interface RequestExtractor<T> {
    public T extract(HttpServletRequest request);
}

public class UserRequestExtractor implements RequestExtractor<User> {
    public User extract(HttpServletRequest request) {
        User user = new User();
        user.username = request.getParameter("username");
        user.email = request.getParameter("email");
        // validation could also be a responsibility of the RequestExtractor
        if (!user.isValid()) {
            return null;
        }
        return user;
    }
}

public interface UserRegistrationService {
    public UserRegistrationResult register(User user);
}

// implementation of UserRegistrationService omitted

public enum UserRegistrationResult {
    SUCCESS, EMAIL_IN_USE, USERNAME_IN_USE;
}

/**
 * Unit test
 */
public class UserRegistrationServletTest {

    @Test
    public void test() {
        UserRegistrationServlet cut = new UserRegistrationServlet();
        User user = new User();
        user.username = null;
        user.email = "[email protected]";

        String response = cut.createResponse(user);

        Assert.assertEquals("{'message' : 'the user parameters are not valid'}", response);
    }
}

Hope this helps.

半葬歌 2024-12-04 10:19:24

为什么不按原样称呼它们:Servlet

如:

com.mycompany.app.admin.user.SaveServlet.java
com.mycompany.app.admin.user.ListServlet.java

Why not call them what they are: Servlets?

As in:

com.mycompany.app.admin.user.SaveServlet.java
com.mycompany.app.admin.user.ListServlet.java
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文