menu
Transkrypt
menu
Tworzenie dostępnych interfejsów
użytkownika na platformie J2EE z
wykorzystaniem frameworka JSF
Grzegorz Terlikowski
Plan prezentacji
Wstęp
Przegląd frameworków J2EE, które wspierają dostępność
Tworzenie dostępnych elementów UI w JSF:
Menu,
Tabele,
Formularze,
Nawigacja.
Wady kontrolek JSF
Rola CSS w dostępności
Wstęp – czym jest J2EE?
Java 2 Enterprise Edition (J2EE) – platforma
programistyczna języka Java bazująca na specyfikacjach.
Właściciel (Oracle a dawniej firma Sun Microsystems)
dostarcza wzorcowych implementacji specyfikacji.
Firmy trzecie mogą dostarczać własnych wersji dla tych
specyfikacji.
Ponadto, powstały rozwiązania, rozszerzające
funkcjonalności oferowane przez specyfikacje J2EE.
Od konkretnego zastosowania systemu informatycznego
oraz doświadczenia zespołu programistów zależy, które
z rozwiązania będą wykorzystywane w danym projekcie.
Wstęp – podejścia do wytwarzania GUI
• bazujące na
znacznikach –
implementacja
interfejsów w plikach
szablonów z
wykorzystaniem
bibliotek znaczników.
• Przykłady: JSF, Spring
MVC, Velocity.
• bazujące na
komponentach Java –
implementacja
interfejsów całkowicie
w Java.
• Przykłady: GWT,
Vaadin.
Wstęp – potrzebna wiedza
Realizacja dostępnych interfejsów wymaga
wiedzy na temat:
zasad działania oraz ograniczeń konkretnego
frameworka wybranego do realizacji warstwy
prezentacji,
zagadnień związanych z dostępnością.
Każdemu frameworkowi należy przyjrzeć się z
osobna w kwestii wspierania przez niego
dostępności.
Przegląd frameworków wspierających
dostępność
Artykuł z 6 stycznia, 2015
http://zeroturnaround.com/rebellabs/top-4-java-webframeworks-revealed-real-life-usage-data-of-springmvc-vaadin-gwt-and-jsf/
Przegląd frameworków wspierających
dostępność – Spring MVC
Spring MVC http://docs.spring.io/autorepo/docs/spring/3.2.x/springframework-reference/html/mvc.html
Jest podwarstwą Spring Framework.
Dostarcza bibliotekę JSP, która zawiera kilkanaście
znaczników, ułatwiających generowanie formularzy.
Wsparcie dla dostępności tych znaczników polega na tym,
że wszystkie atrybuty podane przez użytkownika, które
nie są atrybutami znaczników JSP, są przepisywane do
wynikowego kodu HTML.
Przegląd frameworków wspierających
dostępność - JSF
Framework objęty specyfikacją J2EE,
Posiada kilka implementacji,
Obowiązująca wzorcowa implementacja JSF, czyli wersja
2.2 (Mojarra), której finalny szkic został opublikowany 15
marca 2013, wspiera HTML5, a więc i atrybuty ARIA – Jest
to bardzo ważna cecha tego frameworka.
Przegląd frameworków wspierających
dostępność - GWT
GWT - http://www.gwtproject.org/doc/latest/DevGuideA11y.html
Tworzenie dostępnych widgetów przy użyciu biblioteki
ARIA, propozycja (to nie standard) podejścia do tworzenia
aplikacji bazujących na AJAX.
Dodawanie do widgetów ról, właściwości i stanów ARIA,
Wsparcie dla klawiatury,
Dostępne etykiety,
Automatyczne odczytywanie podświetlonej zawartości,
Ogólne porady dla projektantów widgetów.
Przegląd frameworków wspierających
dostępność - Vaadin
Vaadin - https://vaadin.com/accessibility
Framework próbuje się dostosować w jak największym
stopniu do zaleceń WAI-ARIA.
Posiada szerokie wsparcie standardu WAI-ARIA poprzez
wspieranie standardowych atrybutów ARIA,
Wprowadza styl v-assistive-device-only, do tworzenia
niewidzialnych komponentów, które są postrzegane
tylko przez czytniki ekranu.
Vaadin nie używa tabel dla razkładów.
Przegląd frameworków wspierających
dostępność - Primefaces
Primefaces - http://www.primefaces.org/
Jest rozszerzeniem JSF.
Posiada ponad 100 gotowych do użycia komponentów UI,
Dostępność ma dwa aspekty:
1.
2.
wsparcie obsługi klawiatury (nawigacja po komponentach za
pomocą TAB i strzałek).
wsparcie dla czytnika ekranu.
Komponenty bywają bardzo złożone i posiadają atrybuty
ARIA,
Przegląd frameworków wspierających
dostępność - ADF
ADF (Application Development Framework)http://docs.oracle.com/cd/E16162_01/web.1112/e1618
1/af_access.htm#ADFUI436
Jest rozszerzeniem JSF od firmy Oracle,
Zapewnia wsparcie dla skrótów klawiaturowych,
Dostarcza 3 typy dostępności:
1.
2.
3.
czytnik ekranu,
tryb wysokiego kontrastu,
tryb dużych czcionek.
tryby ustawia się w pliku konfiguracyjnym trinidadconfig.xml lub poprzez dostarczenie odpowiedniej
strony dla użytkownika.
Zasadność budowania UI w JSF
Jest frameworkiem objętym specyfikacją J2EE (przez co jest
powszechnie znany i używany).
Istnieje wiele frameworków, które go rozszerzają – m.in.
Primefaces, IceFaces, RichFaces – w razie potrzeby można je
wykorzystywać na tych samych stronach.
Najnowsza wzorcowa implementacja JSF wspiera HTML5, w
tym atrybuty ARIA.
xmlns:jsf="http://xmlns.jcp.org/jsf" – biblioteka umożliwiająca
traktowanie kontrolek HTML5 jak komponentów JSF (po stronie serwera)
<input type="text" jsf:id="name" jsf:value="#{bean.name}"/>
xmlns:pt="http://xmlns.jcp.org/jsf/passthrough " –
biblioteka umożliwiająca dodanie atrybutów HTML5 do kontrolek JSF.
<h:inputText id="email" value="#{bean.email}"
pt:type="email"/>
Dostępne GUI w JSF
W dalszej części prezentacji zostanie przedstawiony
sposób tworzenia następujących elementów GUI:
Dostępny pasek narzędziowy (menu głównego poziomu),
Dostępne menu rozwijane (podmenu),
Dostępne tabele,
Dostępne formularze,
Dostępna nawigacja.
Elementy te zostaną wygenerowane (o ile to możliwe) z
wykorzystaniem znaczników JSF.
Dostępne GUI w JSF – menu - budowa
W wynikowym kodzie HTML złożone ze znaczników takich
jak: <div>, <ul>, <li>.
Wykorzystanie atrybutów ze specyfikacji W3C dla ARIA
(Accessible Rich Internet Applications).
Atrybuty ARIA określają rolę, stan i właściwości tych
znaczników.
Dostępne GUI w JSF – menu – ARIA
• Dynamiczne menu, powinno wykorzystywać
następujące atrybuty:
role="menubar" dla głównego węzła menu.
role="menu" dla elementu menu, który jest menu
rozwijanym.
role="menuitem" dla każdego elementu menu,
którego kliknięcie powoduje wykonanie akcji (przejścia
do podstrony).
Dostępne GUI w JSF – menu – ARIA c.d.
aria-haspopup="true" dla każdego elementu,
który powoduje wyświetlenie rozwijanego menu.
Przeważnie stosowany na wszystkich głównych
elementach menu i na każdym elemencie, który posiada
podmenu.
aria-hidden="true" dla każdego kontenera menu
rozwijanego. Funkcja JavaScript, która powoduje
wyświetlenie menu, powinna ustawiać ariahidden="false".
tabindex="0" dla pierwszego elementu menu, a dla
pozostałych tabindex="-1".
Dostępne GUI w JSF – menu główne zachowania
Dostępne menu pierwszego poziomu (główne) powinno
wspierać obsługę za pomocą klawiatury:
strzałka w prawo – przejście do następnego elementu głównego
menu.
strzałka w lewo – przejście do poprzedniego elementu głównego
menu.
strzałka w górę (lub w dół) – w przypadku, gdy dany element
głównego menu posiada rozwijane podmenu, powinno nastąpić
rozwinięcie podmenu i zaznaczenie pierwszego elementu.
Enter lub Spacja – otwarcie lub zamknięcie rozwijanego menu.
Tab – opuszczenie menu i przejście do następnego elementu strony.
Dostępne GUI w JSF – menu główne –
implementacja (1/3)
JSF nie posiada znacznika odpowiadającego
za generowanie menu,
Rozszerzenie w postacie frameworka
Primefaces dostarcza różne menu, jednak
na chwilę obecną czytniki ekranu nie
potrafią ich poprawnie zinterpretować,
mimo, że menu wydają się poprawnie
skonstruowane.
Jednym z rozwiązań jest wykorzystanie biblioteki JavaScript
menubar.js,
http://staff.washington.edu/tft/tests/menus/html5/, która
wzorcowo implementuje obsługę menu z poziomu klawiatury.
Dostępne GUI w JSF – menu główne –
implementacja (2/3)
menubar.js jest wyspecjalizowana do obsługi menu
rozwijanych i nie posiada odpowiednich zachowań
związanych z wyborem elementu menu głównego poziomu.
Rozwiązanie problemu składa się z 2 kroków:
1. Należy dla elementów menu głównego poziomu dostarczyć informacji o
stronach, do których powinno nastąpić przeniesienie po ich wybraniu.
<a href="menu_test.xhtml" style="visibility: hidden;"/>
Dostępne GUI w JSF – menu –
implementacja (3/3)
2. Drugim krokiem jest dostarczenie zachowania dzięki,
któremu po wyborze przez użytkownika elementu menu
głównego poziomu nastąpi przeniesienie do treści
wskazanej przez ukryte łącze.
Dostępne GUI w JSF – menu rozwijane zachowania
• W zakresie obsługi menu rozwijanego (kiedy kursor
znajduje się na elemencie podmenu), klawiatura powinna
dostarczać następujących zachowań:
strzałka w lewo (prawo) – przejście do następnego(poprzedniego)
rozwijanego menu i zaznaczenie pierwszego elementu.
strzałka w górę (dół) – przejście do poprzedniego (następnego)
elementu podmenu.
Enter lub Spacja – wybranie elementu podmenu.
Escape – zamknięcie menu rozwijanego i powrót kursora do menu
głównego.
Tab – przejście do następnego elementu strony.
Dostępne GUI w JSF – menu rozwijaneimplementacja
Dostępne megamenu (Adobe)
http://adobeaccessibility.github.io/Accessible-Mega-Menu/
Dostępne GUI w JSF – Java Beans
Dostępne GUI w JSF – Zarządzalne Beans
Zapis ${usersData.users} na stronie JSP/JSF spowoduje wywołanie metody
getUsers(), zarządzalnego komponentu dostępnego w kontekście sesji pod
nazwą usersData.
Dostępne GUI w JSF – tabele (1/5)
Aby tabela była dostępna dla osób niewidomych należy
doprowadzić, aby poszczególne znaczniki HTML
wynikowego kodu miały następujące atrybuty i ich
wartości:
<table> – role="presentation", mówiący o roli
prezentacyjnej tabeli,
<tr> - role="row",
<th> - role="columnheader" oraz scope="col",
<td> - role="gridcell".
Ponadto, aby tabela była dostępna dla osób
słabowidzących, nagłówek oraz parzyste i nieparzyste
wiersze powinny być różnych kolorów.
Dostępne GUI w JSF – tabele (2/5)
<dataTable> – znacznik JSF, służący do generowania
tabel na bazie zadanej kolekcji danych.
Niektóre atrybuty znacznika <dataTable>:
value – wiąże znacznik z kolekcją danych,
var – określa nazwę pojedynczego elementu kolekcji (podanej w
value), pod którą będzie on dostępny wewnątrz znacznika,
id, role, border – odpowiedniki atrybutów znaczników HTML
o tej samej nazwie,
headerClass – umożliwia ustawienie wskazanej klasy CSS na
poziomie wiersza nagłówka wynikowej tabeli HTML.
rowClasses – umożliwia ustawienie wskazanych klas CSS na
poziomie wiersza danych nieparzystego (pierwsza zadana klasa) i
parzystego (druga zadana klasa).
Dostępne GUI w JSF – tabele (3/5)
• <column> – znacznik wewnętrzny opisujący pojedynczą
kolumnę tabeli.
• <facet> – umożliwia wskazanie szczególnej zawartość dla
kolumny tj. nagłówka(header) i/lub stopki(footer).
Wskazanie typu zawartości odbywa się za pomocą
atrybutu name.
Dostępne GUI w JSF – tabele (4/5)
Niestety, znaczniki JSF nie umożliwiają ustawienia
atrybutu role na poziomie <tr>, <th> i <td>.
Dostępne GUI w JSF – tabele (5/5)
W wynikowym kodzie został
wygenerowany atrybut scope na
poziomie znacznika <th>, ale
brakuje role.
Większość czytników ekranu,
sobie z tym radzi.
Można to jednak naprawić za
pomocą kodu JavaScript (np.,
jQuery)
Dostępne GUI w JSF – formularze
Dobrze zaprojektowane powinny dać
się wypełnić i przesłać przy użyciu
samej klawiatury.
Framework JSF dostarcza ponad 100
znaczników – niektóre z nich służą do
generowania formularza i jego pól.
Znacznik <h:form> służy do
generowania znacznika HTML o tej
samej nazwie.
Formularze – Grupowanie pól formularzy
Formularze – grupowanie pól (1/2)
Znacznik HTML <fieldset> jest
łatwym sposobem strukturyzacji
formularza.
Jego celem jest dostarczenie
mechanizmu grupowania
powiązanych ze sobą pól formularza.
Czytniki ekranu, zawsze czytają
zawartość znacznika <legend>
znajdującego się w takiej strukturze
w momencie ustawienia kursora w
polu grupy.
Formularze – grupowanie pól (2/2).
Czytnik przeczyta: „Dane podstawowe, grupa”
Formularze – znaczniki JSF(1/3)
Framework JSF posiada zbiór znaczników, które
ułatwiają generowanie poszczególnych elementów
formularzy.
Każdy ze znaczników posiada własną listę atrybutów,
które pozwalają wpłynąć na wynikowy kod HTML.
Formularze – znaczniki JSF(2/3)
1. <h:inputText> – generuje pole tekstowe – znacznik <input> z
ustawionym atrybutem type="text".
2. <h:inputSecret> – generuje pole hasła – znacznik <input> z
ustawionym atrybutem type="password".
3. <h:inputHidden> – generuje pole ukryte – znacznik <input> z
ustawionym atrybutem type="hidden".
4. <h:inputTextarea> – generuje wielowierszowe pole tekstowe –
znacznik <textarea>.
5. <h:outputText> – generuje etykietę – znacznik <label>.
6. <h:commandButton> – generuje przycisk formularza,
umożliwiający jego wysłanie na serwer – znacznik <submit>.
Formularze – znaczniki JSF(3/3)
6. <h:selectBooleanCheckbox> – generuje pojedyncze pole wyboru
– znacznik <input> z ustawionym atrybutem type="checkbox".
7. <h:selectManyCheckbox> – generuje grupę pól wyboru –
znaczników <input> z ustawionym atrybutem type="checkbox".
8. <h:selectOneRadio> – generuje grupę pól wyboru typu radio –
znaczników <input> z ustawionym atrybutem type="radio".
9. <h:selectOneListbox> – generuje listę (listbox) jednokrotnego
wyboru – znacznik <select>.
10. <h:selectManyListbox> – generuje listę (listbox) wielokrotnego
wyboru – znacznik <select>.
11. <h:selectOneMenu> – generuje rozwijaną listę (combobox)
jednokrotnego wyboru – znacznik <select>.
Formularze – etykiety
Znacznik HTML o nazwie <label> umożliwia
dodawanie etykiet do innych elementów
HTML.
Dzięki zastosowaniu etykiet w formularzu
będzie on bardziej zrozumiały dla użytkownika.
Za pomocą atrybutu for znacznika <label>
można powiązać etykietę z polem formularza o
zadanym id.
38/35 Czytnik przeczyta: „Imię, gwiazdka, pole edycji”
Formularze – zestawy opcji (1/3)
Niestety znaczniki JSF służące do
generowania zestawów opcji nie
nadają się do generowania
dostępnego UI.
Znaczniki m.in. takie jak:
<h:selectOneRadio> i
<h:selectManyCheckbox>,
generują zestawy opcji osadzone w
tabeli.
Formularze – zestawy opcji (2/3)
Czytniki ekranu w zależności od przeglądarki odczytują tę tabelę
(mimo braku atrybutu role), przez co mogą irytować niewidomych
użytkowników.
Czytnik przeczyta:
"Tabela, kino wiersz, komórka kino, pole wyboru nieoznaczone"
Formularze – zestawy opcji (3/3)
Zestawy opcji należy wykonać w HTML.
Grupy opcji warto otoczyć znacznikiem <fieldset> –
przy wejściu do pierwszego elementu opcji, czytnik
ekranu przeczyta etykietę umieszczoną w znaczniku
<legend>.
Czytnik przeczyta:
„Twoje zainteresowania, grupa, Kino, pole wyboru, nieoznaczone"
Formularze – wymagalność danych
Gwiazdka - niezrozumiała dla początkujących internautów.
Atrybuty required i aria-required – umożliwiają wskazanie, które z
pól są obligatoryjne,
Czytnik ekranu przeczyta użytkownikowi, że dane pole jest
wymagane.
Nowoczesne przeglądarki wyświetlą odpowiedni komunikat np.
“this field is required”.
Dobrą praktyką jest używanie ich obu, gdyż nie wiadomo, który z
nich będzie zrozumiały dla danego czytnika ekranu.
Czytnik przeczyta: „Imię, gwiazdka, pole edycji, wymagane”
Formularze – opisy pól
W niektórych przypadkach, zrozumienie zastosowania pola
formularza wymaga większej ilości informacji, niż daje to etykieta.
Aby dodać taki (przyjazny dla czytników ekranu) opis stosujemy na
polu formularza atrybut aria-describedby, którego wartość
wskazuje na identyfikator elementu HTML (najczęściej ukrytego) z
dodatkowym opisem.
Czytnik przeczyta:
„O sobie, pole edycji, Tutaj możesz napisać kilka zdań o sobie"
Nawigacja
Dobrze zaprojektowany interfejs użytkownika powinien wspierać
nawigację za pomocą klawiatury.
Niewidomi użytkownicy, nie mają innej alternatywy, aby sprawnie
nawigować po treści prezentowanej na stronach WWW.
Wsparcie dla nawigacji klawiaturowej także jest ważne z punktu
widzenia osób z problemami ruchowymi, które z oczywistych
względów nie mogą używać wskaźnika myszki.
Dla użytkowników niewidomych ważną rzeczą jest dostępność za
pomocą klawiatury takich elementów jak: paski narzędziowe,
menu, łącza, czy przyciski.
Nawigacja za pomocą klawiatury (m.in. za pomocą klawisza TAB),
powinna odbywać się w przewidywalnym porządku.
Nawigacja - nagłówki
Osoba niewidoma ma możliwość szybkiego
przemieszczania się po kolejnych nagłówkach strony
poprzez wybranie litery H lub skrótu Ctrl+H na
klawiaturze.
Skróty te obsługiwane są przez silniki przeglądarek.
Dlatego też nagłówki powinny być unikalne i
zrozumiałe, tak aby użytkownik rozumiał z czym ma do
czynienia.
Nawigacja – stany elementów
Wszystkie elementy aktywne, takie jak:
łącza, elementy menu, pola formularza
powinny mieć wyraźny wizualny fokus (np. w postaci
ramki widocznej w trakcie nawigacji po stronie
klawiszem TAB).
Zaleca się wzmocnienie domyślnego fokusa, tak, aby był
dobrze widoczny także dla osób niedowidzących.
Realizowane jest to poprzez zastosowanie
odpowiednich arkuszy CSS.
Nawigacja – odnośniki
Wszystkie odnośniki powinny być unikalne i
zrozumiałe, także poza kontekstem.
Nie należy używać linków w postaci: „>>” czy
„więcej” albo „kliknij tutaj”.
Odnośniki (zwłaszcza te prowadzące do zewnętrznych
stron) nie mogą otwierać się w nowym oknie lub
zakładce przeglądarki bez ostrzeżenia.
Nawigacja – odnośniki z potwierdzeniem
Implementacja mechanizmu potwierdzenia wybrania łącza:
1.
2.
Dodanie do takich łączy klasy o pewnej nazwie np. confirmableAnchor.
Dodanie jednoznacznego opisu łącza poprzez ustawienie w nim atrybutu
title.
3.
Podmiana zachowania związanego z wybraniem takiego łącza, np.
wykorzystanie funkcji confirm języka Java Script.
Wady kontrolek JSF
Mogą generować nadmiarowości,
Nie wspierają niektórych atrybutów,
Do rozkładów wykorzystują tabele – wszystkie znaczniki
generujące listy,
Rozszerzenia JSF, np. Primefaces dostarczają poprawnie
zaimplementowanych (pod względem dostępności)
komponentów – niestety nie są one poprawnie
interpretowane przez dzisiejsze czytniki ekranu.
Rola CSS w dostępności
Alternatywne szablony dla słabowidzących,
Można uwzględniać różne wady wzroku
Kontrasty,
Rozkłady komponentów,
Wielkości i kroje czcionek,
Odstępy między wierszami oraz literami,
Stany elementów,
Aktywne menu,
Pola formularza – stany pól.
Dziękuję za uwagę
Pytania?