Web- og serverprogrammering



Relaterede dokumenter
Videregående programmering i Java

Jacob Nordfalk. Ingeniørhøjskolen i København. Nykøbing F itvisioncenter 24. februar 2004

Java-opgraderingskursus

JSP, Tomcat. Tutorial lavet af Jákup W. Hansen TSU semester 10.october 2007

Videregående programmering i Java

Kom i gang med SAS STPbaserede

med Java og Linux Jacob Nordfalk Linuxforum 2004 Lørdag 6. marts Center for Videreuddannelse Ingeniørhøjskolen i København

Hvordan vælger jeg dokumentprofilen?

Videregående programmering i Java

Videregående programmering i Java

Webserverprogrammering

Spring Schema Extension eller Spring Domain Specific Languages

Servlets, Tomcat & BlueJ

Software 1 with Java. Recitation No. 7 (Servlets, Inheritance)

Virkefeltsregler i Java

I profil-feltet kan imastra-kunder vælge om upload skal ske ligesom filerne var indsendt til mailboksen eller

Objektorienterede metoder

Java web applikationer med Tomcat

Anvendelse af Model- View koncept i SAS Stored Processer

PHP Snippets. De små korte. Skrevet af Daniel Pedersen

Terese B. Thomsen 1.semester Formidling, projektarbejde og webdesign ITU DMD d. 02/

IBM Network Station Manager. esuite 1.5 / NSM Integration. IBM Network Computer Division. tdc - 02/08/99 lotusnsm.prz Page 1

Tredjepart webservices

Black Jack --- Review. Spring 2012

Serialization i Java

Privat-, statslig- eller regional institution m.v. Andet Added Bekaempelsesudfoerende: string No Label: Bekæmpelsesudførende

Software Construction 1 semester (SWC) Spørgsmål 1

Arkitektur for begyndere

PHP 3 UGERS FORLØB PHP, MYSQL & SQL

Web- og serverprogrammering

Digitaliseringsstyrelsen

Web- og serverprogrammering

Digitaliseringsstyrelsen

Portal Registration. Check Junk Mail for activation . 1 Click the hyperlink to take you back to the portal to confirm your registration

Indhold. Senest opdateret:03. september Side 1 af 8

Eksempel: et ordresystem note 5 Lagdeling s. 1

Indhold. Senest opdateret : 30. juli Side 1 af 5

MSE PRESENTATION 2. Presented by Srunokshi.Kaniyur.Prema. Neelakantan Major Professor Dr. Torben Amtoft

Kursus i OOP og Java. Kursus i Objektorienteret programmering i Java

Computer Networks Specielt om Infrastrukturer og Teknologi

Introduction til.net remoting i C#

Sådan kan du sende data fra din egen hjemmeside til JitBesked via en HTML-JDF.

De skjulte input typer:

SWC eksamens-spørgsmål. Oversigt

Design by Contract Bertrand Meyer Design and Programming by Contract. Oversigt. Prædikater

Det er muligt at chekce følgende opg. i CodeJudge: og

klient Webside Forespørgsel/ Nye data Python program Database kommando svar Database

University of Southern Denmark Syddansk Universitet. DM503 Forelæsning 11

ODIN-webservice ændringer release 2010 v2.0

dintprog Manual Revision: 1241 August 24, 2010 I Introduktion 3 1 Notation 3 II Begreber 4 2 Grundbegreber om programmering 4

Videregående Programmering Obligatorisk opgave - 3. semester, efterår 2004

public Set(int size) { this.listelement = new LinkedList<Integer>(); }

IBM WebSphere Operational Decision Management

Forelæsning Uge 3 Mandag

2. Husk at give execute-tilladelser. I Filezilla højreklikker I på den overførte file, så vælger I fileattributes og sætter kryds i execute.

Dag 10 Flertrådet programmering

Databaseadgang fra Java

Forelæsning Uge 4 Torsdag

LoGen Generation and Simulation of Digital Logic on the Gate-Level via Internet

Afsending af s vha. ASP

Outline. Servlets. JSPs. Basic Taglibs. SOEN 387 Web-based Enterprise Application Design. Stuart Thiel. Servlets. JSPs. Expression Language (EL)

klient Webside Forespørgsel/ Nye data Python program Database kommando svar Database

Tagwall med Php & MySQL

RMI introduktion. Denne artikel beskriver Java RMI (Remtote Method Invocation).

Forelæsning Uge 3 Mandag

Løsning af skyline-problemet

Log ind med PHP. Denne guide er oprindeligt udgivet på Eksperten.dk. Skrevet den 09. May 2011 af dab93 I kategorien Programmering / Andre

