J2EE:如何更好地构建我的servlet?

时间:2011-06-02 16:46:36

标签: java servlets java-ee if-statement

我目前正在构建的网络应用程序遵循MVC。我已经构建了servlet,使得每个servlet都处理相关的操作(因此,一个servlet可能负责与设置用户帐户相关的所有操作,而另一个servlet可能用于用户对应)。目前,我有一个“action”参数附加到所有查询字符串(用于GET)和请求体(用于POSTS),并使用它来确定在这些“相关操作”servlet中要采取的操作。

换句话说,我的代码结构有点像这样:

protected void doGet(HttpServletRequest request, HttpServletResponse response)
{
    String action = request.getParameter("action");

    if(action.equals("login"))
    {
        .....
    }
    else if(action.equals("createAccount"))
    {
        ....
    }
    else if(action.equals("changePassword"))
    {
        ....
    }
    ..........
}

我在开发过程中相对较早,截至目前,我没有发现任何可维护性问题来自此设计。根据MVC,所有servlet都会调用我的实用程序类的方法;除了将响应发送回客户端之外,它们中没有进行任何实际工作。但是通过浏览SO,我会发现即使是中等大小(~10或更少“elses”)if-else语句是代码嗅觉的情绪,并建议用户不做“OOP方式”。< / p>

有没有更好的方法来过滤进入我的servlet的请求类型?我希望能够提高我的应用程序的可维护性,但不愿意实施OOP功能只是因为它们是OOP(类似于人们鄙视坚持严格封装的纯粹主义者,他们有24个单行的地步getter / setter方法)。

3 个答案:

答案 0 :(得分:2)

您是否考虑使用预先制作的MVC框架,例如Apache StrutsSpringGoogle SiteBricks?所有这些都很棒,可能会大大减轻您的代码负担。我强烈建议你去那条路。你可以省去自己的一些头痛和维护噩梦。

如果由于某种原因你不能,那么说实话,我认为你所做的事情一定不会有问题。它似乎清晰可维护。实际上,你所做的,与Sinatra等微框架在基本URL处理方面的工作方式非常相似,尽管它们使用了一些很好的语法糖。

答案 1 :(得分:2)

除了使用Jonathan建议的框架之外,您还可以将功能分解为多个servlet。您必须决定逻辑中断的位置,但您的URL将更接近REST API。

示例网址为http://myapp.com/create_accounthttp://myapp.com/login

每个URL都可以映射到不同的servlet。

答案 2 :(得分:1)

如果您只是想避免使用大型if语句的代码味道并且更多OO,那么如果您可以使用实用程序类来实现相同的接口,则可以尝试使用反射式实例化。基本上,action参数的值将是实际类名(或其中一部分,前缀或附加适当值)的表示。

String action = request.getParameter("action");
Class clazz = Class.forName(action);
UtilityInterface utilityObj = (UtilityInterface)clazz.newInstance();