2013-09-19 3 views
3

Я создал веб-приложение, и я хотел бы знать, где разместить свой слушатель в web.xml.Как разместить слушателя в web.xml java?

<servlet> 
    <servlet-name>ProcessReg</servlet-name> 
    <servlet-class>ProcessReg</servlet-class> 
    <init-param> 
     <param-name>pract123</param-name> 
     <param-value>jdbc:odbc:practODBC</param-value> 
    </init-param> 
    <listener> 
     <listener-class>config</listener-class> 
    </listener>   
    </servlet> 

Сообщение об ошибке я получил:

cvc-complex-type.2.4.a: Invalid content was found starting with element 'listener'. One of '{"http://java.sun.com/xml/ns/javaee":init-param, "http://java.sun.com/xml/ns/javaee":load-on-startup, "http://java.sun.com/xml/ns/javaee":run-as, "http://java.sun.com/xml/ns/javaee":security-role-ref}' is expected. [17] 

Вот мой конфигурационный файл:

public class config implements ServletContextListener { 
private static final String ATTRIBUTE_NAME = "config"; 
private DataSource dataSource; 

@Override 
public void contextInitialized(ServletContextEvent event) { 
    ServletContext servletContext = event.getServletContext(); 
    String databaseName = servletContext.getInitParameter("pract123"); 
    try { 
      dataSource = (DataSource) new InitialContext().lookup("java:/comp  /env/jdbc/TestDB"); 
    } catch (NamingException e) { 
     throw new RuntimeException("Config failed: datasource not found", e); 
    }} 

@Override 
public void contextDestroyed(ServletContextEvent event) { 
    // NOOP. 
} 

public DataSource getDataSource() { 
    return dataSource; 
} 

public static config getInstance(ServletContext servletContext) { 
    return (config) servletContext.getAttribute(ATTRIBUTE_NAME); 
    } 
} 
+0

Используйте полное имя класса списка. –

ответ

6

То, что вы делаете, вы перепутать <servlet> и <listener> теги .Они которые должен быть отдельным.

Это должно быть

<servlet> 
    <servlet-name>ProcessReg</servlet-name> 
    <servlet-class>ProcessReg</servlet-class> 
    <init-param> 
     <param-name>pract123</param-name> 
     <param-value>jdbc:odbc:practODBC</param-value> 
    </init-param>  
    </servlet> 

<listener> 
     <listener-class>fully.qaulified.path.ContextListener</listener-class> 
</listener> 

или

<listener> 
      <listener-class>fully.qaulified.path.ContextListener</listener-class> 
</listener> 

<servlet> 
    <servlet-name>ProcessReg</servlet-name> 
    <servlet-class>ProcessReg</servlet-class> 
    <init-param> 
     <param-name>pract123</param-name> 
     <param-value>jdbc:odbc:practODBC</param-value> 
    </init-param>  
    </servlet> 

И В классе

package fully.qaulified.path; 
public class ContextListener implements ServletContextListener { 
.. 
.. 

В качестве примечания:

В Java имена классов начинаются с заглавных букв. public class config должен быть

public class Config 
+0

Не должно ли оно идти до определения сервлета? – DaveH

+0

@DaveHowes Нет необходимости. Здесь вы не должны смешиваться. :) –

+0

Спасибо Суреш. Я не использовал пакет. Но теперь у меня есть еще одна ошибка: Исключение отправки контекста инициализированного события в экземпляр слушателя класса Config java.lang.ClassCastException: org.apache.tomcat.dbcp.dbcp.BasicDataSource нельзя передать в javax.activation.DataSource. Как преодолеть эту ошибку? –

0

, как вы видите, в модели содержимого Wep-приложения:

Content Model : (((description*, display-name*, icon*)) | distributable | context-param | filter | filter-mapping | 
listener | servlet | servlet-mapping | session-config | mime-mapping | welcome-file-list | error-page | jsp-config | 
security-constraint | login-config | security-role | ((env-entry*, ejb-ref*, ejb-local-ref*, ((service-ref*)), resource- 
ref*, resource-env-ref*, message-destination-ref*, persistence-context-ref*, persistence-unit-ref*, post- 
construct*, pre-destroy*)) | message-destination | locale-encoding-mapping-list)* 

это родственный servlet не ребенок:

<servlet> 
    <servlet-name>ProcessReg</servlet-name> 
    <servlet-class>ProcessReg</servlet-class> 
    <init-param> 
     <param-name>pract123</param-name> 
     <param-value>jdbc:odbc:practODBC</param-value> 
    </init-param>   
</servlet> 

<listener> 
    <listener-class>config</listener-class> 
</listener> 
1

Слушатель не должен быть в теге servlet и предоставить полное имя

<listener> 
     <listener-class>com.somePackage.ListenerClass</listener-class> 
</listener> 
0

Тег приемника должен быть определен в теге web-app.

<web-app> 
    <display-name>MyListeningApplication</display-name> 
    <listener> 
     <listener-class>config</listener-class> 
    </listener> 
    <servlet-name>ProcessReg</servlet-name> 
    <servlet-class>ProcessReg</servlet-class> 
    <init-param> 
     <param-name>pract123</param-name> 
     <param-value>jdbc:odbc:practODBC</param-value> 
    </init-param> 
</web-app> 
Смежные вопросы