Begrynder til at lave log ind system

FairSSL Fair priser fair support

Dokumentation. Udbyder : sms1919.dk Service : sms-grupper Static FBML Facebook. : Facebook Integration med sms-grupper.

Ratingsystem i PHP og MySQL

9.8 Kildekode. side 88. Pakke Klasse Sidenummer. fortsætter..

Google App Engine. Google App Engine som platform. Claus Myglegaard Vagner og Jacob von Eyben

Klasser og objekter. (Afsnit i manualen)

CHAPTER 8: USING OBJECTS

Geografisk lokalisering i JSP

Schedulering af SAS job i MS Task Scheduler, som sender med log og statuskode ved fejl

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 2

IT Arkitekt Søren Peter Nielsen

CodeDOM - Dynamisk generering og kompilering af kode

Integrationsmanual. Anvendelse af webservice til kursusoversigt i Campus. Brugervejledning til udviklere

Specifikation Abstrakt OO OS-API Rev Specifikation. Abstrakt, objektorienteret operativsystem-api

Øvelse 9. Klasser, objekter og sql-tabeller insert code here

Introduction til.net remoting i VB.NET

ECE 551: Digital System * Design & Synthesis Lecture Set 5

Plotning og MicroStation V8i. Frank Møller Christensen

Microsoft Log Parser, Windows logfil analyse

Aftenskole i programmering sæson Registrering af tid. Sæson 2 - Lektion 5

ASP.NET MVC Framework - en del af ASP.NET 3.5 Extensions

Forelæsning Uge 3 Mandag

Forelæsning Uge 3 Mandag

NT PDC Udarbejdet af Kenneth Dalbjerg

Affaldsdatasystem Vejledning supplement i system-til-system integration for.net brugere

Bemærk, der er tale om ældre versioner af softwaren, men fremgangsmåden er uændret.

Software Construction 1. semester (SWC) januar 2014 Spørgsmål 1

DANMARKS TEKNISKE UNIVERSITET

User Manual for LTC IGNOU

Tilladelse til vævscenter til håndtering af humane væv og celler Authorisation of tissue establishment for the handling of human tissues and cells

AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007

Arkitektur principper og design mønstre til realisering af enterprise applikationer baseret på rige domænemodeller (og.net)

Transkript:

Web- og serverprogrammering Arkitekturer i webprogrammer - dag 6 Model-View-Controller-arkitukturen Flerlags-arkitekturer Læsning: WJSP 10 Dette materiale er under Åben Dokumentlicens, se http://www.sslug.dk/linuxbog/licens.html

Model-View-Controller 1.Modellen (data og de bagvedliggende beregninger - forretningslogik) Domæne-modellen universel anvendelse (oftest lavet som servletter rent Java) En bankkonto har navn på ejer, kontonummer, kort-id, saldo, bevægelser, etc. Saldo kan ikke ændres direkte, men påvirkes med handlingerne (metoderne) overførsel, udbetaling og indbetaling. 2.Præsentationen af data over for brugeren Producerer HTML-kode (oftest lavet som JSP-sider) Bankkonti præsenteres meget forskelligt. I en pengeautomat vises ingen personlige oplysninger overhovedet. I et netbank-system kan saldo og bevægelser ses (det kunne være en webløsning i HTML). 3.Kontrollør Omsætter bruger-input til handlinger: ændringer på modellen beslutning om næste præsentation I en pengeautomat kan man kun hæve penge. I et netbank-system kan brugeren måske lave visse former for overførsel fra sin egen konto. Ved skranken kan medarbejderen derudover foretage ind- og udbetalinger.

Kontrollør Styrer applikationens opførsel Omsætter brugerinput til handlinger på model: Fortolker formulardata fra klienten ændrer omdirigerer til Model Indkapsler programmets tilstand/data Giver adgang til at spørge på data Giver adgang til at foretage handlinger Præsentation Fremviser modellen: Genererer HTML til klienten aflæser

Informationsstrøm Præsentation (fremvisning af data) Model (data og for retningslogik) Kontrollør (ændring af model) Bruger

MVC-eksempel

kontrol.jsp (kontrollør) log_ind.jsp vaelg_konto.jsp vis_konto.jsp... (præsentation) Login.java Brugervalg.java (javabønner model) Bankmodel.java Kontomodel.java (model)

