<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>j2ee.pl - związani z javą &#187; jetty</title>
	<atom:link href="http://j2ee.pl/tag/jetty/feed/" rel="self" type="application/rss+xml" />
	<link>http://j2ee.pl</link>
	<description>związani z Javą</description>
	<lastBuildDate>Mon, 24 Aug 2009 11:45:27 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Pluto, jetty i portlety.</title>
		<link>http://j2ee.pl/2008/03/26/pluto-jetty-i-portlety/</link>
		<comments>http://j2ee.pl/2008/03/26/pluto-jetty-i-portlety/#comments</comments>
		<pubDate>Wed, 26 Mar 2008 12:40:56 +0000</pubDate>
		<dc:creator>Karol Siczek</dc:creator>
				<category><![CDATA[Inne biblioteki]]></category>
		<category><![CDATA[jetty]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[pluto]]></category>
		<category><![CDATA[portlet]]></category>

		<guid isPermaLink="false">http://j2ee.pl/2008/03/26/pluto-jetty-i-portlety/</guid>
		<description><![CDATA[
Tytułem wstępu, czyli kto i co.
Witajcie.
To mój debiut na j2ee.pl i mam nadzieję, że będzie początkiem dłuższej przygody. W tym poście postaram się opisać jak, w kilku krokach, stworzyć i uruchomić prosty portlet używając mavena2 i kilku jego pluginów. Dlaczego to jest takie fajne? Ponieważ wystarczy wpisać mvn jetty:run i można testować swój portlet. Trwa [...]]]></description>
			<content:encoded><![CDATA[<h3><img src="http://j2ee.pl/wp-content/uploads/2008/03/pluto.thumbnail.gif" alt="Pluto" align="right" /></h3>
<h3>Tytułem wstępu, czyli kto i co.</h3>
<p>Witajcie.<br />
To mój debiut na j2ee.pl i mam nadzieję, że będzie początkiem dłuższej przygody. W tym poście postaram się opisać jak, w kilku krokach, stworzyć i uruchomić prosty portlet używając mavena2 i kilku jego pluginów. Dlaczego to jest takie fajne? Ponieważ wystarczy wpisać <em>mvn jetty:run</em> i można testować swój portlet. Trwa to kilka sekund, więc oszczędność czasu może być znacząca w porównaniu z restartem jBoss Portal, lub Liferay.  Ponieważ pomysłem było napisanie prostego howto, części teoretycznej niestety nie będzie. Nie znajdziecie tutaj co to jest portal/kontener portletów, ani nawet sam portlet. Zainteresowane osoby odsyłam do specyfikacji JSR168 i wszechwiedzącej sieci.<br />
<span id="more-117"></span></p>
<h3>Co będzie potrzebne?</h3>
<p>Właściwie tylko maven2 i jakiś edytorek kodu (zakładam, że w miarę nową jave każdy ma). Razem z m2 będziemy używać pluginów jetty i pluto. Jetty jest implementacją serwera webowego, natomiast pluto jest referencyjną implementacją specyfikacji portletów.</p>
<h3>Tworzymy projekt.</h3>
<p>Do wygenerowania szkieletu projektu wykorzystamy archetyp <em>maven-archetype-portlet</em>:<br />
<em><strong>mvn archetype:create -DgroupId=pl.j2ee.portlet -DartifactId=portlet-example -DarchetypeArtifactId=maven-archetype-portlet</strong></em><br />
Jeśli zamierzamy używać Eclipse&#8217;a, przechodzimy do katalogu projektu i wykonujemy:  <em><code><br />
</code><strong>mvn eclipse:eclipse</strong></em></p>
<p>Kolejną rzeczą, jaką należy wykonać, jest modyfikacja pom.xml projektu. Proponuję stworzyć oddzielny profil, np. <strong>pluto-embedded</strong>:</p>
<pre class="prettyprint">
&lt;profile&gt;
  &lt;id&gt;pluto-embedded&lt;/id&gt;
  [...]
&lt;/profile&gt;</pre>
<p>i w nim dodać wpisy dla pluginów:</p>
<pre class="prettyprint">&lt;plugin&gt;
  &lt;groupId&gt;org.mortbay.jetty&lt;/groupId&gt;
  &lt;artifactId&gt;maven-jetty-plugin&lt;/artifactId&gt;
&lt;/plugin&gt;</pre>
<p>oraz</p>
<pre class="prettyprint">&lt;plugin&gt;
  &lt;groupId&gt;org.apache.pluto&lt;/groupId&gt;
  &lt;artifactId&gt;maven-pluto-plugin&lt;/artifactId&gt;
  &lt;executions&gt;
    &lt;execution&gt;
      &lt;phase&gt;generate-resources&lt;/phase&gt;
      &lt;goals&gt;
        &lt;goal&gt;assemble&lt;/goal&gt;
      &lt;/goals&gt;
    &lt;/execution&gt;
  &lt;/executions&gt;
&lt;/plugin&gt;</pre>
<p>Goal <strong>assemble</strong> posłuży do wygenerowania web.xml z odpowiednią konfiguracją i mapowaniem serwletu org.apache.pluto.core.PortletServlet.  Kolejną rzeczą jest konfiguracja pluginu jetty:</p>
<pre class="prettyprint">&lt;configuration&gt;
  &lt;webXml&gt;${project.build.directory}/pluto-resources/web.xml&lt;/webXml&gt;
  &lt;webDefaultXml&gt;src/main/webapp/WEB-INF/jetty-pluto-web-default.xml&lt;/webDefaultXml&gt;
  &lt;systemProperties&gt;
    &lt;systemProperty&gt;
      &lt;name&gt;org.apache.pluto.embedded.portletId&lt;/name&gt;
      &lt;value&gt;MyPortlet&lt;/value&gt;
    &lt;/systemProperty&gt;
  &lt;/systemProperties&gt;
&lt;/configuration&gt;</pre>
<p>Tag &lt;webXml&gt; wskazuje na miejsce, z którego jetty zaczyta sobie deskryptor web.xml-a (wygenerowany wcześniej przez pluto).<br />
Ponieważ pluto korzysta z pliku src/main/webapp/WEB-INF/web.xml do generowania pliku wynikowego, a my nie będziemy potrzebować dodatkowych mapowań, usuwamy to co stworzył nam archetyp i zostawiamy ten plik w postaci:</p>
<pre class="prettyprint">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
 &lt;!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd"&gt;
&lt;web-app&gt;
&lt;/web-app&gt;</pre>
<p>Kolejna rzecz, której potrzebujemy, to konfiguracja parametrów kontekstu, filtrów, serwletów, mapowań itp. Najwygodniej jest użyć gotowego pliku jetty-pluto-web-default.xml, który można znaleźć w archiwum maven-jetty-pluto-embedded-1.0.jar, lub w załączonych źródłach projektu.</p>
<p>Przejdźmy więc do edycji pliku portlet.xml. Jego zawartość zawiera większość potrzebnych informacji, ale zawiera też błędy &#8211; tag &lt;portlet-class&gt; jest nieprawidłowo stworzony przez archetyp i należy go nieznacznie zmodyfikować wpisując poprawną nazwę klasy portletu. Zmieniamy także wartość tagu &lt;portlet-name&gt; tak, aby odpowiadała property org.apache.pluto.embedded.portletId z pom.xml projektu.  Na chwilę jeszcze wróćmy do pom.xml projektu i uzupełnijmy zależności:</p>
<pre class="prettyprint">
&lt;dependency&gt;
  &lt;groupId&gt;org.mortbay.jetty&lt;/groupId&gt;
  &lt;artifactId&gt;jetty&lt;/artifactId&gt;
  &lt;version&gt;6.1.5&lt;/version&gt;
  &lt;scope&gt;provided&lt;/scope&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
  &lt;groupId&gt;org.mortbay.jetty&lt;/groupId&gt;
  &lt;artifactId&gt;jsp-2.1&lt;/artifactId&gt;
  &lt;version&gt;6.1.5&lt;/version&gt;
  &lt;scope&gt;provided&lt;/scope&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
  &lt;groupId&gt;com.bekk.boss&lt;/groupId&gt;
  &lt;artifactId&gt;maven-jetty-pluto-embedded&lt;/artifactId&gt;
  &lt;version&gt;1.0&lt;/version&gt;
&lt;/dependency&gt;</pre>
<p>Aby sprawdzić, czy wszystko zrobiliśmy dobrze, przechodzimy do katalogu projektu i wpisujemy:</p>
<p><strong><em>mvn jetty:run -P pluto-embedded</em></strong></p>
<p>Gdy uruchomi nam się serwer, wpisujemy w przeglądarce <a href="http:localhost:8080/portlet-example/pluto/index.jsp" target="_blank">http:localhost:8080/portlet-example/pluto/index.jsp</a> i  <strong>voilà!</strong><br />
Jeśli komuś nie odpowiada port 8080 na którym słucha serwer, może zmodyfikować <a href="http://docs.codehaus.org/display/JETTY/Maven+Jetty+Plugin" target="_blank">konfigurację pluginu</a>.  Teraz, gdy już widzimy, że wszystko w miarę fajnie się prezentuje zrobimy prosty formularz powitalny:  W pliku normal.jsp zamiast powitania mavena, stwórzmy formularz:</p>
<pre class="prettyprint">
&lt;c:choose&gt;
  &lt;c:when test="${not empty param.fullName}"&gt;
    Hello &lt;c:out value="${param.fullName}"&gt;&lt;/c:out&gt;
  &lt;/c:when&gt;
  &lt;c:otherwise&gt;
    &lt;form action="&lt;portlet:actionURL/&gt;" method="post" id="nameForm"&gt;
      &lt;table&gt;
        &lt;tr&gt;&lt;td&gt;First name:&lt;/td&gt;&lt;td&gt;&lt;input name="firstName" type="text" id="firstName"/&gt;&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Last name:&lt;/td&gt;&lt;td&gt;&lt;input name="lastName" type="text" id="lastName"/&gt;&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;input name="submit" type="submit" id="submit"/&gt;&lt;/td&gt;&lt;/tr&gt;
      &lt;/table&gt;
    &lt;/form&gt;
  &lt;/c:otherwise&gt;
&lt;/c:choose&gt;</pre>
<p>Następnie w klasie MyPortlet dodajemy prostą metodę:</p>
<pre class="prettyprint">
public void processAction(ActionRequest request, ActionResponse response) throws PortletException, IOException {
	if(request.getParameter("firstName") != null &amp;&amp; request.getParameter("lastName") != null)
		response.setRenderParameter("fullName", request.getParameter("firstName") + " " + request.getParameter("lastName"));
}</pre>
<h3>Podsumowanie.</h3>
<p>Ponieważ, jak już wspomniałem, jest to mój pierwszy post na j2ee.pl (dzięki Michał :) ), będę wdzięczny za wszystkie komentarze. Piszcie, co Wam się podobało, co nie i czy takie how-to do czegoś Wam się przydało. Może coś jest niejasne, albo czegoś brakuje&#8230;W następnym poście postaram się dodać testy jwebunit-owe i pokazać w jaki sposób można taki formularz potraktować testami jednostkowymi.</p>
<h3>Źródła:</h3>
<p><a href="http://j2ee.pl/wp-content/uploads/2008/03/portlet-example_src.zip" title="Pluto, jetty i portlety-źródła.">Pluto, jetty i portlety-źródła</a>, <a href="http://www.mortbay.org/" target="_blank">jetty</a>, <a href="http://portals.apache.org/pluto/" target="_blank">pluto</a>, <a href="http://portletwork.blogspot.com/" target="_blank">portletwork</a>,</p>
]]></content:encoded>
			<wfw:commentRss>http://j2ee.pl/2008/03/26/pluto-jetty-i-portlety/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
