GWT 2.0.4 is available
GWT 2.1 Milestone 2
- simplification the process of configuring a RequestFactory
- made record creation within a RequestFactory more extensible
- moved project out of bikeshed
Pour commencer, il faut déclarer le DispatcherServlet dans le fichier de configuration de l'application web: web.xml.
<web-app>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring/app-config.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
</web-app>
En lui spécifiant le paramètre contextConfigLocation, la servlet va charger le context Spring a sa création. Le fichier de context se trouve: /WEB-INF/spring. La servlet doit mapper toutes les URLs du type:
<app_context>/services/*
La configuration Spring se fait en deux fichiers différents:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<mvc:annotation-driven />
</beans>
Cette configuration permet d'utiliser l'annotation @Controller pour déclarer les beans gérés par Spring MVC.
L'exemple suivant se base sur la gestion d'objets SampleBean:
public class SampleBean {
private String name;
private long id;
}
Et utilise le SampleController pour effectuer une recherche par id sur les SampleBean.
@Controller
@RequestMapping("/sample")
public class SampleController {
@RequestMapping(value="{id}", method=RequestMethod.GET)
public @ResponseBody SampleBean get(@PathVariable long id) {
return persistence.get(id);
}
}
Pour mettre en place la convertion, il faut configurer un bean de type ContentNegotiatingViewResolver. En Rest, l'opération de mapping des valeurs de retour et des paramètres vers des objets s'appel: négociation. La négociation se fait en ce basant sur la valeur du header Accept de la requête. Pour cet exemple, le mapping se fera vers du JSon. le header Accept aura donc pour valeur: application/json. Spring fournit parmis ces dépendances, le parseur Jackson, qui est utiliser dans ce qui suit:
<bean
class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver" p:order="1">
<property name="mediaTypes">
<map>
<entry key="json" value="application/json" />
</map>
</property>
<property name="defaultViews">
<list>
<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
</list>
</property>
</bean>
La configuration se fait en spécifiant les formats supportés avec l'attribut mediaTypes et les implémentations des mappers ave la propriété defaultViews. La propriété mediaTypes correspond au contenu du header Accept de la requête reçu par le DispatcherServvlet.
Mylyn est un plugin Eclipse de gestion de tâches. Nous allons expliquer ici comment connecter Mylyn à Redmine en utilisant les connecteurs aux repository web.
Les connecteurs ne font pas partis de l'installation par défaut de Mylyn. Vous devez donc installer ces extensions en enregistrant le site suivant dans Eclipse: http://download.eclipse.org/tools/mylyn/update/incubator.
Server: http://www.redmine.org/ -- Remplacer cette URL par celle de votre installation Redmine
Task URL: ${serverUrl}/issues/show/
New task URL: ${serverUrl}/projects/project/issues/new -- Remplacer project par le nom du projet
Query request URL: ${serverUrl}/issues
Query pattern: <td class="subject">.*?<a href="/issues/show/(\d+)">(.+?)</a></td>
Login request URL: ${serverUrl}/login?username=${userId}&password=${password} [POST]
Vous pouvez remplacer le champ Query request URL par la requête suivante si vous ne voulez que les tâches qui vous sont assignées:
${serverUrl}/issues?set_filter=1&assigned_to_id=me
La requête suivante lit le Status, le Owner et le Tracker (Mylyn 3.2.1) :
<td class="tracker">({Type}.+?)</td><td class="status">({Status}.+?)</td>.+?<td class="subject"><a href=".*?/issues/show/({Id}\d+)">({Description}.+?)</a></td><td class="assigned_to"><a>({Owner}.+?)</a></td>
Le status sera affiché comme "complete" ou "uncomplete" par Eclipse.
[ERROR] Could not resolve <mx:linechart> to a component implementation.
<dependency>
<groupid>com.adobe.flex.sdk</groupid>
<artifactid>datavisualization</artifactid>
<type>swc</type>
<scope>merged</scope>
<version>3.2.0.3958</version>
</dependency>
<dependency>
<groupid>com.adobe.flex.sdk</groupid>
<artifactid>datavisualization</artifactid>
<version>3.2.0.3958</version>
<type>rb.swc</type>
<classifier>en_US</classifier>
</dependency>
Unable to resolve resource bundle "charts" for locale "en_US".
mvn install:install-file -DgroupId=com.adobe.flex.sdk
-DartifactId=datavisualization
-Dversion=3.2.0.3958
-Dpackaging=swc
-Dfile="/Applications/Adobe Flex Builder 3/sdks/3.2.0/frameworks/libs/datavisualization.swc"
mvn install:install-file -DgroupId=com.adobe.flex.sdk
-DartifactId=datavisualization
-Dversion=3.2.0.3958
-Dclassifier=en_US
-Dpackaging=rb.swc
-Dfile="/Applications/Adobe Flex Builder 3/sdks/3.2.0/frameworks/local/locale/en_US/datavisualization_rb.swc"
VerifyError: Error #1014: Class mx.charts::LineChart could not be found.
<build>
<sourcedirectory>src/main/flex</sourcedirectory>
<plugins>
<plugin>
<groupid>org.sonatype.flexmojos</groupid>
<artifactid>flexmojos-maven-plugin</artifactid>
<version>3.5.0</version>
<extensions>true</extensions>
<configuration>
<contextroot>/appcontext</contextroot>
<debug>true</debug>
<licenses>
<flexbuilder3>nnnn-nnnn-nnnn-nnnn-nnnn-nnnn</flexbuilder3>
</licenses>
<sourcefile>App.mxml</sourcefile>
<targetplayer>9.0.124</targetplayer>
</configuration>
<dependencies>
<dependency>
<groupid>com.adobe.flex</groupid>
<artifactid>license</artifactid>
<type>jar</type>
<version>3.2.0.3958</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
mvn install:install-file
-DgroupId=com.adobe.flex
-DartifactId=license
-Dversion=3.2.0.3958
-Dpackaging=jar
-Dfile="C:\Program Files\Adobe\Flex Builder 3 Plug-in\sdks\3.2.0\lib\license.jar"
<dependency>
<groupid>org.springframework.flex</groupid>
<artifactid>spring-flex</artifactid>
<version>1.0.3.RELEASE</version>
<type>jar</type>
<scope>runtime</scope>
</dependency>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring/*-context.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>flex</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/web-application-config.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>flex</servlet-name>
<url-pattern>/messagebroker/*</url-pattern>
</servlet-mapping>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:flex="http://www.springframework.org/schema/flex" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/flex
http://www.springframework.org/schema/flex/spring-flex-1.0.xsd">
<flex:message-broker/>
</beans>
<services-config>
<services>
<default-channels>
<channel ref="my-amf">
</default-channels>
</services>
<channels>
<channel-definition id="my-amf"
class="mx.messaging.channels.AMFChannel">
<endpoint
url="http://{server.name}:{server.port}/{context.root}/messagebroker/amf"
class="flex.messaging.endpoints.AMFEndpoint" />
</channel-definition>
</channels>
</services-config>
<flex:remoting-destination id="userService" ref="userService"/>
, un environement de développment dédié aux DSLs. Cet environement est la réponse, d'aprés cet article, aux besoins, mais également à ladifficulté de développer des DSLs.
Google fournit un plugin Eclipse pour la création d'applications web basées sur Google Web Toolkit et permettant de déployer les applications sur Google App Engine. Petit tour d'horizon de ce plugin bien pratique.http://dl.google.com/eclipse/plugin/3.3http://dl.google.com/eclipse/plugin/3.4
Le wizard permet d'inclure/exclure GWT et/ou Google App Engine dans le projet. Il inclut par défaut les dernières versions des frameworks. Via les liens Configure SDKs... , il est possible de choisir une autre version du SDK installée sur la station.
MyTestProjectLe plugin génère une application de base avec un service RPC de base. L'application permet d'envoyer une message via le service. Et celui-ci renvoi ce message avec des informations sur le serveur.
src/
com/
mytestproject/
MyTestProject.gwt.xml
client/
GreetingService.java
GreetingServiceAsync.java
MyTestProject.java
server/
GreetingServiceImpl.java
war/
MyTestProject.css
MyTestProject.html
WEB-INF/
web.xml
classes/
lib/
...GWT JARs...
MyTestProjectL'application générée donne accès à la technologie de persistance DataNucleus utilisée par GAE. Pour la partie présentation, puisque l'application est censé être une appli web, une servlet a été généré.
src/
log4j.properties
META-INF/
jdoconfig.xml
com/
mytestproject/
MyTestProjectServlet.java
war/
index.html
WEB-INF/
appengine-web.xml
web.xml
logging.properties
classes/
lib/
...App Engine JARs...
MyTestProjectL'application offre des fonctionnalités similaires aux deux types de projet précédents.
src/
log4j.properties
META-INF/
jdoconfig.xml
com/
mytestproject/
MyTestProject.gwt.xml
client/
GreetingService.java
GreetingServiceAsync.java
MyTestProject.java
server/
GreetingServiceImpl.java
war/
MyTestProject.css
MyTestProject.html
WEB-INF/
appengine-web.xml
web.xml
logging.properties
classes/
lib/
...App Engine JARs...
...GWT JARs...


pour ouvrir la boite de dialogue:
Il faut posséder un compte GAE pour pouvoir déployer une application, et donc posséder un compte utilisateur Google. Le plugin doit d'abord être configuré avec l'identifiant de l'application GAE: Properties > Google > App Engine > Application ID. Aprés avoir clické sur le bouton Deploy, le plugin compile et package l'application, qui est ensuite envoyée sur la plate forme.Malgrés la possibilité d'intégrer les outils de GWT tel junitCreator comme outil externe d'Eclipse, je regrette l'abscence de ces outils du plugin. La volonté de Google était apparement de fournir le plus rapidement possible un outil permettant de developper des applications GWT. Du coup, le nice to have a été mis de coté. Ce sera, je l'espére, pour la prochaine version. La raison de cette abscence peut aussi être expliqué par les bugs (dans la version 1.6.4 du SDK) produits par ces scripts.