我有一个JSP网站,而不是Spring MVC,它有一个配置文件web.xml。
我想在web.xml文件中有几个设置。
但是,我想从位于Source Packages文件夹中的类中访问这些设置。
我知道我可以将ServletContect从JSP传递给类,但我想避免这种情况,只需从我的类中访问web.xml文件。
这可能吗?
修改
我一直在考虑javax.servlet
在想那里我想要的东西,但如果是的话,我看不到它。
答案 0 :(得分:1)
使用javax.servlet.ServletContextListener实现,允许类似于单例的访问上下文:
package test.dummy;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletContextEvent;
public class ContextConfiguration implements ServletContextListener {
private static ContextConfiguration _instance;
private ServletContext context = null;
//This method is invoked when the Web Application
//is ready to service requests
public void contextInitialized(ServletContextEvent event) {
this.context = event.getServletContext();
//initialize the static reference _instance
_instance=this;
}
/*This method is invoked when the Web Application has been removed
and is no longer able to accept requests
*/
public void contextDestroyed(ServletContextEvent event) {
this.context = null;
}
/* Provide a method to get the context values */
public String getContextParameter(String key) {
return this.context.getInitParameter(key);
}
//now, provide an static method to allow access from anywere on the code:
public static ContextConfiguration getInstance() {
return _instance;
}
}
在web.xml处设置:
<web-app>
<listener>
<listener-class>
test.dummy.ContextConfiguration
</listener-class>
</listener>
<servlet/>
<servlet-mapping/>
</web-app>
并在代码的任何地方使用它:
ContextConfiguration config=ContextConfiguration.getInstance();
String paramValue=config.getContextParameter("parameterKey");
答案 1 :(得分:0)
我认为这与您的描述非常接近:link。
基本上,你想以编程方式从web.xml读取参数,对吧?
答案 2 :(得分:0)
嗯...我假设一旦你的网络应用程序启动,那么你就不会在web.xml中做任何改变....
现在你可以做的是创建一个servlet,它在启动时加载并初始化一个单例类。您可以在web.xml中使用以下设置。
<servlet>
<description></description>
<display-name>XMLStartUp</display-name>
<servlet-name>XMLStartUp</servlet-name>
<servlet-class>com.test.servlets.XMLStartUp</servlet-class>
<init-param>
<param-name>log4j-init-file</param-name>
<param-value>WEB-INF/classes/log4j.properties</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
在tomcat中,如果设置load-on-startup
值0
,则意味着在加载时它具有最高优先级。现在在servlets init
方法中读取所有这样的init参数并将其设置在你的单例类中。
String dummy= getInitParameter("log4j-init-file");
答案 3 :(得分:0)
这不容易实现,可能不是一个优雅的解决方案。我建议的唯一选择是将您的配置选项设置为xml或属性文件,并将其放在WEB-INF / classes目录中,以便使用ClassLoader.getResource
或ClassLoader.getResourceAsStream
我知道这可能是配置的重复,但IMO是一种优雅的方式。
答案 4 :(得分:0)
我真的不喜欢从web.xml读取的类...为什么需要它? 恕我直言,如果你准备了一个属性文件和一个从那里读取的经理类,它会更容易,更清晰,更易于管理。