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.
Les méthodes qui doivent être obligatoirement implémentées sont :
Vous pouvez redéfinir les méthodes suivantes :
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; } }
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>
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>
où youWebApplication est le nom de votre application WEB.
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; }
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; }