<?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>pamiętnik programisty &#187; jee</title>
	<atom:link href="http://piotr.doniec.eu/devlog/tag/jee/feed/" rel="self" type="application/rss+xml" />
	<link>http://piotr.doniec.eu/devlog</link>
	<description></description>
	<lastBuildDate>Wed, 28 Dec 2011 23:52:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Prosty przykład wykorzystania Java Servlets, JPA, Oracle 10XE i Glassfish v3</title>
		<link>http://piotr.doniec.eu/devlog/2010/02/prosty-przyklad-wykorzystania-java-servlets-jpa-oracle-10xe-i-glassfish-v3/</link>
		<comments>http://piotr.doniec.eu/devlog/2010/02/prosty-przyklad-wykorzystania-java-servlets-jpa-oracle-10xe-i-glassfish-v3/#comments</comments>
		<pubDate>Wed, 03 Feb 2010 20:03:41 +0000</pubDate>
		<dc:creator>pejotr</dc:creator>
				<category><![CDATA[J2EE]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[glassfish]]></category>
		<category><![CDATA[jee]]></category>
		<category><![CDATA[jpa]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[servlet]]></category>

		<guid isPermaLink="false">http://piotr.doniec.eu/devlog/?p=408</guid>
		<description><![CDATA[Celem tego wpisu jest pokazanie w jaki sposób stworzyć dynamiczną prostą aplikację WWW wykorzystującą technologię Java Servlets pobierającą dane z lokalnie dostępnej bazy danych Oracle 10g XE z wykorzystaniem JPA. Całość ma obsługiwać Glassfish v3. Struktura relacyjna w bazie danych jest bardzo prosta, ale wystarczająca do zapoznania z JPA &#8211; składa się z tabeli zawierającej [...]]]></description>
			<content:encoded><![CDATA[<p>Celem tego wpisu jest pokazanie w jaki sposób stworzyć dynamiczną prostą aplikację WWW wykorzystującą technologię Java Servlets pobierającą dane z lokalnie dostępnej bazy danych Oracle 10g XE z wykorzystaniem JPA. Całość ma obsługiwać Glassfish v3.<br />
Struktura relacyjna w bazie danych jest bardzo prosta, ale wystarczająca do zapoznania z  JPA &#8211; składa się z tabeli zawierającej dane studentów takie jak imię, nazwisko i z z tabeli opisującej grupy dziekańskie. Obie tabele powiązane są relacją wiele-do-jednego, także grupa może składać się z wielu studentów, natomiast każdy student przynależy do dokładnie 1 grupy.<br />
<span id="more-408"></span><br />
Na wstępie zaznaczam, że jestem początkujący w tej dziedzinie. Jeśli ktoś bardziej doświadczony, znajdzie jakieś nieścisłości lub błędy to proszę o pozostawienie komentarza. Chętnie poprawię i przy okazji czegoś się nauczę.<br />
Opisana wyżej struktura bazy danych jest reprezentowana przez dwie encje połączone relacją i wygląda to następująco:<br />
<center><img src="http://piotr.doniec.eu/devlog/wp-content/uploads/2010/02/jpa_entities1.jpg" alt="jpa_entities" title="jpa_entities" width="516" height="165" class="alignnone size-full wp-image-427" /></center></p>
<p>Java Persistence Api (JPA) jest wykorzystywane do mapowania encji zapisanych w bazie danych (wiersze tabeli) na ich obiektową reprezentację również nazywaną encją. Zbieżność terminów może powodować konsternację dlatego w dalszej części wpisu przez pojęcie encja należy rozumieć tylko odpowiednio opisaną klasę w języku Java.<br />
W ogólnym wypadku każda klasa spełniająca wymogi JavaBean tj. posiadająca bezparametrowy konstruktor oraz metody get i set dla pól może zostać przekształcona w encję. Dla przykładu, Grupa może zostać opisana przez taki komponent:</p>
<pre class="brush: java">
package eu.doniec.piotr.bean

public class Grupa {
    private Long id;

    private String nazwa;
    private String opis;

    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }
    public String getNazwa() { return nazwa; }
    public void setNazwa(String nazwa) { this.nazwa = nazwa; }
    public String getOpis() { return opis; }
    public void setOpis(String opis) { this.opis = opis; }
}
</pre>
<p>Modyfikacja do postaci encji, możliwej do wykorzystania przez JPA do obsługi danych zawartych w tabeli Grupy polega na opisaniu klasy metainformacjami &#8211; adnotacjami z pakietu javax.persistence. Gotowa klasa przedstawia się następująco:</p>
<pre class="brush: java">
package eu.doniec.piotr.persistence;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQuery;
import javax.persistence.Table;

@Entity
@NamedQuery(
    name=&quot;findAllGroups&quot;,
    query=&quot;SELECT g FROM Grupa g&quot;
)
@Table(name=&quot;GRUPY&quot;)
public class Grupa implements Serializable {

    @Id @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String nazwa;
    private String opis;

    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }
    public String getNazwa() { return nazwa; }
    public void setNazwa(String nazwa) { this.nazwa = nazwa; }
    public String getOpis() { return opis; }
    public void setOpis(String opis) { this.opis = opis; }
}
</pre>
<p>Podobnie sytuacja wygląda z klasą Studenta, choć tu sytuacja jest trochę inna. Struktura bazy danych wymaga aby tabela STUDENCI posiadała ograniczenie FOREIGN_KEY na dodatkowe pole GRUPA_ID. W takiej sytuacji w ramach encji Student umieszczamy odwołanie do encji Grupa. Właściwość ta jest dodatkowo oznaczona adnotacją @ManyToOne oznaczającą właśnie że wielu studentów może przynależeć do jednej grupy.</p>
<pre class="brush: java">
package eu.doniec.piotr.persistence;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.ManyToOne;
import javax.persistence.JoinColumn;

@Entity
@NamedQuery(
    name=&quot;findAllStudents&quot;,
    query=&quot;SELECT s FROM Student s&quot;
)
@Table(name=&quot;STUDENCI&quot;)
public class Student implements Serializable {
    @Id @GeneratedValue(strategy = GenerationType.AUTO)
    private Long nr_indeksu;

    private String imie;
    private String nazwisko;

    @ManyToOne
    private Grupa grupa;

    public Long getNr_indeksu() { return nr_indeksu; }
    public void setNr_indeksu(Long nr_indeksu) { this.nr_indeksu=nr_indeksu; }
    public String getImie() { return imie; }
    public void setImie(String imie) { this.imie = imie; }
    public String getNazwisko() { return nazwisko; }
    public void setNazwisko(String nazwisko) { this.nazwisko = nazwisko; }
    public Grupa getGrupa() { return grupa; }
    public void setGrupa(Grupa grupa) { this.grupa = grupa; }
}
</pre>
<p>Encje są zdefiniowane, pozostało jeszcze je wykorzystać. W tym celu powstanie servlet, który wyświetli nr indeksu, nazwisk i przydział studenta do grupy. W celu wykorzystania stworzonych obiektów trzeba utworzyć obiekt EntityManager&#8217;a, a raczej &#8222;wstrzyknąć&#8221; go do aplikacji &#8211; uzyskuje się to annotacją @PersistenceContext. Utworzony w ten sposób EntityManager jest zarządzany przez kontener aplikacji tzw. container-managed. Sensowne wydaje się wstrzyknięcie go w klasie implementującej ServletContextListener i zapisanie w kontekście servletu, w ten sposób łatwo będzie się do niego dostać:</p>
<pre class="brush: java">
package eu.doniec.piotr.listeners;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.ServletContext;

import javax.persistence.PersistenceContext;
import javax.persistence.EntityManager;

@WebListener()
public class ContextListener implements ServletContextListener {

    @PersistenceContext
    private EntityManager em;

    private ServletContext context;

    public void contextInitialized(ServletContextEvent sce) {
        context = sce.getServletContext();
        context.setAttribute(&quot;EntityManager&quot;, em);
    }

    public void contextDestroyed(ServletContextEvent sce) {
        context.removeAttribute(&quot;EntityManager&quot;);
    }
}
</pre>
<p>Na tym etapie, pozostało już tylko stworzenie serwletu i konfiguracja połączenia z bazą danych. Ostatni, prymitywny fragment kodu wypisuje na ekran nr indeksu, nazwisko i nazwę grupy do której zapisany jest student.</p>
<pre class="brush: java">
package eu.doniec.piotr.servlets;

import eu.doniec.piotr.persistence.Student;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import javax.persistence.EntityManager;
import javax.persistence.Query;

@WebServlet(name=&quot;studenci&quot;, urlPatterns={&quot;/studenci&quot;})
public class Studenci extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType(&quot;text/html;charset=UTF-8&quot;);
        PrintWriter out = response.getWriter();
        try {
            EntityManager em = (EntityManager)getServletContext().getAttribute(&quot;EntityManager&quot;);
            Query q = em.createNamedQuery(&quot;findAllStudents&quot;);

            out.println(&quot;&lt;html&gt;&quot;);
            out.println(&quot;&lt;head&gt;&quot;);
            out.println(&quot;&lt;title&gt;Servlet studenci&lt;/title&gt;&quot;);
            out.println(&quot;&lt;/head&gt;&quot;);
            out.println(&quot;&lt;body&gt;&quot;);
            out.println(&quot;&lt;h1&gt;Servlet studenci at &quot; + request.getContextPath () + &quot;&lt;/h1&gt;&quot;);

            out.println(&quot;&lt;table&gt;&quot;);
            out.println(&quot;&lt;tr&gt;&lt;th&gt;Numer indeksu&lt;/th&gt;&lt;th&gt;Nazwisko&lt;/th&gt;&lt;th&gt;Grupa&lt;/th&gt;&lt;/tr&gt;&quot;);

            List studenci =  q.getResultList();
            for (Iterator iter = studenci.iterator(); iter.hasNext();) {
                Student s = (Student) iter.next();
                out.println(&quot;&lt;tr&gt;&quot;);
                out.println(&quot;&lt;td&gt;&quot; + s.getNr_indeksu() +&quot;&lt;/td&gt;&quot;);
                out.println(&quot;&lt;td&gt;&quot; + s.getNazwisko() + &quot;&lt;/td&gt;&quot;);
                out.println(&quot;&lt;td&gt;&quot; + s.getGrupa().getNazwa() +&quot;&lt;/td&gt;&quot;);
                out.println(&quot;&lt;/tr&gt;&quot;);
            }

            out.println(&quot;&lt;/body&gt;&quot;);
            out.println(&quot;&lt;/html&gt;&quot;);
        } finally {
            out.close();
        }
    } 

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }
}
</pre>
<p>Plik persistence.xml:</p>
<pre class="brush: xml">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;persistence version=&quot;1.0&quot; xmlns=&quot;http://java.sun.com/xml/ns/persistence&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd&quot;&gt;
  &lt;persistence-unit name=&quot;baza-danych-nauczyciela-pu&quot; transaction-type=&quot;JTA&quot;&gt;
    &lt;provider&gt;oracle.toplink.essentials.PersistenceProvider&lt;/provider&gt;
    &lt;jta-data-source&gt;jdbc/bazanauczyciela&lt;/jta-data-source&gt;
  &lt;/persistence-unit&gt;
