jEE work

01/16/2010

AOP cu aspectJ

Filed under: Uncategorized — Edi @ 8:08 pm

Am sa scriu cateva randuri despre folosirea aspectj in ECLIPSE. Am schimbat mediul de lucru pentru ca NetBeans nu are plugin pentru aspectj decat in versiunea 6.0 si la momentul la care scriu versiunea curenta e 6.8, deci o sa folosesc Eclipse 3.5 si aspectj.

Eclipse se gaseste aici.
Aspectj pentru Eclipse se gaseste aici. Pentru cei care nu stiu cum sa instaleze un plugin in eclipse vedeti asta.

Dupa ce ati instalat acest plugin e foarte simplu. Puteti sa faceti un proiect java, apoi o clasa Main, cu niste metode, si apoi un Aspect. Din meniu File -> New -> Aspect.
O un aspect simplu arata asa:

public aspect WorkerA {
	pointcut timing() : execution(* main.Main.*());

	before() : timing() {
		System.out.println("Inainte de metoda");
	}

	after() : timing() {
		System.out.println("Dupa apelarea metodei");
	}
}

Pentru a intelege mai bine ce e cu acel pointcut si cu expresia regulata data ca parametru puteti citi un nicte cartulii in domeniu. (hint).

12/03/2009

Cate ceva despre RMI si JMS

Filed under: JMS RMI — Edi @ 3:22 pm

Linkuri utile RMI
- de la sun

- de la bucknell

- de la coffeebreak (colorat)
- alt blog jurnal (in romana).
- de la redhat
si cateva despre jms
- de la sun
- de la alt blogger (recomandat)
- de la un indian
- de la oracle.

Un tutorial foarte bun pt cine are rabdare sa citeasca pdf-uri -  jms_tutorial-1_3_1

Imi pare rau ca nu mai am timp sa pun aplicatiile testate de mine. Sper insa sa fie suficiente linkurile.
Spor la cod.

11/23/2009

Object Oriented Database

Filed under: Databases — Edi @ 10:10 pm

Voi pune niste link-uri spre cateva sisteme de baze de date orientate obiect.

Traiasca wikipedia (ps: are nevoie de bani).

Si ca sa va ajut sa alegeti eu am vizionat si am citit cate un pic din sistemele alea si am ales cateva, in ordinea preferintei:

1. DB4O.
2. Java objects database.
3. Cacé.

DB4O are o documentatie consistenta pe cate o gasitit aici.

Si ceva legat de serializarea in xml a obiectelor:
exemplul asta pare ok si o implementare la jaxm gasiti aici.

Daca citeste cineva ce scriu eu pe aici si are o solutie mai buna va rog sa nu ezitati sa lasati un comment.

Spor la scris.

11/20/2009

Linkuri utile despre jsf

Filed under: Databases,Hibernate,JSF — Edi @ 11:03 pm

Cum sa accesezi corect un managed-bean programatic gasesti aici , sper sa nu dispara pagina si sa am timp sa o adaug pe plogul meu (care de asemenea sper sa nu pateasca nimic);

Alte informatii despre hibernate si JSF, cum sa faci o aplicatie jsf si Hibernate in netBeans, tutorial oficial NetBeans aici, foarte interesant si util.

Totorial Hibernate in eclipse intuitiv gasiti aici .

Acelas exemplu oferit de catre JDeveloper gasiti aici . JDeveloper este un IDE dezvoltat de catre cei de la Oracle.

O alta idee de aplicatie JSF si Hibernate gasiti si aici .

Un tutorial interesant despre Hibernate gasiti aici .

Informatii interesanta despre cum sa golesti o tabela in Hibernate gasesti aici.

Un site interesant despre maparile Hibernate gasiti aici . Mi se pare foarte util pt a intelege mai usor si a dezvolta mai rapid o aplicatie.

O versiune unor probleme care implica hibernate si JSF vor fi adaugate mai tarziu pe acest blog.

11/19/2009

Postgres auto-increment

Filed under: Databases — Edi @ 10:27 pm

