Stripes & Stripernate. Zbigniew Skowron 13 kwietnia 2007



Podobne dokumenty
Programowanie w Sieci Internet JSP ciąg dalszy. Kraków, 9 stycznia 2015 r. mgr Piotr Rytko Wydział Matematyki i Informatyki

Serwery aplikacji. dr Radosław Matusik. radmat

Wykład dla studentów Informatyki Stosowanej UJ 2012/2013

Java Server Faces narzędzie do implementacji w wy prezentacji

prepared by: Programowanie WWW Model-View-Controller

Bezpieczeństwo frameworków WEBowych Java na przykładzie ataku CSRF

Serwery aplikacji. dr Radosław Matusik. radmat

Elementy JEE. 1. Wprowadzenie. 2. Prerekwizyty. 3. Pierwszy servlet. obsługa parametrów żądań 4. JavaServer Pages.

prepared by: Programowanie WWW Servlety

1 Wprowadzenie do J2EE

BEAN VALIDATION. Waldemar Korłub. Narzędzia i aplikacje Java EE KASK ETI Politechnika Gdańska

Wzorce prezentacji internetowych

Programowanie w Sieci Internet filtry oraz web.xml. Kraków, 11 stycznia 2013 r. mgr Piotr Rytko Wydział Matematyki i Informatyki


Aplikacja webowa w Javie szybkie programowanie biznesowych aplikacji Spring Boot + Vaadin

Aplikacje internetowe i rozproszone - laboratorium

Programowanie komponentowe. Przykład 1 Bezpieczeństwo wg The Java EE 5 Tutorial Autor: Zofia Kruczkiewicz

2) W wyświetlonym oknie należy zaznaczyć chęć utworzenia nowej aplikacji (wygląd okna może się różnić od powyższego); kliknąć OK

Architektury Usług Internetowych. Laboratorium 1. Servlety

Wprowadzenie do projektu QualitySpy

Architektury Usług Internetowych. Laboratorium 1 Servlety

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Zaawansowane aplikacje internetowe

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Java. Michał Wójcik.

Programowanie w Javie

Wprowadzenie do technologii JavaServer Faces 2.2 na podstawie Wykład 2 Technologie internetowe

JavaServer Faces (JSF)

Microsoft.NET: ASP.NET MVC + Entity Framework (Code First)

Zaawansowane aplikacje internetowe - laboratorium Web Services (część 1).

Zagadnienia Programowania Obiektowego Agata Hejmej

Zadanie polega na stworzeniu bazy danych w pamięci zapewniającej efektywny dostęp do danych baza osób.

Dokumentacja do API Javy.

b) Jako nazwę projektu wpisz SerwletyJSPJSTL. Nie zmieniaj wartości pozostałych opcji. Kliknij przycisk Next >.

Wykład 6 Dziedziczenie cd., pliki

Tworzenie stron internetowych z wykorzystaniem HTM5, JavaScript, CSS3 i jquery. Łukasz Bartczuk

Zaawansowane Aplikacje Internetowe

Programowanie komponentowe 5

Java wybrane technologie spotkanie nr 4. Serwlety c.d.

Aplikacje w środowisku Java

Laboratorium 1. Wzorce oprogramowania lab1, Zofia Kruczkiewicz

Serwlety Java: zagadnienia zaawansowane. Data Sources. Data Sources. Przykład pliku data-sources.xml

Aplikacje w środowisku Java

Zastosowanie słuchaczy zdarzeń wg

JAX-RS czyli REST w Javie. Adam Kędziora

Podstawowe wykorzystanie Hibernate

Zajęcia 4 - Wprowadzenie do Javascript

Laboratorium 7 Blog: dodawanie i edycja wpisów

Serwlety. Co to jest serwlet? Przykładowy kod serwletu. Po co są serwlety?

Przykład integracji kalkulatora mbank RATY na platformie IAI

Realizacja Aplikacji Internetowych 2013 laboratorium cz. 2 K.M. Ocetkiewicz

