PV168/Úlohy: Porovnání verzí

Z FI WIKI
Přejít na: navigace, hledání
(Úloha 6)
Řádka 63: Řádka 63:
 
'''Název''': Jednoduché webové rozhraní k aplikaci<br/>
 
'''Název''': Jednoduché webové rozhraní k aplikaci<br/>
 
'''Počet bodů''': 3<br/>
 
'''Počet bodů''': 3<br/>
'''Způsob řešení''': Úlohu řeší oba členové týmu dohromady.
+
'''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:
 +
 
 +
<xml>
 +
<%@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>
 +
</xml>
 +
 
 +
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:
 +
 
 +
<java>
 +
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);
 +
       
 +
    }
 +
}
 +
</java>
 +
 
 +
Stránka zobrazující seznam objektů pak bude vypadat zhruba takto:
 +
 
 +
<xml>
 +
<%@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>
 +
</xml>
 +
 
 +
=== 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 <code>pool.getConnection()</code>:
 +
 
 +
<java>
 +
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();
 +
    //...
 +
    }
 +
}
 +
</java>
 +
 
 +
Aby TomCat věděl, kde má DataSource vzít, do souboru '''WEB-INF/web.xml''' doplňte následující:
 +
<xml>
 +
  <resource-ref>
 +
    <res-ref-name>jdbc/moje</res-ref-name>
 +
    <res-type>javax.sql.DataSource</res-type>
 +
    <res-auth>Container</res-auth>
 +
  </resource-ref>
 +
</xml>
 +
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>
 +
<?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>
 +
</xml>
 +
 
 +
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 ==
 
== Úloha 7 ==

Verze z 18. 2. 2011, 20:01

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).

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ášť

Ú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).