Developing Portlets with GWT
How to write a portlet with the aim of GWT.
Pre-development Actions
Modifying Tomcat
- Replace $CATALINA_HOME/webapps/gridsphere/WEB-INF/CustomPortal/layouts/TemplateLayout.xml with the corresponding one found here.
- Include gwt.js and script.html files found here in $CATALINA_HOME/webapps/gridsphere/html directory.
In this way, the gwt.js script will exist in all portal pages. In particular, it will be always located after all the <meta> headers that define gwt-modules. This is desired, because this script processes the meta-headers and creates a handler per module in order to instanciate and load it.
Modifying Gridpshere Home
If you want you can also apply the respective changes to gridsphere's home directory. This can be useful if, for some reason, you want to redeploy gridsphere.
Installing GWT
- Download the latest version of GWT from here.
- Uzip the file.
- Set environmntal variable: GWT_HOME=<the name of the folder where you unpacked gwt files>
Creating a gwt-portlet
Creating a gwt project
In order to create a gwt project, you must execute:
>cd $GRIDPSHERE_HOME/projects
>mkdir <module_dir_name>
>cd <module_dir_name>
>$GWT_HOME/projectCreator -eclipse MyProject
>$GWT_HOME/applicationCreator -eclipse MyProject org.diligentproject.<whatever>.client.<ModuleName>
Now you can develop your gwt project as you wish by using eclipse!
FYI, there is a toolkit for eclipse named "GWT Designer" that provides developers with a GUI so as to design their gwt modules.
However, it's not free. If you wish to see its demos, click here.
Writing a gwt application
You can find useful information about how to write a gwt application on the Google Web Toolkit's official site: http://code.google.com/webtoolkit/.
! IMPORTANT INFO
In the entrypoint-class, in the onModuleLoad() method:
When you are about to add your widget in the main page,
instead of writing:
RootPanel.get().add(<your widget>);
you must write:
RootPanel.get(<a unique id for the DIV>).add(<your widget>);
So, the generated html will be placed in the predefined div instead of being placed in an unspecified location.
Creating a jsr 168 portlet
In oder to create an empty portlet project, you must execute:
>cd $GRIDPSHERE_HOME/
>ant new-project
- insert: <Portlet's Title>
- insert: <module_dir_name> -- This must be the same as in gwt project
- insert: jsr
Now, if you refresh the eclipse project, you can see that the "portlet-files" are generated.
Creating the portlet class
- Create a class named: org.diligentproject.<whatever>.portlets.<portletClassName>.
- Add the following content to the class:
// JSP folder name public static final String JSP_FOLDER = "/jsp"; // JSP file name to be rendered on the view mode public static final String VIEW_JSP = JSP_FOLDER + "/<a_name_for_the_jsp_page>.jsp"; public void doView(RenderRequest request, RenderResponse response) throws PortletException, IOException{ // ------------------------------------------------------------ // Note: The portlet is just diplaying a JSP for the AJAX Lab. // It does absolutely nothing else. // ------------------------------------------------------------ // Invoke the JSP to render: PortletRequestDispatcher rd = getPortletContext().getRequestDispatcher(VIEW_JSP); rd.include(request,response); }
Creating the jsp page
- Create a file in the webapp/jsp directory named: <a_name_for_the_jsp_page>.jsp.
- In this file you place the following content:
<%@ page contentType="text/html" %> <%@taglib uri="http://java.sun.com/portlet" prefix="portlet" %> <!-- --> <!-- The module reference below is the link --> <!-- between html and your Web Toolkit module --> <!-- --> <meta name='gwt:module' content='org.diligentproject.<whatever>.client.<ModuleName>'> <!-- --> <!-- This script is required bootstrap stuff. --> <!-- You can put it in the HEAD, but startup --> <!-- is slightly faster if you include it here. --> <!-- --> <div id="<a unique id for the DIV"> </div>
I should mention here that the org.diligentproject.<whatever>.client.<ModuleName> is the one you defined when you created the gwt application.
Additionally, the id for the div is the one you used in the RootPanel.get() method.
Configuring the portlet
- Modify the webapp/portlet.xml file as following:
Instead of:
<description xml:lang="en">This Portlet is a sample</description> <description xml:lang="de">Diese Portlet ist ein sample</description> <portlet-name>SamplePortlet</portlet-name> <display-name xml:lang="en">A sample Portlet</display-name> <display-name xml:lang="de">Ein sample Portlet</display-name> <portlet-class>org.gridlab.gridsphere.portlets.SamplePortlet</portlet-class>
Write:
<description xml:lang="en">Your Portlet description</description> <portlet-name>UniquePorltetName</portlet-name> <display-name xml:lang="en">Portlet's Title</display-name> <portlet-class>org.diligentproject.<whatever>.portlets.<portletClassName></portlet-class>
Deploying the gwt-portlet
In order to deploy the gwt-portlet you need to create a file in the main directory of your eclipse project which will contain the following:
#!/bin/bash #This bash script compiles and deploys the gwt-portlet. # Delete files from previous compilation / deployment: rm -rf webapp/html rm -rf webapp/WEB-INF/classes/org/* rm -rf .gwt-cache/ rm -rf ./www/org.diligentproject* ant clean #Stop Tomcat: $CATALINA_HOME/bin/shutdown.sh #Compile the gwt project: ./<ModuleName>-compile -out www/ -style DETAILED ##### Replace the <ModuleName> with the actual one. # Copy files from gwt project to portlet public place: cp -r ../www/org.diligentproject*/ webapp/html cp -r ../../../build/classes/org/ webapp/WEB-INF/classes/org # Install the porltet on Tomcat: ant install #Start Tomcat: $CATALINA_HOME/bin/startup.sh
Finally, just execute this script, and the portlet will be deployed!!!
--Valia 16:59, 1 March 2007 (EET)