Eclipse -- VI -- Generar Código con XDoclet y el Plugin MyEclipse

Puede encontrar la versión original de este artículo en Inglés en:

http://www.myeclipse.com/

Introducción

Los pasos y las imágenes mostradas en este artículo están basadas en las siguientes versiones de estos componentes:

Paso 1.- Crear un Nuevo Proyecto

  1. Cambie o abra la perspectiva de MyEclipse (Window > Open Perspecitve > Other... > MyEclipse).
  2. Seleccione File > New... > Project > MyEclipse > J2EE Project > Web Project, y luego pulse sobre el botón Next.
  3. Como nombre de proyecto escriba MyXDocletWeb y como contexto raíz especifique /MyXDocletWeb, como se muestra en la Figura 1, y pulse el boton Finish

  4. Figura 1: Crear un nuevo Proyecto Web

    La estructura del proyecto resultante deberá parecerse a la mostrada en la figura 2:


    Figura 2: Estructura del nuevo proyecto

Paso 2.- Crear un Servlet

  1. Seleccione el proyecto MyXDocletWeb en el Package Explorer
  2. Seleccione File > New... > Servlet
  3. Ponga como nombre de paquete com.myeclipse.tutorial.servlet y como nombre de clase BasicServlet como se muestra en la Figura 3, y pulse el botón Next:


    Figura 3: Crear el Servlet
  4. Cuando se muestre la segunda página del asistente, desmarque el checkbox etiquetado como Generate/Map web.xmlFile y pulse el boton Finish como se muestra en la figura 4. No se necesita que el asistente mapee el fichero web.xml porque lo generaremos posteriormente basándonos en la configuración de XDoclet.


    Figura 4: Crear el Servlet, Página 2
  5. Después de que se genere el servlet, se abrirá en el editor Java. Reemplace el código fuente generado por el siguiente código y grabe el fichero:
    /*
    * BasicServlet.java
    * Created on Aug 7, 2003
    */
    package com.myeclipse.tutorial.servlet;
    
    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;
    
    /**
    * Basic Servlet Using XDoclet.
    *
    * @author Administrator
    * @version 1.0, Aug 7, 2003
    *
    * @web.servlet name = "BasicServlet"
    *              display-name = "Basic Servlet"
    *              load-on-startup = "1"
    * @web.servlet-init-param name = "hi"
    *  value = "${basic.servlet.hi}"
    * @web.servlet-init-param name = "bye"
    *  value = "${basic.servlet.bye}"
    * @web.servlet-mapping url-pattern = "/Basic/*"
    * @web.servlet-mapping url-pattern = "*.Basic"
    * @web.servlet-mapping url-pattern = "/BasicServlet"
    * @web.resource-ref description = "JDBC resource"
    *                   name = "jdbc/mydb"
    *                   type = "javax.sql.DataSource"
    *                   auth = "Container"
    */
    
    public class BasicServlet extends HttpServlet {
       /**
        * Constructor of the object.
        */
       public BasicServlet() {
           super();
       }
    
       /**
        * Destruction of the servlet.
        */
       public void destroy() {
            super.destroy(); // Just puts "destroy" string in log
       }
    
       /**
        * The doGet method of the servlet.
        *
        * @param request the request send by the client to the server
        * @param response the response send by the server to the client
        *
        * @throws ServletException if an error occurred
        * @throws IOException if an error occurred
        */
       public void doGet(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {
           processRequest(request, response);
       }
    
       /**
        * The doPost method of the servlet.
        *
        * @param request the request send by the client to the server
        * @param response the response send by the server to the client
        *
        * @throws ServletException if an error occurred
        * @throws IOException if an error occurred
        */
       public void doPost(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {
           processRequest(request, response);
       }
    
       /**
        * Returns information about the servlet.
        *
        * @return String information about this servlet
        */
       public String getServletInfo() {
           return "Basic Servlet Using XDoclet";
       }
    
       /**
        * Initialization of the servlet.
        *
        * @throws ServletException if an error occurred
        */
       public void init() throws ServletException {
           // Put your code here
       }
    
       /**
        * Initialization of the servlet with the servlet's configuration.
        *
        * @param config the servlet's configuration
        *
        * @throws ServletException if an error occurred
        */
       public void init(ServletConfig config) throws ServletException {
           super.init(config);
       }
    
       /**
        * Processes requests for both HTTP GET and POST methods.
        *
        * @param request servlet request
        * @param response servlet response
        *
        * @throws ServletException if an error occurred
        * @throws java.io.IOException if an I/O error occurred
        */
       protected void processRequest(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
            ServletConfig config = this.getServletConfig();
           String hi = config.getInitParameter("hi");
            String bye = config.getInitParameter("bye");
    
           try {
                response.setContentType("text/html");
    
               PrintWriter out = response.getWriter();
               out.println("<html>");
               out.println("<head>");
               out.println("<title>Basic Servlet</title>");
               out.println("</head>");
               out.println("<body>");
               out.println("<h1>hi:  " + hi + "</h1>");
               out.println("<h1>bye:  " + bye + "</h1>");
               out.println("</body>");
               out.println("</html>");
               out.close();
           } catch (Exception e) {
                throw new ServletException(e);
           }
       }
    }
    			

Explicación de las etiquetas de XDoclet utilizadas en el Servlet. La siguiente tabla muestra el uso de algunas útiles etiquetas de XDoclet, así como lo que esas etiquetas generan.

Etiqueta XDoclet Código generado
@web.servlet name = "BasicServlet" 
     display-name = "Basic Servlet" load-on-startup = "1" 
				
Genera esto en web.xml:
<servlet>
    <servlet-name>BasicServlet</servlet-name> 
    <display-name>Basic Servlet</display-name>
    <servlet-class>com.myeclipse.tutorial.servlet.BasicServlet</servlet-class> 
    ...
    <load-on-startup>1</load-on-startup> 
</servlet> 
				
@web.servlet-init-param name = "hi"
  value = "${basic.servlet.hi}"
@web.servlet-init-param name = "bye"
  value = "${basic.servlet.bye}" 
				
Código generado en web.xml cuando las propiedades de Ant se configuran como:(basic.servlet.hi = Ant is cool!) y (basic.servlet.bye = XDoclet Rocks!):
<servlet>
...
  <init-param> 
    <param-name>hi</param-name> 
    <param-value>Ant is cool!</param-value> 
  </init-param>    
  <init-param> 
    <param-name>bye</param-name> 
    <param-value>XDoclet Rocks!</param-value> 
  </init-param>    ... 
</servlet>
				
@web.servlet-mapping url-pattern = "/Basic/*"
@web.servlet-mapping url-pattern = "*.Basic"
@web.servlet-mapping url-pattern = "/BasicServlet"
				
Código generado en web.xml:
<servlet-mapping>
  <servlet-name>BasicServlet</servlet-name> 
  <url-pattern>/Basic/*</url-pattern> 
</servlet-mapping>
<servlet-mapping> 
  <servlet-name>BasicServlet</servlet-name> 
  <url-pattern>*.Basic</url-pattern> 
</servlet-mapping> 
<servlet-mapping> 
  <servlet-name>BasicServlet</servlet-name> 
  <url-pattern>/BasicServlet</url-pattern> 
</servlet-mapping> 
				
@web.resource-ref 
  description = "JDBC resource" 
  name = "jdbc/mydb"     
  type = "javax.sql.DataSource"     
  auth = "Container" 
				
Código generado en web.xml:
<resource-ref>
  <description>JDBC resource</description> 
  <res-ref-name>jdbc/mydb</res-ref-name> 
  <res-type>javax.sql.DataSource</res-type> 
  <res-auth>Container</res-auth> 
</resource-ref> 
				

Paso 3.- Crear la Clase de una Etiqueta Personalizada

  1. Seleccione el proyecto MyXDocletWeb en la Package Explorer.
  2. Seleccione File > New... > Class,
  3. Escriba com.myeclipse.tutorial.customtag como nombre del paquete, BasicTag como nombre de la clase y javax.servlet.jsp.tagext.TagSupport como nombre de la clase padre, como se ve en la Figura 5, y pulse el botón Finish:


    Figura 5: Crear una Etiqueta Personaliza
  4. Después de generar la etiqueta, esta se abrirá en el editor Java. Reemplace todo el código fuente generado por este otro código y grabe el fichero:
    /*
    * BasicTag.java
    */
    package com.myeclipse.tutorial.customtag;
    
    import javax.servlet.jsp.JspException;
    import javax.servlet.jsp.tagext.TagSupport;
    
    /**
    * Basic Custom Tag Using XDoclet.
    *
    * @jsp.tag name="BasicTag"
    * @jsp.variable name-given="currentIter"
    *               class="java.lang.Integer"
    *               scope="NESTED"
    *               declare="true"
    * @jsp.variable name-given="atBegin"
    *               class="java.lang.Integer"
    *               scope="AT_BEGIN"
    *               declare="true"
    * @jsp.variable name-given="atEnd"
    *               class="java.lang.Integer"
    *               scope="AT_END"
    *               declare="true"
    *
    */
    
    public class BasicTag extends TagSupport {
       /** Holds value of property includePage. */
       private boolean includePage = false;
    
       /** Holds value of property includeBody. */
       private boolean includeBody = false;
    
       /** Holds value of property iterate. */
       private int iterate = 0;
    
       /**
        * Creates a new BasicTag object.
        */
       public BasicTag() {
           super();
       }
    
       /**
        * @see javax.servlet.jsp.tagext.TagSupport#doStartTag()
        */
       public int doStartTag() throws JspException {
            pageContext.setAttribute("currentIter", new Integer(iterate));
            pageContext.setAttribute("atBegin", new Integer(0));
    
            return includeBody ? EVAL_BODY_INCLUDE : SKIP_BODY;
       }
    
       /**
        * @see javax.servlet.jsp.tagext.TagSupport#doEndTag()
        */
       public int doEndTag() throws JspException {
            pageContext.setAttribute("atEnd", new Integer(iterate));
    
            return includePage ? EVAL_PAGE : SKIP_PAGE;
       }
    
       /**
        * @see javax.servlet.jsp.tagext.TagSupport#doAfterBody()
        */
       public int doAfterBody() throws JspException {
           iterate -= 1;
            pageContext.setAttribute("currentIter", new Integer(iterate));
    
           if (iterate <= 0) {
               return SKIP_BODY;
           } else {
               return EVAL_BODY_AGAIN;
           }
       }
    
       /**
        * Getter for property includePage.
        *
        * @return Value of property includePage.
        *
        * @jsp.attribute required="true"
        *                rtexprvalue="true"
        *                description="The includePage attribute"
        */
       public boolean isIncludePage() {
           return includePage;
       }
    
       /**
        * Setter for property includePage.
        *
        * @param includePage New value of property includePage.
        */
       public void setIncludePage(boolean includePage) {
           this.includePage = includePage;
       }
    
       /**
        * Getter for property includeBody.
        *
        * @return Value of property includeBody.
        *
        * @jsp.attribute required="true"
        *                rtexprvalue="true"
        *                description="The includeBody attribute"
        */
       public boolean isIncludeBody() {
           return includeBody;
       }
    
       /**
        * Setter for property includeBody.
        *
        * @param includeBody New value of property includeBody.
        */
       public void setIncludeBody(boolean includeBody) {
           this.includeBody = includeBody;
       }
    
       /**
        * Getter for property iterate.
        *
        * @return Value of property iterate.
        *
        * @jsp.attribute required="true"
        *                rtexprvalue="true"
        *                description="The iterate attribute"
        */
       public int getIterate() {
           return iterate;
       }
    
       /**
        * Setter for property iterate.
        *
        * @param iterate New value of property iterate.
        */
       public void setIterate(int iterate) {
           this.iterate = iterate;
       }
    }
    			

Explicación de las etiquetas de XDoclet utilizadas en el Etiqueta Personalizada. La siguiente tabla muestra el uso de algunas útiles etiquetas de XDoclet, así como lo que esas etiquetas generan.

Etiqueta XDoclet Código generado
@jsp.tag name="BasicTag"
Código generado en el fichero .tld:
<tag>
  <name>BasicTag</name> 
   <tag-class>
     com.myeclipse.tutorial.customtag.BasicTag 
   </tag-class>    ... 
</tag>
				
@jsp.variable  
  name-given="currentIter" 
  class="java.lang.Integer" 
  scope="NESTED"
  declare="true"
@jsp.variable
  name-given="atBegin" 
  class="java.lang.Integer" 
  scope="AT_BEGIN"
  declare="true"
@jsp.variable
  name-given="atEnd" 
  class="java.lang.Integer" 
  scope="AT_END"
  declare="true" 
				
Código generado en el fichero .tld:
<tag>
  ...
  <variable> 
    <name-given>currentIter</name-given> 
    <variable-class>java.lang.Integer</variable-class> 
    <declare>true</declare> 
    <scope>NESTED</scope> 
  </variable>
  <variable> 
    <name-given>atBegin</name-given> 
    <variable-class>java.lang.Integer</variable-class> 
    <declare>true</declare> 
    <scope>AT_BEGIN</scope> 
  </variable>
  <variable> 
    <name-given>atEnd</name-given> 
    <variable-class>java.lang.Integer</variable-class> 
    <declare>true</declare> 
    <scope>AT_END</scope> 
    </variable>    ... 
</tag> 
				
@jsp.attribute required="true" 
  rtexprvalue="true"
  description="The includePage attribute"
@jsp.attribute required="true"
  rtexprvalue="true" 
  description="The includeBody attribute"
@jsp.attribute required="true"
  rtexprvalue="true" 
  description="The iterate attribute" 
				
Código generado en el fichero .tld:
<tag>
  ...
  <attribute> 
    <name>includePage</name> 
    <required>true</required> 
    <rtexprvalue>true</rtexprvalue>
    <description><![CDATA[The includePage attribute]]></description> 
  </attribute>
  <attribute> 
    <name>includeBody</name> 
    <required>true</required> 
    <rtexprvalue>true</rtexprvalue>
    <description><![CDATA[The includeBody attribute]]></description> 
  </attribute>
  <attribute> 
    <name>iterate</name> 
    <required>true</required> 
    <rtexprvalue>true</rtexprvalue>
    <description><![CDATA[The iterate attribute]]></description> 
  </attribute>
</tag> 
				

Paso 4.- Añadir una Carpeta llamada 'merge' al Proyecto

  1. Seleccione el proyecto MyXDocletWeb en el Package Explorer.
  2. Seleccione File > New... > Folder,
  3. Escriba merge como nombre de la carpeta, como se ve en la Figura 6, y pulse el botón Finish:


    Figura 6: Crear la carpeta merge

Paso 5.- Crear el fichero taglibs.xml

  1. Seleccione la carpeta MyXDocletWeb/merge en el Package Explorer.
  2. Seleccione File > New... > XML(from Template)
  3. Escriba taglibs.xml, como nombre del fichero y pulse el botón Finish como se ve en la Figura 7:


    Figura 7: Crear el fichero taglibs.xml
  4. Una vez que se ha creado el fichero taglibs.xml y se ha abierto en el editor de XML, reemplace su contenido por el siguiente código:
    <taglib>
      <taglib-uri>/mytaglib</taglib-uri>
      <taglib-location>/WEB-INF/mytaglib.tld</taglib-location>
    </taglib> 
    			

Paso 6.- Crear el fichero welcomefiles.xml

  1. Seleccione la carpeta MyXDocletWeb/merge en el Package Explorer.
  2. Seleccione File > New... > XML(from Template)
  3. Escriba welcomefiles.xml, como nombre del fichero y pulse el botón Finish
  4. Una vez que se ha creado el fichero welcome.xml y se ha abierto en el editor de XML, reemplace su contenido por el siguiente código:
    <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
      <welcome-file>index.html</welcome-file>
    </welcome-file-list> 
    			

Paso 7.- Crear el fichero xdoclet-build.properties

  1. Seleccione la carpeta MyXDocletWeb en el Package Explorer
  2. Seleccione File > New... > File.
  3. Escriba xdoclet-build.properties, como nombre del fichero como se muestra en la Figura 8 y pulse el botón Finish


    Figura 8: Crear el fichero xdoclet-build.properties
  4. Una vez que se ha creado el fichero xdoclet-build.properties y se ha abierto en el editor de texto, reemplace su contenido con el siguiente texto:
    basic.servlet.hi = MyEclipse Rocks!
    basic.servlet.bye = Feel the power of XDoclet!
    			

Paso 8.- Configurar el Proyecto para utilizar XDoclet

  1. Pulse con el botón derecho sobre la carpeta MyXDocletWeb en el Package Explorer.
  2. Seleccione Properties > MyEclipse-XDoclet
  3. Pulse sobre el botón Add Standard como se puede ver en la Figura 9:


    Figura 9: Añadir una Configuración Estándar de XDoclet
  4. Seleccione Standard Web en el diálogo emergente. La configuración resultante debe parecerse a la de la Figura 10:


    Figura 10: Añadir una Configuración Estándar Web
  5. Seleccione deploymentdescriptor bajo la entrada webdoclet y seleccione y configure los siguientes valores como se muestran en la Figura 11:
    Propiedad Valor
    Servletspec 2.3
    destDir WebRoot/WEB-INF
    displayName XDoclet Web Tutorial
    mergeDir merge


    Figura 11:Configuración del Descriptor de Despliegue
  6. Seleccione jsptaglib bajo la entrada webdoclet y seleccione y configure los siguientes valores como se muestra en la Figura 12:
    Propiedad Valor
    Jspversion 1.2
    destDir WebRoot/WEB-INF
    destinationFile mytaglib.tld
    shortname basic


    Figura 12:Configuración de la librería de Etiquetas JSP
  7. Pulse sobre el botón OK que hay en la parte inferior del diálogo de Propiedades para grabar las configuraciones de XDoclet. Esto generará un fichero xdoclet-build.xml en la carpeta del proyecto.

Paso 9.- Ejecutar XDoclet

  1. Pulse con el botón derecho sobre la carpeta MyXDocletWeb en el Package Explorer.
  2. Seleccione MyEclipse > Run XDoclet.
  3. Después de ejecutar XDoclet, verá que se han creado los ficheros web.xml y mytaglib.tld en el directorio WEB-INF; y en la consola podrá ver el resultado de la ejecución de XDoclet:


    Figura 13: Ficheros generados tras ejecutar XDoclet

Paso 10.- Añadir una Página JSP

  1. Pulse con el botón derecho sobre el proyecto MyXDocletWeb en el Package Explorer
  2. Seleccione New... > JSP.
  3. Escriba TestJSP.jsp como nombre de la página, como se ve en la Figura 14 y pulse el botón Finish:


    Figura 14: Crear una página JSP
  4. Después de que se haya generado la página JSP y se haya abierto en el editor, reemplace todo el código generado por el siguiente código:
    <%@ page language="java" %>
    <%@ taglib uri="/mytaglib" prefix="mytag" %>
    
    <html>
     <head>
        <title>I am a happy JSP page. Yeah!</title>
     </head>
     <body>
        <mytag:BasicTag includePage="true" includeBody="true" iterate="3">
          Current iteration is <%=currentIter%> <br/>
       </mytag:BasicTag>
     </body>
    </html>
    			

Paso 11.- Añadir un Página HTML

  1. Pulse con el botón derecho sobre el proyecto MyXDocletWeb en el Package Explorer
  2. Seleccione New... > HTML
  3. Escriba index.html como nombre de la página, como se ve en la Figura 15 y pulse el botón Finish:


    Figura 15: Crear una página HTML
  4. Después de que se haya generado la página HTML y se haya abierto en el editor, reemplace todo el código generado por el siguiente código:
    <html>
     <head>
       <title>XDoclet Web Tutorial</title>
     </head>
     <body>
       <br />
       <blockquote>
         <h3>XDoclet Web Tutorial</h3>
         <ul>
            <li><a href="TestJSP.jsp">Test Basic JSP Custom Tag</a></li>
            <li><a href="BasicServlet">Test Basic Servlet</a></li>
         </ul>
       </blockquote>
     </body>
    </html>
    			

Paso 12.- Verificar el Proyecto

El proyecto ya está completo. Para verificar que la estructura está completa, por favor, compare su proyecto con el mostrado en la Figura 16:


Figura 16: Estructura final del Proyecto

Paso 13.- Activar Tomcat en MyEclipse

  1. Seleccione Window > Preferences >
  2. En la ventana de Preferences seleccione MyEclipse > Application Servers y elija la versión de Tomcat que tiene instalada.
  3. Active el botón de radio Enable y rellene los campos con los directorios de Tomcat, como muestra la Figura 17 y pulse el botón OK:


    Figura 17: Activar Tomcat en MyEclipse

Paso 14.- Desplegar y Probar el Proyecto

  1. Pulse con el botón derecho sobre el proyecto MyXDocletWeb y seleccione MyEclipse > Add and Remove Project Deployments, como se muestra en la figura 18:


    Figura 18: Crear el Despliegue del Proyecto
  2. Seleccione el botón Add y seleccione Tomcat , como se muestra en la Figura 19:


    Figura 19: Elgiendo un Servidor
  3. Pulse sobre el botón OK y podrá ver si el despliegue se ha completado con éxito.


    Figura 20: Completando el Despliegue
  4. Arranque el servidor como se muestra en la Figura 21:


    Figura 21: Arrancar el Servidor
  5. Abra un navegador y pruebe la aplicación tecleando la dirección: http://localhost:8080/MyXDocletWeb. Los resultados serán parecidos a los de la Figura 22




    Figura 22: La aplicación Funciona!

Conclusión

Esto ha sido una introducción al uso de XDoclet para aplicaciones Web dentro de MyEclipse. Aunque la aplicación de ejemplo ha sido muy sencilla, es una aplicación completa que incluye una página HTML, una página JSP, un servlet basado en XDoclet, y una librería de etiquetas también basada en XDoclet. Ya conoce el funcionamiento básico, salga ahí fuera y empiece a simplificar su desarrollo Web con MyEclipse y XDoclet.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP