Heu… c’est pas faux, mais comment intègre-t-on du GWT dans une portlet?

Suite à l’article de Pierre-Yves, je vais vous montrer comment on s’y prend pour intégrer du GWT dans une portlet Liferay.

Tout d’abord ce qu’il faut savoir sur une portlet, c’est qu’elle peut très bien se résumer à une jsp dans le cas qui nous intéresse. Ainsi, toute la manip que propose Pierre-Yves dans son article s’applique à la jsp (mode view) de la portlet à deux détails près :

  • l’importation du javascript
  • l’accès à la requête d’affichage de la page

En effet, on préféra laisser à Liferay le soin d’importer le javascript dans la page en le déclarant dans le fichier liferay-portlet.xml (ligne 7) de votre projet portlet.

1
2
3
4
5
6
7
8
9
10
11
<liferay-portlet-app>
    <portlet>
        <portlet-name>myOtherPortlet</portlet-name>
        <icon>/icon.png</icon>
        <instanceable>true</instanceable>
        <header-portlet-css>/css/main.css</header-portlet-css>
        <footer-portlet-javascript>/myUI/myUI.nocache.js</footer-portlet-javascript>
        <css-class-wrapper>myOtherPortlet-portlet</css-class-wrapper>
    </portlet>
    ...
</liferay-portlet-app>

Pour la récupération des données, Liferay met à disposition la classe com.liferay.portal.kernel.servlet.PortalDelegateServlet qui permet de partager les données d’une servlet avec celles de notre portlet.
Cette approche nous permet de récupérer les données de session par appel de service RPC au lieu de les stocker dans notre page sous forme de variables javascript. Pour cela il faut déclarer l’implémentation de notre service comme “assujetie” à la PortalDelegateServlet dans le web.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
    <servlet>
        <servlet-name>myServlet</servlet-name>
        <servlet-class>com.liferay.portal.kernel.servlet.PortalDelegateServlet</servlet-class>
        <init-param>
            <param-name>servlet-class</param-name>
            <param-value>com.excilys.liferay.server.MyServiceImpl</param-value>
        </init-param>
        <init-param>
            <param-name>sub-context</param-name>
            <param-value>mySubServlet</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

Enfin, dans la partie cliente de votre GWT, vous devrez redéfinir le point d’entrée de votre service pour atteindre la servlet déléguée (ligne 7):

1
2
3
4
5
6
7
8
public class MyUI implements EntryPoint {

    private MyServiceAsync service = GWT.create(MyService.class);
   
    @Override
    public void onModuleLoad() {
        ((ServiceDefTarget) service).setServiceEntryPoint("/delegate/mySubServlet");
        ...

Maintenant, dans l’implémentation de votre service RPC, vous pouvez accéder à la requête http qui a permis l’affichage de la portlet par ThreadLocal (Tiens donc! Encore la ligne 7) :

1
2
3
4
5
6
7
8
9
public class MyServiceImpl extends RemoteServiceServlet implements MyService {

    @Override
    public String getCurrentUser() {
        String userName = null;
         try {
             User user = PortalUtil.getUser(getThreadLocalRequest());
             userName = user.getFullName();
                         ...
VN:R_U [1.9.22_1171]
Rating: 0 (from 0 votes)
Share
Ce contenu a été publié dans Non classé, avec comme mot(s)-clef(s) , , . Vous pouvez le mettre en favoris avec ce permalien.

3 réponses à Heu… c’est pas faux, mais comment intègre-t-on du GWT dans une portlet?

  1. Alexandre Dergham dit :

    Et mon titre fait référence à … la botte secrète ;-)

    VN:R_U [1.9.22_1171]
    Rating: +1 (from 1 vote)
  2. Cool ! Finalement, GWT s’intègre bien, dans différents contextes.

    A ma connaissance, il y a plus simple que :

    1
    ((ServiceDefTarget) service).setServiceEntryPoint("/delegate/mySubServlet");

    Il suffit d’annoter l’interface MyService (qui étend RemoteService) avec l’annotation @RemoteServiceRelativePath.

    Exemple :

    1
    2
    3
    4
    @RemoteServiceRelativePath("/delegate/mySubServlet")
    public interface MyService extends RemoteService {
      String getCurrentUser();
    }
    VN:R_U [1.9.22_1171]
    Rating: 0 (from 0 votes)
  3. mgrenonville@excilys.com dit :

    Et d’ailleurs, l’intégration que tu proposes pour les portlets ressemble à mon commentaire sur l’article de Pierre-Yves \o/

    VN:R_U [1.9.22_1171]
    Rating: 0 (from 0 votes)

Laisser un commentaire