Programowanie wielowarstwowe i komponentowe

Klasy i obiekty cz II

1. CZYM JEST SERIALIZACJA

Piotr Laskowski Krzysztof Stefański. Java Servlets

Laboratorium 6 Tworzenie bloga w Zend Framework

Java Server Faces - wprowadzenie

Badania poziomu bezpieczeństwa portalu dostępowego do infrastruktury projektu PL-Grid

Java Enterprise Edition spotkanie nr 4. Java Server Pages c.d.

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Tomasz Dobek.

STRUTS 2. Krystyna Bury Katarzyna Sadowska Joanna Pyc Politechnika Wrocławska Wydział Informatyki i Zarządzania Informatyka, III rok

Programowanie wielowarstwowe i komponentowe JSP, JSF

Enterprise JavaBeans (EJB)

Test przykładowy 2 PAI WSB Wrocław /06/2018

Enterprise JavaBeans

PHP: bloki kodu, tablice, obiekty i formularze

Contexts and Dependency Injection (CDI) Autor wykładu: Marek Wojciechowski

Integracja frameworku Wicket z serwisem Platnosci.pl.

Programowanie obiektowe

Enterprise JavaBeans. 1. Architektura EJB: komponenty encyjne, komponenty sesyjne, komponenty sterowane komunikatami. 2. Kontenery EJB JBoss.

Aplikacje WWW - laboratorium

Programowanie obiektowe

Google Web Toolkit Michał Węgorek ZPO 2009

Podejście obiektowe do relacyjnych baz danych Hibernate.

Warszawa JUG. Struts 2 rusztowanie dla Łebu

Java EE: Serwlety i filtry serwletów

Programowanie obiektowe

Przykłady tworzenia aplikacji komponentowych w technologii JavaServer Faces 2.1 na podstawie


Wybrane działy Informatyki Stosowanej

Dokumentacja API BizIn

Komunikacja między serwletami

Budowa prostej aplikacji wielowarstwowej. Laboratorium 1 Programowanie komponentowe Zofia Kruczkiewicz

Programowanie obiektowe

Microsoft.NET: LINQ to SQL, ASP.NET AJAX

Throwable. Wyjatek_1(int x_) { x = x_; } int podaj_x()

Kurs WWW 1. Paweł Rajba

Aplikacje WWW - laboratorium

Tworzenie aplikacji J2EE w technologii Struts

PWSG Ćwiczenia 12. Wszystkie ukończone zadania należy wysłać na adres: lub

Fragmenty są wspierane od Androida 1.6

Przegląd technologii JSP

Programowanie obiektowe

xmlns:prism= c. <ContentControl prism:regionmanager.regionname="mainregion" />

Zastosowanie komponentów EJB typu Session

Wykład 8: Obsługa Wyjątków

Transkrypt:

Stripes & Stripernate Zbigniew Skowron

Stripes & Stripernate Stripes: Framework do budowania aplikacji webowych. Założenia: prostota i minimum konfiguracji. Zbudowany na technologiach Javy 5.0: Serlvet 2.4 i JSP 2.0. Stripernate: Biblioteka integrująca Stripes'y z Hibernate'm. 2

Własności Konfiguracja poprzez anotacje. Automatycznie konfigurowane ActionBean'y. Automatyczna walidacja i konwersja typów. Indeksowane właściwości. Łatwa lokalizacja. Obsługa pobierania plików. Rozszerzalność. "JavaDoc, TagDoc and reference documentation that doesn't suck." 3

Część I: Wprowadzenie 4

Użycie Stripes: Należy umieścić poniższe w classpath: /WEB-INF/classes StripesResources.properties /WEB-INF/lib stripes.jar commons-logging.jar (1.1) cos.jar (com.oreilly.servlets) Stripernate: stripernate.jar jar'y Hibernate'a... 5

