我对struts有疑问。
我有HashMap
,有近50个条目。现在我必须在一个动作类中定义这个地图,比如TestAction
。如您所知,此操作类扩展了Action
类。现在我的疑问是基本的:我应该将地图加载为静态吗?加载这个Map静态有什么好处?如果我要调用此Action类100次,这个地图只会加载一次吗?
此外,不是每次动作类调用我都可以访问此地图。如果我将此动作类调用100次,则可能只需要访问该地图40次。
如果我将此地图加载为
public Map getMap()
{
Map testMap= new HashMap();
testMap.put("Harish",25);
testMap.put("Ravi",55);
return testMap();
}
有什么缺点?哪种方法最好?
答案 0 :(得分:2)
如果您的数据永远不会改变,静态加载它似乎是最好的选择。它只会加载一次。
private static final Map testMap = new HashMap();
static {
testMap.put("Harish",25);
testMap.put("Ravi",55);
}
如果您有时需要更改它,其他因素(如测试和线程)可能会导致其他选项更为可取。
答案 1 :(得分:1)
现在编码的方式 - 每次调用getMap()方法时都会重新创建testMap。我不确定你的意思是“如果动作类被调用” - 如果在你的类上调用了getMap()方法,那么是 - 如果调用了某些其他方法而不以某种方式调用getMap() ,然后没有。
我应该将地图加载为静态吗?加载这个Map静态有什么好处?如果我要调用此Action类100次,这个地图只会加载一次?
如果您将Map 引用设为静态,则它将在类级别存在一次。您也可以静态加载Map,这只会发生一次。这应该只是在你不打算改变地图内容时才会这样做,因为你可能会遇到线程问题,或者如果不断地将数据添加到地图但是从未删除过,那么必须解决何时清空地图的问题。等等。
也不是每次动作类调用我都可以访问此地图。如果我将此动作类调用100次仅40次,则可能需要访问此地图。
如果您担心自己可能永远不需要Map,您可能需要查看延迟加载 - 使地图成为静态引用,但始终通过静态方法访问它,以检查Map是否已创建 - 以及如果不是它第一次需要而不是在启动时创建。虽然在这种情况下它可能并不重要。
我必须在动作类
中定义这个地图
我认为这更像是一个假设而不是一个要求 - 因为这是一个Web应用程序 - 更好的解决方案可能是在启动时将Map放入应用程序范围 - 几乎就像静态一样,只是它不依赖于类
您可以添加ServletContextListener来监听您的网络应用的启动和停止,并通过调用
将地图添加到应用范围servletContext.setAttribute("mapKey", testMap)
然后在您的操作中(或您的webapp中的任何其他位置),您可以致电
servletContent.getAttribute("mapKey")
然后访问您的地图。
答案 2 :(得分:0)
如果地图的内容保持静态,请将其设置为静态 - 50个条目是少量数据,对类加载时间的影响可以忽略不计。