Videregående programmering i Java

Dag 13 - valgfrie emner

Evt: Introduktion til J2EE og EJB

Evt.: Værktøjer til forbedring af kodekvalitet - kodemetrikker og audit

Evt.: Udskrift til printer/sideformattering

Projektvejledning

Udgår: Introduktion til J2ME, midletter og programmering af mobiltelefoner

Læsning: Evt VP 14 (VP 13 udgår)

Dette materiale er under Åben Dokumentlicens, se http://www.sslug.dk/linuxbog/licens.html

Sidste gang - spørgsmål?

Dag 12 - Introspektion og optimering

Introspektion af klasser på køretidspunktet (reflektion)

Evt.: JAR-filer og oprettelse af eksekverbare JAR-filer

Optimering af programmer

Evt.: Optimeringsværktøjer (Borland OptimizeIt)

Projektvejledning

Læsning: VP 9, VP 11

Java 2 Enterprise Edition (J2EE)
- til store servere

J2EE-platformens dele

Webserver

EJB (Enterprise JavaBeans)

CORBA - fjernkald af objekter (ikke kun Java, sværere end RMI)

JTS (Java Transaction Service) - transaktioner (commit, rollback)

JMS (Java Message Service) - til MQ-systemer.

tjeneste til at sende og modtage synkrone eller asynkrone meddelelser mellem programmer

JavaMail, XML-behandling, ...

Sun varetager 'kun' J2EE-specifikationen

Mange uafhængige udbydere af J2EE-platforme

Borland AppServer

Oracle

IBM WebbSphere

JBoss (med åben kildekode)

Sun (referenceimplementation)

... (>10 andre)

J2EE != udviklingsplatform

Mange udbydere har også egen, 'strømlinet' webudviklingsmodel

Enterprise JavaBeans (EJB)
- objekter i serveren

J2EE-container varetager EJB-objekter

Persistens, transaktioner, sikkerhed

Kald kan ske lokalt eller over netværket

F.eks. fra JSP-sider!

EJB koncentrerer sig om programlogik

Serveren sørger for al 'benarbejdet'

Sessionsbønner repræsenterer et forløb

Entitetsbønner repræsenterer data fra en tabel

Containerstyret persistens (CMP)

Al databasekode bliver genereret af containeren (!)

Bønnestyret persistens (BMP)

Programmøren skriver selv databasekoden

Meddelelses-drevne bønner

Princippet i kald af metoder i
objekter over netværket

En EJB-bønne kører en en J2EE-applikationsserver - muligvis adskilt fra klienten

Hver EJB-bønne udgøres af tre stykker kildetekst (to interfaces og en klasse):

1)Et fjerninterface (eng.: remote interface), der specificerer hvordan bønnen kan bruges af klienten.

2)Et hjemmeinterface (eng.: home interface), der specificerer, hvordan bønnen kan fremfindes, oprettes og nedlægges af klienten.

3)En implementationsklasse af bønnen, med den programkode, der beskriver, hvad der skal ske, når de forskellige metoder i fjerninterfacet kaldes.

Kildekoden i en EJB

... plus noget information til EJB-containeren (XML)

Bruge en EJB

Typer af EJB

Sessionsbønner

repræsenterer et eller andet forløb og indeholder de data der knytter sig til dette forløb

Tilstandsløse (eksempel: Veksler-bønnen)

Flere klienter kan dele samme instans

Tilstandsfulde

Hver klient får sin egen instans

Entitetsbønner

repræsenterer data fra en tabel. De er persistente
(dvs. deres data 'bakkes op' af en database).

Containerstyret persistens (CMP)

Al databasekode bliver genereret af containeren (!)

Bønnestyret persistens (BMP)

Programmøren skriver selv databasekoden

Meddelelses-drevne bønner

Entitetsbønner med CMP

EJB Query Language

EJB Query Language

EJB: Transaktioner

Programmatisk ('i hånden'-) transaktionsstyring

Deklarativ transaktionsstyring

Metoder markeres med en transaktions-attribut

Det er containerens opgave at sørge for at oprette, nedlægge, fuldføre og evt. annullere transaktioner i henhold til disse

Required - metoden er med i den aktuelle transaktion.

Der oprettes en ny transaktion af containeren, hvis der ikke er nogen i gang.

Supports - metoden er med i den aktuelle transaktion.

Der oprettes ikke en ny transaktion af containeren, hvis der ikke er nogen i gang.

Mandatory - metoden skal være med en transaktion.

Er der ikke er nogen i gang, kastes undtagelsen TransactionRequiredException.

Never - metoden må aldrig være med en transaktion.

Er der en transaktion i gang, kastes undtagelsen RemoteException af containeren.

RequiresNew - der oprettes en ny transaktion.

Hvis der er en transaktion i gang, suspenderes denne indtil metoden har afsluttet.

NotSupported - kan ikke være med en transaktion.

Hvis der er en transaktion i gang, suspenderes indtil metoden har afsluttet.

Microsoft .NET

Here's one cut at an itemized list of the technical components making up the .NET platform:

·C#, a "new" language for writing classes and components, that integrates elements of C, C++, and Java.

·A "common language runtime", which runs bytecodes in an Internal Language (IL) format. Code and objects written in one language can, ostensibly, be compiled into the IL runtime, once an IL compiler is developed for the language.

