Случается, когда вы пытаетесь использовать переменную, которая ранее не была определена.
Типичным примером может быть
foreach ($items as $item) {
// do something with item
$counter++;
}
Если вы ранее не определяли $counter
, код, указанный выше, вызывает уведомление.
Правильный способ - установить переменную перед ее использованием, даже если это просто пустая строка, например
$counter = 0;
foreach ($items as $item) {
// do something with item
$counter++;
}
Вопросы, относящиеся:
(Обновление: Если я мог бы удалить этот ответ, я был бы, хотя, так как он принят, я не могу. Я обновляю описание, чтобы обеспечить лучшее руководство и отговорить людей использовать плохую практику, которую я обрисовал в общих чертах в исходном ответе).
можно определить эти параметры через контекст или параметры среды, такой как в context.xml. Посмотрите разделы, названные "Параметры Контекста" и "Записи Среды" на этой странице:
http://tomcat.apache.org/tomcat-5.5-doc/config/context.html
Как @netjeff указывает, эти значения будут доступны через Context.lookup (Строка) метод и не как Системные параметры.
Другой способ сделать определяет, что эти значения должны определить переменные в файле web.xml веб-приложения, которое Вы развертываете (см. ниже). Как @Roberto Lo Giacco указывает, это обычно считают плохой практикой, так как развернутый артефакт не должен быть конкретной средой. Однако ниже отрывок конфигурации, если Вы действительно хотите сделать это:
<env-entry>
<env-entry-name>SMTP_PASSWORD</env-entry-name>
<env-entry-type>java.lang.String</env-entry-type>
<env-entry-value>abc123ftw</env-entry-value>
</env-entry>
cliff.meyers исходный ответ, который предложил использовать <env-entry>
, не поможет, когда использование только System.getProperty ()
Согласно документам Tomcat 6.0 <env-entry>
для JNDI. Таким образом, это означает, что не будет иметь никакого эффекта на System.getProperty()
.
С <env-entry>
от [1 111] пример cliff.meyers , следующий код
System.getProperty("SMTP_PASSWORD");
возвратит пустой указатель, не значение "abc123ftw".
Согласно Tomcat 6 документов, для использования <env-entry>
необходимо было бы написать код как это для использования <env-entry>
:
// Obtain our environment naming context
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
// Look up our data source
String s = (String)envCtx.lookup("SMTP_PASSWORD");
Протест: Я на самом деле не попробовал пример выше. Но я имею , попробовал <env-entry>
System.getProperty (), и это определенно не работает.
Обычно Вы не должны полагаться на системные свойства для конфигурирования веб-приложения - они могут использоваться для конфигурирования контейнера (например, Tomcat), но не приложение, выполняющее внутреннего кота.
cliff.meyers уже упомянул способ, которым необходимо скорее использовать для webapplication. Это - стандартный путь, который также соответствует Вашему вопросу того, чтобы быть настраивающимся через средства context.xml или server.xml.
Однако должен Вы действительно нуждаться в системных свойствах или других jvm опциях (как макс. настройки памяти) у кота, необходимо создать файл, названный "bin/setenv.sh" или "bin/setenv.bat". Эти файлы не существуют в стандартном архиве, который Вы загружаете, но если они присутствуют, содержание выполняется во время запуска (при запуске кота с помощью startup.sh/startup.bat). Это - хороший способ разделить Ваши собственные настройки от стандартных настроек кота и делает обновления настолько легче. Никакая потребность настроить startup.sh или catalina.sh.
(При казни кота как окон servive Вы обычно используете tomcat5w.exe, tomcat6w.exe и т.д. для конфигурирования настроек реестра для сервиса.)
РЕДАКТИРОВАНИЕ: Кроме того, другая возможность состоит в том, чтобы пойти для Ресурсы JNDI .
Также возможно позволить ServletContextListener установить свойства системы:
import java.util.Enumeration;
import javax.servlet.*;
public class SystemPropertiesHelper implements
javax.servlet.ServletContextListener {
private ServletContext context = null;
public void contextInitialized(ServletContextEvent event) {
context = event.getServletContext();
Enumeration<String> params = context.getInitParameterNames();
while (params.hasMoreElements()) {
String param = (String) params.nextElement();
String value =
context.getInitParameter(param);
if (param.startsWith("customPrefix.")) {
System.setProperty(param, value);
}
}
}
public void contextDestroyed(ServletContextEvent event) {
}
}
А затем поместить это в ваш web.xml (должно быть возможно и для context.xml)
<context-param>
<param-name>customPrefix.property</param-name>
<param-value>value</param-value>
<param-type>java.lang.String</param-type>
</context-param>
<listener>
<listener-class>servletUtils.SystemPropertiesHelper</listener-class>
</listener>
У меня это сработало.