2011-04-29 31 views
5

Soy nuevo en Java Enterprise y en Spring, pero tengo una gran comprensión de Java estándar. Estoy mirando a través de un proyecto de aplicación web existente. El proyecto utiliza Tomcat/Spring/Hibernate, que entiendo es bastante común. También utiliza DWR para invocaciones de métodos remotos. Me resulta un tanto difícil separar las responsabilidades: de qué se responsabiliza Tomcat, de qué es responsable Spring, cómo se obtiene una solicitud de uno para el otro y cómo encajan las piezas principales de Spring. He leído una gran cantidad de documentación sobre Spring, especialmente sobre frijoles y frijoles, y todavía estoy en proceso de leer más. Cualquier consejo que ustedes tengan sería bienvenido, pero les daré algunas preguntas específicas.¿Alguien puede explicar el archivo Spring web.xml?

Pregunta 1: ¿Dónde encaja el web.xml en las cosas (cuándo se usa/se llama y de dónde se llama)?

Ejemplo de código 1:

<servlet> 
    <servlet-name>qrst</servlet-name> 
     <display-name>qrst Servlet</display-name> 
    <servlet-class> 
     org.springframework.web.servlet.DispatcherServlet 
    </servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

¿Qué hace el fragmento anterior (o, lo que causa esto suceda)? En algún momento de mi aplicación web se usa qrst.jsp; ¿es el Servidor Dispatcher quien llama a qrst.jsp usando el nombre del servlet? De lo contrario, ¿cuál es el significado del nombre del servlet? ¿Qué es cargar en el arranque?

Ejemplo de código 2:

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value> 
     /someLocation/some-servlet.xml 
    </param-value> 
</context-param> 

Vínculos o explicación de lo que el anterior? Al mirar el archivo XML que contiene definiciones de bean, puedo ver que entiendo qué son los beans y cómo se usan, pero no conozco ningún otro detalle sobre esto y me gustaría saberlo.

Ejemplo de código 3:

<servlet> 
    <servlet-name>dwr-invoker</servlet-name> 
    <display-name>DWR</display-name> 
    <servlet-class> 
     org.directwebremoting.servlet.DwrServlet 
</servlet-class> 
    <init-param> 
     <param-name>classes</param-name> 
     <param-value> 
      somepackage.someclass 
     </param-value> 
    </init-param> 
    <load-on-startup>2</load-on-startup> 
</servlet> 

Por lo que he leído sobre los granos, creo que esos elementos init-param son sólo parámetros que consiga el conjunto de la clase Java del servlet. ¿Cuál es la importancia del nombre del servlet y qué ocurre con la carga al inicio? La aplicación web de alguna manera "sabe" cuando está ocurriendo una llamada AJAX (dwr) versus cuando la aplicación web se está cargando por primera vez (cuando se está cargando por primera vez, debe usar qrst.jsp). ¿Cómo sabe esto? ¿Cómo decide enrutar la solicitud a DWR en lugar de a qrst.jsp? ¿Dónde hace esto?

Gracias.

Respuesta

10

Los servlets son la expresión idiomática de JavaEE para responder HTTP requests. Usted programa el comportamiento de su aplicación en un Servlet que responderá a una solicitud.

Tomcat es un contenedor Servlet, lo que significa que despliega su aplicación en Tomcat y administrará toda la infraestructura de comunicación para usted: acepta conexiones, administra conexiones de base de datos (*) y llamará a sus servlets para manejar solicitudes entrantes.

web.xml es parte de cualquier aplicación JavaEE, no de Spring. Su ejemplo de código 1 declara que su aplicación usará una instancia de la clase org.springframework.web.servlet.DispatcherServlet para manejar las solicitudes entrantes.

Aunque los servlets son los fundamentos básicos para el desarrollo de JavaEE, no se recomienda crear uno propio; en cambio, con Spring, crea MVC controllers. Entonces el DispatcherServlet llamará a estos controladores para que manejen las solicitudes. Es solo otra indirección (¡pero muy poderosa!)

¿Es el Servidor Dispatcher el que llama a qrst.jsp usando el nombre del servlet?

