prepared by: pawel@kasprowski.pl Programowanie WWW Model-View-Controller



Podobne dokumenty
prepared by: Programowanie WWW Servlety

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

Wzorce prezentacji internetowych

Aplikacje Internetowe

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

Architektury Usług Internetowych. Laboratorium 1. Servlety

Wieloplatformowe aplikacje sieciowe. dr inż. Juliusz Mikoda mgr inż. Anna Wawszczak

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

Programowanie w Internecie. Podstawy użycia JSP. Paweł Kasprowski. vl06z

ASP.NET MVC. Podstawy. Zaawansowane programowanie internetowe Instrukcja nr 3

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

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

Java Database Connectivity

Projektowanie aplikacji w modelu MVC opartej o framework CodeIgniter

1 Wprowadzenie do J2EE

Wzorce dystrybucji i wspólbieżności autonomicznej

Java rozszerzenie. dr. A. Dawid

Przegląd technologii JSP

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

MVC w praktyce tworzymy system artykułów. cz. 2

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

Aplikacje Internetowe

Laboratorium 7 Blog: dodawanie i edycja wpisów

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

Piotr Laskowski Krzysztof Stefański. Java Servlets

Aplikacje Internetowe, Servlety, JSP i JDBC


Baza danych do przechowywania użytkowników

Aplikacje WWW - laboratorium

Java wybrane technologie spotkanie nr 3. Serwlety

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

Serwery aplikacji. dr Radosław Matusik. radmat

Programowanie w języku Java

Wzorce projektowe warstwy aplikacji

Serwery aplikacji. mgr Radosław Matusik. Wydział Matematyki i Informatyki Uniwersytetu Łódzkiego radmat radmat@math.uni.lodz.

Podstawowe wykorzystanie Hibernate

akademia androida Składowanie danych część VI

Aplikacje internetowe i rozproszone - laboratorium

prepared by: Java Server Pages Sesje, cookies, znaczniki

Java Server Faces - wprowadzenie

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

JavaServer Pages. Konrad Kurdej Karol Strzelecki

Podejście obiektowe do relacyjnych baz danych Hibernate.

MVC w praktyce tworzymy system artykułów. cz. 1

Zajęcia 13 wykorzystanie MySQL w PHP cz. 2

Aplikacje WWW - laboratorium

Projektowanie aplikacji J2EE w architekturze Model-View-Controller

Aplikacje WWW - laboratorium

Architektura Model-View-Controller

Aplikacje Internetowe. przygotował:

Aplikacje Internetowe. Zakres przedmiotu. Plan ramowy. Tworzenie aplikacji internetowych w języku Java w środowisku Eclipse

Programowanie w języku Java. Bazy danych SQLite w Javie

A Zasady współpracy. Ocena rozwiązań punktów punktów punktów punktów punktów

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

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

Bazy danych dla producenta mebli tapicerowanych. Bartosz Janiak Marcin Sikora Wrocław r.

Wzorce logiki dziedziny

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

Aplikacje WWW - laboratorium

Programowanie wielowarstwowe i komponentowe JSP, JSF

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

JAVA I BAZY DANYCH. MATERIAŁY:

Tworzenie aplikacji internetowych w języku Java

Aplikacje bazodanowe. dr inż. Arkadiusz Mirakowski

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

Przetwarzanie dokumentów XML i zaawansowane techniki WWW Wykład 09

Bazy Danych - Instrukcja do Ćwiczenia laboratoryjnego nr 8

mgr inż. Michał Paluch

CGI i serwlety. Plan wykładu. Wykład prowadzi Mikołaj Morzy. Przykład: serwlety vs. szablony. Implementacja logiki prezentacji

Programowanie obiektowe

Warstwa integracji. wg. D.Alur, J.Crupi, D. Malks, Core J2EE. Wzorce projektowe.

Java Zadanie 1. Aby poprawnie uruchomić aplikację desktopową, należy zaimplementować główną metodę zapewniającą punkt wejścia do programu.

Instytut Sterowania i Systemów Informatycznych Uniwersytet Zielonogórski. Zaawansowane Systemy Decyzyjne. Laboratorium

Zaawansowane aplikacje internetowe

Java Enterprise Edition spotkanie nr 3. Serwlety c.d.

Blaski i cienie wyzwalaczy w relacyjnych bazach danych. Mgr inż. Andrzej Ptasznik