web.xml <filter> <display-name>stripes Filter</display-name> <filter-name>stripesfilter</filter-name> <filter-class>net.sourceforge.stripes.controller.stripesfilter</...> </filter> <filter-mapping> <filter-name>stripesfilter</filter-name> <url-pattern>*.jsp</url-pattern> <dispatcher>request</dispatcher> </filter-mapping> <filter-mapping> <filter-name>stripesfilter</filter-name> <servlet-name>stripesdispatcher</servlet-name> <dispatcher>request</dispatcher> </filter-mapping> Stripes Filter Stripes Dispatcher Servlet <servlet> <servlet-name>stripesdispatcher</servlet-name> <servlet-class>net.sourceforge.stripes.controller.dispatcherservlet</...> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>stripesdispatcher</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping> 6

Stripes Filter & Dispatcher 7

Przykład: Calculator.jsp <%@ page contenttype="text/html;charset=utf-8" language="java" %> <%@ taglib prefix="stripes" uri="http://stripes.sourceforge.net/stripes.tld"%> <html> <head> <title>my First Stripe</title> </head> <body> <h1>stripes Calculator</h1> Stripes Taglib Action Bean <stripes:form action="/calc/calculator.action" focus=""> <stripes:errors/> Number 1: <stripes:text name="numberone"/> <br/> Number 2: <stripes:text name="numbertwo"/> <br/> Pola Action Bean'a Metody Action Bean'a <stripes:submit name="addition" value="add"/> <stripes:submit name="division" value="divide"/> Result: ${actionbean.result </stripes:form> </body> </html> Zwykły EL 8

Zwykły interfejs ActionBean public class CalculatorActionBean implements ActionBean { private ActionBeanContext context; public ActionBeanContext getcontext() { return context; public void setcontext(actionbeancontext context) { this.context = context; Kontekst Właściwości private double numberone; private double numbertwo; private double result; //... gettery i settery pominięte... Obsługa zdarzenia addition public Resolution addition() { result = getnumberone() + getnumbertwo(); return new ForwardResolution("/calc/index.jsp"); Obsługa domyślna @DefaultHandler public Resolution foo() { return new RedirectResolution("/calc/foo.jsp"); Polecenie do wykonania 9

ActionBeanContext Kontekst zawiera informacje o bieżącym żądaniu: ServletContext getservletcontext() HttpServletRequest getrequest() HttpServletResponse getresponse() String List<Message> ValidationErrors Resolution Dostęp do Servlet API Nazwa przetwarzanego zdarzenia geteventname() getmessages() getvalidationerrors() getsourcepageresolution() Pozwala wrócić do wywołującej strony 10

Znajdowanie ActionBean'a Stripes sam znajduje klasy implementujące interfejs ActionBean i przypisuje je do URL-i. Jeśli znajdzie bean'a: pl.mimuw.www.math.calc.calculatoractionbean Obcina wszystko do pakietu web, www, action lub stripes włącznie. Usuwa słowa Action i Bean z końca nazwy klasy. Zamienia. na / i dodaje.action Przypisuje bean'a do powstałego URL-a: /math/calc/calculator.action Ręcznie: anotacja dla klasy @UrlBinding( /qs/calc ) Użycie: <stripes:form action="/math/calc/calculator.action" focus="">... </stripes/form> 11

Obsługa zdarzeń Obsługuje zdarzenie addition Event handler każda metoda publiczna zwracająca Resolution. public Resolution addition() { return new ForwardResolution("/calc/index.jsp"); Obsługuje zdarzenie subtraction @HandlesEvent("subtraction") public Resolution foo() { return new RedirectResolution("/calc/index.jsp"); new ForwardResolution("/calc/index.jsp"); new RedirectResolution("/calc/index.jsp"); serializuje obiekt do JavaScript'a new JavaScriptResolution(fooObject); new StreamingResolution("text/xml", new StringReader("<ala/>")); wysyła dowolne dane 12

StreamingResolution & AJAX function invoke(form, event, container) { Zdarzenie var params = event + '&' + Form.serialize(form); new Ajax.Updater(container, form.action, {method:'post', postbody:params); Zdarzenie <stripes:button value="div" name="divide" onclick="invoke(this.form, this.name, 'result');"/> <div id="result"></div> public Resolution divide() { String result = String.valueOf(numberOne / numbertwo); return new StreamingResolution("text", result); Wysłanie zwykłego napisu 13

JavaScriptResolution & AJAX JavaScriptResolution: serializuje obiekty Javy do JavaScript'a, radzi sobie z cyklami i duplikatami, obsługuje także kolekcje (Collection, Map i Array). return new JavaScriptResolution(fooObject); Serializacja function update(xmlresponse) { var output = eval(xmlresponse.responsetext); $('result').innerhtml = output; Deserializacja function invoke(form, event) { var params = event + '&' + Form.serialize(form); new Ajax.Request(form.action, {method:'post', postbody:params, onsuccess: update); 14

Resolution robione ręcznie Resolution to zwykły interfejs, mający tylko jedną metodę: public Resolution getlotsofdata() { return new Resolution() { Klasa anonimowa public void execute(httpservletrequest request, HttpServletResponse response) throws Exception { response.setcontenttype("text/html"); Jak zwykły servlet response.getoutputstream().print("<html>"); response.getoutputstream().print("ala ma kota."); response.getoutputstream().print("</html>"); 15

Walidacja Walidacja jest sterowana przy pomocy anotacji: @Validate(required=true) private double numberone; @Validate(maxvalue=25.5) private double numbertwo; Możliwości: Stripes sam już dodaje sprawdzenie, czy wpisane wartości dają się zkonwertować na typ double required=true/false, on={events, minlength, maxlength, minvalue, maxvalue, mask=".*@regex.pl", expression="this < elvar" wyrażenie EL (dostępne sa pola bean'a, request i session scope) 16

Wyświetlanie komunikatów Podobnie jak w JSF: <stripes:form action="/calc/calc.action">... <stripes:errors/> <stripes:messages/> Podobnie jak stripes:errors <stripes:errors globalerrorsonly="true"/> <stripes:text name="username"/> <stripes:errors field="username"/> Można też umieścić poza formularzem... </stipes:form> <stripes:errors action="/calc/calc.action"/> <style type="text/css"> input.error { background-color: red; </style> Każde pole z błędami walidacji dostaje dodatkowo css-ową klasę "error" 17

Walidacja pól obiektów Większe możliwości jak w JSF: @ValidateNestedProperties @ValidateNestedProperties({ @Validate(field="username", required=true, minlength=3), @Validate(field="email", mask="[\\w\\.]+@[\\w\\.]+\\.\\w+"), wielokrotne zagnieżdzenie @Validate(field="employer.id", required=true), @Validate(field="pets.name", required=true, maxlength=50) ) walidacja wszystkich elementów kolekcji private List<Person> people = new ArrayList<Person>(); 18

Walidacja wybiórcza <stripes:submit name="division" value="divide"/> public Resolution division() { result = numberone / numbertwo; return new ForwardResolution("/calc/index.jsp"); Można też bez parametru @ValidationMethod(on="division") public void avoiddividebyzero(validationerrors errors) { if(this.numbertwo == 0) errors.add("numbertwo", new SimpleError("Dividing by zero is not allowed.")); Pomiń walidację dla tego zdarzenia @DontValidate public Resolution redirect() { return new RedirectResolution("/calc/index.jsp"); 19

Ręczna obsługa błędów walidacji Zwykły interfejs public class CalculatorActionBean implements ActionBean, ValidationErrorHandler { Resolution handlevalidationerrors(validationerrors errors) { int count = errors.size(); errors.clear(); Można anulować wszystkie błędy errors.addglobalerror( new SimpleError("There were " + count + " errors.")); return new RedirectResolution("/calc/errors.jsp"); Można przekierować do dowlolnej strony 20

Konwersje Stripes automatycznie używa konwerterów. @Validate(converter=MoneyTypeConverter.class) private Money balance; Zmiana konwertera <s:link xhref="/update.action"> <s:param name="man" value="${man.id" /> ${man.name </s:link> Dla własnych typów można zarejestrować konwerter w fabryce konwerterów... public class ManConverter implements TypeConverter<Man> { public void setlocale(locale locale) { public Man convert(string formval, Class targetclass, Collection<ValidationError> errors) { return DAO.findById( Long.parseLong( formval ) );...ale wystarczy też konstruktor przyjmujący Stringa 21

Lokalizacja komunikatów StripesResources.properties zawiera m. in. Można użyć komunikaty dla błędów: innych źródeł converter.number.invalidnumber=the value ({1) entered in field {0 must be a valid number converter.byte.outofrange=the value ({1) entered in field {0 was out of the range {2 to {3 converter.enum.notanenumeratedvalue=the value "{1" is not a valid value for field {0 converter.date.invaliddate=the value ({1) entered in field {0 must be a valid date converter.email.invalidemail=the value ({1) entered is not a valid email address Można je lokalizować zgodnie z konwencjami Javy. 22

Lokalizacja komunikatów new ScopedLocalizableError( "converter.integer", "outofrange",...); Pole formularza Kolejność wyszukiwania: Akcja Błąd /cats/kittendetail.action.age.outofrange /cats/kittendetail.action.age.errormessage age.outofrange age.errormessage /cats/kittendetail.action.outofrange /cats/kittendetail.action.errormessage converter.integer.outofrange Zasięg 23

Kolekcje obiektów Większe możliwości jak w JSF. Bezproblemowa integracja z JSTL. private Map<Date, List<Appointment> > appointments; Stripes stworzy nowe słowniki i listy w miarę potrzeby <stripes:text name="appointments[${date][${idx].note"/> Wielokrotne zagnieżdżenie Stripes sam stworzy obiekty, których pola ustawiamy private List<Person> people; <c:foreach items="${actionbean.people" var="man" varstatus="loop"> ${man.name <stripes:hidden name="people[${loop.index].id"/> </c:foreach> 24

Część II: Szczegóły 25

Cykl życia: znajdowanie ActionBean'a 1. Dopasuj klasę ActionBean'a do URL'a. 2. Jeśli klasa ma anotację @SessionScope to: zwróć instancję zapisaną w HttpSession.getAttribute(UrlBinding), jeśli jej nie ma, to utwórz nową. 3. Wpw (domyślnie): utwórz nową instancję ActionBean'a. 4. Stwórz kontekst bean'a i wywołaj setcontext(). 5. Zapisz ActionBean'a w odpowiednio request lub session pod kluczem UrlBinding. 6. Zapisz ActionBean'a w request pod kluczem 'actionbean'. 26

Cykl życia ActionBean'a 27

Cykl życia: przypisania i walidacja @Validate(required=true) 1.Sprawdzenie czy wartości wymagane są ustawione. 2.Walidacja przed konwersją: minlength, maxlength, mask... 3.Konwersja na docelowy typ. 4.Przypisanie polom ActionBean'a nowych wartości. 5.Walidacja po konwersji: minvalue, maxvalue, expression... 6.Jeśli były błędy to przerwij. 7.Uruchom walidację użytkowika. 8.Jeśli były błędy to przerwij. Błędy są zgromadzone w ActionBeanContext.getVa lidationerrors() 28

Może być też @After Interceptory @Before(LifecycleStage.BindingAndValidation) public void rehydrate() { this.domainobject = gethibernatesession().load(domainobject.class, context.getrequest().getparameter("id")); @Intercepts({LifecycleStage.ActionBeanResolution, Etapy życia LifecycleStage.HandlerResolution, LifecycleStage.BindingAndValidation, LifecycleStage.CustomValidation, LifecycleStage.EventHandling, LifecycleStage.ResolutionExecution) public class NoisyInterceptor implements Interceptor { public Resolution intercept(executioncontext ctx) throws Exception { System.out.println("Before " + ctx.getlifecyclestage()); Resolution resolution = ctx.proceed(); System.out.println("After " + ctx.getlifecyclestage()); return resolution; Można przerwać Parametry dla StripesFilter cykl życia zwracając resolution!= null <init-param> <param-name>interceptor.classes</param-name> <param-value> com.myco.noisyinterceptor, net.sourceforge.stripes.controller.beforeaftermethodinterceptor </param-value> </init-param> 29

Instancjacja Action Bean'a Konwersascje Jest Action Bean......więc jest i wynik Action Bean nie został utworzony Action Bean przechowany we Flash Scope 30

Flash Scope Flash Scope istnieje w ciągu bieżącego i następnego żądania. Pozwala się uniezależnić od różnicy pomiędzy ForwardResolution() i RedirectResolution(). Nie psuje się przy używaniu wielu okien przeglądarki. Zaimplementowany jako tymczasowy obiekt w Session Scope. RedirectResolution("/some/page.jsp").flash(this); FlashScope.getCurrent(getContext().getRequest(), true).put(this); 31

Lista zdarzeń startowych Wizard @Wizard(startEvents="begin") public class RegisterActionBean extends BugzookyActionBean { public Resolution begin() { return new RedirectResolution("/bugzooky/Register.jsp"); public Resolution gotostep2() throws Exception { return new ForwardResolution("/bugzooky/Register2.jsp"); Przetwarzanie formularza podzielone na dwa zdarzenia public Resolution register() { new PersonManager().saveOrUpdate(this.user); getcontext().setuser(this.user); getcontext().getmessages().add( new LocalizableError("/bugzooky/Register.action.successMessage", this.user.getfirstname(), this.user.getusername())); return new RedirectResolution("/bugzooky/BugList.jsp"); Alternatywnie: <wizard-fields/> Wpisuje do strony jako 'hidden' wszystkie pola z żądania, które nie mają odpowiadającego pola formularza 32

Użyteczne znaczniki Utworzenie ActionBean a dla strony <stripes:useactionbean binding="/db/blob.action"/> <stripes:hidden name="numberone"> <link href="/my/actions/cannon" event="fire"> <param name="yaw" value="north-east-north"/> <param name="pitch" value="45 deg"/> </link> Link do zdarzenia <stripes:select name="bugs[${loop.index].component.id"> <stripes:option value="">select One</stripes:option> <stripes:options-collection collection="${componentmanager.allcomponents" label="name" value="id"/> </stripes:select> Wybór elementu kolekcji Wybór wartości wyliczeniowej <stripes:select name="bugs[${loop.index].priority"> <stripes:option value="">select One</stripes:option> <stripes:options-enumeration enum="net.sourceforge.stripes.examples.bugzooky.biz.priority"/> </stripes:select> 33

Przesyłanie plików Znacznik <stripes:file name="newattachment"/> private FileBean newattachment; Pole ActionBean'a Można albo tak: FileBean.save(File file); Albo tak: Nie można łączyć tych sposobów FileBean.getInputStream(); FileBean.delete(); 34

Stripernate Stripernate = Stripes + Hibernate Dostępne dla każdego żądania HTTP HibernateProvider.getInstance().getSession(); HibernateProvider.getInstance().commit(); Dla bezpieczeństwa trzeba wykonywać ręcznie. HibernateFilter - wyszukuje obiekty zaanotowane jako @Entity i udostępnia sesję Hibernate'a. HibernateInterceptor - inicjalizuje sesję Hibernate'a. HibernatePropertyBinder - łapie wyjątki walidacji Hibernate'a i wycofuje transakcje. HibernateTypeConverter - konwersja id -> obiekt. HibernateFormatter - konwersja obiekt -> id. 35

Łączenie formularzy z bazą Jeśli request będzie miał parametr user=5, to Stripernate wyciągnie z bazy User'a o id=5 i przypisze na pole user. @Entity class User { @Id Stripernate znajdzie tą klasę automatycznie int id; class ActionBean { User user; Wystarczy jej użyć jako pole ActionBean'a 36

Koniec Źródła: http://stripes.mc4j.org/ http://www.mongus.com/topics/web%20development/stripernate/ 37