PV168/Úlohy: Porovnání verzí

Z FI WIKI
Přejít na: navigace, hledání
(Úloha 5: Vlákna)
m (Odkaz na osnovu)
Řádka 3: Řádka 3:
 
V průběhu semestru budete řešit několik úloh, které na sebe ve většině případů navazují. Cílem bude vyvinout jednoduchou databázovou aplikaci s grafickým uživatelským rozhraním a s jednoduchým webovým rozhraním. Pokud nebude řečeno jinak, budou úlohy řešeny ve dvojicích.
 
V průběhu semestru budete řešit několik úloh, které na sebe ve většině případů navazují. Cílem bude vyvinout jednoduchou databázovou aplikaci s grafickým uživatelským rozhraním a s jednoduchým webovým rozhraním. Pokud nebude řečeno jinak, budou úlohy řešeny ve dvojicích.
  
Úlohy budou zadávány a kontrolovány na cvičení. Úlohy musejí být zároveň odevzdány do odevzdávárny a to nejpozději před začátkem cvičení, na kterém má být úloha opravena. Pokud úlohu neodevzdáte na příslušném cvičení, za každý započatý týden zpoždění ztratíte jeden bod. Celkem můžete získat 30 bodů. Na získání zápočtu potřebujete získat 24 bodů, mít odevzdané všechny úlohy a v závěrečné úloze musíte mít splněná všechna předepsaná kritéria (viz níže).  
+
Úlohy budou zadávány a kontrolovány na cvičení. Úlohy musejí být zároveň odevzdány do odevzdávárny a to nejpozději před začátkem cvičení, na kterém má být úloha opravena. Pokud úlohu neodevzdáte na příslušném cvičení, za každý započatý týden zpoždění ztratíte jeden bod. Celkem můžete získat 30 bodů. Na získání zápočtu potřebujete získat 24 bodů, mít odevzdané všechny úlohy a v závěrečné úloze musíte mít splněná všechna předepsaná kritéria (viz níže). Termíny odevzdání úloh naleznete v [https://is.muni.cz/auth/elearning/warp.pl?qurl=%2Fel%2F1433%2Fjaro2011%2FPV168%2Findex.qwarp;rozbalit_vse=1; osnově předmětu]
  
 
Pokud je v osnově zařazena průběžná kontrola úlohy, je nutné mít předepsanou část úlohy hotovou již před touto průběžnou kontrolou (není však nutné nic vkládat do odevzdávárny). V opačném případě cvičící opět uplatní bodovou penalizaci dle pravidla "každý započatý týden zpoždění = ztráta jednoho bodu".
 
Pokud je v osnově zařazena průběžná kontrola úlohy, je nutné mít předepsanou část úlohy hotovou již před touto průběžnou kontrolou (není však nutné nic vkládat do odevzdávárny). V opačném případě cvičící opět uplatní bodovou penalizaci dle pravidla "každý započatý týden zpoždění = ztráta jednoho bodu".

Verze z 18. 2. 2011, 20:11

This page has restricted access. Only members of PV168 group can edit it.

V průběhu semestru budete řešit několik úloh, které na sebe ve většině případů navazují. Cílem bude vyvinout jednoduchou databázovou aplikaci s grafickým uživatelským rozhraním a s jednoduchým webovým rozhraním. Pokud nebude řečeno jinak, budou úlohy řešeny ve dvojicích.

Úlohy budou zadávány a kontrolovány na cvičení. Úlohy musejí být zároveň odevzdány do odevzdávárny a to nejpozději před začátkem cvičení, na kterém má být úloha opravena. Pokud úlohu neodevzdáte na příslušném cvičení, za každý započatý týden zpoždění ztratíte jeden bod. Celkem můžete získat 30 bodů. Na získání zápočtu potřebujete získat 24 bodů, mít odevzdané všechny úlohy a v závěrečné úloze musíte mít splněná všechna předepsaná kritéria (viz níže). Termíny odevzdání úloh naleznete v osnově předmětu

Pokud je v osnově zařazena průběžná kontrola úlohy, je nutné mít předepsanou část úlohy hotovou již před touto průběžnou kontrolou (není však nutné nic vkládat do odevzdávárny). V opačném případě cvičící opět uplatní bodovou penalizaci dle pravidla "každý započatý týden zpoždění = ztráta jednoho bodu".

Témata úloh

  • Evidence CD, DVD a knih
  • Adresář a správa kontaktů
  • Autopůjčovna
  • Evidence nemovitostí
  • Evidence plateb
  • Kalendář
  • Konfigurátor PC
  • Skladové hospodářství
  • Správa docházky

Zakázaná témata

  • Evidence hrobů
  • Evidence jídla v ledničce

Úloha 1

Název: Specifikace, případy užití, diagram tříd
Počet bodů: 3
Způsob řešení: Každý člen týmu řeší úlohu individuálně, při průběžné kontrole se potom vybere lepší řešení, případně cvičící doporučí zkombinovat prvky obou návrhů.

Zadání

  1. Sestavte si dvojčlenný tým a vyberte se některé z výše uvedených témat. Můžete si vybrat i jiné podobné téma, které si ale v takovém případě musíte nechat schválit cvičícím.
  2. Vytvořte specifikaci pro vaši aplikaci a identifikujte případy užití. Případy užití modelujte prostřednictvím UML.
  3. Vytvořte návrh vaší aplikace a modelujte jej pomocí diagramu tříd v UML.

Tipy

  • Držte se pravidla KISS.
  • Nevytvářejte příliš složitou specifikaci s velkým množstvím případů užití. Čím složitější specifikaci vytvoříte, tím více budete mít později práce, až budete aplikaci implementovat.
  • Snažte se udržet váš návrh tříd přiměřeně jednoduchý. Nevytvářejte zbytečně velké množství atributů u entit. Čím složitější návrh vytvoříte, tím více budete mít později práce, až budete aplikaci implementovat.
  • Ideální rozsah aplikace jsou dvě entity, každá s třemi až pěti atributy, a jedna až dvě třídy realizující aplikační logiku.
  • K vytvoření diagramů doporučujeme nástroj Visual Paradigm, ale pokud máte jiný oblíbený UML nástroj, můžete použít i ten.

Úloha 2

Název: Sada alespoň tří netriviálních testovacích metod k vašemu projektu
Počet bodů: 3
Způsob řešení: Každý člen týmu řeší úlohu zvlášť a vytváří různé testovací metody pro různé části aplikace.

Úloha 3

Název: Implementace základních databázových operací
Počet bodů: 3
Způsob řešení: Úlohu řeší oba členové týmu dohromady.

Úloha 4

Název: Kompletní implementace aplikační vrstvy + testy
Počet bodů: 3
Způsob řešení: Úlohu řeší oba členové týmu dohromady.

Úloha 5

Název: Vícevláknová aplikace
Počet bodů: 3
Způsob řešení: Úlohu řeší každý člen týmu zvlášť

Zadání

Napište jednoduchý program, který vytvoří tři vlákna. Tato vlákna budou generovat společnou řadu čísel od 0 do 50 a vypisovat je na standardní výstup ve tvaru

vlakno 1: 0
vlakno 1: 1
vlakno 3: 2
vlakno 2: 3
...
vlakno 1: 50

Tipy a další pokyny

Při řešení úlohy dodržujte tyto tyto pokyny:

  • Třídu implementující chování vláken nerealizujte jako potomka třídy Thread, ale jako třídu implementující rozhraní Runnable.
  • Všechna tři vlákna realizujte pomocí jedné společné třídy (tj. nevytvářejte pro každé vlákno novou třídu, pouze novou instanci společné třídy).
  • Dejte si pozor, co všechno musíte synchronizovat. Chyby v synchronizaci budou předmětem bodové penalizace. Chybou v synchronizaci není pouze synchronizace nedostatečná, ale také synchronizace nadbytečná.
  • Pokud by se stalo, že přepínání kontextu bude pomalé a všechna čísla vygeneruje jedno vlákno, vložte na vhodné místo (případně na více vhodných míst) aktivní čekací smyčku. Za normálních okolností byste samozřejmě ve svém programu aktivní čekací smyčku nikdy používat neměli, protože zbytečně spotřebovává strojový čas procesoru a snižuje výkon aplikace. V tomto případě by ale použití vhodnější metody (např. volání Thread.sleep()) vynutilo přepnutí kontextu a zamaskovalo by to veškeré případné chyby v synchronizaci. Pozor! Ani to, že použijete aktivní čekací smyčku negarantuje, že jste opravdu žádnou chybu v synchronizaci neudělali. Aktivní čekací smyčka pouze výrazně zvyšuje šanci, že se vaše případné chyby v synchronizaci projeví.
  • Až budete mít program hotový, nejspíš zjistíte, že se čísla nevypisují ve správném pořadí. Uložte si tuto verzi programu a zkuste jej pak upravit tak, aby bylo dodrženo i pořadí čísel. Při opravování pak ukažte obě verze (první by měla být jednodušší, druhá o něco složitější).
  • Každé číslo musí být samozřejmě ve výstupní posloupnosti právě jednou.
  • Častou chybou je přesáhnutí hodnoty 50 na konci, dejte si na to pozor.

Úloha 6

Název: Jednoduché webové rozhraní k aplikaci
Počet bodů: 3
Způsob řešení: Úlohu řeší každý člen týmu zvlášť.

Zadání

Vytvořte webovou aplikaci obsahující dvě JSP stránky a jeden servlet. První JSP stránka nechť se jmenuje index.jsp a obsahuje HTML formulář pro zadání nějaké entity do vašeho projektu, tj. například auta, zákazníka, jídla do ledničky, těla do hrobu atd. Bude vypadat nějak takto:

 
<%@page contentType="text/html;charset=utf-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 
<html>
    <head>
        <title>Zadání dat</title>
    </head>
    <body>
        <h2>Zadejte auto</h2>
        <c:if test="${not empty chyba}">
            <div style="border: solid 1px red; background-color: yellow; padding: 10px">
                <c:out value="${chyba}"/>
            </div>
        </c:if>
        <form action="${pageContext.request.contextPath}/ZpracovaniServlet" method="post">
        <table>
            <tr>
                <th>SPZ:</th>
                <td><input type="text" name="spz" /></td>
            </tr>
            <tr>
                <th>barva:</th>
                <td><input type="text" name="barva" /></td>
            </tr>
            <tr>
                <th>značka:</th>
                <td><input type="text" name="znacka" /></td>
            </tr>
        </table>    
        <input type="Submit" value="Zadat" />
        </form>    
    </body>
</html>

Nezapomeňte do aplikace přidat knihovnu JSTL 1.1!

Servlet bude obsahovat kontrolu, že všechna pole formuláře byla vyplněna, a pokud ne, zobrazí opět stránku index.jsp s popisem chyby.

Pokud budou všechna data zadána, servlet zavolá aplikační logiku projektu, uloží nový objekt (auto, jídlo, hrob, atd.), načte všechny objekty a předá řízení na stránku, která je zobrazí. Tj. servlet bude vypadat zhruba takto:

 
package cz.muni.fi.pa168.uloha;
 
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
public class ZpracovaniServlet extends HttpServlet {
   
 
    /** 
    * Handles the HTTP <code>POST</code> method.
    * @param request servlet request
    * @param response servlet response
    */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        //aby fungovala cestina z formulare
        request.setCharacterEncoding("utf-8");
 
        String spz = request.getParameter("spz");
        String barva = request.getParameter("barva");
        String znacka = request.getParameter("znacka");
        
        if(spz==null||spz.length()==0
                ||barva==null||barva.length()==0
                ||znacka==null||znacka.length()==0) {
            request.setAttribute("chyba", "Je nutné vyplnit všechny hodnoty !");
            request.getRequestDispatcher("/index.jsp").forward(request, response);
            return;
        }
        
        
        CarRental cr = new CarRental();
        cr.addCar(new Car(spz,barva,znacka));
        
        List<Car> allCars = cr.getAllCars();
        request.setAttribute("cars", allCars);
         
        request.getRequestDispatcher("/seznam.jsp").forward(request, response);
        
    }
}