<%@include file="logintjek.jsp" %> <jsp:usebean id="valg" scope="session" class="bank.brugervalg" /> <html> <head><title>vaelg_konto</title></head> <body> <h1>vælg hvilken konto du vil bruge</h1> <form method="post" action="kontrol.jsp"> <% for (java.util.iterator i=valg.konti.iterator(); i.hasnext(); ) { bank.kontomodel k = (bank.kontomodel) i.next(); %> <input type="radio" name="kontovalg" value="<%= k.getid() %>"> Konto <%= k.getid() %> med <%= k.getsaldo() %> kr.<br> <% } %> <input type="submit" value="vælg konto"> </form> <p><a href="kontrol.jsp?adgangskode=x">log ud</a> </body> </html>

<%@page import="java.util.*" %> <%@include file="logintjek.jsp" %> <jsp:usebean id="valg" scope="session" class="bank.brugervalg" /> <html> <head><title>vis_konto</title></head> <body> <h1>konto <%= valg.konto.getid() %> med ejer <%= valg.konto.getejer() %></h1> Saldo: <%= valg.konto.getsaldo() %><p> Bevægelser:<br> <% Iterator i= valg.konto.getbevægelser().iterator(); while (i.hasnext()) { %> <%= i.next() %><br> <% } %> <hr> Hvad vil du gøre:<p> <form method="post" action="kontrol.jsp"> <input type="hidden" name="handling" value="haev"> Hæv <input type="text" name="beloeb"> kr. fra kontoen. <input type="submit" value="hæv"> </form> <p> <form method="post" action="kontrol.jsp"> <input type="hidden" name="handling" value="saet_ind"> Sæt <input type="text" name="beloeb"> kr. ind på kontoen. <input type="submit" value="sæt ind"> </form> <p> <form method="post" action="kontrol.jsp"> <input type="hidden" name="handling" value="overfoer"> Overfør <input type="text" name="beloeb"> kr. fra denne konto til konto nummer <input type="text" name="tilkontoid">. <input type="submit" value="overfør"> </form>

