我在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;
}
答案 0 :(得分:2)
你的意思是静态参考?没有静态类,除非它们是内部类,但它们没有静态行为。 如果您使用静态引用作为控制器,则需要关注这些控制器中的所有属性。
答案 1 :(得分:2)
静态内部类是另一个包中普通类的替代方法。因此,您不必担心它们与您的servlet类混淆。
由于您通过servlet调用调用.handleRequest()
方法,因此必须确保控制器的实现重入。即它们的执行不应该使用堆栈以外的变量存储以及作为参数传递的对象。
那就是说,我会选择将控制器放在包含servlet的包之外的自己的包中。然后,您可以添加一个拥有并初始化映射的管理器类,并处理来自servlet的调用(抽象实现细节。)
答案 2 :(得分:1)
据我所知,静态类只不过是一个嵌套类。所以我不明白为什么它应该与普通的公共课不同。
答案 3 :(得分:1)
静态内部类的行为与普通类完全相同,它们只有一个额外的范围。也就是说,如果您通过在外部类中使用静态变量来共享类之间的状态,那么这可能会导致问题。鉴于您已经说过只使用HttpSession对象在调用之间传递数据,那么这对您来说不会有问题。
答案 4 :(得分:1)
从您的代码看起来就像您使用静态散列图而不是静态类,因此您在所有用户之间共享地图。我看到了一些问题 -
答案 5 :(得分:1)
你在做什么看起来对我很好。只需确保您不在Controller实现中的成员变量中存储任何内容。我还假设你只是在servlet实例化时将对象放入控制器映射中。