在我的项目中,我使用 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")
访问配置文件
在 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名称。无需进一步研究合并代码(我已经有一段时间没有研究它了)其中一个应该足够了。目前,您需要同时使用两者。
据我所知,没有标准方法可以在运行时修改初始化参数。此外,将配置放在那里是一种不好的做法,尤其是以明文形式放置数据库凭据。
通常最佳实践是将配置放在外部文件中。它可能是一些自定义属性或 xml 文件。
对于数据库连接,通常使用JNDI。因此,基本上,您在代码中查找 JNDI 资源,而 JNDI 本身是在容器级别配置的。谷歌找到很多如何通过JNDI为Jetty、Tomcat、JBoss等配置数据库连接的例子。
虽然您找到了使用
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();
}
}