AWWW-1st3.6-l08.tresc-1.0

From Studia Informatyczne

Aplikacje WWW - laboratorium

JavaServer Pages Standard Tag Library

Celem ćwiczenia jest zapoznanie ze standardową biblioteką znaczników JSTL. W ramach ćwiczenia zostanie skonstruowany prosty sklep internetowy przy użyciu stron JSP i komponentu JavaBean. Biblioteka JSTL zostania wykorzystana do przetwarzania pliku XML, sterowania przepływem pracy oraz wyświetlania danych. Do wykonania ćwiczenia potrzebne jest zintegrowane środowisko programistyczne NetBeans IDE 5.0 (do pobrania z http://www.netbeans.org) oraz środowisko J2SE 1.4.2 (lub wyższe).

1. Uruchom narzędzie NetBeans IDE 5.0

2. Z menu głównego wybierz File->New Project. W oknie kreatora projektu wybierz kategorię Web i typ projektu Web Application. Kliknij przycisk Next >.


3. Podaj nazwę projektu, np. „labJSTL". Kliknij przycisk Finish.

4. Budowany sklep internetowy będzie oferował funkcję koszyka, w którym klient może umieszczać (lub z niego usuwać) produkty. Ze strony programisty wymaga to zapewnienia, że informacje o wybranych przez klienta produktach nie będą ulotne. W tym celu można zastosować komponent JavaBean (o zasięgu sesji) reprezentujący koszyk zakupów.

5. W nawigatorze projektu (znajduje się w lewej części okna) prawym przyciskiem myszy kliknij na węzeł Source Packages i wybierz opcję New->Java Package. Wprowadź nazwę pakietu, np. student.beans. Kliknij przycisk Finish.

6. Pod węzłem Source Packages został utworzony węzeł student.beans. Kliknij na nim prawym przyciskiem myszy i wybierz New->Java Class. Wprowadź nazwę klasy, np. shoppingCart i kliknij przycisk Finish.

7. Przejdź do edycji utworzonej klasy (dwukrotne kliknięcie na nazwie klasy w nawigatorze projektu). Klasa będzie oferowała możliwość przechowywania identyfikatorów produktów w koszyku wraz z ilością sztuk danego produktu. Takie dane można w łatwy sposób składować w tablicy haszowej, której kluczem jest identyfikator produktu a wartością liczba zamówionych sztuk tego produktu. Ponadto dostępne są metody do dodawania produktu (można dodawać po jednej sztuce), usuwania produktu (całość, niezależnie od ilości sztuk) oraz pobierania ilości różnych produktów i całej tablicy haszowej. Zastąp zawartość klasy shoppingCart poniższym kodem.

package student.beans;
import java.util.Hashtable;

public class shoppingCart {
    private Hashtable items;

    public shoppingCart() {
        this.items = new Hashtable();
    }

    public void add(String id_item) {
        if (this.items.containsKey(id_item)) {
            Integer quantity = (Integer)this.items.get(id_item);
            int newQuantity = quantity.intValue() + 1;
            this.items.put(id_item, new Integer(newQuantity));
        } else
            this.items.put(id_item, new Integer(1));
    }

    public Hashtable getItems() {
        return this.items;
    }
    public int getSize() {
        return items.size();
    }

    public void setNewItem(String id_item) {
        this.add(id_item);
    }

    public void setRemoveItem(String id_item) {
        this.items.remove(id_item);
    }
}

8. Dane na temat towarów oferowanych w sklepie będą znajdowały się w pliku XML. Plik zawiera opis części komputerowych. Struktura drzewa DOM (z przykładowymi wartościami) tego dokumentu została przedstawiona poniżej.

Image:AWWW-1st3_6-l08_tresc-1_0_05.png

9. Kliknij prawym przyciskiem na węzeł Web Pages i wybierz New->XML Document. Podaj nazwę pliku, np. items_data (bez rozszerzenia). Kliknij przycisk Next > a następnie przycisk Finish. Przejdź do edycji pliku XML i wprowadź do niego poniższą zawartość.

<?xml version="1.0" encoding="UTF-8"?>
<computer_parts><part ID="10"><name>Procesor 3.8 GHz</name><price>450.50</price></part><part ID="25"><name>Mysz laserowa</name><price>65.20</price></part><part ID="40"><name>Klawiatura multimedialna</name><price>12</price></part><part ID="50"><name>Monitor LCD 19</name><price>960</price></part><part ID="60"><name>Monitor CRT 17</name><price>360</price></part></computer_parts>


10. Kolejnym krokiem jest utworzenie stron JSP, które będą służyły do zarządzania zawartością koszyka. Utworzony projekt automatycznie posiada główną stronę w pliku index.jsp. W nawigatorze projektu rozwiń węzeł Web Pages i przejdź do edycji głównej strony (dwukrotne kliknięcie myszą na nazwie pliku).

Image:AWWW-1st3_6-l08_tresc-1_0_06.png

11. Na głównej stronie sklepu internetowego będą wyświetlone nazwy i ceny produktów, które zapisane są w pliku XML. Poniżej znajduję się kod głównej strony. Wszystkie potencjalne skryptlety zostały zastąpione odpowiednimi znacznikami JSTL. Dotyczy to zarówno odczytu, przetwarzania i wyświetlania dokumentu XML, jak również konstrukcji adresów URL oraz obsługi napisów w różnych językach. Umieść poniższy kod w pliku index.jsp.

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt"%>
<%@page import="java.util.Iterator"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
   </head>
   <body>
     <jsp:useBean id="cart" class="student.beans.shoppingCart"
                  scope="session"/>
     <fmt:setBundle basename="student.properties.language" />
     <center>
         <h1><fmt:message key="title"/></h1>
         <c:import var="xmlfile" url="items_data.xml"/>
         <x:parse doc="${xmlfile}" var="result"/>
         <table border=1>
             <tr>
                 <td><fmt:message key="name"/></td>
                 <td><fmt:message key="price"/></td>
                 <td> </td>
             </tr>
             <x:forEach select="$result//part" var="currentPart">
                 <tr>
                     <td><x:out select="$currentPart/name"/></td>
                     <td><x:out select="$currentPart/price"/></td>
                     <c:set var="id_part">
                         <x:out select="$currentPart/@ID" />
                     </c:set>
                     <c:url value="/change_cart.jsp" var="addURL">
                         <c:param name="action" value="add"/>
                         <c:param name="id_part" value="${id_part}"/>
                     </c:url>
                     <td><a href="<c:out value="${addURL}"/>">
                         <fmt:message key="add_to_cart"/></a></td>
                    </tr>
                </x:forEach>
            </table>
            <BR><fmt:message key="num_of_items"/>
                <c:out value="${cart.size}"/><BR>
            <a href="show_cart.jsp"><fmt:message key="show_cart"/></a>
        </center>
    </body>
</html>

12. W środowisku NetBeans zostanie wyświetlona informacja o wykrytym problemie. Użyte znaczniki nie mogą zostać rozpoznane. Jest to spowodowane tym, że biblioteka JSTL nie jest domyślnie włączona do projektu.

Image:AWWW-1st3_6-l08_tresc-1_0_07.png

13. W nawigatorze projektu kliknij prawym przyciskiem na węzeł Libraries i wybierz Add Library. W okienku wyboru biblioteki wybierz JSTL 1.1 i kliknij przycisk Add Library.

Image:AWWW-1st3_6-l08_tresc-1_0_08.png


14. Następnym krokiem ćwiczenia jest dodanie odpowiednich wpisów dla różnych wersji językowych. W nawigatorze projektu dodaj pakiet student.properties (patrz opis dodania pakietu w punkcie 5). Kliknij prawym przyciskiem myszy na węźle utworzonego pakietu i wybierz New->Properties File. Wpisz nazwę pliku, np. language i kliknij przycisk Finish.

15. Rozwiń węzeł language.properties, kliknij na nim prawym przyciskiem myszy i wybierz Add Locale.

Image:AWWW-1st3_6-l08_tresc-1_0_10.png

16. W polu kodu języka wpisz pl i kliknij przycisk OK.

Image:AWWW-1st3_6-l08_tresc-1_0_11.png

17. Postępując tak samo, jak w kroku 16, dodaj lokację z kodem języka en. Ostatecznie w nawigatorze projektu powinna być następująca struktura.

Image:AWWW-1st3_6-l08_tresc-1_0_12.png


18. Kliknij prawym przyciskiem myszy na węźle dla lokacji pl. Wybierz Add Property. W pole key wpisz nazwę klucza, przez który następuje odwołanie z dokumentu JSP do wartości (pole value) w odpowiednim pliku językowym, np. dla klucza „title" polska wartość to „Sklep". Kliknij przycisk OK.

Image:AWWW-1st3_6-l08_tresc-1_0_13.png

19. Postępując zgodnie z punktem 17 wprowadź do lokacji pl-polski następujące pary klucz-wartość.

title=Sklep
name=Nazwa
price=Cena
add_to_cart=Dodaj do koszyka
remove_from_cart=Usuń wszyskie
show_cart=Pokaż koszyk
added_to_cart=Dodano do koszyka.
num_of_items=Liczba różnych produktów w koszyku:
error=Błąd
cart=Zawartość koszyka
quantity=Ilość
go_back=Wróć
total_price=Wartość koszyka:
removed_from_cart=Usunięto z koszyka

20. Dla lokacji en-angielski i lokacji domyślnej wprowadź następujący tekst (możesz bezpośrednio skopiować i wkleić tekst do pliku z lokacją).

title=Shop
name=Name
price=Price
add_to_cart=Add to cart
remove_from_cart=Remove all
show_cart=Show cart
added_to_cart=Added to cart.
num_of_items=Number of different products in cart:
error=Error
removed_from_cart=Removed form cart.
cart=Cart
quantity=Quantity
go_back=Go back
total_price=Total price:
removed_from_cart=Removed from cart.


21. Następnym krokiem jest zapewnienie możliwości dodawania i usuwania produktów z koszyka. Jednym z rozwiązań jest skonstruowanie odpowiedniej strony JSP (można także utworzyć np. servlet). Utwórz nową stronę klikając prawym przyciskiem myszy na węzeł Web Pages i wybierając New->JSP. Jako nazwę podaj change_cart. Kliknij przycisk Finish.

Image:AWWW-1st3_6-l08_tresc-1_0_14.png

22. Do sterowania przepływem pracy (wybór między dodawaniem i usuwaniem produktów) można wykorzystać znaczniki JSTL. Przejdź do edycji utworzonej strony i zastąp automatycznie wygenerowany kod poniższym.

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
     <META HTTP-EQUIV="Refresh"  CONTENT="2; URL=index.jsp">
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
     <center><font color="red"><h3>
     <jsp:useBean id="cart" class="student.beans.shoppingCart"
                  scope="session"/>
     <fmt:setBundle basename="student.properties.language" />
     <c:if test="${!empty param.action and !empty param.id_part}">
         <c:choose>
             <c:when test="${param.action ==’add’}">
                 <fmt:message key="added_to_cart"/>
                 <jsp:setProperty name="cart" property="newItem"
                                  value="${param.id_part}"/>
             </c:when>
             <c:when test="${param.action == ’remove’}">
                 <jsp:setProperty name="cart" property="removeItem"
                                  value="${param.id_part}"/>
                 <fmt:message key="removed_from_cart"/>
             </c:when>
             <c:otherwise>
                 <fmt:message key="error"/>
             </c:otherwise>
         </c:choose>
     </c:if>
     </h3></font></center>
 </body>
</html>

23. Ostatnim krokiem w budowie sklepu jest dodanie możliwości przeglądania produktów umieszczonych w koszyku klienta. Dodaj stronę JSP (patrz punkt 20) o nazwie show_cart.

24. Strona służąca do przeglądania zawartości koszyka jest podobna do głównej strony, gdzie klient dokonuje wyboru produktów. Informacje na temat produktów pochodzą z komponentu JavaBean, gdzie przechowywane są identyfikatory i ilości zamówionych produktów. Na podstawie identyfikatorów produktów odczytywane (przeszukiwanie XML z użyciem XPath) i wyświetlane są pozostałe dane dotyczące produktów. Analogicznie do poprzednich stron JSP, również tutaj skryptlety zostały wyeliminowane przez użycie znaczników JSTL. Wprowadź poniższy kod do pliku strony show_cart.

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt"%>
<%@page import="java.util.Iterator"%>
<%@page import="java.util.Hashtable"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <jsp:useBean id="cart" class="student.beans.shoppingCart"
                 scope="session"/>
    <fmt:setBundle basename="student.properties.language" />
    <center><BR>
      <fmt:message key="cart"/><BR><BR>
      <c:import var="xmlfile" url="items_data.xml"/>
      <x:parse doc="${xmlfile}" var="result"/>
      <c:set var="total_price" value="0"/>
      <table border=1>
         <tr><td><fmt:message key="name"/></td>
             <td><fmt:message key="price"/></td>
             <td><fmt:message key="quantity"/></td><td> </td></tr>
         <c:forEach var=’item’ items=’${cart.items}’>
            <c:set var="key" value="${item.key}"/>
            <x:forEach select="$result//part[@ID=$key]" var="currentPart">
              <tr>
              <x:set var="price" select="string($currentPart/price)"/>
              <c:set var="total_price" value="${total_price + price *
                     item.value}"/>
              <td><x:out select="$currentPart/name"/></td>
              <td><fmt:formatNumber><c:out
                   value="${price}"/></fmt:formatNumber></td>
              <c:set var="id_part">
                  <x:out select="$currentPart/@ID" />
              </c:set>
              <c:url value="/change_cart.jsp" var="addURL">
                 <c:param name="action" value="remove"/>
                 <c:param name="id_part" value="${id_part}"/>
              </c:url>
              <td><c:out value="${item.value}"/></td>
              <td><a href="<c:out value="${addURL}"/>">
                  <fmt:message key="remove_from_cart"/></a></td>
              </tr>
            </x:forEach>
         </c:forEach>
      </table>
      <BR>
      <fmt:message key="total_price"/>
      <c:out value="${total_price}"/><BR><BR>
      <a href="index.jsp"><fmt:message key="go_back"/></a>
    </center>
  </body>
</html>

25. Przejdź do edycji głównego pliku (index.jsp) i uruchom aplikację za pomocą klawiszy SHIFT+F6. Przetestuj działanie sklepu.

26. Sprawdź działanie sklepu dla innej lokacji. Możesz to zrobić używając np. przeglądarki Internet Explorer. Uruchom przeglądarkę. Z głównego menu wybierz Narzędzia->Opcje internetowe, na zakładce Ogólne kliknij przycisk Języki. Otworzy się panel, w którym można dodawać/usuwać preferowane języki oraz zmieniać ich priorytet. Umieść na pierwszym miejscu język angielski[en]. Uruchom stronę sklepu w przeglądarce Internet Explorer. Sprawdź, w jaki sposób wyświetlane są liczby na stronie z zawartością koszyka na stronie dla lokacji pl i dla lokacji en.