cancel
Showing results for 
Search instead for 
Did you mean: 

Java-backed Web Scripts interface utilisateur

michel
Champ in-the-making
Champ in-the-making
Bonjour,

Je suis en trains de voir comment fonctionne les Java-backed Web Scripts et j'ai une petite question:

Comment peut-on renvoyer des données au client (web en général) autrement que via:


res.getWriter().write("les données");

est-il possible d'utiliser une JSP ou quelque chose d'autre pour la présentation (style comme en FTL/javascript)?

Je passe via le java pour une question de performance…

Merci d'avance.

Michel.
24 REPLIES 24

thomasb
Champ in-the-making
Champ in-the-making
Bonjour,

Je suis en trains de voir comment fonctionne les Java-backed Web Scripts et j'ai une petite question:

Comment peut-on renvoyer des données au client (web en général) autrement que via:


res.getWriter().write("les données");

est-il possible d'utiliser une JSP ou quelque chose d'autre pour la présentation (style comme en FTL/javascript)?

Si FreeMarker convient, il suffit de dériver de DeclarativeWebScript au lieu de AbstractWebScript. Sinon, il faudra appeler le renderer (JSP ou autre) directement; je ne connais pas les APIs JSP mais c'est très probablement possible.

Je passe via le java pour une question de performance…

Je ne suis pas sûr que ce soit une raison suffisante pour choisir Java plutôt que JavaScript. Il n'y a qu'à voir comment Alfresco Share utilise du "declarative WebScript" de partout: pour une page affichée, il y a au minimum (je dis ça à la louche) 3 WebScripts appelés côté Share, sans compter les WebScripts côté "repository" pour obtenir les données à afficher.

À mon avis, le choix de Java pour les webscripts doit être fait plus en cas de nécessité, si après benchmarks il s'avère que le pendant javascript présente effectivement des difficultés (et je ne parle pas de mesures comparatives, mais de "performance jugée acceptable" ou non); ou bien pour absence de fonctionnalités en JavaScript. Pour Share par exemple, l'invitation d'utilisateurs nécessite un "run as system", qui n'est pas dispo en JavaScript (j'ai fait une ScriptProcessExtension pour ça dans un projet, Alfresco a préféré coder le webscript entièrement en Java).

michel
Champ in-the-making
Champ in-the-making
Un grand merci pour ta réponse.

En ce qui concerne le choix de java au lieu de javascript pour les webscripts, il s'agit justement d'un cas de nécessité. En effet, le webscript existe déjà en javascript mais son exécution est trop lente lorsqu'il doit afficher énormément de données (documents/espaces); il met plus de 2 minutes.

Je teste ça de suite.

michel
Champ in-the-making
Champ in-the-making
Bonjour,

Voici un petit feedback à propos des "Java-backed Web Scripts".

Pour créer un Java-backed end Web Scripts, il faut :

1) Étendre la classe : org.alfresco.web.scripts.DeclarativeWebScript
2) Overridé la méthode protected Map<String, Object> executeImpl(WebScriptRequest req, WebScriptStatus status)
3) Construire son modèle dans une Map comme suit: Clef Valeur/objet
4) Créer l'intégration spring dans un fichier XML du bean Java-backed end Web Scripts
5) Créer la description/intégration XML du web-script. (attention il faut être authentifier pour pouvoir avoir accès au compagy_home)
6) Créer le ficher ftl.

pour plus ample information, veuillez-vous référer au wiki à l'adresse suivante: http://wiki.alfresco.com/wiki/Java-backed_Web_Scripts_Samples

bertrandf
Champ on-the-rise
Champ on-the-rise
Bonjour,

J'ai suivi les étapes que vous avez décrites mais je ne parviens pas à récupèrer ce que j'ai mis dans mon modèle avec mon fichier freemarker.

Par exemple, si je mets dans mon modèle ceci :

Map<String, Object> model = new HashMap<String, Object>();
model.put("Var", "Hello World");

return model;

Comment faut-il faire pour récupèrer les données dans son fichier ftl?

J'ai essayé avec :
${model.Var}
et
${Var}
mais ca ne marche pas.

Est-ce que qqn pourrait m'expliquer svp, car je suis ne suis pas très à l'aise avec freemarker.
Merci d'avance.

thomasb
Champ in-the-making
Champ in-the-making
Normalement ${Var}.

Sans en savoir plus sur le "ça ne marche pas", je dirais que peut-être le bean n'est pas correctement déclaré côté Spring, donc le code pas exécuté (et comme un webscript peut n'être composé que d'un couple desc.xml + ftl…)

