Servlet中的静态类

时间:2009-10-27 12:30:02

标签: java servlets static controller

我在servlet中创建静态类,这些类是网页的控制器。请求被控制器URL重定向到控制器,这些控制器URL位于包含所有控制器的静态HashMap中。是否有任何可能的用户/会话实现的东西可能会被其他用户会话弄乱?我当然会将所有与会话相关的数据保存到HttpSession,并在调用控制器请求处理程序时将请求,响应和HttpSession对象提供给控制器。

更新:

以下是示例:

public class MainControllerServlet extends HttpServlet {
static HashMap<String, ControllerAbstract> controllers = new HashMap<String, ControllerAbstract>();

    public MainControllerServlet()
    {
        controllers.put("url", new Controller());
    }

}

ControllerAbstract:

public abstract class ControllerAbstract {
    private String url;
    private HashMap<String, ControllerAbstract> children = new HashMap<String, ControllerAbstract>();

    public abstract void handleRequest(HttpServletRequest request, HttpServletResponse response, SessionBean session, String type) throws Exception;

}

6 个答案:

答案 0 :(得分:2)

你的意思是静态参考?没有静态类,除非它们是内部类,但它们没有静态行为。 如果您使用静态引用作为控制器,则需要关注这些控制器中的所有属性。

答案 1 :(得分:2)

静态内部类是另一个包中普通类的替代方法。因此,您不必担心它们与您的servlet类混淆。

由于您通过servlet调用调用.handleRequest()方法,因此必须确保控制器的实现重入。即它们的执行不应该使用堆栈以外的变量存储以及作为参数传递的对象。

那就是说,我会选择将控制器放在包含servlet的包之外的自己的包中。然后,您可以添加一个拥有并初始化映射的管理器类,并处理来自servlet的调用(抽象实现细节。)

答案 2 :(得分:1)

据我所知,静态类只不过是一个嵌套类。所以我不明白为什么它应该与普通的公共课不同。

答案 3 :(得分:1)

静态内部类的行为与普通类完全相同,它们只有一个额外的范围。也就是说,如果您通过在外部类中使用静态变量来共享类之间的状态,那么这可能会导致问题。鉴于您已经说过只使用HttpSession对象在调用之间传递数据,那么这对您来说不会有问题。

答案 4 :(得分:1)

从您的代码看起来就像您使用静态散列图而不是静态类,因此您在所有用户之间共享地图。我看到了一些问题 -

  • 您的地图不是线程安全的,这可能是对象创建和检索之间冲突的问题。鉴于潜在的共享/线程问题,您还在哪里将对象放入地图?
  • 您的ControllerAbstract对象具有状态,您可能会遇到多个请求将使用同一个控制器的情况。例如,任何请求是否会在自己的ControllerAbstract对象中添加子hashmap?您可以使用相同的ControllerAbstract进行多次请求 - 例如如果请求1想要添加或删除它的ControllerAbstract.children映射,而引用相同对象的请求2决定它需要遍历子节点,则会得到ConcurrentModificationException。
  • Servlet构造由容器管理。如果你要对url进行硬编码以使其存在于servlet的构造函数中,它只是一个常量字符串吗?如果是这样,将它声明为ControllerAbstract对象中的常量会不会更容易?如果没有,它来自哪里?无论如何,只要容器决定需要创建一个新的servlet,你所做的就是改变控制器的映射。

答案 5 :(得分:1)

你在做什么看起来对我很好。只需确保您不在Controller实现中的成员变量中存储任何内容。我还假设你只是在servlet实例化时将对象放入控制器映射中。