117.md 5.3 KB
Newer Older
W
init  
wizardforcel 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14
# 使用初始化参数配置 Java Web 应用程序

> 原文: [https://javatutorial.net/java-init-parameters](https://javatutorial.net/java-init-parameters)

本示例演示了使用初始化参数来配置 [Java](https://javatutorial.net/install-java-9-eclipse) Web 应用程序

初始化参数非常适合设置变量,将来可能需要更改。 例如,您可以使用 init 参数来存储数据库连接或存储外部 API 密钥或 URL。 使用初始化参数的好处是,您可以轻松更改配置,而无需重新编译整个应用程序。

![Using init-param and context-param to configure Java web apps](img/70aaf23831a7541d9dfe23aa47949776.jpg)

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

## 注释与部署描述符

W
wizardforcel 已提交
15
在前面的示例中,我们演示了使用[注释配置 Servlet](https://javatutorial.net/servlet-annotation-example) 的用法。 尽管您可以使用注释来设置 init 参数,但我不建议您这样做。 原因是,如果使用注解来设置初始化参数,则每次需要更改参数时都必须重新编译应用程序。 使用部署描述符来设置 init 参数要好得多。 一旦将 init 参数值放入 web.xml 文件中并需要更改它们,您要做的就是用更改后的值重新启动应用程序。 无需重新编译,无需重新部署!
W
init  
wizardforcel 已提交
16

W
wizardforcel 已提交
17
## `@WebInitParam`注解
W
init  
wizardforcel 已提交
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159

下面的示例显示 Servlet 声明中@WebInitParam 注释的用法

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

如前所述,如果您选择设置初始化参数,则需要重新编译和重新部署应用程序。

## 上下文初始化参数

如果要在整个应用程序中共享参数,那么上下文初始化参数是一个很好的选择。 应用程序中的每个 Servlet 都共享这些初始化参数,并且它们的值在所有 Servlet 中都相同。 您可以使用以下< context-param >< param-name >< param-value >标记在 web.xml 文件中设置上下文参数:

```java
<context-param>
	<param-name>url</param-name>
	<param-value>https://javatutorial.net</param-value>
</context-param>
<context-param>
	<param-name>api-key</param-name>
	<param-value>h6Thd5guE4Kl12g3</param-value>
</context-param>
```

稍后,您可以像这样简单地在 servlet 或其他组件中使用此参数:

```java
package net.javatutorial.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 初始化参数

web.xml 文件中的&lt; init-param &gt;标记创建特定于给定 Servlet 的 init 参数。

```java
<?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.javatutorial.tutorials.ServletInitParams</servlet-class>
		<init-param>
			<param-name>url</param-name>
			<param-value>https://javatutorial.net</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 中,您可以像这样调用参数:

```java
package net.javatutorial.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"));
	}

}

```

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

```java
ServletContext c = this.getServletContext();
```

和初始化参数:

```java
ServletConfig c = this.getServletConfig();
```