Bonjour ,

J'essaie de mettre en place la génération de document avec rtfTemplate , en y allant par étape.

En un premier lieu mon but est simplement éditer un document .rtf qui ne contient que du texte( sans les objets java que je ferais en second lieu )i.e. avoir la fenetre qui s'ouvre(ouvrir, enregistrer..).

j'utilise struts et lorsque que je suis dans ma jsp je clique sur une image qui apelle la methode valider de mon action et celle-ci fait un forward pour lancer ma servlet TestSC1 qui hérite de AbstractRTFTemplateServlet.

voici le code de TestSC1:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
 
package fr.gws.exxeco;
 
import java.io.File;
import java.io.FileReader;
import java.io.InputStream;
import java.io.Reader;
 
import javax.servlet.http.HttpServletRequest;
 
import net.sourceforge.rtf.template.IContext;
import net.sourceforge.rtf.web.servlet.AbstractRTFTemplateServlet;
 
/**
 * Servlet implementation class TestSC1
 */
public class TestSC1  extends AbstractRTFTemplateServlet  {
 
	/**
         * 
         */
	private static final long serialVersionUID = 8074086949778238114L;
 
	//private static final String JAKARATA_VELOCITY_MODEL = "jakarta-velocity-model";
    private static final String REQUEST_MODELNAME = "SC1";
    private static final String REQUEST_MUSTBECACHED = "mustBeCached";
 
 
 
 
 
	protected Reader getRTFReader(HttpServletRequest request) throws Exception {
		// 1. Get Real path of RTF model.
		String rtfModelName = "SC1";
		rtfModelName+= ".rtf";
		String rtfModelPath = "/models/suiviChantier/" + rtfModelName; 
		rtfModelPath = super.getRealPathOfRTFModel(request, rtfModelPath);
 
		// 2. Get Reader of RTF model
		Reader rtfModelReader = new FileReader(new File(rtfModelPath));
		return rtfModelReader;
	}
 
    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;
    }
 
	protected void putContext(HttpServletRequest request, IContext ctx ) throws Exception {
 
 
	}
 
	protected InputStream getXMLFieldsAvailable(HttpServletRequest request) throws Exception {
 
		String xmlFieldsAvailable = "SC1" + ".fields.xml";
		InputStream inputStream = TestSC1.class.getResourceAsStream(xmlFieldsAvailable);
		return inputStream;
 
 
	}
 
 
 
	/**
         * return name of FileName for Content-Disposition
         */
	protected String getFileNameOfContentDisposition(HttpServletRequest request) {
		String rtfModelName = request.getParameter(REQUEST_MODELNAME);
		if (rtfModelName != null) {
			return rtfModelName + ".rtf";
		}
		return super.getFileNameOfContentDisposition(request);
	}
 
 
 
 
 
}
J'ai utilisé l'exemple qu'il y avait dans la distribution rtftemplate-web-usecases-1.0.1-b14 en mettant en dur le nom de mon fichier pour mon premier test.

Mon souci est que quand je lance cette servlet j'obtient cette erreur :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
 
6 janv. 2010 14:48:43 org.apache.catalina.core.ApplicationDispatcher invoke
GRAVE: "Servlet.service()" pour la servlet TestSC1 a lancé une exception
java.lang.IllegalStateException: "getWriter()" a déjà été appelé pour cette réponse
	at org.apache.catalina.connector.Response.getOutputStream(Response.java:579)
	at org.apache.catalina.connector.ResponseFacade.getOutputStream(ResponseFacade.java:183)
	at javax.servlet.ServletResponseWrapper.getOutputStream(ServletResponseWrapper.java:102)
	at clime.messadmin.filter.MessAdminResponseWrapper.getOutputStream(MessAdminResponseWrapper.java:399)
	at net.sourceforge.rtf.web.servlet.AbstractRTFTemplateServlet.error(AbstractRTFTemplateServlet.java:213)
	at net.sourceforge.rtf.web.servlet.AbstractRTFTemplateServlet.doRequest(AbstractRTFTemplateServlet.java:177)
	at net.sourceforge.rtf.web.servlet.AbstractRTFTemplateServlet.doPost(AbstractRTFTemplateServlet.java:74)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
	at org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1054)
	at org.apache.struts.tiles.TilesRequestProcessor.doForward(TilesRequestProcessor.java:292)
	at org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:384)
	at org.apache.struts.tiles.TilesRequestProcessor.processForwardConfig(TilesRequestProcessor.java:344)
	at fr.improve.foundations.extension.strutslayout.StrutsLayoutRequestProcessor.processForwardConfig(StrutsLayoutRequestProcessor.java:53)
	at fr.improve.foundations.client.navigation.actions.ImproveFoundationProcessor.processActionPerform(ImproveFoundationProcessor.java:61)
	at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:225)
	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1858)
	at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:459)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at clime.messadmin.filter.MessAdminFilter.doFilter(MessAdminFilter.java:106)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at fr.improve.foundations.component.transaction.ThreadContextFilter.doFilter(ThreadContextFilter.java:44)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
	at java.lang.Thread.run(Unknown Source)
J'ai fait pas mal de recherche dans les forums et apparemment getWriter() a déjà été appelé dans la jsp pour instancier l'objet out.