&lt;/persistence&gt;
</pre>
<p>Sposób stworzenie źródła danych dla Oracle pod Glassfish wystarczająco dobrze opisany jest tu: <a href="http://technology.amis.nl/blog/1276/configuring-a-oracle-datasource-on-glassfish">http://technology.amis.nl/blog/1276/configuring-a-oracle-datasource-on-glassfish</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://piotr.doniec.eu/devlog/2010/02/prosty-przyklad-wykorzystania-java-servlets-jpa-oracle-10xe-i-glassfish-v3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adnotacje w servlet 3.0</title>
		<link>http://piotr.doniec.eu/devlog/2009/12/adnotacje-w-servlet-3-0/</link>
		<comments>http://piotr.doniec.eu/devlog/2009/12/adnotacje-w-servlet-3-0/#comments</comments>
		<pubDate>Sat, 26 Dec 2009 17:43:58 +0000</pubDate>
		<dc:creator>pejotr</dc:creator>
				<category><![CDATA[J2EE]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[glassfish]]></category>
		<category><![CDATA[jee]]></category>

		<guid isPermaLink="false">http://piotr.doniec.eu/devlog/?p=369</guid>
		<description><![CDATA[W JSR 315: Java Servlet 3.0 Specification zdefiniowano dodatkowe, nowe adnotacje mające na celu ułatwienie tworzenia aplikacji. Referencyjna implementacja została już zawarta w jednym z &#8222;nocnych wydań&#8221; serwera Glassfish. Dziwi zatem fakt że informacja o tym że servlety nie wymagają już odpowiednich wpisów w deskryptorze rozmieszczenia ( ang. deployment descriptor ) nie została umieszczona w [...]]]></description>
			<content:encoded><![CDATA[<p>W JSR 315: Java Servlet 3.0 Specification zdefiniowano dodatkowe, nowe adnotacje mające na celu ułatwienie tworzenia aplikacji. Referencyjna implementacja została już zawarta w jednym z &#8222;nocnych wydań&#8221; serwera Glassfish. Dziwi zatem fakt że informacja o tym że servlety nie wymagają już odpowiednich wpisów w deskryptorze rozmieszczenia ( ang. deployment descriptor ) nie została umieszczona w oficjalnym tutorialu. Mimo że przykładowe projekty dla serwletów w SDK 6 zostały napisane od nowa żaden z nich nie wykorzystuje nowych adnotacji.<span id="more-369"></span><br />
Dodane adotacje to: @WebServlet, @ServletFilter, @WebServletContextListener, @WebInitParam oraz @MultipartConfig więcej informacji na ich temat można znaleźć w pakiecie javax.servlet.annotation.<br />
Przykładowe wykorzystanie:<br />
[cc lang="java"]<br />
@WebServlet(name=&#8221;HelloWorld&#8221;, urlPatterns={&#8222;/helloworld&#8221;}, displayName=&#8221;DISPLAY NAME&#8221;)<br />
public class HelloWorld extends HttpServlet {</p>
<p>@Override<br />
    protected void doGet(HttpServletRequest request, HttpServletResponse response)<br />
    throws ServletException, IOException {<br />
        //processRequest(request, response);<br />
    }</p>
<p>}<br />
[/cc]</p>
]]></content:encoded>
			<wfw:commentRss>http://piotr.doniec.eu/devlog/2009/12/adnotacje-w-servlet-3-0/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>O JSP słów kilka</title>
		<link>http://piotr.doniec.eu/devlog/2009/07/o-jsp-slow-kilka/</link>
		<comments>http://piotr.doniec.eu/devlog/2009/07/o-jsp-slow-kilka/#comments</comments>
		<pubDate>Sun, 05 Jul 2009 14:58:46 +0000</pubDate>
		<dc:creator>pejotr</dc:creator>
				<category><![CDATA[J2EE]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[jee]]></category>

		<guid isPermaLink="false">http://piotr.doniec.eu/devlog/?p=226</guid>
		<description><![CDATA[W swoim wcześniejszym wpisie, zatytułowanym JSP, JSF, GlassFish &#8211; mini słowniczek napisałem że JSP jest wykorzystywane jako warstwa widoku w modelu MVC. Jest to oczywiście prawda ale jak się niedawno dowiedziałem, w znaczny sposób spłyciłem zastosowanie JSP. Okazuje się bowiem że samo JSP jest idealnym sposobem na tworzenie prostych aczkolwiek dynamicznych stron WWW w których [...]]]></description>
			<content:encoded><![CDATA[<p>W swoim wcześniejszym wpisie, zatytułowanym <a href="http://piotr.doniec.eu/devlog/2009/03/jsp-jsf-glassfish-mini-slowniczek/">JSP, JSF, GlassFish &#8211; mini słowniczek</a> napisałem że JSP jest wykorzystywane jako warstwa widoku w modelu MVC. Jest to oczywiście prawda ale jak się niedawno dowiedziałem, w znaczny sposób spłyciłem zastosowanie JSP. Okazuje się bowiem że samo JSP jest idealnym sposobem na tworzenie prostych aczkolwiek dynamicznych stron WWW w których nie ma potrzeby podziału na poszczególne warstwy Model &#8211; Widok &#8211; Kontroler. Co więcej okazuję się że każda strona JSP również jest servletem i zachowuję się w sposób podobny.<br />
<span id="more-226"></span><br />
Strona JSP to na dobrą sprawę kod HTML/XHTML z pewnymi dodatkami które zapewniają dynamiczność takiej strony. Te &#8222;pewne dodatki&#8221; to tzw. skryptlety, czyli poprstu kod Javy umieszczony w kodzie stron JSP pomiędzy znacznikami <code><% ... %></code>. Jest to rozwiązanie bardzo podobne do umieszczania kodu PHP w ramach kodu HTML. Jak wiadomo mieszanie logiki aplikacji ze sposobem prezentacji nie jest dobrym pomysłem, ale na dobry początek trzeba zacząć od czegoś prostego. Aby nie był to &#8222;suchy wpis&#8221; przedstawiam przykład(pochodzi książki Head First Servlets &#038; JSP):</p>
<pre class="brush: java">
package foo;

public class Licznik {
    private static int liczba;
    public static synchronized int getLiczba() {
        liczba++;
        return liczba;
    }
}
</pre>
<p>to kod wstawiony do strony JSP korzystający z licznika powinien wyglądać następująco:<br />
<code><% out.println(foo.licznik.getLiczba());  %></code></p>
<p>Oprócz znacznika skryptletu który został przed chwilą zaprezentowane w stronach JSP można spotkać również inne, np.</p>
<ul>
<li>Dyrektywa: <%@ ... %>, np: <code><%@page contentType="text/html; charset=UTF-8" %></code> ustawia typ treści</li>
<li>Wyrażenie <%= ... %>, np. <code><%= Licznik.getLiczba() %> spowoduje wyświetlenie aktualnego stanu licznika. </code></li>
<li>Definicja: <%! ... %>, umożliwia definiowanie zmiennych i metod które są później &#8222;wstrzykiwane&#8221; do tworzonej klasy servletu. W ramach tych znaczników jesteśmy upoważnieni do przeciążenia metod <code>jspInit</code> oraz <code>jspDestroy</code> które są wywoływane odpowiednio przy powoływaniu servletu do życia i przy jego usuwaniuz kontenera. Z uwagi na fakt że definicje metod zawartych w obrębie znacznika defincji stają metodami servletu, nie ma tu dostępu do zmienny <code>request</code> i <code>response</code></li>
</ul>
<p>Jak wspomniałem każda strona JSP jest servletem. Strona jest tłumaczona przez kontener na odpowiedni servlet. Wykorzystanie różnych znaczników do zaprezentowania innego typu zawartości ułatwia kontenerowi konwersję. I tak dyrektywy są używane aby kontrolować jak kontener ma przetłumaczyć a następnie wykonać kod strony, skryptlety są po prostu przepisywane do kodu servletu natomiast wyrażenia są przekazywane jako parametry odpowiednich funkcji.</p>
]]></content:encoded>
			<wfw:commentRss>http://piotr.doniec.eu/devlog/2009/07/o-jsp-slow-kilka/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wstęp do servlet&#8217;ów</title>
		<link>http://piotr.doniec.eu/devlog/2009/06/wstep-do-servletow/</link>
		<comments>http://piotr.doniec.eu/devlog/2009/06/wstep-do-servletow/#comments</comments>
		<pubDate>Sun, 28 Jun 2009 21:47:53 +0000</pubDate>
		<dc:creator>pejotr</dc:creator>
				<category><![CDATA[J2EE]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[jee]]></category>

		<guid isPermaLink="false">http://piotr.doniec.eu/devlog/?p=214</guid>
		<description><![CDATA[A czym że to jest ? Servlet API to zbiór klas i interface&#8217;ów które umożliwiają komunikację z użytkownikiem i dynamicznie przygotowywanie treści w odpowiedzi na żądanie. Servlet jest to napisana w języku Java klasa, ładowana i obsługiwana poprzez serwer WWW lub serwer aplikacji współpracujący z serwerem WWW, która umie odebrać żądanie i odpowiednio obrobić i [...]]]></description>
			<content:encoded><![CDATA[<p>A czym że to jest ? Servlet API to zbiór klas i interface&#8217;ów które umożliwiają komunikację z użytkownikiem i dynamicznie przygotowywanie treści w odpowiedzi na żądanie. Servlet jest to napisana w języku Java klasa, ładowana i obsługiwana poprzez serwer WWW lub serwer aplikacji współpracujący z serwerem WWW, która umie odebrać żądanie i odpowiednio obrobić i wygenerować odpowiedź. Ci którzy mieli styczność ze skryptami CGI zapewne zauważą podobieństwa, Servlet jest prawie tym samym co skrypt PHP. Jednak ja mówi stare chińskie przysłowie &#8222;prawie robi wielką różnicę&#8221;.<br />
<span id="more-214"></span><br />
Niezaprzeczalne zalety servletów to większa szybkość działania (każde żądanie jest obsługiwane w nowym wątku) oraz większe bezpieczeństwo. Do wad należy zaliczyć wymaganie na dość silną maszynę, w szczególności chodzi tu o dostępną pamięć.</p>
<p>Aby servlet mógł być servletem a nie zwykłą klasą musi implementować interface javax.servlet.Servlet. </p>
<pre class="brush: java">
interface javax.servlet.Servlet
{
  void destroy();
  ServletConfig getServletConfig();
  String getServletInfo();
  void init(ServletConfig config);
  void service(ServletRequest req, ServletResponse res);
}
</pre>
<p>Metoda <code>destroy</code> jest uruchamiana przez serwer aplikacji celem zniszczenia servletu. Dwie metody <code>init</code> oraz <code>service</code> mają za zadanie &#8222;zarządzanie&#8221; cyklem życia servletu. Pierwsza z wyżej wymienionych metod jest wywoływana tylko raz w całym cyklu życia servletu. Ma to zawsze miejsce przed obsługą przez servlet jakichkolwiek żądań klientów. Natomiast zadaniem metody <code>service</code> jest obsługa żądania. Metoda przyjmuje 2 parametry, pierwszy z nich definiuje żądanie skierowane do serwera, a drugi będzie zawierał wygenerowaną odpowiedź. </p>
<p>Tworzenie za każdym razem klasy implementującej ten interface może się okazać zadaniem dosyć żmudnym dlatego do dyspozycji mamy jeszcze 2 klasy: <code>GenericServlet</code> &#8211; klasa obsługująca żadania nie zależenie od protokołu, jednak wymaga samodzielnej implementacji metody <code>service</code>, oraz klasa <code>HttpServlet</code> do wykorzystania wraz z protokołem HTTP. Oczywistą zaletą tej klasy jest w pełni zaimplementowany mechanizm sterownia życiem servletu. Rola programisty ogranicza się właściwie do przysłonięcia metod typowych dla żadań HTTP takich jak POST (metoda doPost), GET (doGet), HEAD, OPTIONS, PUT, TRACE, DELETE. Nie trzeba chyba nikogo przekonywać że w 99% przypadków nadpisywana jest jedna z dówch pierwszych metod lub obie.</p>
]]></content:encoded>
			<wfw:commentRss>http://piotr.doniec.eu/devlog/2009/06/wstep-do-servletow/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JSP, JSF, GlassFish &#8211; mini słowniczek</title>
		<link>http://piotr.doniec.eu/devlog/2009/03/jsp-jsf-glassfish-mini-slowniczek/</link>
		<comments>http://piotr.doniec.eu/devlog/2009/03/jsp-jsf-glassfish-mini-slowniczek/#comments</comments>
		<pubDate>Tue, 03 Mar 2009 22:55:44 +0000</pubDate>
		<dc:creator>pejotr</dc:creator>
				<category><![CDATA[J2EE]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[jee]]></category>

		<guid isPermaLink="false">http://piotr.doniec.eu/devlog/?p=79</guid>
		<description><![CDATA[Nie dziś wiadomo że w informatyce akronimy pojawiają się nader często, co gorsza pula 3 literowych skrótów została już wyczerpana i zdarza się że 2 akronimy znaczą to samo. W tym gąszczu pojawia się wiele które związane są w jakiś sposób z Java a w szczególności z JEE. Tak więc zaczynając od początku: serwlet &#8211; [...]]]></description>
			<content:encoded><![CDATA[<p>Nie dziś wiadomo że w informatyce akronimy pojawiają się nader często, co gorsza pula 3 literowych skrótów została już wyczerpana i zdarza się że 2 akronimy znaczą to samo. W tym gąszczu pojawia się wiele które związane są w jakiś sposób z Java a w szczególności z JEE.<span id="more-79"></span> Tak więc zaczynając od początku:</p>
<ul>
<li><strong>serwlet</strong> &#8211; ciężko zdefiniować go w sposób jednoznaczny, ale jest to klasa Javy dziedzicząca po HttpServlet, odpowiedzialna za reakcję na żądania dostarczone od użytkownika za pośrednictwem serwera WWW. Serwlety są podobne do skryptów PHP czy Perl, ale to zupełnie inna technologia. PHP i Perl to CGI, no a serwlet to serwlet. Serwlet jest najczęściej tworzony jako kontroler w modelu MVC</li>
<li><strong>JSP</strong> &#8211; skrót od JavaServer Pages. Nazwanie tego technologią to trochę za dużo, ale jest to sposób na wyświetlanie danych odebranych z serwletu. JSP to Widok(View) w modelu MVC.</li>
<li><strong>JSF</strong> &#8211; skrót od JavaServer Faces, jest frameworkiem dla JSP. Zawiera komponenty które w znaczny sposób mają ułatwić tworzenie aplikacji i odciążyć programistę od powtarzania kodu dla wielu typowych operacji.</li>
<li><strong>GlassFish, JBoss</strong> &#8211; serwlety muszą być uruchamiane w specjalnym środowisku. Potrzebny do tego jest serwer aplikacji JEE, jakim właśnie jest np. GlassFish. Taki serwer aby był zgodny ze specyfikacją JEE oprócz kontenera serwletów musi także zawierać kontener EJB( klasy modelu ). </li>
<p>Połączenie wszystkich wyżej wymienionych technologii można zobrazować jak na rysunku poniżej(przedstawiony &#8222;graf&#8221; od ciemne grubej kreski jest zawarty w serwerze aplikacji JEE np. GlassFish, JBoss)<br />
<div id="attachment_83" class="wp-caption aligncenter" style="width: 495px"><img src="http://piotr.doniec.eu/devlog/wp-content/uploads/2009/03/mvc-applied-jsp-model2.gif" alt="Pobrany z http://www.jcorporate.com/" title="mvc-applied-jsp-model2" width="485" height="418" class="size-full wp-image-83" /><p class="wp-caption-text">Obrazek pobrany z http://www.jcorporate.com/</p></div></p>
]]></content:encoded>
			<wfw:commentRss>http://piotr.doniec.eu/devlog/2009/03/jsp-jsf-glassfish-mini-slowniczek/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

