项目打包成WAR时修改Servlet 3.0中的WebInitParam

问题描述 投票:0回答:3

在我的项目中,我使用 Servlet 3.0,并且尝试使用注释。

要初始化数据库的连接参数,我在 servlet 中使用它:

@WebServlet(name = "FrontServlet", urlPatterns = {"/index"},
        initParams = {
        @WebInitParam(name = "userDB", value = "root"),
        @WebInitParam(name = "passwordDB", value = "*****")})

现在,当我将项目打包在 WAR 中时,我没有 web.xml,因此我无法像以前在旧 servlet 版本中那样编辑初始化参数。

我的问题是,当项目打包成WAR时,我可以编辑我的初始化参数吗?如果是的话怎么办?否则我应该使用什么方法来存储我的初始化参数并能够在 WAR 中修改它们?

如果可能的话,我想避免使用所有 URL 模式等重新创建整个 web.xml...

编辑:

最后我保留了:

@WebServlet(name = "FrontServlet", urlPatterns = {"/index"})

我使用 Properties 加载数据库参数,使用

getClass().getClassLoader().getResourceAsStream("servlet/config/config.ini")

访问配置文件
java servlets servlet-3.0
3个回答
4
投票

在 Servlet 3.0 中,注释提供了默认值,但可以在 web.xml 中覆盖这些默认值,因此您可以将以下内容添加到 web.xml 中来更改参数。

  <servlet>
    <servlet-name>FrontServlet</servlet-name>
    <servlet-class>fully.qualified.ClassName</servlet-class>
    <init-param>
      <param-name>passwordDB</param-name>
      <param-value>NewValue</param-value>
    </init-param>
  </servlet>

至少在Tomcat中,您需要指定类名和Servlet名称。无需进一步研究合并代码(我已经有一段时间没有研究它了)其中一个应该足够了。目前,您需要同时使用两者。


2
投票

据我所知,没有标准方法可以在运行时修改初始化参数。此外,将配置放在那里是一种不好的做法,尤其是以明文形式放置数据库凭据。

通常最佳实践是将配置放在外部文件中。它可能是一些自定义属性或 xml 文件。

对于数据库连接,通常使用JNDI。因此,基本上,您在代码中查找 JNDI 资源,而 JNDI 本身是在容器级别配置的。谷歌找到很多如何通过JNDI为Jetty、Tomcat、JBoss等配置数据库连接的例子。


0
投票

虽然您找到了使用

getClassLoader
的解决方法,但它不是 Servlet 方法。 另外,仅仅为了配置
web.xml
WebInitParam
已经定义的参数而使用
WebServlet
是非常麻烦的,因为你被迫复制服务器名称、url 模式和类位置。

但幸运的是,有一个 Servlet 解决方案目前未在本页提及。

您可以使用

ServletContextListener
以编程方式添加 servlet 初始化参数,而无需更改原始 servlet。 (只要servlet使用servlet init params来获取值。)这是一个无需使用
web.xml
的解决方案。

ServletContextListener:

@WebListener
public class MyServletParamInitializer implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent contentEvent) {
        ServletRegistration servletRegistration = contentEvent.getServletContext().getServletRegistration("MyServlet");
        servletRegistration.setInitParameter("userDB", "root");
        servletRegistration.setInitParameter("passwordDB", "*****");
    }
}

所以它使用

ServletRegistration
来设置初始化参数。

Servlet 然后可以从仅适用于此 Servlet 的

ServletConfig
访问初始化参数:

@WebServlet(name = "MyServlet", value = "/*", loadOnStartup = 1)
public class MyServlet extends HttpServlet {

    // You could use this method to do some db initialization
    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        String userDB = config.getInitParameter("userDB");
        System.out.println("MyServlet.init(): userDB=" + userDB);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter writer = resp.getWriter();

        String userDB = getServletConfig().getInitParameter("userDB");
        String message = "MyServlet.doGet(): userDB=" + userDB;
        System.out.println(message);
        writer.println(message);

        writer.flush();
        writer.close();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.