Je me dis donc que je m'y prends mal pour implémenter rtfTemplate dans une appli web.

Si quelqu'un pourrais m'éclairer car ma jsp est mon point de départ et si j'ai bien compris j'ai besoin de cette servlet.

Voilà pour plus d'information le reste de mon code :

dans web.xml :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
	 <!-- Servlet RTFtemplate -->   
 
  <servlet>
  	<servlet-name>TestSC1</servlet-name>
  	<display-name>TestSC1</display-name>
   	<servlet-class>fr.gws.exxeco.TestSC1</servlet-class>
  	<load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
	<servlet-name>TestSC1</servlet-name>
	<url-pattern>/TestSC1</url-pattern>
  </servlet-mapping>
dans stuts-config voici mon action:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
<action attribute="imprimerSchDoc" input="/imprimerSchDoc.jsp"
			name="imprimerSchDoc" parameter="reqCode" path="/imprimerSchDoc" scope="session"
			type="fr.asfalia.asfabox.client.suivichantier.genererDoc.imprimerSchDocAction"
			validate="false">
			<forward name="ok" path="/imprimerSchDoc.jsp" />
			<forward name="editerDoc" path="/TestSC1" />
</action>
ma jsp qui ne contient qu'une liste où je choisi le document :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
<%@ page language="java" %>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>
<%@ taglib uri="http://struts.application-servers.com/layout" prefix="layout" %>
 
 
<layout:html>
	<layout:form action="/imprimerSchDoc"  key="affaire.imprimerDoc" reqCode="init">
 
    	<layout:panel key="imprimerDoc.genrationDocuments">
		  <layout:select key="imprimerDoc.libDocument" property="typeModeleDoc.idRefTypeModeleDoc" isRequired="false">
	          <layout:options collection="typeModelList" labelProperty="libRefTypeModeleDoc" property="idRefTypeModeleDoc"/>
	    </layout:select>
 
 
 
	    </layout:panel>
	</layout:form>
</layout:html>

mon action imprimerSchDocAction
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
 
package fr.asfalia.asfabox.client.suivichantier.genererDoc;
import java.util.List;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;
 
import fr.asfalia.asfabox.application.service.AppTSchAffaireService;
import fr.gws.exxeco.application.service.AppTRefTypeModeleDocService;
import fr.gws.exxeco.client.action.ButtonMenuBarAction;
import fr.gws.exxeco.enterprise.entity.TRefTypeModeleDoc;
import fr.gws.exxeco.enterprise.entity.TSchAffaire;
import fr.improve.foundations.architecture.ApplicationLayer;
import fr.improve.struts.taglib.layout.util.FormUtils;
 
 
public class imprimerSchDocAction extends DispatchAction implements	ButtonMenuBarAction {
 
 
	private static AppTRefTypeModeleDocService typeModelService = (AppTRefTypeModeleDocService) ApplicationLayer.getDefaultInstance().getService(AppTRefTypeModeleDocService.class);
	private static AppTSchAffaireService schAffaireService = (AppTSchAffaireService) ApplicationLayer.getDefaultInstance().getService(AppTSchAffaireService.class);
 
 
	private void initArray(ActionForm form, HttpServletRequest request) {
		ImprimerSchDocForm lc_form = (ImprimerSchDocForm)form;
 
		TSchAffaire schAffaire = lc_form.getSchAffaire();
		if (schAffaire != null) {
			if (schAffaire.getTRefTypePrestation() != null) {
				// mettre la liste de lib de models des docs dans la request
				List<TRefTypeModeleDoc> modelList = typeModelService.rechercheTRefTypeModeleDocListByTRefTypePrestation(schAffaire.getTRefTypePrestation().getIdRefTypePrestation());
				request.setAttribute("typeModelList", modelList);
			}
		}
 
	}
 
	public ActionForward init(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		String result = "ok";
 
		ImprimerSchDocForm lc_form = (ImprimerSchDocForm) form;
 
		lc_form.setTypeModeleDoc(new TRefTypeModeleDoc());
 
		FormUtils.setFormDisplayMode(request, form, FormUtils.EDIT_MODE);
		// boutons enregistrer et annuler actifs
		request.setAttribute("menuBar", "bouton_enregistrer_annuler_actif");
		String selectedIdSchAffaireString = request.getParameter("selectedIdSchAffaire");
		int selectedSchAffaireId = selectedIdSchAffaireString != null ? Integer.valueOf((String)selectedIdSchAffaireString): 0;
		if (selectedSchAffaireId == 0) {
			selectedSchAffaireId = (Integer)request.getSession().getAttribute("idSchAffaireString");
		}
		if (selectedSchAffaireId != 0){
			lc_form.setSchAffaire((TSchAffaire)imprimerSchDocAction.schAffaireService.rechercherParId(selectedSchAffaireId));
		}
 
		initArray(form, request);
		return mapping.findForward(result) ;
	}
 
 
 
 
 
	public ActionForward valider(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
 
		String result = "editerDoc";
 
		ImprimerSchDocForm lc_form = (ImprimerSchDocForm) form;
 
 
		return mapping.findForward(result);
	}
 
 
 
 
 
 
 
}
les méthodes init et initArray ne faisant que charger ma comboBox pour l'instant.

Merci pour vos réponses.

De mon coté je continue à chercher .