使用Init参数配置Java Web应用程序

时间:2020-02-23 14:37:10  来源:igfitidea点击:

此示例演示如何使用init参数配置javaweb应用程序

Init参数对于设置变量非常有用,这可能需要在将来进行更改。例如,可以使用init参数存储数据库连接或者存储外部API键或者url。使用init参数的好处是,我们可以轻松地更改配置,而无需重新编译整个应用程序。

使用init param和context param配置Java web应用程序

注释与部署描述符

在前面的示例中,我们演示了如何使用注释来配置servlet。虽然我们可以使用注释来设置init参数,但我不会建议我们这样做。原因是,如果使用注释来设置init参数,那么每次需要更改参数时都必须重新编译应用程序。使用部署描述符设置init参数更好。一旦将init param值放入web.xml文件文件,并且我们需要更改它们,我们只需使用更改的值重新启动应用程序。无需重新编译,无需重新部署!

@WebInitParam注释

下面的示例显示了在servlet声明中@WebInitParam注释的用法

@WebServlet(
		name = "servletParamAnnotation", 
		urlPatterns = {"/servletParamAnnotation"}, 
		initParams = {
				@WebInitParam(name = "server", value = "https://theitroad.local"), 
				@WebInitParam(name = "api-key", value = "h6Thd5guE4Kl12g3")
		} )
public class InitParamServletAnnotations extends HttpServlet {
	//...
}

如前所述,如果我们选择这样设置init参数,则需要重新编译和重新部署应用程序。

Context Init参数

如果我们想在整个应用程序中共享参数,那么context init参数是一个很好的选择。应用程序中的每个Servlet共享这些init参数,并且它们的值在所有Servlet中都是相同的。我们可以在web.xml文件通过使用<context param>、<param name>和<param value>标记创建文件,如下所示:

<context-param>
	<param-name>url</param-name>
	<param-value>https://theitroad.local</param-value>
</context-param>
<context-param>
	<param-name>api-key</param-name>
	<param-value>h6Thd5guE4Kl12g3</param-value>
</context-param>

稍后,我们可以在servlet或者其他组件中轻松使用此参数:

package net.theitroad.tutorials;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletContextParams extends HttpServlet {

	private static final long serialVersionUID = -3462096555274971485L;

	@Override
	protected void doGet(HttpServletRequest reqest, HttpServletResponse response) 
			throws ServletException, IOException {

		ServletContext c = this.getServletContext();
		PrintWriter writer = response.getWriter();
		writer.append("URL: ").append(c.getInitParameter("url")).append(", API KEY: ")
				.append(c.getInitParameter("api-key"));
	}

}

Servlet初始化参数

中的<init param>标记web.xml文件文件,创建特定于给定Servlet的init参数。

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
	version="3.1">

	<display-name>Servlet with Init Parameters</display-name>

	<servlet>
		<servlet-name>servletInitParams</servlet-name>
		<servlet-class>net.theitroad.tutorials.ServletInitParams</servlet-class>
		<init-param>
			<param-name>url</param-name>
			<param-value>https://theitroad.local</param-value>
		</init-param>
		<init-param>
			<param-name>api-key</param-name>
			<param-value>h6Thd5guE4Kl12g3</param-value>
		</init-param>
	</servlet>
	<servlet-mapping>
		<servlet-name>servletInitParams</servlet-name>
		<url-pattern>/servletInitParams</url-pattern>
	</servlet-mapping>

</web-app>

在Servlet中,我们可以调用如下参数:

package net.theitroad.tutorials;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletInitParams extends HttpServlet {

	private static final long serialVersionUID = -1242096555274971485L;

	@Override
	protected void doGet(HttpServletRequest reqest, HttpServletResponse response) 
			throws ServletException, IOException {

		ServletConfig c = this.getServletConfig();
		PrintWriter writer = response.getWriter();
		writer.append("URL: ").append(c.getInitParameter("url")).append(", API KEY: ")
				.append(c.getInitParameter("api-key"));
	}

}

请注意上下文参数之间的区别,它们的用法如下:

ServletContext c = this.getServletContext();

和初始化参数:

ServletConfig c = this.getServletConfig();