Eu folosesc Sistemul de baze de date PostgreSQL si ma lovesc des de problema auto incrementarii id-ului pe tabele. Deci o sa scriu aici o serie de pasi ca sa ma pot ghida pe viitor:

Trebuie sa creez o segventa:

CREATE SEQUENCE mytable_myid_seq;

Trebuie sa adaug campul id daca nu il am deja:

ALTER TABLE mytable
    ADD myid INT UNIQUE;

Apoi trebuie sa leg id-ul de segventa:

ALTER TABLE mytable
    ALTER COLUMN myid
        SET DEFAULT NEXTVAL('mytable_myid_seq');

si daca vreau sa updatez tabela cu valori pentru id, trebuie sa fac asa:

UPDATE mytable
    SET myid = NEXTVAL('mytable_myid_seq');

Si asta e tot.
Aceste informatii au fost preluate de aici, si au fost verificate personal.

JSF schimbare locale

Filed under: Uncategorized — Edi @ 9:11 pm

Un mic exemplu in care voi prezenta cum sa schimbi locale-ul la o aplicatie JSF. Mai exact Locale inseamna asta, sau pe wikipedia. Am cautat mult pe net pana sa dau de un exemplu functional (sunt multe exemplu care mie nu mi-au mers). exemplul asta e simplu. Mai intai terbuie declarat in faces-config.xml faptul ca vrei sa folosesti locale, apoi folosesti variabila care retine mesajele particularizate in paginile jsp, care este vazut ca un bean, desi e resursa. Pentru a schimba textul in mod dinamic am facut o clasa, care are nite metode cu ajutorul carora schimb variabila locale din aplicatie.

Si acum sursele…

Am un pachet locale si o clasa si niste fisiere de proprietati care contin mesajele:

Am oferit suport doar pt engleza si romana, dar se poat adauga foarte usor cate traduceri vreti.

 

In faces-config.xml am definit locale asa:

<application> <!-- in aplicatie declar configuratia pt locale--> <locale-config> <default-locale>ro</default-locale> <supported-locale>ro</supported-locale> <supported-locale>en</supported-locale> </locale-config> <resource-bundle> <!-- setez numele de baza pt fisiere de proprietati a se observa ca denumirea se opreste la Message _ro si _en vor fi adaugate de catre aplicatie--> <base-name>locale.Messages</base-name> <!-- variabila la care se va face referire pt mesaj--> <var>msg</var> </resource-bundle> </application> <!-- declararea manage-beanului pentru actiunile de schimbare a locale-ului --> <managed-bean> <managed-bean-name>locale</managed-bean-name> <managed-bean-class>locale.Local</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean>

 

 

 

 

 

 

 

 

import java.util.Locale;

public class Local {
private Locale locale;

public Locale getLocale(){
return locale;
}

public String setLocaleRO(){
locale = new Locale(“ro”);
return “”;
}

public String setLocaleEN(){
locale = Locale.ENGLISH;
return “”;
}
}

Si acum partea din jsp care apeleaza metodele din manage-bean pt a schimba valorile:

<h:form>

<h:commandButton value=”ro” action=”#{locale.setLocaleRO}” /> &nbsp;&nbsp;

<h:commandButton value=”en” action=”#{locale.setLocaleEN}” />

</h:form>

In paginile jsp trebuie sa adaugati in atributul locale in tagul view, cam asa:

<f:view locale=”#{locale.locale}”>

<!– toate tagurile jsf –>

</f:view>

Si cam asta e tot.

Spor la treaba in continuare.

11/17/2009

JSF demo

Filed under: JSF — Edi @ 11:14 pm

Salutare, în acest articol voi scrie despre JSF (Fava server Faces). Deoarece am descoperit că o aplicație mică la prima vedere poate deveni destul de complexă, o voi structura pe 3 capitole. Si anume, baza de date, middle tier și în final partea de view, adică JSF efectiv. Niste linkuri utile despre JSF gasiti aici: Kickstart, site oficial, articol IBM , tot pe acolo gasiti mai multe articole despre JSF, Developers book. Daca citit toate astea o sa va fie mai usor sa intelegeti aplicatia, sau ati putea chiar sa nu mai cititi de aici.