·A set of base components, accessible from the common language runtime, that provide various functions (networking, containers, etc.).

·ASP+, a new version of ASP that supports compilation of ASPs into the common language runtime (and therefore writing ASP scripts using any language with an IL binding).

·Win Forms and Web Forms, new UI component frameworks accessible from Visual Studio.

·ADO+, a new generation of ADO data access components that use XML and SOAP for data interchange.

Denne side er ikke under Åben Dokumentlicens

J2EE og .NET

J2EE

En standard

Flere udbydere (>15)

Flere platforme

Ét firma styrer (Sun)

Ét sprog (Java)

Åben kildekode

JDBC RowSet

EJB CMP

.NET

En samling Windows-produkter

Én udbyder

Én platform

Flere sprog

Lukket

DataSet

(mangler)

Denne side er ikke under Åben Dokumentlicens

Udskrift til printer

public void udskriv()

{

java.awt.PrintJob pj = Toolkit.getDefaultToolkit().getPrintJob(this,"figurer",null);

Graphics g = pj.getGraphics(); // Graphics-objekt til at tegne på papiret

tegnFigurer(g);

pj.end(); // Færdiggør siden med udskriften og send den til printeren

}

Simplest mulige udskrivning (fra JDK 1.1)

Kun én side

Meget lidt kontrol over sideformat

Udskrift foregår ved tegning med et Graphics-objekt

Udskrift til printer

public void udskriv()

{

java.awt.print.PrinterJob pj = java.awt.print.PrinterJob.getPrinterJob();

// implementér Printable-interfacet for at udskrive noget

java.awt.print.Printable p = new java.awt.print.Printable() {

public int print(Graphics g, java.awt.print.PageFormat pf, int side) {

if (side > 4) return java.awt.print.Printable.NO_SUCH_PAGE;

tegnFigurer(g);

g.drawString("Side "+side, (int)pf.getImageableX(), (int)pf.getImageableY()+10);

return java.awt.print.Printable.PAGE_EXISTS;

}

};

pj.setPrintable(p);

pj.printDialog(); // vis printerdialog – hvor bruger kan vælge antal sider etc

try {

pj.print(); // udskriv!

} catch (Exception ex) { ex.printStackTrace(); }

}

Mere avanceret udskrivning (fra JDK 1.2)

Fuld kontrol over sideformat

Flere sider (kan have forskellige sideformater)

Udskrivningsdialog kender antal sider (med Pageable)

// eller:

//java.awt.print.Book b = new java.awt.print.Book();

//b.append(p, pj.defaultPage());

//pj.setPageable(b);

Udskrift til printer

Java Print Service (fra JDK 1.3)

Søgning efter printere med bestemte evner

duplex, farve, PostScript, ...

Specificere formatet af det udskrevne

Opløsning (DPI), antal kopier, prioritet, ...

Sende data

Også i rå formater som

PostScript

PDF

GIF, JPEG, PNG

Eksempel: Udskrivning af PostScript-fil, 5 dobbeltsides A4-kopier:

FileInputStream psStream = new FileInputStream("file.ps");

DocFlavor psInFormat = DocFlavor.INPUT_STREAM.POSTSCRIPT;

Doc myDoc = new SimpleDoc(psStream, psInFormat, null);

PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();

aset.add(new Copies(5));

aset.add(MediaSize.A4);

aset.add(Sides.DUPLEX);

PrintService[] services = PrintServiceLookup.lookupPrintServices(psInFormat, aset);

if (services.length > 0) {

DocPrintJob job = services[0].createPrintJob();

job.print(myDoc, aset);

}

Mere læsning om udskrivning

Basal udskrivning

Udskrivning af flere sider

http://java.sun.com/developer/technicalArticles/Printing/Java2DPrinting/

Java Print Service

http://java.sun.com/j2se/1.4.2/docs/guide/jps/

Andre

http://java.sun.com/printing/

http://java.sun.com/developer/technicalArticles/Printing/

Værktøj til forbedring af kodekvalitet – automatisk koderevision (audit)

Nogle værktøjer kan søge programkoden igennem og revidere den (eng.: audit)

Består af 30-80 forskellige tjek af koden på forskellig måde

Almindelige fejl og uhensigsmæssigheder kan påpeges

Griber ind i den programmørens kodningsvaner

Nok nødvendigt i projekter med mange programmører

Hvilke tjek der skal foretages kan indstilles fra projekt til projekt

Eksempel:

Use Abbreviated Assignment Operator (UAAO)

Use the abbreviated assignment operator in order to write programs more rapidly. Also some compilers run faster when you do so.

Wrong

void oper () {

int i = 0;

i = i + 20;

i = 30 * i;

}

Right

void oper () {

int i = 0;

i += 20;

i *= 30;

}

Andre eksempler:

'switch' Statement Should Include a Default Case (SSSIDC)

Assignments to 'for' Loop Variables (AFLV)

Accessing Static Members through Objects (ASMO)

Assignments to Formal Parameters (AFP)

Ekstra projekthjælp

Torsdag den 9. december

14.30 Henrik

15 Preben

16 Kim H

17 Kim J

Videregående programmering i Java

Præsentatoner fra kurset

2004-08-30T12:23:21