Il s'agit de concevoir une application web (exemple) permettant aux internautes d'évaluer des entreprises.
Principales fonctionnalités :
Décommenter la relation belongsTo dans la classe KEntreprise :
public KEntreprise() {
super();
belongsTo(KVille.class);//hasMany(KEvaluation.class);
}
Modifier la méthode toString de la classe KVille :
public class KVille extends KObject {
...
@Override
public String toString() {
return cp +" "+ville;
}
<class name="KEntreprise" caption="Entreprise"> <member max="60" name="rs" required="1" type="string" caption="Raison sociale"/> <member max="200" name="adresse" required="0" type="string" caption="Adresse"/> <member max="11" name="idVille" required="0" type="int" caption="Ville"/> <member max="200" name="mail" required="0" type="string" caption="Mail"/> <member max="20" name="tel" required="0" type="string" caption="Tél."/> </class>
<class name="KEntreprise" caption="Entreprise"> <member max="60" name="rs" required="1" type="string" caption="Raison sociale"/> <member max="200" name="adresse" required="0" type="string" caption="Adresse"/> <member max="11" name="idVille" required="0" type="int" caption="Ville"/> <member max="200" name="mail" required="0" type="mail" caption="Mail"/> <member max="20" name="tel" required="0" type="tel" caption="Tél."/> </class>
* Associer tel2 au type du membre tel de KEntreprise dans kox.xml :
<class name="KEntreprise" caption="Entreprise"> <member max="60" name="rs" required="1" type="string" caption="Raison sociale"/> <member max="200" name="adresse" required="0" type="string" caption="Adresse"/> <member max="11" name="idVille" required="0" type="int" caption="Ville"/> <member max="200" name="mail" required="0" type="mail" caption="Mail"/> <member max="20" name="tel" required="0" type="tel2" caption="Tél."/> </class>
Même si la validité du numéro de téléphone est contrôlée, il se peut que les numéros saisis ne soient pas uniformes : En effet, les formats suivants des numéros sont acceptés :
0231101112, 02.31.10.11.12, 02-31-10-11-12, 02 31 10 11 12
Nous allons créer un Transformer pour faire en sorte que tous les numéros saisis aient le même format : 02.31.10.11.12
package net.validation;
import net.ko.controller.KTransformer;
public class MyTransformers extends KTransformer {
public static String tel(String value){
return value.replaceAll("\\W", ".");
}
}
<class name="KEntreprise" caption="Entreprise" transformer="net.validation.MyTransformers"> <member max="60" name="rs" required="1" type="string" caption="Raison sociale"/> <member max="200" name="adresse" required="0" type="string" caption="Adresse"/> <member max="11" name="idVille" required="0" type="int" caption="Ville"/> <member max="200" name="mail" required="0" type="mail" caption="Mail"/> <member max="20" name="tel" required="0" type="tel2" caption="Tél." transform="tel"/> </class>
D'autres Transformers existent par défaut dans KObject et peuvent être utilisés : voir http://tutorial.kobject.net/java/configcontroller.
Un mapping permet d'associer une url à une ressource présente sur le serveur. Toutes les requêtes d'une application KObject doivent logiquement passer par des mappings d'url, par défaut en *.do
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ include file="header.jsp"%> <div id="main"> <div id="menu"> <a id="entreprises" title="Afficher la liste des entreprises">Liste des entreprises</a> | <a id="villes" title="Afficher la liste des villes">Liste des villes</a> </div> <div id="content"> Main page </div> <div id="message"></div> </div> <%@ include file="footer.jsp"%>
| Une requête vers | Affichera la page |
|---|---|
| index.do | /WEB-INF/index.jsp |
| entreprises.do | /WEB-INF/entreprises.jsp |
| villes.do | /WEB-INF/villes.jsp |
<mappings> <mapping requestURL="index.do" responseURL="/WEB-INF/index.jsp"/> <mapping requestURL="entreprises.do" responseURL="/WEB-INF/entreprise.list"/> <mapping requestURL="villes.do" responseURL="/WEB-INF/ville.list"/> </mappings>
Il s'agit maintenant de créer la dynamique de l'interface : la logique applicative côté client.
Toutes les modifications de la logique client sont implémentées dans le fichier conf/mox.xml
<ajax-includes> <request requestURL="index.do"> <js triggerSelector="#entreprises"> <include targetURL="entreprises.do" targetId="content"/> </js> </request> </ajax-includes>
<ajax-includes> <request requestURL="index.do"> <js triggerSelector="#entreprises" triggerEvent="click"> <include targetURL="entreprises.do" targetId="content"/> </js> <js triggerSelector="#villes" triggerEvent="click"> <include targetURL="villes.do" targetId="content"/> </js> </request> </ajax-includes>
Il est possible de réduire les 2 inclusions précédentes à une seule :
<ajax-includes>
<request requestURL="index.do">
<js triggerSelector="#menu a" triggerEvent="click">
<include targetURL="{js:target.id}.do" targetId="content"/>
</js>
</request>
</ajax-includes>
Le sélecteur est une inclusion ajax permettant d'associer du code à un ensemble d'éléments, l'un d'entre eux devenant à l'exécution l'élément actif.
<ajax-includes>
<request requestURL="index.do">
<js triggerSelector="#menu a">
<include targetURL="{js:target.id}.do" targetId="content"/>
</js>
<js triggerSelector="body" triggerEvent="load">
<selector selector="#menu a" event="mouseenter" startIndex="0">
<message targetId="message">target.title</message>
</selector>
</js>
</request>
</ajax-includes>
Pour l'instant, les vues affichées (formulaires et listes) sont les pages par défaut : voir http://tutorial.kobject.net/java/khttpdefaultpages
Nous allons maintenant créer nos pages à partir des templates : voir http://tutorial.kobject.net/java/listtemplate
{#func:this.setEditable(false)#}
{#set:this.ajaxIncludes=true#}
{#set:this.isShowCaption=true#}
{#set:this.listContentUrl="entreprises.do"#}
{#mask:<td>{rs}</td><td>{adresse}</td><td>{ville}</td>#}
{#mask:<td>{rs}</td><td>{adresse}</td><td>{ville}</td>#}
{_ajx}
{_listContent}
{_filtre}
{_page}
<div class="boxButtons">{_pageCounter}{_navBarre}</div>
{/_listContent}
{#func:this.setEditable(true)#}
{#mask:<td>{cp}</td><td>{ville}</td>#}
{#mask:<td>{cp}</td><td>{ville}</td>#}
{#set:this.ajaxIncludes=true#}
{#set:this.listContentUrl="villes.do"#}
{_ajx}
{_listContent}
{_page}
<div class="boxButtons">{_pageCounter}{_navBarre}</div>
{/_listContent}