O aplicație web ar trebui să arate cam asa: application-architecture

A se observa unde este Faces servlet si de asemenea faptul ca mai sunt niste tehnologii care permit unei aplicatii sa fie modulara si scalabila.  Avand in vedere ca aplicatia este una pur JSF nivelul business nu poate fi reprezentat de o alta tehnologie. Asa ca o sa il scriem de manutza ;) . Nu e greu cand ai 2-3 clase, dar de pe la 20 de clasa in sus, ar cam trebui sa folosim un alt framework care sa ne ajute un pic cu gestionarea. Partea de baze de date nu poate fi evitata orice ai face, si aici o sa folosesc PostgreSQL Este usor de folosit, este gratis, si mai este si performanta (nu ca ar conta pt cateva tabele).

Nu am spus ce face aplicatia, nu mi se pare important atunci cand faci o aplicatie doar pentru a testa un framework, dar pentru logica celor scrise in continuare va spun ca aplicatia o sa “gestinoneze” niste scoruri la meciuri.

Sa incepem cu structura aplicatiei, aceasta asrata cam asa :

Respirati adanc… nu e asa de complicat pe cat pare, am pus clasele in multe pachete pt ca

au diferite functii si am vrut sa le regasesc usor, si sa ma obisnuiesc cu o organizare stricta. Imaginati-va cam a avea 10 convertori si 10 validatori… si asta e doar pt un proiect mediu spre mic :P . Un tutorial pentru convertori si validatori il puteti vedea aici.

Sa incepem cu beanurile, acestea se afla in pacjetul jsfp si sunt niste clase cu niste campuri care sunt corespunzatoare cu campurile aferente din tabelele din baza de date. De exemplu in baza de date exista tabela score, deci am bean cu acelas nume. Beanul Score arata asa:

package jsfp;

import java.io.Serializable;
import java.util.Calendar;
import java.util.Locale;
import jdba.ScoreService;

public class Score implements Serializable {

    private Long id;
    private Team hoast;
    private Team guest;
    private Integer score1;
    private Integer score2;
    private Calendar date;

    @Override
    public boolean equals(Object o) {
        if (!(o instanceof Score)) {
            return false;
        } else {
            Score t = (Score) o;
            if (id != t.getId()) {
                return false;
            } else {
                return true;
            }
        }
    }

    @Override
    public int hashCode() {
        int hash = 3;
        hash = 53 * hash + (this.id != null ? this.id.hashCode() : 0);
        hash = 53 * hash + (this.hoast != null ? this.hoast.hashCode() : 0);
        hash = 53 * hash + (this.guest != null ? this.guest.hashCode() : 0);
        hash = 53 * hash + (this.score1 != null ? this.score1.hashCode() : 0);
        hash = 53 * hash + (this.score2 != null ? this.score2.hashCode() : 0);
        return hash;
    }

    public void persist() {
        ScoreService ss = new ScoreService();
        ss.insert(this);
        score1 = 0;
        score2 = 0;
        date = Calendar.getInstance(new Locale(new Local().getLocale()));
    }

     // getters and setters for every field

}

IMPORTANT Suprascrierea metodelor equals si getHash este obligatorie, pt ca JSF compara obiectele atunci cand lucreaza cu ele.

Clasa Team.java arata cam asa:

package jsfp;

import java.io.Serializable;
import jdba.TeamService;

public class Team implements Serializable {

    private Long id;
    private String name;
    private String manager;
    private String coach;
    private String mood;
    private Integer points;

    @Override
    public boolean equals(Object o) {
        if (!(o instanceof Team)) {
            return false;
        } else {
            Team t = (Team) o;
            if (id != t.getId()) {
                return false;
            } else {
                return true;
            }
        }
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 71 * hash + (this.id != null ? this.id.hashCode() : 0);
        hash = 71 * hash + (this.name != null ? this.name.hashCode() : 0);
        hash = 71 * hash + (this.manager != null ? this.manager.hashCode() : 0);
        hash = 71 * hash + (this.coach != null ? this.coach.hashCode() : 0);
        hash = 71 * hash + (this.mood != null ? this.mood.hashCode() : 0);
        hash = 71 * hash + (this.points != null ? this.points.hashCode() : 0);
        return hash;
    }

