Guide utilisateur - Intégration RTFTempate - Servlet

RTFTemplate & Servlet

Pour utiliser RTFTemplate dans votre application WEB, vous pouvez implémenter la servlet net.sourceforge.rtf.web.servlet.AbstractRTFTemplateServlet.

Pour utilser cette classe vous devez :

La distribution rtftemplate-web-usecases-version fournit des exemples de cas d'utilisation de RTFTemplate dans une application WEB.

Implementation de AbstractRTFTemplateServlet

Les méthodes qui doivent être obligatoirement implémentées sont :

  • putContext : cette méthode vous permet de poser dans le contexte tous les objets JAVA que votre modèle RTF peut utiliser. Concernant les collections ou les objets complexes (avec graphes d'objets), il est très important d'instancier la collection et de lui ajouter au moins UN objet Java, afin que RTFTemplate puisse générer les macros de boucles (#foreach pour Velocity, #list pour freemarker,...), mais aussi qu'il puisse générer correctement le fichier XML des champs disponibles (*.fields.xml).
  • getXMLFieldsAvailable : cette méthode doit retourner le flux du fichier XML des champs disponibles pour le modèle à éditer. Si le modèle n'est pas mis encache, cette méthode sera appelé à chaque édition RTF.

    Vous pouvez redéfinir les méthodes suivantes :

  • getRTFReader OU getRTFInputStream : ces méthodes doivent retourner le contenu (Reader ou InputStream) du modèle source RTF. Si le modèle n'est pas mis en cache, cette méthode sera appelé à chaque édition RTF. du modèle.
  • getFileNameOfContentDisposition : cette méthode doit retourner le nom du fichier à utiliser (peut être totalement différent du nom du fichier du modèle RTF source). dans le "Content-Disposition" of requête http.
  • getGroupByPerPageBreak : retourner le nombre de groupByPerPageBreak pour générer tous les groupByPerPageBreakème un saut de page sur la première liste que RTFTemplate détecte dans votre modèle RTF.
  • cacheWithKey et unCacheWithKey : ces méthodes vous permettent de gérer le cache l'instance RTFDocument transformé. La mise en cache permet d'optimiser l'éditon des modèles RTF.
  • getGlobalApplicationContext et getApplicationContext : ces méthodes vous permettent d'indiquer la configuration Spring à utiliser avec RTFTemplate (globalement ou pour un modèle RTF).

Voici un example de classe qui implémente AbstractRTFTemplateServlet :

  ...
  import net.sourceforge.rtf.web.servlet.RTFTemplateServlet;

  public class SampleRTFTemplateServlet extends AbstractRTFTemplateServlet  {

      public static final long serialVersionUID = 1L;
      private static final String JAKARATA_VELOCITY_MODEL = "jakarta-velocity-model";
      private static final String REQUEST_MODELNAME = "modelName";
      private static final String REQUEST_MUSTBECACHED = "mustBeCached";
      
      private static final String JAKARATA_VELOCITY_MODEL = "jakarta-velocity-model";
      
      protected Reader getRTFReader(HttpServletRequest request) throws Exception {
              // 1. Get Real path of RTF model.
              String rtfModelName = request.getParameter(REQUEST_MODELNAME);
              rtfModelName+= ".rtf";
              String rtfModelPath = "/models/jakartavelocityproject/" + rtfModelName; 
              rtfModelPath = super.getRealPathOfRTFModel(request, rtfModelPath);
              
              // 2. Get Reader of RTF model
              Reader rtfModelReader = new FileReader(new File(rtfModelPath));
              return rtfModelReader;
      }
      
      protected void putContext(HttpServletRequest request, IContext ctx ) throws Exception {
              // Swith RTF Model Name, Context is different
              String rtfModelName = request.getParameter(REQUEST_MODELNAME);
              if (JAKARATA_VELOCITY_MODEL.equals(rtfModelName)) {
                      putContextJAKARATA_VELOCITY_MODEL(request, ctx);
              }
              else {
                      // ...... Other RTF model
              }
      }
      
      protected InputStream getXMLFieldsAvailable(HttpServletRequest request) throws Exception {
              //        Swith RTF Model Name, XML fields available is different or can be null
              String rtfModelName = request.getParameter(REQUEST_MODELNAME);
              if (JAKARATA_VELOCITY_MODEL.equals(rtfModelName)) {
                      String xmlFieldsAvailable = rtfModelName + ".fields.xml";
                      InputStream inputStream = SampleRTFTemplateServlet.class.getResourceAsStream(xmlFieldsAvailable);
                      return inputStream;
              }
              else {
                      // ...... Other RTF model
              }
              return null;
      }
      
      protected void putContextJAKARATA_VELOCITY_MODEL(HttpServletRequest request, IContext ctx ) throws Exception {
              
              String projectName = request.getParameter("projectName");
              
              String projectName = request.getParameter("projectName");
              /*
               * Context of simply POJO
               */
              ctx.put("date", new Date());
              ctx.put("project", new Project(projectName));
      }
      
      /**
       * return name of FileName for Content-Disposition
       */
      protected String getFileNameOfContentDisposition(HttpServletRequest request) {
              String rtfModelName = request.getParameter("modelName");
              if (rtfModelName != null) {
                      return rtfModelName + ".rtf";
              }
              return super.getFileNameOfContentDisposition(request);
      }
        
    protected String cacheWithKey(HttpServletRequest request) {
        // Test if checkbox cache is checked
        if (request.getParameter(REQUEST_MUSTBECACHED) != null) {
            // Cache must be enable for the RTF model
            // return name of the RTF model
            return request.getParameter(REQUEST_MODELNAME);
        }
        return null;
    }
    
    protected String unCacheWithKey(HttpServletRequest request) {
        // Test if checkbox cache is checked
        if (request.getParameter(REQUEST_MUSTBECACHED) == null) {
            // Cache must be disable for the RTF model
            // return name of the RTF model
            return request.getParameter(REQUEST_MODELNAME);            
        }        
        return null;
    }        
}

Declaration de votre servlet

Une fois que vous avez implémenter la servlet AbstractRTFTemplateServlet, vous devez la déclarer dans votre fichier web.xml, comme ceci :

  <!-- Servlet RTFtemplate -->   
  <servlet>
    <servlet-name>rtf</servlet-name>
    <servlet-class>net.sourceforge.rtf.web.usecases.SampleRTFTemplateServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>rtf</servlet-name>
    <url-pattern>/rtfservlet/*</url-pattern>
  </servlet-mapping>  

Appel de votre servlet

Pour lancer une édition RTF à partir de votre servlet, vous devez définir un formulaire HTML qui poste vers votre servlet :

  <form name="sampleRTFTemplate" action="/youWebApplication/rtfservlet" >
  
    <input type="submit" value="Launch RTF Edition" >
    
  </form>
  

youWebApplication est le nom de votre application WEB.

XML fields available

Il est conseillé d'utiliser le fichier XML des champs disponibles (*.fields.xml). Pour effectuer ceci vous devez imlémenter la méthode getXMLFieldsAvailable de la classe AbstractRTFTemplateServlet.

  protected InputStream getXMLFieldsAvailable(HttpServletRequest request) throws Exception {  
    ....
    return xmlFieldsInputStream;
  }  
  

Optimisation

Pour avoir un explication plus en détail de l'optimisation de RTFTemplate, vous pouvez lire cette section

Pour mettre en cache le modèle source RTF, vous devez définir la méthode cacheWithKey, qui doit retourner l'identifiant du modèle à mettre dans le cache. Voici un exemple :

    protected String cacheWithKey(HttpServletRequest request) {
        // Test if checkbox cache is checked
        if (request.getParameter(REQUEST_MUSTBECACHED) != null) {
            // Cache must be enable for the RTF model
            // return name of the RTF model
            return request.getParameter(REQUEST_MODELNAME);
        }
        return null;
    }

Pour supprimer le modèle du cache (dans le cas d'une mise à jour du modèle source RTF), vous devez définir la méthode unCacheWithKey, qui doit retourner l'identifiant du modèle à enlever du cache . Voici un exemple :

  protected String unCacheWithKey(HttpServletRequest request) {
        // Test if checkbox cache is checked
        if (request.getParameter(REQUEST_MUSTBECACHED) == null) {
            // Cache must be disable for the RTF model
            // return name of the RTF model
            return request.getParameter(REQUEST_MODELNAME);            
        }        
        return null;
    }