Wykład 5. SQL praca z tabelami 2

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

Programowanie obiektowe

Java Server Faces narzędzie do implementacji w wy prezentacji

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

Systemy operacyjne na platformach mobilnych

Bazy Danych i Usługi Sieciowe

Aplikacje w środowisku Java

Dokumentacja techniczna API systemu SimPay.pl

Stripes & Stripernate. Zbigniew Skowron 13 kwietnia 2007

Aplikacje Internetowe

Ćwiczenie 1. Kolejki IBM Message Queue (MQ)

Aplikacje WWW - laboratorium

Zaawansowane aplikacje internetowe laboratorium

Podstawowe informacje o technologii Java Persistence API - przykład

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Aplikacje Internetowe. Najprostsza aplikacja. Komponenty Javy. Podstawy języka Java

Dostęp do baz danych z serwisu www - PHP. Wydział Fizyki i Informatyki Stosowanej Joanna Paszkowska, 4 rok FK

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

Aplikacje RMI

Transkrypt:

Programowanie WWW Model-View-Controller

Przypomnienie problemu Aplikacja do liczenia kredytów Klasa Kredyt Formatka do wprowadzania danych (czysty HTML) Skrypt liczący ratę (JSP wykorzystujące klasę Kredyt)

Klasa Kredyt public class Kredyt { double procent; double kwota; double lat; public double getprocent() { return procent; }... public void setprocent(double procent) { this.procent = procent; }

Klasa Kredyt cd public double getkwota() { return kwota;} public void setkwota(double kwota) { this.kwota = kwota; } public double getlat() { return lat; } public void setlat(double lat) { this.lat = lat; } public double getrata() { double rata = kwota * (procent/12)/ (1-(1/Math.pow(1.0+procent/12,lat*12))); return rata; } //nie ma setrata()!!! }

Formatka <form action="result.jsp"> kwota: <input type="text" name="kwota"><br/> ile lat: <input type="text" name="lat"><br/> procent: <input type="text" name="procent"><br/> <input type="submit"/> </form>

Skryplet z setterami <% pl.edu.swsim.kredyt kredyt = new pl.edu.swsim.kredyt(); kredyt.setkwota(double.parsedouble( request.getparameter("kwota"))); kredyt.setlat(double.parsedouble( request.getparameter("lat"))); kredyt.setprocent(double.parsedouble( request.getparameter("procent"))); out.write("<p>rata wynosi: "+kredyt.getrata()+"</p>"); %>

JSP z tagami <jsp:usebean id="credit" class="pl.edu.swsim.kredyt"> <jsp:setproperty name="credit" property="kwota" param="kwota"/> <jsp:setproperty name="credit" property="procent" param="procent"/> <jsp:setproperty name="credit" property="lat" param="lat"/> </jsp:usebean> Rata: <jsp:getproperty name="credit" property="rata"/>

JSP z tagami <jsp:usebean id="credit" class="pl.edu.swsim.kredyt"> <jsp:setproperty name="credit" property="kwota" param="kwota"/> <jsp:setproperty name="credit" property="procent" param="procent"/> <jsp:setproperty name="credit" property="lat" param="lat"/> </jsp:usebean> Rata: ${credit.rata}

Użycie tagów Unikamy kodu w Javie na stronie JSP Problem: niektóre rzeczy łatwiej napisać w Javie Zalety czystej Javy (względem tagów na stronie JSP) Łatwiejszy dostęp do zasobów Bieżąca kontrola poprawności kodu Łatwiejsze debugowanie Możliwość testowania poza serwerem WWW Prosta obsługa błędów Plan na dziś: Tworzenie servletów Połączenie servletu i strony JSP

Tworzenie servletu Servlet to klasa dziedzicząca po HttpServlet Dwie podstawowe metody: doget(httpservletrequest req, HttpServletResponse resp) dopost(httpservletrequest req, HttpServletResponse resp) Wypisanie tekstu HTML: PrintWriter out = response.getwriter(); out.println("hello");

Podpięcie servletu w projekcie Plik WEB-INF/web.xml <?xml version="1.0" encoding="utf-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <servlet> <servlet-name>hello</servlet-name> <servlet-class>pl.swsim.myservlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app>

Stworzenie servletu Tworzymy bezpośrednio kod servletu zamiast strony JSP public class MyController extends HttpServlet { public void doget(httpservletrequest request, HttpServletResponse response) throws IOException, ServletException { response.getwriter().println("hello from GET"); } public void dopost(httpservletrequest request, HttpServletResponse response) throws IOException, ServletException { response.getwriter().println("hello from POST"); }

Tworzenie łańcucha servletów Servlet może pobrać z kontekstu obiekt RequestDispatcher: getservletcontext().getrequestdispatcher("url") Dwie metody: forward(request, response) include(request, response) Przekierowanie wywołania: getservletcontext().getrequestdispatcher("/form.jsp").forward(request, response); Przed przekierowaniem można umieścić dane w request: request.setattribute("klucz",dowolnadana);

Architektura MVC Controller otrzymuje żądania od klienta i przesyła je do modelu Model logika, dane, stan aplikacji View prezentacja danych stworzonych w modelu

MVC model Controller View Model

MVC i WWW Strony wysyłane "for request" Brak stałej komunikacji między Model i View View tworzy się głównie w HTML, resztę w innym języku (np. w Javie)

MVC Model 2 prepared by: pawel@kasprowski.pl

Podstawy MVC Klient wysyła żądanie z parametrami Servlet analizuje parametry i uruchamia komponent Komponent tworzy beany Wypełnione beany są wysyłane do strony JSP Strona JSP jest przetwarzana na HTML i wysyłana do klienta

Przykład MVC Kontroler - servlet Otrzymuje zgłoszenia od użytkowników Przygotowuje dane (za pomocą Modelu) Umieszcza dane w obiekcie request Przekazuje sterowanie do Widoku Model klasa Java Udostępnia metody do tworzenia i modyfikacji danych Jest niezależny od kontrolera i widoku (czyste przetwarzanie danych) Widok strona JSP Wydobywa dane z request Prezentuje je użytkownikowi w HTML

Przykład z kredytem Klasa MyServlet - otrzymuje wszystkie wywołania użytkownika W zależności od typu GET wywołuje formatkę index.jsp POST oblicza kredyt, umieszcza wynik w request i wywołuje result.jsp Klasa Kredyt bez zmian! Index.jsp bez zmian! Result.jsp nie trzeba już ładować beana

Metoda doget Tylko przekierowuje do formularza public void doget(httpservletrequest request, HttpServletResponse response) throws IOException, ServletException { getservletcontext().getrequestdispatcher("/web-inf/jsp/form.jsp").forward(req, resp); }

Metoda dopost Tworzy obiekt klasy Kredyt Zasila go argumentami Wrzuca go do request Przekierowuje do strony result.jsp

Metoda dopost protected void dopost(httpservletrequest req, HttpServletResponse resp) throws ServletException, IOException { Kredyt kredyt = new Kredyt(); kredyt.setkwota(double.parsedouble(req.getparameter("kwota"))); kredyt.setlat(double.parsedouble(req.getparameter("lat"))); kredyt.setprocent(double.parsedouble(req.getparameter("procent"))); req.setattribute("kredyt", kredyt); getservletcontext().getrequestdispatcher("/web-inf/jsp/result.jsp").forward(req, resp); }

Plik result.jsp <%@ page contenttype="text/html; charset=utf-8" %> Kwota: ${kredyt.kwota} <br/> Rata: ${kredyt.rata}

Zalety rozwiązania W plikach jsp tylko formatowanie i używanie gotowych danych Logika tylko w klasach Javy Możliwa lepsza obsługa błędów! Wyłapanie wyjątku NumberFormatException Wrzucenie zmiennej "error" do requesta Przekierowanie z powrotem do strony z formatką

Kod obsługi błędów Metoda dopost try{ kredyt.setkwota(double.parsedouble(req.getparameter("kwota"))); kredyt.setlat(double.parsedouble(req.getparameter("lat"))); kredyt.setprocent(double.parsedouble(req.getparameter("procent"))); }catch(numberformatexception ex) { } req.setattribute("error", "Podałeś nieprawidłowe dane - to nie liczby!"); getservletcontext().getrequestdispatcher("/web-inf/jsp/form.jsp").forward(req, resp); return;

Umieszczenie błędu na formatce <%@ page contenttype="text/html; charset=utf-8" %> <form method="post"> kwota: <input type="text" name="kwota"><br/> ile lat: <input type="text" name="lat"><br/> procent: <input type="text" name="procent"><br/> ${error} <input type="submit"/> </form>

Przykład z bazą danych Tabela samochodów (car) Możliwość obejrzenia samochodów i dodania nowego Docelowo możliwość wykonania wszelkich operacji na wierszach tabeli Tworzenie (CREATE) Oglądanie zawartości (RETRIEVE) Aktualizacja (UPDATE) Usuwanie (DELETE) W skrócie: CRUD

Data Access Objects (DAO) Główna idea: uniezależnić aplikację od źródła danych Interfejs DAO zapewnia wszystkie operacje na danych (tzw. CRUD Create Retrieve Update Delete) Składniki: interfejs DAO źródło danych (DataSource) obiekt transferowy (JavaBean)

Klasa transferowa public class Car { } private String make; private String model; private double price;...gettery i settery...

Stworzenie tabeli CREATE TABLE car ( ); idc int NOT NULL auto_increment, make varchar(50), model varchar(50), price double default NULL, PRIMARY KEY (`idc`)

Wstawienie danych INSERT INTO car VALUES(1,'Fiat','Brava', 20000); INSERT INTO car VALUES(2,'Fiat','Punto', 22000); INSERT INTO car VALUES(3,'Ford','Fiesta',15600); INSERT INTO car VALUES(4,'Ford','Focus',11000); INSERT INTO car VALUES(5,'Opel','Astra',44500);

CarDAO Metody: List<Car> getcars() void addcar(car car) Połączenie z bazą danych (DBCP) public Connection getconnection() { try{ Context initcontext = new InitialContext(); DataSource ds = (DataSource)initContext.lookup("java:/comp/env/jdbc/mydb"); return ds.getconnection(); }catch(exception ec) { ec.printstacktrace(); } return null; }

Konfiguracja połączenia (xml) <Context path="/web1" reloadable="true"> <Resource name="jdbc/mydb" auth="container" type="javax.sql.datasource" maxactive="100" maxidle="30" maxwait="10000" username="myuser" password="mypass" driverclassname="com.mysql.jdbc.driver" url="jdbc:mysql://localhost:3306/mydb? autoreconnect=true"/> </Context>

getcars() public List<Car> getcars() { List<Car> lista = new ArrayList<Car>(); Connection con = getconnection(); try{ ResultSet rs = con.createstatement().executequery("select * from car"); while(rs.next()) { } Car car = new Car(); car.setidc(rs.getint("idc")); car.setmake(rs.getstring("make")); car.setmodel(rs.getstring("model")); car.setprice(rs.getdouble("price")); lista.add(car); con.close(); }catch(sqlexception ec) {ec.printstacktrace();} return lista; }

insertcar() public void insertcar(car car) { try{ Connection con = getconnection(); PreparedStatement pstmt = con.preparestatement( "insert into car(make,model,price) values(?,?,?)"); pstmt.setstring(1, car.getmake()); pstmt.setstring(2, car.getmodel()); pstmt.setdouble(3, car.getprice()); pstmt.executeupdate(); con.close(); } catch(sqlexception ec) {ec.printstacktrace();} }

Controller public class MyController extends HttpServlet { public void doget(httpservletrequest request, HttpServletResponse response) throws IOException, ServletException { processrequest(request, response); } public void dopost(httpservletrequest request, HttpServletResponse response) throws IOException, ServletException { processrequest(request, response); } protected void processrequest( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {... }

processrequest String actionname = request.getparameter("action"); if(actionname.equals("carlist")) { List carlist = cardao.getcars(); request.setattribute("carlist", carlist); destinationpage = "/carlist.jsp"; } else { String error = "[" + actionname + "] is not a valid action."; } request.setattribute("error", error); destinationpage = "/error.jsp";

processrequest cd // przekierowanie do wybranej strony jsp RequestDispatcher dispatcher = getservletcontext(). getrequestdispatcher(destinationpage); dispatcher.forward(request, response);

Strona carlist.jsp <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <table> <tr> <th>make</th><th>model</th><th>year</th> </tr> <c:foreach items='${carlist}' var='car'> <tr> <td>${car.make}</td> <td>${car.model}</td> <td>${car.price}</td> </tr> </c:foreach> </table>

Strona error.jsp <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> ${error}

Control flow Wszystkie zgłoszenia idą do serwletu MyController z parametrem action=... MyController przygotowuje dane, wrzuca do obiektu request i przesyła je do strony jsp Strona jsp jest wypełniana danymi przesyłana do użytkownika jako html

Konfiguracja zgłoszeń *.go <web-app> <!-- servlet definition --> <servlet> <servlet-name>go</servlet-name> <servlet-class>car.servlet.mycontroller</servlet-class> </servlet> <!-- servlet mapping --> <servlet-mapping> <servlet-name>go</servlet-name> <url-pattern>*.go</url-pattern> </servlet-mapping> </web-app>

Czytanie requesturi requesturi zawiera pełną ścieżkę ze zgłoszenia String path = request.getrequesturi(); Przykładowo: /webcar/car/carlist.go Rozpakowanie: String path = request.getrequesturi(); actionname = path.substring(path.lastindexof("/")+1, path.lastindexof("."));

Kolejny krok: dodawanie Formatka dla nowego samochodu Akcja pokazująca formatkę (carinsert) Akcja zapisująca pola z formatki (carinsertsave)

Akcja dodaj samochód if(actionname.equals("carinsert")) { destinationpage = "/carinsert.jsp"; }

Formatka do edycji <form action="carinsertsave.go"> make: <input type="text" name="make"><br/> model: <input type="text" name="model"><br/> price: <input type="text" name="price"><br/> <input type="submit"/> </form>

Obsługa zgłoszenia if(actionname.equals("carinsertsave")) { Car car = new Car(); car.setmake(request.getparameter("make")); car.setmodel(request.getparameter("model")); car.setprice(double.parsedouble(request.getparameter("price")); cardao.insertcar(car); List carlist = cardao.getcars(); request.setattribute("carlist", carlist); destinationpage = "/carlist.jsp"; }

Obsługa zgłoszenia if(actionname.equals("carinsertsave")) { Car car = new Car(); car.setmake(request.getparameter("make")); car.setmodel(request.getparameter("model")); car.setprice(double.parsedouble(request.getparameter("price")); cardao.insertcar(car); List carlist = cardao.getcars(); request.setattribute("carlist", carlist); destinationpage = "/carlist.jsp"; }

Obsługa zgłoszenia if(actionname.equals("carinsertsave")) { Car car = new Car(); car.setmake(request.getparameter("make")); car.setmodel(request.getparameter("model")); car.setprice(double.parsedouble(request.getparameter("price")); cardao.insertcar(car); } destinationpage = "/carlist.go";

Obsługa zgłoszenia if(actionname.equals("carinsertsave")) { Car car = new Car(); car.setmake(request.getparameter("make")); car.setmodel(request.getparameter("model")); car.setprice(double.parsedouble(request.getparameter("price")); cardao.insertcar(car); } destinationpage = "/carlist.go";

Obsługa zgłoszenia if(actionname.equals("carinsertsave")) { Car car = new Car(); JspRuntimeLibrary.introspect(car, request); cardao.insertcar(car); } destinationpage = "/carlist.go";

Kolejne kroki Edycja samochodu Usunięcie samochodu Dodanie przycisków edycja i usuń w tabeli Akcje: carlist carinsert caredit?id=x jeśli id=0 dodaje nowy samochód cardelete?id=x

Usunięcie samochodu if(actionname.equals("cardelete")) { int idc = Integer.parseInt(request.getParameter("idc")); cardao.deletecar(idc); destinationpage = "/carlist.go"; }

Akcja edycji if(actionname.equals("caredit")) { String idcstr = request.getparameter("idc"); int idc = Integer.valueOf(idcStr); Car car = cardao.getcar(idc); request.setattribute("car",car); destinationpage = "/caredit.jsp"; }

Formatka edycji <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <form action="careditsave.go"> <input type="hidden" name="idc" value="${car.idc}"> make: <input type="text" name="make" value="${car.make}"><br/> model: <input type="text" name="model" value="${car.model}"><br/> price: <input type="text" name="price" value="${car.price}"><br/> <input type="submit"/> </form>

Zapis edycji if(actionname.equals("careditsave")) { Car car = new Car(); car.setidc(integer.parseint(request.getparameter("idc"))); car.setmake(request.getparameter("make")); car.setmodel(request.getparameter("model")); car.setprice(double.parsedouble(request.getparameter("price"))); cardao.updatecar(car); destinationpage = "/carlist.go"; }