<?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; glassfish</title>
	<atom:link href="http://piotr.doniec.eu/devlog/tag/glassfish/feed/" rel="self" type="application/rss+xml" />
	<link>http://piotr.doniec.eu/devlog</link>
	<description></description>
	<lastBuildDate>Sun, 25 Jul 2010 12:54:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</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:</p>
<div class="codecolorer-container java mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">@WebServlet<span style="color: #009900;">&#40;</span>name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;HelloWorld&quot;</span>, urlPatterns<span style="color: #339933;">=</span><span style="color: #009900;">&#123;</span><span style="color: #0000ff;">&quot;/helloworld&quot;</span><span style="color: #009900;">&#125;</span>, displayName<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;DISPLAY NAME&quot;</span><span style="color: #009900;">&#41;</span><br />
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> HelloWorld <span style="color: #000000; font-weight: bold;">extends</span> HttpServlet <span style="color: #009900;">&#123;</span><br />
<br />
@Override<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000066; font-weight: bold;">void</span> doGet<span style="color: #009900;">&#40;</span>HttpServletRequest request, HttpServletResponse response<span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">throws</span> ServletException, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aioexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">IOException</span></a> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">//processRequest(request, response);</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
<br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
]]></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>
	</channel>
</rss>