Stránka zobrazující seznam objektů pak bude vypadat zhruba takto:

 
<%@page contentType="text/html;charset=utf-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 
<html>
    <head>
        <title>Seznam aut</title>
    </head>
    <body>
        <h2>Seznam aut</h2>
        <table border="1">
        <c:forEach items="${cars}" var="car">
            <tr>
                <td><c:out value="${car.spz}"/></td>
                <td><c:out value="${car.barva}"/></td>
                <td><c:out value="${car.znacka}"/></td>
            </tr>    
        </c:forEach>
        </table>
     </body>
</html>

Tipy

Až budete shánět spojení do databáze, máte dvě možnosti.

Ta asi jednodušší je do projektu přidat knihovny s ovladačem pro JavaDB a spojení si ručně vytvořit.

Ale v reálných aplikacích poskytuje spojení do databáze TomCat, a tady je návod pro odvážnější:

Do servletu přidejte anotovanou proměnnou, kterou TomCat naplní instancí poolu databázových spojení. Na ní pak stačí zavolat pool.getConnection():

 
package cz.muni.fi.pa168.uloha;
 
import java.io.*;
import java.sql.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.sql.DataSource;
import javax.annotation.Resource;
 
public class ZpracovaniServlet extends HttpServlet {
    
    //dependency injection poolu spojeni na databazi od Tomcatu
    @Resource(name="jdbc/moje")
    private DataSource pool;
 
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    //...
    Connection c = pool.getConnection();
    //...
    }
}