    public void persist() {
        TeamService ts = new TeamService();
        ts.insert(this);
    }

   // getters and setters for every field

}

Clasa Locale nu are echivalent in baza de date, este folosita doar pentru a stoca variabila de interbationalizare. Ea arata asa:

package jsfp;

public class Local {

    private static String locale = new String("en");

    public String setLocaleRo() {
        locale = new String("ro");
        return "ro";
    }

    public String setLocaleEn() {
        locale = new String("en");
        return "en";
    }

    public String getLocale() {
        return locale;
    }

    public void setLocale(String locale) {
        this.locale = locale;
    }
}

Conectarea la baza de date am realizat-o destul de simplu si ineficient d.p.d.v al scalabilitatii, dar avand in vedere ca asta e doar o tema si nu sunt mai mult de 2-3 utilizatori se accepta :P . Ideea este urmatoarea: am facut o clasa singleton DbCon care tine o conexiune la baza de date, cand am nevoie de o conexiune de oriunde din aplicatie, apelez aceasta clasa si iau o conexiune. Aceasta clasa arata asa:

package jdba;

import java.sql.Connection;
import java.sql.DriverManager;
import java.util.ResourceBundle;

public class DbCon {

    private static DbCon instance = null;

    private DbCon() {
    }

    public static DbCon getInstance() {
        if (instance == null) {
            instance = new DbCon();
        }
        return instance;
    }

    public Connection getCon() {
        try {
            ResourceBundle rsb = ResourceBundle.getBundle("jdba.DatabaseProps");
            Class.forName(rsb.getString("driver"));
            Connection c = DriverManager.getConnection(rsb.getString("url"), rsb.getString("user"),
                    rsb.getString("pass"));
            return c;
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }
}

Pentru a usura optinerea conexiunii am facut o clasa abstracta in care am declarat conexiunea un statement si un String ‘query’, aceasta clasa mai contine si 2 metode de deschidere si inchidere a conexiunii. Aceasta clasa arata asa:

package jdba;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

public abstract class Service {

    Connection c;
    Statement s;
    String q;

    protected void open() {
        try {
            DbCon d = DbCon.getInstance();
            c = d.getCon();
            s = c.createStatement();
            c.setAutoCommit(false);
        } catch (SQLException ex) {
            System.out.println("Error on opening connection");
            ex.printStackTrace();
        }
    }

    protected void close() {
        try {
            c.commit();
            s.close();
            c.close();
        } catch (SQLException ex) {
            System.out.println("Error on closing connection");
            ex.printStackTrace();
        }
    }
}

Clasa ScoreService arata asa:

package jdba;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Calendar;
import java.util.Date;
import java.util.Vector;
import jsfp.Score;

public class ScoreService extends Service {

