Re: How to Use Custom Bean in Freemarker

Dinesh Gupta <[email protected]>
Newsgroups gmane.comp.web.freemarker.user
Message-ID <CAMwQn-uxM-1x=m3QyB14RjEkSL2CoP9W=7-wFDXpqKQkVLkjRA@mail.gmail.com>
Hi All,
I have given you to full source code.
Please make it runnable without error.

Thanks I advance.

Code:
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Hashtable;
import java.util.List;

import org.apache.log4j.Logger;

import freemarker.ext.beans.BeansWrapper;
import freemarker.template.Configuration;
import freemarker.template.ObjectWrapper;
import freemarker.template.SimpleHash;
import freemarker.template.Template;
import freemarker.template.TemplateException;

public class Main {
        private static final Logger LOGGER = Logger.getLogger(Main.class);
        public static void main(String[] args) {
                LOGGER.info("Entering main in Main");
                Calendar now = Calendar.getInstance();
                System.out.println("Current date : " +
(now.get(Calendar.MONTH) + 1)
                                + "-" + now.get(Calendar.DATE) + "-" +
now.get(Calendar.YEAR));

                // add days to current date using Calendar.add method
                now.add(Calendar.DATE, 1);

                System.out.println("date after one day : "
                                + (now.get(Calendar.MONTH) + 1) + "-" +
now.get(Calendar.DATE)
                                + "-" + now.get(Calendar.YEAR));
                sample();
        }
        private static void sample(){
                try {
                        LOGGER.info("Entering sample in Case Manager");
                        Configuration fmCfg = new Configuration();
                        /*BeansWrapper beanWrapper = new BeansWrapper();

//beanWrapper.setExposureLevel(BeansWrapper.EXPOSE_ALL);
                        beanWrapper.setExposeFields(true);
                        fmCfg.setObjectWrapper(beanWrapper);*/
                        Template template =
fmCfg.getTemplate("./resources/helloworld.ftl");
                        SimpleHash context = new
SimpleHash(ObjectWrapper.BEANS_WRAPPER);

                        // Build the data-model
                        context.put("message", "Hello World!");

                        //List parsing
                        List<String> countries = new ArrayList<String>();
                        countries.add("India");
                        countries.add("United States");
                        countries.add("Germany");
                        countries.add("France");
                        context.put("countries", countries);
                        List<User> lUsers = new ArrayList<User>(2);
                        lUsers.add(new User("Dinesh","GatewayPark"));
                        lUsers.add(new User("Sandeep","Banglore"));
                        context.put("users",lUsers);

                        // Console output
                        Writer out = new OutputStreamWriter(System.out);
                        template.process(context, out);
                        out.flush();

                        // File output
                        Writer file = new FileWriter(new
File("./output/FTL_helloworld.html"));
                        template.process(context, file);
                        file.flush();
                        file.close();
                } catch (IOException e) {
                        LOGGER.error(e);
                } catch (TemplateException e) {
                        LOGGER.error(e);
                }
        }
}
class User{
        String name;
        String place;
        public User(String name, String place) {
                this.name = name;
                this.place = place;
        }
        public String getName() {
                return name;
        }
        public void setName(String name) {
                this.name = name;
        }
        public String getPlace() {
                return place;
        }
        public void setPlace(String place) {
                this.place = place;
        }
}

Template :
        FreeMarker Template example: ${message}

        =======================
        ===  County List   ====
        =======================
        <#list countries as country>
            ${country_index + 1}. ${country}
        </#list>

        =======================
        ===  User List   ====
        =======================
        User Objects: ${users}
        <#list users as user>
                ${user_index+1}. ${user.name}
        </#list>
Error I am getting:

        Current date : 11-30-2012
date after one day : 12-1-2012
FreeMarker Template example: Hello World!

        =======================
        ===  County List   ====
        =======================
            1. India
            2. United States
            3. Germany
            4. France

        =======================
        ===  User List   ====
        =======================
        User Objects: [com.tatainfotech.Common.User@192d342,
com.tatainfotech.Common.User@6b97fd]
                1.
Expression user.name is undefined on line 15, column 36 in
resources/helloworld.ftl.
The problematic instruction:
----------
==> ${user.name} [on line 15, column 34 in resources/helloworld.ftl]
----------

Java backtrace for programmers:
----------
freemarker.core.InvalidReferenceException: Expression user.name is
undefined on line 15, column 36 in resources/helloworld.ftl.
        at