Aby TomCat věděl, kde má DataSource vzít, do souboru WEB-INF/web.xml doplňte následující:

 
  <resource-ref>
     <res-ref-name>jdbc/moje</res-ref-name>
     <res-type>javax.sql.DataSource</res-type>
     <res-auth>Container</res-auth>
  </resource-ref>

a aby TomCat věděl, jaké spojení na databázi použít, do souboru META-INF/context.xml doplňte text aby vypadal zhruba takto (url, jméno a heslo nastavte pochopitelně svoje):

 
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/WebApplication2">
 
    <Resource name="jdbc/moje" auth="Container" type="javax.sql.DataSource"
            driverClassName="org.apache.derby.jdbc.ClientDriver"
            username="makub" password="heslo"
            url="jdbc:derby://localhost:1527/pokus"
    />
 
</Context>

A ted už jenom na příkazovém řádku zkopírujte JDBC ovladač do adresáře kde ho TomCat najde, tj.

$ cp /packages/run/jdk-1.6.0_05/db/lib/derbyclient.jar ~/.netbeans/6.0/apache-tomcat-6.0.14_base/nblib/

a můžete spustit aplikaci.

Úloha 7

Název: návrh GUI pro aplikaci
Počet bodů: 3
Způsob řešení: Úlohu řeší oba členové týmu dohromady.

Zadání

Pomocí návrháře GUI v NetBeans navrhněte, jak by mělo vypadat rozhraní Vaší aplikace. Příští hodinu Vám cvičící zkontroluje, jestli jde o uživatelsky přívětivé řešení.

Úloha 8

Název: Finální verze aplikace
Počet bodů: 9
Způsob řešení: Úlohu řeší oba členové týmu dohromady.

Zadání

Doimplementujte aplikaci tak, aby splňovala specifikaci definovanou v rámci úlohy 1, měla plně funkční GUI a splňovala následující požadavky:

  1. Lokalizace alespoň do tří jazyků.
  2. Logování základních operací v aplikační vrstvě a logování všech výjimek a chyb.
  3. Konfigurace připojení k databázi je uložena v property souboru, který je umístěn v classpath.
  4. Uživatelské rozhraní je uživatelsky přívětivé a intuitivní (viz úloha 7).