我想知道是否有人可以就Java webapp问题提出建议?
我有一个标准的Java类,它有设置和获取属性文件值的方法。这些方法在系统范围内使用,并且由servlet和非servlet类方法调用。
但我想要做的是使用ServletContextListener来全局设置属性文件的路径,而不是对它们进行硬编码或将它们存储在数据库中。
ServletContextListener可用于使用context.setAttribute(“PROP_FILE_PATH”,“C:\ ...”)为servlet设置“全局变量”。但有没有办法在servlet外部访问这些变量,或者可以在servlet外部访问ServletContext?
我不认为将ServletContext作为参数传递给我必须获取的类方法,并且由于调用次数,设置属性文件值将是一个可行的选项。
由于
马丁
答案 0 :(得分:8)
您可以将设置存储在与Servlet上下文不同的位置,例如配置类上的一组静态变量。然后ServletContextListener
可以在启动时设置这些变量,任何其他代码都可以访问这些静态,无论他们是否有权访问ServletContext
本身。
答案 1 :(得分:1)
ServletContext可以在servlet的上下文或边界内使用。
您可以将变量存储在随应用服务器一起提供的jndi服务器中,并可以使用初始上下文从那里获取变量。
同样是加载属性文件的类,你可以在jar中捆绑并将该jar放在服务器的类路径中(你可以参考服务器启动脚本并将其放在类路径中)。所以当你的服务器是load加载一个带有静态{}块的类,并引用那些属性文件。 然后,您可以直接引用此类,因为它在服务器类路径中。有关硬编码属性文件的路径,您可以将其存储在jndi服务器中。
答案 2 :(得分:1)
ServletContext
通过ServletContextListener
,如上所述,可用于在配置类中加载静态变量。如果需要,也可以触发它来重新加载这些变量。此外,您只需访问HttpServletRequest
对象即可访问上下文。如果将请求传递给中间对象,则可以很容易地访问上下文。
ServletContext application = req.getSession().getServletContext();
然后,您可以根据需要将数据放入临时变量中来访问数据,然后将其传递给其他函数,并在超出范围时最终释放它。
答案 3 :(得分:0)
如果碰巧使用Spring,则不必实现自己的ServletContextListener。您可以使用Spring的ContextLoaderListener来实现它,如果注册,则存储ServletContext并通过静态方法使其可供以后使用。
在web.xml中注册:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
然后在servlet外部访问servletContext很简单:
import javax.servlet.ServletContext;
import org.springframework.web.context.ContextLoaderListener;
ServletContext servletContext =
ContextLoaderListener.getCurrentWebApplicationContext().getServletContext();