freemarker.core.TemplateObject.assertNonNull(TemplateObject.java:125)
        at freemarker.core.Expression.getStringValue(Expression.java:118)
        at freemarker.core.Expression.getStringValue(Expression.java:93)
        at freemarker.core.DollarVariable.accept(DollarVariable.java:76)
        at freemarker.core.Environment.visit(Environment.java:221)
        at freemarker.core.MixedContent.accept(MixedContent.java:92)
        at freemarker.core.Environment.visit(Environment.java:221)
        at
freemarker.core.IteratorBlock$Context.runLoop(IteratorBlock.java:167)
        at freemarker.core.Environment.visit(Environment.java:428)
        at freemarker.core.IteratorBlock.accept(IteratorBlock.java:102)
        at freemarker.core.Environment.visit(Environment.java:221)
        at freemarker.core.MixedContent.accept(MixedContent.java:92)
        at freemarker.core.Environment.visit(Environment.java:221)
        at freemarker.core.Environment.process(Environment.java:199)
        at freemarker.template.Template.process(Template.java:259)
        at com.tatainfotech.Common.Main.sample(Main.java:76)
        at com.tatainfotech.Common.Main.main(Main.java:46)
 On Nov 30, 2012 1:54 AM, "Daniel Dekany" <[email protected]> wrote:

> So I see you expect "users" to be *list* of Users. Then, the problem
> is this line:
>
>   context.put("users",new Users("Diinesh","GatewayPark"));
>
> You wanted to write this:
>
>   context.put("users", lUsers);
>
> Also inside the #foreach you want ${user.name}, not ${users.name}.
>
> (Also, why's the class name "Users"? It should be User, as it
> represents a *single* user.)
>
> --
> Best regards,
>  Daniel Dekany
>
>
> Thursday, November 29, 2012, 2:15:07 PM, Dinesh Gupta wrote:
>
> > Dear Daniel,
> > Thanks for quick replying.
> > Below template I Am using with previous mention mail code
> > ------------
> > : FreeMarker Template example: ${message}
> > ======================= === County List ====
> > ======================= <#list countries as country> ${country_index
> > + 1}. ${country} </#list> ${users.name} ======================= ===
> > User List ==== ======================= <list user as users>
> > <#foreach user in users> ${user_index + 1}. ${users.name} </#foreach>
> > -----------------
> > But I am getting below error:
> > FreeMarker Template example: Hello World!
> > ======================= === County List ====
> > ======================= 1. India 2. United States 3. Germany 4. France
> > ======================= === User List ==== ======================= <list
> user as users>
> > Expected collection or sequence. users evaluated instead to
> > freemarker.ext.beans.StringModel on line 15, column 27 in
> > resources/helloworld.ftl. The problematic instruction: ----------==>
> > foreach user in users [on line 15, column 9 in
> > resources/helloworld.ftl] ----------
> > Java backtrace for programmers:
> > ----------freemarker.template.TemplateException: Expected collection
> > or sequence. users evaluated instead to
> > freemarker.ext.beans.StringModel on line 15, column 27 in
> > resources/helloworld.ftl. at freemarker.core.TemplateObject.
> > invalidTypeException(TemplateObject.java:136) at
> > freemarker.core.IteratorBlock$
> > Context.runLoop(IteratorBlock.java:190) at
> > freemarker.core.Environment. visit(Environment.java:428) at
> > freemarker.core.IteratorBlock. accept(IteratorBlock.java:102) at
> > freemarker.core.Environment. visit(Environment.java:221) at
> > freemarker.core.MixedContent. accept(MixedContent.java:92) at
> > freemarker.core.Environment. visit(Environment.java:221) at
> > freemarker.core.Environment. process(Environment.java:199) at
> > freemarker.template.Template. process(Template.java:259) at
> > com.tatainfotech.Common.Main. sample(Main.java:76) at
> > com.tatainfotech.Common.Main.main(Main.java:46)
> > On Nov 29, 2012 3:21 AM, "Daniel Dekany" <[email protected]> wrote:
> > You just put that Users (sic) object into the data model, and then
> > access its properties like:
> >
> >   ${users.name}
> >
> > This works with the default wrapper too, since that extends
> > BeansWrapper. (Although I would avoid the default wrapper in new
> > projects, and just use pure BeansWrapper... but that's another story.)
> >
> > --
> > Best regards,
> >  Daniel Dekany
> >
> >
> > Wednesday, November 28, 2012, 5:04:47 PM, Dinesh Gupta wrote:
> >
> >> Please help me out this problem.
> >>  How can I access the POJO(custom bean) I Freemarker.
> >> How can I use BeansWrapper or  other DataModal. Please give me an
> example of the one
> >>
> >>
> >> ----------------------------------
> >> import java.io.File;
> >> import java.io.FileWriter;
> >> import java.io.IOException;
> >> import java.io.OutputStreamWriter;
> >> import java.io.Writer;
> >> import java.util.ArrayList;
> >> import java.util.Calendar;
> >> import java.util.List;
> >>
> >> import org.apache.log4j.Logger;
> >>
> >>
> >>
> >> import freemarker.template.Configuration;
> >> import freemarker.template.ObjectWrapper;
> >> import freemarker.template.SimpleHash;
> >> import freemarker.template.Template;
> >> import freemarker.template.TemplateException;
> >>
> >>
> >> public class Main {
> >>         private static final Logger LOGGER =
> Logger.getLogger(Main.class);
> >>         public static void main(String[] args) {
> >>                 LOGGER.info("Entering main in Main");
> >>                 Calendar now = Calendar.getInstance();
> >>                 System.out.println("Current date : " +
> (now.get(Calendar.MONTH) + 1)
> >>                                 + "-" + now.get(Calendar.DATE) + "-" +
> now.get(Calendar.YEAR));
> >>
> >>                 // add days to current date using Calendar.add method
> >>                 now.add(Calendar.DATE, 1);
> >>
> >>                 System.out.println("date after one day : "
> >>                                 + (now.get(Calendar.MONTH) + 1) + "-" +
> now.get(Calendar.DATE)
> >>                                 + "-" + now.get(Calendar.YEAR));
> >>                 sample();
> >>         }
> >>         private static void sample(){
> >>                 try {
> >>                         LOGGER.info("Entering sample in Case Manager");
> >>                         Configuration fmCfg = new Configuration();
> >>                         /*BeansWrapper beanWrapper = new BeansWrapper();
> >>
> >> //beanWrapper.setExposureLevel(BeansWrapper.EXPOSE_ALL);
> >>                         beanWrapper.setExposeFields(true);
> >>                         fmCfg.setObjectWrapper(beanWrapper);*/
> >>                         Template template =
> >> fmCfg.getTemplate("./resources/helloworld.ftl");
> >>                         SimpleHash context = new
> >> SimpleHash(ObjectWrapper.BEANS_WRAPPER);
> >>
> >>                         // Build the data-model
> >>                         context.put("message", "Hello World!");
> >>
> >>                         //List parsing
> >>                         List<String> countries = new
> ArrayList<String>();
> >>                         countries.add("India");
> >>                         countries.add("United States");
> >>                         countries.add("Germany");
> >>                         countries.add("France");
> >>                         context.put("countries", countries);
> >>                         List<Users> lUsers = new ArrayList<Users>(2);
> >>                         lUsers.add(new Users("Diinesh","GatewayPark"));
> >>                         lUsers.add(new Users("Sandeep","Banglore"));
> >>                         context.put("users",new
> Users("Diinesh","GatewayPark"));
> >>
> >>                         // Console output
> >>                         Writer out = new OutputStreamWriter(System.out);
> >>                         template.process(context, out);
> >>                         out.flush();
> >>
> >>                         // File output
> >>                         Writer file = new FileWriter(new
> >> File("./output/FTL_helloworld.html"));
> >>                         template.process(context, file);
> >>                         file.flush();
> >>                         file.close();
> >>                 } catch (IOException e) {
> >>                         LOGGER.error(e);
> >>                 } catch (TemplateException e) {
> >>                         LOGGER.error(e);
> >>                 }
> >>         }
> >> }
> >> class Users{
> >>         String name;
> >>         String place;
> >>         public Users(String name, String place) {
> >>                 this.name = name;
> >>                 this.place = place;
> >>         }
> >>         public String getName() {
> >>                 return name;
> >>         }
> >>         public void setName(String name) {
> >>                 this.name = name;
> >>         }
> >>         public String getPlace() {
> >>                 return place;
> >>         }
> >>         public void setPlace(String place) {
> >>                 this.place = place;
> >>         }
> >>
> >> }
> >> ----------------------------------
> >
> >
> >
> ------------------------------------------------------------------------------
> > Keep yourself connected to Go Parallel:
> > INSIGHTS What's next for parallel hardware, programming and related
> areas?
> > Interviews and blogs by thought leaders keep you ahead of the curve.
> > http://goparallel.sourceforge.net
> > _______________________________________________
> > FreeMarker-user mailing list
> > [email protected]
> > https://lists.sourceforge.net/lists/listinfo/freemarker-user
>
>

------------------------------------------------------------------------------
Keep yourself connected to Go Parallel: 
TUNE You got it built. Now make it sing. Tune shows you how.
http://goparallel.sourceforge.net

_______________________________________________
FreeMarker-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freemarker-user
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.