No directamente. Es solo una coincidencia que su servlet y el archivo JSP tengan el mismo nombre.

¿Qué se carga en el inicio?

Su ejemplo de código 2 instruye al DispatcherServlet para que cargue los beans del archivo /someLocation/some-servlet.xml. Si hay beans de controlador en este archivo y según la forma en que configuró url mapping, los beans de este archivo responderán a las solicitudes entrantes. Ver the reference.

Creo que esos elementos init-param son sólo parámetros que consiga el conjunto de la clase Java del servlet

Los elementos init-param en web.xml son para la clase servlet.

La aplicación web de alguna manera "sabe" cuando un (DWR) llamada AJAX está sucediendo en oposición a cuando la aplicación web se carga por primera vez (cuando su carga por primera vez, se debe utilizar qrst.jsp). ¿Cómo sabe esto?

que falta de la cuestión son o bien el elemento <servlet-mapping> (que se encuentra en web.xml), o las asignaciones de URL (que se encuentra en los archivos de primavera). Estos son responsables de decidir si una URL debe ser manejada por el servlet despachador o el servlet dwr.

Por ejemplo, con una asignación de servlet, como a continuación:

<servlet-mapping> 
    <servlet-name>qsrt</servlet-name> 
    <url-pattern>*.do</url-pattern> 
</servlet-mapping> 
<servlet-mapping> 
    <servlet-name>dwr</servlet-name> 
    <url-pattern>*.dwr</url-pattern> 
</servlet-mapping> 

Entonces todas las URL que terminan en .do serán respondidas por el servlet despachador, y los que terminan con .dwr serán manejadas por el servlet DWR. Aquí es donde los nombres de los servlets son importantes.

Los archivos JSP son una historia diferente. El contenedor simplemente los usará para manejar una URL que termina en * .jsp. No cree su asignación de servlets onw para las URL que terminan en *.jsp. Esto solo causará dolores de cabeza. Probablemente este sea un comportamiento no especificado.

Editar:

Sin embargo, la dirección URL en la barra de direcciones del navegador siempre tiene el mismo aspecto: siempre sería invocar el servlet QRST

entonces es posible que el servlet-mapping es tan amplio (algo así como: <url-pattern>/*</url-pattern>) que manejará cualquier cosa que arroje al servidor y nunca dará la oportunidad a los otros servlets de manejarlo.

Por último pero no menos importante, al trabajar con DWR o cualquier tecnología Ajax, instale HttpFox extension for Firefox para que pueda monitorear las llamadas Ajax de su aplicación.

+0

Muchas gracias por la ayuda. Tengo un mapeo de servlet definido tanto para qrst como para dwr-invocador, ¡entonces lo que estás diciendo tiene sentido para mí! Sin embargo, la URL en la barra de direcciones del navegador siempre tiene el mismo aspecto: siempre invocaría el primer servlet.¿Podría dwr establecer la URL en el código de JavaScript antes de realizar su solicitud? Ya he buscado esto un poco, pero no veo nada de eso, si estoy en el camino correcto seguiré buscando. – KyleM

+0

En el some-servlet.xml, hay dos elementos con un atributo "clase" que contiene "Controller". ¡Uno es el principal, y el otro es para el DWR! Entonces parece que DispatcherServlet simplemente elige el apropiado para invocar, ¿suena sensato? Y tengo que irme a casa ahora, pero revisaré tus enlaces lo antes posible el lunes. Gracias a un millón por la ayuda, realmente no puedo decirte lo mucho que lo aprecio. – KyleM

+0

Gracias de nuevo por toda la ayuda, no puedo decir lo mucho que lo aprecio, he podido estudiar los temas apropiados como resultado de su excelente publicación. @Todo el mundo: el uso de HttpFox mostró que "/ dwr" ES parte de la URL que se está publicando cuando se ejecutan las llamadas ajax. La declaración de Leonel acerca de los mapeos de servlets fue acertada. Ahora solo es cuestión de descubrir CÓMO se publica la URL (ya que no veo dónde está configurado ...). Estoy actualizando la pregunta original con algunos documentos útiles. – KyleM

Cuestiones relacionadas