import="java.util.*, bank.*" %> <% Nedenstående objekt har globalt virkefelt (svarer til en singleton) %> <jsp:usebean id="bank" class="bank.bankmodel" scope="application" /> <% Nedenstående objekter har sessionen (brugeren) som virkefelt %> <jsp:usebean id="login" class="javabog.login" scope = "session"/> <jsp:usebean id="valg" class="bank.brugervalg" scope="session"> <% Når denne bønne oprettes skal setbankmodel(bank) kaldes %> <jsp:setproperty name="valg" property="bankmodel" value="<%= bank %>" /> </jsp:usebean> <% Denne side er den eneste, der sætter egenskaber (ændrer på modellen) %> <jsp:setproperty name="login" property="*" /> <jsp:setproperty name="valg" property="*" /> <% String brugernavn = login.getbrugernavn(); if (!login.isloggetind()) { // er bruger logget korrekt ind? application.log("bruger "+brugernavn+" skal logge ind."); valg.konto = null; valg.konti = null; response.sendredirect("log_ind.jsp"); } else { // login er ok if (valg.konto == null) { // har han valgt en af sine konti? // nej find alle brugerens konti og læg dem i valg.konti if (valg.konti == null) { valg.konti = new ArrayList(); for (Iterator i=bank.konti.iterator(); i.hasnext();) { Kontomodel k = (Kontomodel) i.next(); if (k.getejer().equalsignorecase(brugernavn)) valg.konti.add(k); } } if (valg.konti.size() == 0) { application.log(brugernavn+" skal oprette konto."); response.sendredirect("ingen_konto.jsp"); } else if (valg.konti.size() == 1) { kontrol.jsp

fejl.jsp <%@ page contenttype="text/html; charset=iso 8859 1" iserrorpage="true" %> <jsp:usebean id="login" class="javabog.login" scope = "session"/> <html> <head><title>fejl</title></head> <body> Der skete en fejl: <%= exception.getlocalizedmessage() %>. <p> Gå tilbage og prøv igen. <% application.log( (Exception)exception, "Fejl for "+login.getbrugernavn()); %> <p><a href="kontrol.jsp?adgangskode=x">log ud</a> </body> </html>

Frontkontrol En Frontkontrol (eng.: Front Controller) modtager alle anmodninger og beslutter hvad der skal ske kontrol.jsp er en frontkontrol. (Den er det ikke helt, fordi man kan kan rette i URLen og på den måde få fat i de andre sider uden om kontrol.jsp.) redigere web.xml sådan, at alle forespørgsler dirigeres til én servlet eller JSPside, der agerer Frontkontrol. De rigtige sider kan ligge skjult for klienten i WEB-INF/-mappen Eksempel på web.xml <! Frontkontrol: Alt der starter med /bank sendes til kontrol.jsp > <servlet> <servlet name>frontkontrol</servlet name> <jsp file>/web INF/bank/kontrol.jsp</jsp file> </servlet> <servlet mapping> <servlet name>frontkontrol</servlet name> <url pattern>/bank/*</url pattern> <! Bemærk: * i URL mønster > </servlet mapping>

package bank; import java.util.*; public class Brugervalg { /** Egenskab 'bank' sættes fra JSP siden kontrol.jsp når bønnen oprettes */ Bankmodel bank; public void setbankmodel(bankmodel b) { bank = b; } /** Liste over denne brugers konti */ public ArrayList konti; /** Den konto, brugeren har valgt at arbejde med lige nu */ public Kontomodel konto; /** Egenskab 'kontovalg' sættes fra JSP side vaelg_konto.jsp*/ public void setkontovalg(int nr) { konto = null; for (Iterator i=konti.iterator(); i.hasnext(); ) { Kontomodel k = (Kontomodel) i.next(); if (k.getid() == nr) konto = k; } if (konto == null) throw new IllegalArgumentException("Konto ID "+nr+" er ukendt"); } /** Streng der beskriver en handling brugern ønsker at udføre */ public String handling; public void sethandling(string h) { handling = h; } /** Beløbet handlingen (hæv/sæt ind/overfør) drejer sig om */ double handlbeløb; public void setbeloeb(double b) { handlbeløb = b; } /** Hvis der skal foretages en overførel, hvilken konto er det til */ Kontomodel ovftil; /** Egenskab 'tilkontoid' sættes fra JSP siden vis_konto.jsp */ public void settilkontoid(int nr) { ovftil = null; for (Iterator i=bank.konti.iterator(); i.hasnext(); ) { Kontomodel k = (Kontomodel) i.next(); Brugervalg.java

package bank; import java.util.*; public class Kontomodel { private String ejer; private int id; private double saldo; private List bevægelser = new ArrayList(); public Kontomodel(String ejer1, int id1) { ejer = ejer1; id = id1; } public Kontomodel(String ejer1, int id1, double saldo1) { ejer = ejer1; id = id1; saldo = saldo1; } public String getejer() { return ejer; } public int getid() { return id; } public double getsaldo() { return saldo; } public List getbevægelser() { return bevægelser; } public String tostring() { return ejer + ": "+saldo+" kr"; } public void overfør(kontomodel til, double beløb) { if (beløb<0) throw new IllegalArgumentException( "Beløb kan ikke være negativt eller nul"); saldo = saldo beløb; til.saldo = til.saldo + beløb;// privat variabel kan ændres i samme klasse } String ændring = "Overført "+beløb+" fra "+ejer+" til "+til.ejer; bevægelser.add(ændring); til.bevægelser.add(ændring); public void hæv(double beløb) { if (beløb<0) throw new IllegalArgumentException( "Beløb kan ikke være negativt eller nul"); saldo = saldo beløb; bevægelser.add("hævet "+beløb); } public void indsæt(double beløb) { if (beløb<0) throw new IllegalArgumentException(

Lidt mere om MVC Kilde: Professional JSP, 2. udg., Wrox Press Ltd.

MVC og implementation-teknologier

MVC Model 1 - State components Current model values Methods to change the values (may include some business logic) Implementation: Java Beans applicable Protocol-independent (HTTP, RMI,...) 2 - Action components Define allowable changes to state (business logic) Implementation: best not to put in controller rather: create a layer of action beans View The presentation logic of an application Presents state from the Model Provides the UI for the specific protocol (here, HTTP/browser) Separation from Model allows different UI's Implementation: JSP (http) Interaction with model eased by using Java Beans

MVC Controller 'Glue' for the MVC-architecture Receiving events Determining and invoking the appropriate handler Invoking appropriate response (view) Implementation: servlets (general programming) Controller acts as dispatcher Handles these tasks: Security authentification, authorisation Event identification (e.g. using parameter in request) Preparing the model ensure availability of required components Processing events invoke appropriate event handler Handling errors forward control to an error page Triggering response forward control to response generator

Code refactoring Role separation

Page-centric (Client-server) architecture 1. Simple Page-view architecture - easy for getting started; small applications 2. Factoring-out business logic

The 'Dispatcher' (mediator, controller) architecture Mediating servlet (controller) Processes requests Creates beans Manges navigation (decides which JSP the request should be forwarded to next) has common tasks: e.g. authentification JSP (presentation) Has no processing logic Retrieves objects/beans Presents next view