    public void insert(Score sc) {
        open();
        Date now = sc.getDate().getTime();
        q = "insert into score (hoast,guest,score1,score2,date) " +
                "values (" + sc.getHoast().getId() + "," +
                sc.getGuest().getId() + "," +
                sc.getScore1() + "," +
                sc.getScore2() + ",'" +
                now.getDay() + "/" + now.getMonth() + "/" + (1900 + now.getYear()) + "');";
        try {
            s.executeUpdate(q);
        } catch (SQLException ex) {
            ex.printStackTrace();
        }

        if (sc.getScore1() > sc.getScore2()) {
            q = "update team set points = points + " + 3 + " where id = " + sc.getHoast().getId() + " ;";
        } else if (sc.getScore1() < sc.getScore2()) {
            q = "update team set points = points + " + 3 + " where id = " + sc.getGuest().getId() + " ;";
        } else {
            q = "update team set points = points + " + 1 + "where id in (" + sc.getHoast().getId() + "," + sc.getGuest().getId() + ") ;";
        }

        try {
            s.executeUpdate(q);
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        close();
    }

    public Vector getAll() {
        open();
        Vector scores = new Vector();
        q = "select hoast,guest,score1,score2,date from score";
        try {
            TeamService ts = new TeamService();
            ResultSet rs = s.executeQuery(q);
            while (rs.next()) {
                Score sc = new Score();
                sc.setHoast(ts.getById(rs.getLong(1)));
                sc.setGuest(ts.getById(rs.getLong(2)));
                sc.setScore1(rs.getInt(3));
                sc.setScore2(rs.getInt(4));
                String[] dts = rs.getString(5).split("/");
                Calendar cl = Calendar.getInstance();
                cl.set(Integer.parseInt(dts[2]), Integer.parseInt(dts[1]), Integer.parseInt(dts[0]));
                sc.setDate(cl);
                scores.add(sc);
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        close();
        return scores;
    }

    public boolean gameDisputed(long hoast, long guest) {
        boolean flag = false;
        open();
        System.out.println("Hoast = " + hoast + "  Guest = " + guest);
        q = "select * from score where hoast = " + hoast + " and guest = " + guest + ";";
        try {
            ResultSet rs = s.executeQuery(q);
            flag = rs.next();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        close();
        return flag;
    }
}

Clasa TeamService arata asa:

package jdba;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;
import jsfp.Team;

public class TeamService extends Service {

    public void insert(Team t) {
        open();
        q = "insert into team (name,manager,coach,mood,points) " +
                "values ( '" + t.getName() + "'," +
                "'" + t.getManager() + "'," +
                "'" + t.getCoach() + "'," +
                "'" + t.getMood() + "',0);";
        try {
            s.executeUpdate(q);
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        close();
    }

    public Team getByName(String nm) {
        open();
        Team t = null;
        q = "select id,name,manager,coach,mood,points from team where name = '" + nm + "' ;";
        try {
            ResultSet rs = s.executeQuery(q);
            while (rs.next()) {
                t = new Team();
                t.setId(rs.getLong(1));
                t.setName(rs.getString(2));
                t.setManager(rs.getString(3));
                t.setCoach(rs.getString(4));
                t.setMood(rs.getString(5));
                t.setPoints(rs.getInt(6));
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        close();
        return t;
    }

    public Team getById(Long nm) {
        open();
        Team t = null;
        q = "select id,name,manager,coach,mood,points from team where id = " + nm + " ;";
        try {
            ResultSet rs = s.executeQuery(q);
            while (rs.next()) {
                t = new Team();
                t.setId(rs.getLong(1));
                t.setName(rs.getString(2));
                t.setManager(rs.getString(3));
                t.setCoach(rs.getString(4));
                t.setMood(rs.getString(5));
                t.setPoints(rs.getInt(6));
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        close();
        return t;
    }

    public Vector getAll() {
        open();
        Vector teams = new Vector();
        q = "select id,name, manager,coach,mood,points from team";
        try {
            ResultSet rs = s.executeQuery(q);
            while (rs.next()) {
                Team t = new Team();
                t.setId(rs.getLong(1));
                t.setName(rs.getString(2));
                t.setManager(rs.getString(3));
                t.setCoach(rs.getString(4));
                t.setMood(rs.getString(5));
                t.setPoints(rs.getInt(6));
                teams.add(t);
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        close();
        return teams;
    }
}

Fisierul de proprietati ‘DatabaseProps’ contine informatiile necesare pt conexiune la baza de date:
user=user
pass=user
url=jdbc:postgresql://localhost:5432/game
driver=org.postgresql.Driver

Clasa TeamValidator arata asa:
Eu am facut o validare pentru echipe, si am gandit asa: cand este selectata prima echipa se apeleaza acet validator si este setat id-ul acestei echipe, cand se seteaza a doua echipa se apeleaza din nou acest validator si se seteaza id-ul al doilea, apoi se verifica daca aceste id-uri sunt diferite, asta avertizeaza asupra faptului ca o echipa nu poate juca cu ea insesi.

package gui.validators;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;
import jdba.ScoreService;
import jsfp.Team;

public class TeamValidator implements Validator {

    static long t1 = -1;
    static long t2 = -1;

    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        Team s = (Team) value;
        if (t1 == -1) {
            t1 = s.getId();
        } else {
            t2 = s.getId();

            ScoreService ss = new ScoreService();
            if (ss.gameDisputed(t1, t2)) {
                t1 = t2 = -1;
                FacesMessage message = new FacesMessage();
                message.setDetail("Game already disputed");
                message.setSummary("Game already disputed");
                message.setSeverity(FacesMessage.SEVERITY_ERROR);
                throw new ValidatorException(message);
            }

            if (t1 == t2) {
                t1 = t2 = -1;
                FacesMessage message = new FacesMessage();
                message.setDetail("Teams must not be equal");
                message.setSummary("Teams must not be equal");
                message.setSeverity(FacesMessage.SEVERITY_ERROR);
                throw new ValidatorException(message);
            }
            t1 = t2 = -1;
        }
    }
}

Clasa TeamGetAll arata asa:

package gui;

import java.util.Vector;
import javax.faces.model.SelectItem;
import jdba.TeamService;
import jsfp.Team;

public class TeamGetAll {

    public Vector
 getAll(){
        Vector
 sis = new Vector
();
        TeamService ts = new TeamService();
        Vector vt = ts.getAll();
        for(Team t:vt){
            SelectItem si = new SelectItem(t,t.getName());
            sis.add(si);
        }
        return sis;
    }

    public Vector getTeams(){
        TeamService ts = new TeamService();
        return ts.getAll();
    }
}

Clasa ScoresGetAll arata asa:

package gui;

import java.util.Vector;
import jdba.ScoreService;
import jsfp.Score;

public class ScoresGetAll {

    public Vector getScores() {
        ScoreService ts = new ScoreService();
        return ts.getAll();
    }
}

Daca inca mai citesti inseamna ca ai vointa :D . Acum o sa pun si niste poze cu bucatelele importante din paginile jsp:
pagina de index arata asa:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Pagina View arata asa:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Pagina Teams arata asa:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Pagina Edit arata asa:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Cam asta e tot…
cireasa de pe tort: asta e o aplicatie mica :d analiza placuta si cititi cu atentie tutorialele de la linkurile pe care le-am pus la inceputul paginii.
PS: asta e si faces config:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Spor in continuare.

10/22/2009

Free Marker

Filed under: Java Web — Edi @ 8:00 pm

Stiu ca alegerea multora este Velocity, dar dupa o zi de documentare si nervi, nu am reusit sa fac functionala o pagina :) . Asa ca am ales a doua alternativa care este mai “tanara” dar mai buna. Va prezint in continuare o aplicatie web care foloseste Free Marker. Un “Hello world!” cred ca e suficient pt inceput. Gasiti aici si documentatia pentru lucruri mai avansate ;) .

Mai intai terbuie sa luati sursele pentru Free Marker. Spre deosebire de Velocity acesta are un singur jar.
Faceti un proiect web simplu. Creati un servlet, eu l-am denumit “FMServlet”. Codul acestiua ar terbui sa fie cam asa:

package fm;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import java.io.IOException;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class FMServlet extends HttpServlet {

    private Configuration cfg;
    public void init() {
        cfg = new Configuration();
        //specificati locul de unse se vor incarca template-urile
        cfg.setServletContextForTemplateLoading(getServletContext(), "WEB-INF/template");
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
       //Construiti un model
        Map root = new HashMap();
        root.put("message", "Hello World!");

        // Puneti mana protected template
        Template t = cfg.getTemplate("test.ftl");

        //Pregatiti raspunsul
        response.setContentType("text/html; charset=" + t.getEncoding());
        Writer out = response.getWriter();

        // Uniti medelul cu template-ul, si apoi il scrieti in response
        try {
            t.process(root, out);
        } catch (TemplateException e) {
            throw new ServletException(
                    "Error while processing FreeMarker template", e);
        }
    }
}

Continutul templatului este umratorul:

<html>
<head>
<title>Primul exemplu de template cu FreeMarker</title>
</head>
<body>
Servletul va transmite: ${message}
</body>
</html>

Din pagina index.jsp apelz servletul care imi intoarce templatul impreuna cu datele.

Cam atat de simplu este. Evident o sa pun si niste poze cu structura aplicatiei pentru a avea un context in care stau aceste 2 fisiere:
Structura aplicatiei:

Structura

A se observa locatia templatului

Locatia servletului

Faptul ca am inclus jarul freemarker

Spor la cod.

10/20/2009

Taguri imbricate

Filed under: Java Web — Edi @ 2:00 am

Incerc sa fac un mic exemplu despre tagurile imbricate. Ideea de baza este sa facem un tag parinte care are ca atribut o culoare, apoi un tag interior care are ca atribut o dimensiune de la 1 la 6 si de asemenea poate fi suprascris atributul culoare, in caz contrar este luat de la tagul parinte. Pentru exemplul asta voi folosi netbeans 6.7.1 si voi porni de la o aplicatie web simpla, fara nici un framework.

Dupa crearea aplicatiei, trebuie sa creati un TLD, netbeans ne ajuta mult, pasii sunt urmatorii: Ctrl+N pentu un nou fisier, apoi din categoria Web alegeti Tag Library Descriptor, alegeti numele si gata. Vericicati sa fi in interiorul lui WEB-INF, altfel nu va fi recunoscut in pagini!. Sa ii spunem MyTLD.

Acum cream 2 tag handler-uri:Facem un pachet in folderul de surse numit “tags” sin in acel pachet o sa punem handler-urile noastre. Deci Ctrl+N, din categoria web alegem Tag Handler, dupa ce alegeti numele, trebuie sa alegeti si fisierul TLD in care vreti sa il puneti, alegeti MyTLD, la acelas pas adaugati si 1 atribut care este de tipul string si se numeste color, atributul este obligatoriu, si trebuie bifat ca atare. Si astfel am terminat primul tag Handler, eu l-am denumit PapaTag. Similar faceti si un SonTag, dar care va avea atributul color optional, si inca un atribut size optional.

Si acum sursele:
PapaTag.java

package tags;
import java.io.IOException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class PapaTag extends SimpleTagSupport {
    private String color;
    @Override
    public void doTag() throws JspException {
        try {
            JspWriter out = getJspContext().getOut();
            //setez culoarea data ca parametru
            out.print("");
            try {
                JspFragment f = getJspBody();
                if (f != null) {
                    f.invoke(out);
                }
                //dupa textul din tag
                out.print("");
            } catch (java.io.IOException ex) {
                ex.printStackTrace();
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
    public String getColor(){
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }
}

SonTag.java

package tags;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class SonTag extends SimpleTagSupport {
    private String color;
    private String size;
    @Override
    public void doTag() throws JspException {
        JspWriter out = getJspContext().getOut();
        try {
            // optin parintele daca exista
            PapaTag pt = (PapaTag) findAncestorWithClass(this, PapaTag.class);
            if(pt!=null){ // daca nu am culoarea setata o iau de la parinte
                if(color==null){
                    color = pt.getColor();
                }
            }
            if(size==null){ //daca nu am dimensiunea specificata fac una default
                size = "1";
            }
            //setez culoarea si mensiunea
            out.print("");
            JspFragment f = getJspBody();
            if (f != null) {
                f.invoke(out);
            }
            //inchit tagurile
            out.print("");
        } catch (java.io.IOException ex) {
            throw new JspException("Error in SonTag tag", ex);
        }
    }

    public void setColor(String color) {
        this.color = color;
    }
    public void setSize(String size) {
        this.size = size;
    }
}

Fisierul web.xml nu trebuie modificat si fisierul MyTLD.tld este completat de netBeans.
Pagina index.jsp este urmaoarea:

index.jpg

Si asta este structura proiectului din NetBeans:

tree

10/04/2009

Indrumari pentru captcha in jee

Filed under: Java Web — Edi @ 8:38 am

http://www.owasp.org/index.php/JCaptcha_servlet_example

si utilizati si jarul asta : commons-collections-2.1.jar

Theme: Rubric. Bloguieşte pe WordPress.com.

Follow

Get every new post delivered to your Inbox.