【问题标题】:How can I read context parameter/web.xml values in a non-servlet java file?如何读取非 servlet java 文件中的上下文参数/web.xml 值?
【发布时间】:2011-05-10 21:20:17
【问题描述】:

我有一个常规的 java 文件,用于更新和查询 mysql 数据库,但我需要在该文件中采用可配置选项(如主机名、密码等)并将其放入 web.xml 文件中(或者如果可以选择另一个文件,但最好在 web.xml 中)。

但我不知道如何从常规的非 servlet java 文件中访问 web.xml 值。

或者我需要读取 xml(就像任何其他 xml 文件一样...或者是否有通往此的快捷方式...)

【问题讨论】:

  • 你真的不得不提到这个“常规的非 servlet Java 文件”是在 ServletContextListener#contextInitialized() 中实例化和执行的(根据你之前的问题)。这会对正确答案产生很大影响......
  • 您使用的是什么服务器?雄猫,JBoss,???根据服务器参数,可以通过多种方式在服务器实例级别设置。

标签: java servlets web.xml


【解决方案1】:

您需要将所需的参数放在 web.xml 文件的 env-entry 条目中:

<env-entry> 
    <env-entry-name>dbhost</env-entry-name>
    <env-entry-type>java.lang.String</env-entry-type>
    <env-entry-value>localhost</env-entry-value> 
</env-entry>

然后通过 jndi 上下文访问它们

import javax.naming.Context;
import javax.naming.InitialContext;
...
// Get the base naming context
Context env = (Context)new InitialContext().lookup("java:comp/env");

// Get a single value
String dbhost = (String)env.lookup("dbhost");

【讨论】:

  • 请务必在 env-entry-value 之前指定 env-entry-type,否则您可能会收到 XML 验证错误。
  • 也许您可以添加导入。 :)
  • @alexander 你去吧
  • 你的解决方案可以用注解来实现吗?
【解决方案2】:

您可以在 web.xml 中使用上下文参数和 javax.servlet.ServletContextListener 来填充一些静态字段。

在你的普通 java 类中你会读到这个静态字段。

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
...
<context-param>
    <description>Prameter</description>
    <param-name>myParam</param-name>
    <param-value>123456790</param-value>
</context-param>
...
</web-app>

您可以使用ServletContext.getInitParameter 访问此上下文参数

【讨论】:

    【解决方案3】:

    一种方法是读取xml文件并解析它。

    你可以在ServletContextListener解析后放在一些静态地图上

    【讨论】:

      【解决方案4】:

      实现ServletContextListener:

      package util;
      
      import javax.servlet.ServletContext;
      import javax.servlet.ServletContextEvent;
      import javax.servlet.ServletContextListener;
      
      public class MyConfigListener implements ServletContextListener {
          @Override
          public void contextInitialized(ServletContextEvent sce) {
              ServletContext ctx = sce.getServletContext();
      
              String hostname = ctx.getInitParameter("my.config.hostname");
      
              // now go and do something with that
          }
      
          @Override
          public void contextDestroyed(ServletContextEvent sce) {}
      
      }
      

      别忘了在web.xml注册:

      <context-param>
        <param-value>somewhere.example.org</param-value>
        <param-name>my.config.hostname</param-name>
      </context-param>
      <listener>
        <listener-class>util.MyConfigListener</listener-class>
      </listener>
      

      【讨论】:

        【解决方案5】:

        创建一个将从servlets init 之一初始化的静态类。

        【讨论】:

        • 这里的难点在于哪个 servlet的init。您不希望您的应用程序依赖于 Servlet 首先初始化的时间。
        猜你喜欢
        • 2011-04-15
        • 2014-03-16
        • 2010-11-06
        • 2014-06-18
        • 1970-01-01
        • 1970-01-01
        • 2011-02-02
        • 2013-02-23
        • 2012-12-08
        相关资源
        最近更新 更多