Java ServletContext
我有一个JSP网站,不是SpringMVC,它有一个配置文件web.xml 我想在web.xml文件中获得一些设置 但是,我想从我的SourcePackages文件夹中的类中访问这些设置 我知道我可以将ServletContect从JSP传递到类,但我希望避免这种情况,只需从我的类访问web.xml文件 这可能吗 编辑Java ServletContext,java,Java,我有一个JSP网站,不是SpringMVC,它有一个配置文件web.xml 我想在web.xml文件中获得一些设置 但是,我想从我的SourcePackages文件夹中的类中访问这些设置 我知道我可以将ServletContect从JSP传递到类,但我希望避免这种情况,只需从我的类访问web.xml文件 这可能吗 编辑 我一直在看javax.servlet认为我想要的东西在里面,但如果是,我就看不到了。我认为这与您的描述非常接近: 基本上,您希望以编程方式从web.xml读取参数,对吗?我认为这
我一直在看
javax.servlet
认为我想要的东西在里面,但如果是,我就看不到了。我认为这与您的描述非常接近:
基本上,您希望以编程方式从web.xml读取参数,对吗?我认为这与您的描述非常接近:
基本上,您希望以编程方式从web.xml读取参数,对吗?Hmmm。。。我假设一旦您的web应用程序启动,您就不会对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>
嗯。。。我假设一旦您的web应用程序启动,您就不会对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>
这是不容易做到的,也可能不是一个简单的解决方案。我建议的唯一选项是将配置选项保存在xml或属性文件中,并将其放在WEB-INF/classes目录中,以便使用
ClassLoader.getResource
或ClassLoader.getResourceAsStream
我知道这可能是配置的重复,但我认为这是elegent方法。这不容易实现,也可能不是elegent解决方案。我建议的唯一选项是将配置选项保存在xml或属性文件中,并将其放在WEB-INF/classes目录中,以便使用
ClassLoader.getResource
或ClassLoader.getResourceAsStream
我知道这可能是配置的重复,但我认为这是一种简单的方式。使用一个实现,允许类似于单例的上下文访问:
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>
使用允许类似于单例的上下文访问的实现:
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>
我真的不喜欢从web.xml阅读的课程。。。你为什么需要这个?
我想,如果您准备了一个属性文件和一个从中读取的管理器类,那么它将更容易、更干净,而且更易于管理。我真的不喜欢从web.xml读取类。。。你为什么需要这个?
我想,如果您准备了一个属性文件和一个从中读取的管理器类,那么它将更容易、更干净,并且更易于管理。关闭但不完全关闭。我所在的类不是servlet,而是一个普通的旧类文件,它需要访问web.xml文件。我没有doPost等eventsWell,我相信ServletContext属于Servlet类,所以我会这样做:使用Servlet访问参数,然后将它们传递给任何其他libaray类以执行其他操作。此外,请考虑安全性,同时尝试从Web.java类中访问Web.xml:“OK,我明白了。您是否可以发布一些示例代码,向我展示如何从类中调用servlet并从中返回两个值?有点像Java新手,以防你错过它。:)接近但不完全。我所在的类不是servlet,而是一个普通的旧类文件,它需要访问web.xml文件。我没有doPost等eventsWell,我相信ServletContext属于Servlet类,所以我会这样做:使用Servlet访问参数,然后将它们传递给任何其他libaray类以执行其他操作。此外,请考虑安全性,同时尝试从Web.java类中访问Web.xml:“OK,我明白了。您是否可以发布一些示例代码,向我展示如何从类中调用servlet并从中返回两个值?有点像Java新手,以防你错过它。:)嗯,单身汉。不是我最喜欢的实现,而是一个肯定会工作的实现。完全同意,我想我可能会把它作为最后一个选项。“不是我最喜欢的实现”:好吧,正确的方法是将参数传递到类中,但您不希望这样。单例的替代方案可以是ThreadLocal(由过滤器设置),但这并没有太大区别,并且只有在从处理传入请求的线程调用类时才起作用。Hmmm,单例。不是我最喜欢的实现,而是一个肯定会工作的实现。完全同意,我想我可能会把它作为最后一个选项。“不是我最喜欢的实现”:好吧,正确的方法是将参数传递到类中,但您不希望这样。单例的替代方案可以是ThreadLocal(由过滤器设置),但这并没有太大区别,并且只有在处理传入请求的线程调用类时才起作用。