A téma bemutatásához egy minta portletet fogunk elkészíteni. Ez egy egyszerű üzenőfal lesz, ami listázza az eddig beírt üzeneteket, és lehet újat is felvenni.
Első teendő az SDK beszerzése, ezt az alábbi utasítással tehejük meg:
svn co svn://svn.liferay.com/repos/public/plugins/trunk --username guest
A jelszó üres. Ezzel letöltöttük a legfrissebb forrást. Mielőtt használatba vennénk, szükséges beállítani az eléréseket. Ehhez hozzuk létre a gyökerébe egy build.{username}.properties fájlt, az alábbi tartalommal:
app.server.dir=${user.home}/workspace/portal/bundles/tomcat-6.0.24
Értelemszerűen átírva, hogy egyezzen a használt rendszerrel. Ezután a portlet könyvtárban kiadva az alábbi parancsot, létrejön a portletünk váza:
./create.sh messagewall "Message Wall"
Ki is próbálhatjuk, ha a portlet mappájában buildelünk ant-al, akkor lefordítja, összepakolja és bemásolja a beállított deploy mappába, tehát azonnal használható is lesz.
Szükségünk lesz egy service.xml fájlra, ez fogja leírni az adatbázis modelljét, amiből a ServiceBuilder le fogja generálni a szükséges fájlokat. Tehát a WEB-INF-be hozzunk létre egy service.xml fájlt, az alábbi tartalommal:
<?xml version="1.0"?>
<!DOCTYPE service-builder PUBLIC "-//Liferay//DTD Service Builder 6.0.0//EN" "http://www.liferay.com/dtd/liferay-service-builder_6_0_0.dtd">
<service-builder package-path="hu.example.messagewall">
<namespace>MessageWall</namespace>
<entity name="Message" local-service="true" remote-service="false">
<!-- PK fields -->
<column name="messageId" type="long" primary="true" />
<!-- Audit fields -->
<column name="message" type="String" />
<!-- Order -->
<order by="desc">
<order-column name="message" />
</order>
</entity>
</service-builder>
Az osztályok legenerálásához az alábbi utasítás használható:
ant build-service
Ez nem történik meg általános buildelésnél, de csak akkor van rá szükség, ha a service.xml vagy az Impl oszályok változnak.
Mivel szeretnénk Eclipse-el fejleszteni, ezért létre kell hoznunk egy projectet neki. Ehhez indítsunk egy Dynamic Web Project-et, írjuk be a nevét, töröljük a Project Contents pontot, majd válasszuk ki a portlet mappáját. Válasszunk Runtime-t, majd Next. Az src legyen
docroot\WEB-INF\src, a build pedig
docroot\WEB-INF\classes, majd Next. Itt a webcontent-et írjuk át
docroot-ra, majd finish. A path errorok megoldására adjuk hozzá,hogy függjön a portál projecttől, majd a view.jsp-ben a taglib URI végéről a 2_0-t szedjük le, tehát így nézzen ki a sor:
<%@ taglib uri="http://java.sun.com/portlet" prefix="portlet" %>
Végül adjuk hozzá a service mappát forrásként, ezzel megszűnt az összes error. Ezután fel kell venni egy új üzenetet létrehozó metódust a service-be. Ehhez írjuk át a MessageLocalServiceImpl osztályt:
public class MessageLocalServiceImpl extends MessageLocalServiceBaseImpl {
public void createMessage(String msg) {
try {
Message m = createMessage(counterLocalService.increment());
m.setMessage(msg);
updateMessage(m);
} catch (SystemException e) {
e.printStackTrace();
}
}
}
Ezután generáljuk le újra a service osztályokat. Végül fel kell vennünk egy portletet, ami majd az action-t kezeli:
public class MessageWallPortlet extends MVCPortlet {
@Override
public void processAction(ActionRequest actionRequest, ActionResponse actionResponse) throws IOException, PortletException {
MessageLocalServiceUtil.createMessage(ParamUtil.getString(actionRequest, "newMessage"));
}
}
Majd meg kell mondanunk, hogy ezt a portletet használja, ehhez a portet.xml-t írjuk át:
<portlet-class>hu.example.messagewall.portlet.MessageWallPortlet</portlet-class>
Ezután meg kell még írnunk a megjelnítést, ez a view.jsp-be kerül:
<%@ taglib uri="http://java.sun.com/portlet" prefix="portlet" %>
<%@page import="java.util.List"%>
<%@page import="hu.example.messagewall.model.Message"%>
<%@page import="hu.example.messagewall.service.persistence.MessageUtil"%>
<%@page import="hu.example.messagewall.service.impl.MessageLocalServiceImpl"%>
<%@page import="hu.example.messagewall.service.MessageLocalServiceUtil"%><portlet:defineObjects />
This is the <b>Message Wall2</b>.
Messages:
<%
List<Message> messages=MessageLocalServiceUtil.getMessages(-1,-1);
for(Message m:messages){
%>
<p><%=m.getMessage() %></p>
<%
}
%>
Create new message:
<form action="<portlet:actionURL/>" method="post">
Message:<input type="text" name="<portlet:namespace/>newMessage"/><input type="submit"/>
</form>
Ezzel készen is vagyunk, lefordítva, kideployolva már használható is az üzenőfal.
Kiegészítés:Eclipse project létrehozásához használhatjuk az
ant setup-eclipse utasítást, ezután importálhatjuk a workspace-be.