bertrandf
Champ on-the-rise
Champ on-the-rise
Merci pour la réponse.

Quand je dis ca ne marche pas, c'est qu'en fait il ne connait pas la variable :
Wrapped Exception (with status template): Error during processing of the template 'Expression Var is undefined on line 7, column 21 in org/alfresco/audit/simple.get.html.ftl.'.

Je vais regarder coté Spring.

Merci, je pensais que j'utilisais mal freemarker.

michel
Champ in-the-making
Champ in-the-making
Bonjour,

Normalement c'est bien
${Var}
pour accéder à la variable Smiley Happy

Mais peux-tu montrer l'erreur que tu obtiens en ftl ou dans les log d'alfresco?

bertrandf
Champ on-the-rise
Champ on-the-rise
Voici l'erreur que j'obtiens :


Exception:   freemarker.core.InvalidReferenceException - Expression Var is undefined on line 6, column 19 in org/alfresco/audit/simple.get.html.ftl.
   
   freemarker.core.TemplateObject.assertNonNull(TemplateObject.java:124)
   freemarker.core.Expression.getStringValue(Expression.java:118)
   freemarker.core.Expression.getStringValue(Expression.java:93)
   freemarker.core.DollarVariable.accept(DollarVariable.java:76)
   freemarker.core.Environment.visit(Environment.java:208)
   freemarker.core.MixedContent.accept(MixedContent.java:92)
   freemarker.core.Environment.visit(Environment.java:208)
   freemarker.core.Environment.process(Environment.java:188)
   freemarker.template.Template.process(Template.java:237)
   org.alfresco.repo.template.FreeMarkerProcessor.process(FreeMarkerProcessor.java:201)
   org.alfresco.web.scripts.AbstractWebScript.renderTemplate(AbstractWebScript.java:505)
   org.alfresco.web.scripts.DeclarativeWebScript.renderFormatTemplate(DeclarativeWebScript.java:241)
   org.alfresco.web.scripts.DeclarativeWebScript.execute(DeclarativeWebScript.java:147)
   org.alfresco.repo.web.scripts.RepositoryContainer$2.execute(RepositoryContainer.java:319)
   org.alfresco.repo.transaction.RetryingTransactionHelper.doInTransaction(RetryingTransactionHelper.java:320)
   org.alfresco.repo.transaction.RetryingTransactionHelper.doInTransaction(RetryingTransactionHelper.java:227)
   org.alfresco.repo.web.scripts.RepositoryContainer.transactionedExecute(RepositoryContainer.java:368)
   org.alfresco.repo.web.scripts.RepositoryContainer.transactionedExecuteAs(RepositoryContainer.java:390)
   org.alfresco.repo.web.scripts.RepositoryContainer.executeScript(RepositoryContainer.java:273)
   org.alfresco.web.scripts.AbstractRuntime.executeScript(AbstractRuntime.java:261)
   org.alfresco.web.scripts.AbstractRuntime.executeScript(AbstractRuntime.java:139)
   org.alfresco.web.scripts.servlet.WebScriptServlet.service(WebScriptServlet.java:116)
   javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
   org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
   org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
   org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
   org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
   org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
   org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
   org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
   org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
   org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
   org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
   org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
   java.lang.Thread.run(Thread.java:619)

Merci.

bertrandf
Champ on-the-rise
Champ on-the-rise
je dirais que peut-être le bean n'est pas correctement déclaré côté Spring

En fait j'ai repris l'exemple du wiki et quand je créé mon WebScript avec AbstractWebScript, il fonctionne bien.

Mais je n'arrive pas à le faire fonctionner avec DeclarativeWebscript, pourtant:
- j'etends bien la classe : org.alfresco.web.scripts.DeclarativeWebScript
- j'ai overridé la méthode protected Map<String, Object> executeImpl(WebScriptRequest req, Status status)
- et j'ai construis son modèle dans une Map ( Clef Valeur/objet)

En ce qui concerne l'intégration spring dans un fichier XML du bean et la description/intégration XML du web-script, je fais la même chose que l'exemple du wiki.

L'intégration spring dans un fichier XML du bean est bien la même que j'etende la classe AbstractWebScript ou la classe DeclarativeWebscript ?

En ce qui concerne le fichier template, je l'ai nommé : nomWS.get.html.ftl et je l'ai placé au même endroit que la description du WS (nomWS.get.desc.xml), c'est bien ce qu'il faut faire?
Y-a-t-il qqch à préciser quelque part pour indiquer qu'il faut utiliser mon fichier ftl (dans la classe java ou dans la déclaration du WS) ou cela se fait implicitement vu le nom du template?

Je vous remercie par avance.