Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    JAVA WEB - Passare oggetti a FreeMarker

    Salve a tutti,

    Ho un problema, assurdo, ho iniziato da poco ad imparare il funzionamento del template engine Freemarker e non so se sia un mio errore .

    Ho bisogno di passare un oggetto (bean) ad un file di template .ftl cosi da far stampare i dati membro di quest'oggetto direttamente al file di template.

    Ho letto in giro che è una pratica comune. Quando eseguo la servlet viene mostrato un'eccezione dicendo che il dato passato è nullo: ${theObject.title}, se provassi a stampare ${theObject} stampa il riferimento all'oggetto.

    Qualche link in cui viene risolto il mio problema:

    http://stackoverflow.com/questions/5...d-then-looping

    http://freemarker.org/docs/pgui_data...ctWrapper.html

    Vi mostro il codice che ho scritto, non riesco proprio a risolvere questo problema

    Servlet:

    codice:
    public class servletTest extends HttpServlet {
    
    /**
     * @see Servlet#init(ServletConfig)
     */
    public void init(ServletConfig servConfig) throws ServletException {
        // TODO Auto-generated method stub
    
    
        try {
            cfg = config.getConfig();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    
    
    }
    
    
    
    
    /**
     * Questa chiamata permette di chiamare il file di configurazione per il
     * template
     */
    private Configuration             cfg;
    
    
    
    
    
    
    
    
    protected void doGet(HttpServletRequest request,
                         HttpServletResponse response) throws ServletException, IOException {
    
    
    
    
        PrintWriter out = response.getWriter();
    
    
    
    
    
    
         SimpleHash root = new SimpleHash();
         // expose a "simple" java objects:
         root.put("theString", "wombat");
         // expose an "arbitrary" java objects:
         root.put("theObject", new banquet( "Thinking In Java") );
    
    
    
    
        /* Get the template */
        Template template = cfg.getTemplate("banquetsList.ftl");
    
    
        Writer out_template = new StringWriter();
    
    
        try {
    
    
            template.process( root, out_template );
    
    
        } catch (TemplateException e) {
            e.printStackTrace();
        }
    
    
        out.write( out_template.toString() );
    
    
    
    
    
    
    }
    
    
    
    
    
    
    }

    File di configurazione di freemarker:

    codice:
    private static void build_config() throws IOException{
    
    
    
        cfg = new Configuration();
    
    
        cfg.setServletContextForTemplateLoading( R.context.get_servletContext(), R.path.get_TEMPLATE() );
    
    
        DefaultObjectWrapper ObjectWrapper = new DefaultObjectWrapper();
    
    
        cfg.setObjectWrapper( ObjectWrapper.DEFAULT_WRAPPER );
        cfg.setDefaultEncoding("UTF-8");
        cfg.setTemplateExceptionHandler(TemplateExceptionHandler.HTML_DEBUG_HANDLER);
        cfg.setIncompatibleImprovements(new Version(2, 3, 20));
    
    
    
    
    
    
    
    
    }

    Classe di cui viene derivato l'oggetto da passare:

    codice:
    class banquet{
    
    banquet( /*int code,*/ String title){
        //this.code = code;
        this.title = title;
    }
    public String title;
    //public int code;
    
    
     }
    File di template

    codice:
    <html>
    
    <body>
    
    
        <h1>
            lista di banchetti
        </h1>
    
    
    
    
    
    
        <div>
    
    
        </div>
    
    
        <div>
    
    
    
    
                   ${theObject.title}
        </div>
    
    
    
    
    
    
    </body>
    </html>

    Che cosa ho sbagliato?? non riesco proprio a capirlo... ho letto nel post precedente, che questo tipo d'approccio viene gestito tramite spring che non vorrei utilizzare perché il mio intento è quello di capire come usare freemarker.

    Grazie mille in anticipo spero di non aver fatto qualche gaff ciaooo!!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da cataDesign Visualizza il messaggio
    codice:
    class banquet{
    
    banquet( /*int code,*/ String title){
        //this.code = code;
        this.title = title;
    }
    public String title;
    //public int code;
    
    
     }
    Per quanto ne so di FreeMarker, per i "bean" accede alle "proprietà" .... non direttamente ai campi. Quindi metti pure title private e poi i getter/setter pubblici.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Intanto GRAZIE MILLEEE di aver risposto ) !!

    Quote Originariamente inviata da andbin Visualizza il messaggio
    Per quanto ne so di FreeMarker, per i "bean" accede alle "proprietà" .... non direttamente ai campi. Quindi metti pure title private e poi i getter/setter pubblici.
    ho provato a fare come dici facendo il bean in questo modo:
    codice:
    class banquet{
        
        banquet( /*int code,*/ String title){
    //        this.code = code;
            this.title = title;
        }
        private String title;
    //    public int code;
        
        public String get_title(){
            return title;
        }
        
    }
    e sul template:

    codice:
    ${theObject.get_title()}
    ma ottengo sempre il solito errore...

    codice:
    FreeMarker template errorThe following has evaluated to null or missing: ==> theObject.get_title [in template "banquetsList.ftl" at line 16, column 27] Tip: If the failing expression is known to be legally null/missing, either specify a default value with myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthessis: (myOptionVar.foo)!myDefault, (myOptionVar.foo)?? The failing instruction (FTL stack trace): ---------- ==> ${theObject.get_title()} [in template "banquetsList.ftl" at line 16, column 25] ---------- Java stack trace (for programmers): ---------- freemarker.core.InvalidReferenceException: [... Exception message was already printed; see it above ...] at freemarker.core.InvalidReferenceException.getInstance(InvalidReferenceException.java:98) at freemarker.core.UnexpectedTypeException.newDesciptionBuilder(UnexpectedTypeException.java:41) at freemarker.core.UnexpectedTypeException.<init>(UnexpectedTypeException.java:24) at freemarker.core.MethodCall._eval(MethodCall.java:119) at freemarker.core.Expression.eval(Expression.java:111) at freemarker.core.Expression.evalAndCoerceToString(Expression.java:115) at freemarker.core.DollarVariable.accept(DollarVariable.java:76) at freemarker.core.Environment.visit(Environment.java:265) at freemarker.core.MixedContent.accept(MixedContent.java:93) at freemarker.core.Environment.visit(Environment.java:265) at freemarker.core.Environment.process(Environment.java:243) at freemarker.template.Template.process(Template.java:277) at andreacatania.TomServlet.doGet(TomServlet.java:123) at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176) at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145) at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92) at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:394) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:744)
    non ho più idee... le ho provate tutte...

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da cataDesign Visualizza il messaggio
    ho provato a fare come dici facendo il bean in questo modo:
    codice:
    class banquet{
        
        banquet( /*int code,*/ String title){
    //        this.code = code;
            this.title = title;
        }
        private String title;
    //    public int code;
        
        public String get_title(){
            return title;
        }
        
    }
    e sul template:

    codice:
    ${theObject.get_title()}
    No, nel template va ${theObject.title}
    Il 'title' è il nome della proprietà e secondo le specifiche JavaBean, i metodi "accessori" (i metodi getter/setter) devono essere

    public String getTitle()
    public void setTitle(String title)


    (il nome del parametro non è importante anche se, convenzionalmente, si mette lo stesso del campo)
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Ho fatto tutto quello che dici... e la classe banquet adesso è cosi:

    codice:
    class banquet{    
        banquet( /*int code,*/ String title){
    //        this.code = code;
            
            setTitle( title );
        }
        
        
        private String title;
    //    public int code;
        
        
        
        public String getTitle(){
            return title;
        }
        
        public void setTitle( String title ){
            this.title = title;
        }
        
    }

    ottengo sempre lo stesso errore, vorrei farti vedere il codice, dal link sotto puoi scaricare il progetto e il file .WAR, non so quale ti serve, cosi lo puoi eseguire tu stesso e magari notare qualcosa che sbaglio e che io assolutamente non riesco a vedere... non ho proprio idee mamma mia..


    WAR file: https://copy.com/M6zPaogFSzX6
    Cartella del progetto: https://copy.com/FprkWiRDp7CX


    Ho pure visto che questa persona risolve il problema nel modo che hai suggerito tu..
    http://stackoverflow.com/questions/1...ts-within-list

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da cataDesign Visualizza il messaggio
    codice:
    class banquet{
    Alt, ancora un "piccolo" dettaglio: la classe del bean deve essere public.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    WOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo :------******** mamma mia!! non sai come mi hai fatto F E L I C E!!! hai reso la mia giornata migliore D ti ringrazio FANTASTICOOO!!!! MAMMA miaaaaaa non ce la facevo più DD ho solo due domande ma una quasi fuori topic...

    A cosa serve il modificatore public messo li?? per me da ignorante non serve a nulla, ma invece a cosa serve di preciso??

    Ormai mi ero dato per spacciato, e quindi mi spiegavo il perche utilizzare il Framework Spring, e quindi le dependency injection, ma adesso che ho risolto mi riviene un dubbio, a cosa serve questo Framework??

    Ti ringrazio moltissimo fantastico !!!! PR0

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da cataDesign Visualizza il messaggio
    A cosa serve il modificatore public messo li?? per me da ignorante non serve a nulla, ma invece a cosa serve di preciso??
    Serve a far sì che la classe sia accessibile da qualunque altra classe in qualunque altro package. E questo serve a FreeMarker, che accede al tuo bean tramite reflection.

    Già che ci sono ti segnalo anche una cosa: hai usato FreeMarker come "template" per pagine HTML. FreeMarker è generico, di per sé non "sa" nulla di HTML o altro linguaggio di markup. Se il tuo title (o qualunque altra property che esponi) contiene dei caratteri speciali per HTML es. '<' o '>', il tuo HTML complessivo risulta sballato.
    Per l'escaping serve dell'altro, vedere sul manuale: http://freemarker.org/docs/dgui_temp...insertion.html

    Quote Originariamente inviata da cataDesign Visualizza il messaggio
    quindi mi spiegavo il perche utilizzare il Framework Spring, e quindi le dependency injection, ma adesso che ho risolto mi riviene un dubbio, a cosa serve questo Framework??
    http://it.wikipedia.org/wiki/Spring_framework
    http://en.wikipedia.org/wiki/Spring_Framework
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Quote Originariamente inviata da cataDesign Visualizza il messaggio
    A cosa serve il modificatore public messo li?? per me da ignorante non serve a nulla, ma invece a cosa serve di preciso??
    Se una classe top level non ha uno specificatore di accesso (solo "class" quindi) allora è visibile solo da classi all'interno dello stesso package. Con "public" invece è visibile ovunque.

    Quote Originariamente inviata da cataDesign Visualizza il messaggio
    Ormai mi ero dato per spacciato, e quindi mi spiegavo il perche utilizzare il Framework Spring, e quindi le dependency injection, ma adesso che ho risolto mi riviene un dubbio, a cosa serve questo Framework??
    Ehm... Prima di metterti ad usare un framework come Spring (che fa TANTE cose, ha un sacco di moduli...) forse ti conviene studiarti bene Java (in particolare vita morte e miracoli dei java bean)
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  10. #10
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Serve a far sì che la classe sia accessibile da qualunque altra classe in qualunque altro package. E questo serve a FreeMarker, che accede al tuo bean tramite reflection.

    Già che ci sono ti segnalo anche una cosa: hai usato FreeMarker come "template" per pagine HTML. FreeMarker è generico, di per sé non "sa" nulla di HTML o altro linguaggio di markup. Se il tuo title (o qualunque altra property che esponi) contiene dei caratteri speciali per HTML es. '<' o '>', il tuo HTML complessivo risulta sballato.
    Per l'escaping serve dell'altro, vedere sul manuale: http://freemarker.org/docs/dgui_temp...insertion.html

    http://it.wikipedia.org/wiki/Spring_framework
    http://en.wikipedia.org/wiki/Spring_Framework

    Grazie mille ancora una volta ) molto utile l'escape ), per il framework spring mi sa che come dice Alex'87 devo studiare un po di più java e i java bean


    Quote Originariamente inviata da Alex'87 Visualizza il messaggio
    Ehm... Prima di metterti ad usare un framework come Spring (che fa TANTE cose, ha un sacco di moduli...) forse ti conviene studiarti bene Java (in particolare vita morte e miracoli dei java bean)
    Si, faccio tesoro di questo consiglio!
    Per caso avete qualche fonte dove leggere più in dettaglio cosa sono i java bean?
    Praticamente spring non usa i java bean classici ma bensi un altro tipo di oggetto proprietario con un funzionamento simile ma migliore, dico bene?

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.