- Stahuj zápisky z přednášek a ostatní studijní materiály
- Zapisuj si jen kvalitní vyučující (obsáhlá databáze referencí)
- Nastav si své předměty a buď stále v obraze
- Zapoj se svojí aktivitou do soutěže o ceny
- Založ si svůj profil, aby tě tví spolužáci mohli najít
- Najdi své přátele podle místa kde bydlíš nebo školy kterou studuješ
- Diskutuj ve skupinách o tématech, které tě zajímají
Studijní materiály
Zjednodušená ukázka:
Stáhnout celý tento materiálm01y+m02
y’ = m10 m11 m12 * y = m10x+m11y+m12
1 0 0 1 1 1 Shear:
1 shx 0
shy 1 0
0 0 1 Translation:
1 0 tx
0 1 ty
0 0 1 Rotation:
cos( fi ) -sin( fi ) 0
sin( fi ) cos( fi ) 0
0 0 1 (cos, sin, -sin, cos, 0, 0)
fi > 0 clockwise (radian) Scaling:
sx 0 0
0 sy 0
0 0 1 (sx, 0, 0, sy, 0, 0)
sx, sy>1 greater
negative / flip (1, shy, shx, 1, 0, 0)
Transformace (1, 0, 0, 1, tx, ty)
tx, ty>0 right and down Třída AffineTransform Počátek souřadnic je v levém horním rohu komponenty – osa y je však
převrácená – tj. užívá se překlopený první kvadrant a tedy rotace pro
kladný úhel je ve směru hodinových ručiček. Řada konstruktorů a metod
usnadňuje definici a změny transformační matice:
void translate( ... ) void setToTranslate( ... ) at=getTranslateInstance( ... )
void rotate( ... ) void setToRotate( ... ) at=getRotateInstance( ... )
void scale( ... ) void setToScale( ... ) at=getScaleInstance( ... )
void shear( ... ) void setToShear( ... ) at=getShearInstance( ... )
AffineTransform createInverse( )
void concatenate( AffineTransform at )
void preConcatenate( AffineTransform at )
K provedení transformace slouží metody:
void transform( ... )
void deltaTransform( ... ) - transformace bez translační složky
void inverseTransform( ... ) – zpětná transformace
Shape createTransformedShape( Shape s ) f i h w y x 0,0 Příklad double x= , y= , w= , h= , fi= ; // all values are positive
Rectangle2D.Double r = new Rectangle2D.Double( x, y, w, h );
Area a = new Area( r );
AffineTransform t = new AffineTransform( );
a.transform( t.getRotateInstance( fi, x, y ) ); // x, y ... centre of rotation
public void paint( Graphics g ) {
Graphics2D g2= ( Graphics2D ) g;
g2.fill( r );
g2.setColor( Color.RED );
g2.fill( a );
}
JDBC = Java Data Base Connectivity Java neobsahuje žádné databáze - jen prostředky pro spojení s těmi,
které splňují normu JDBC. Ta má postupné verze ( 1.0, 2.0, 3.0 ) se stále
vyššími nároky a tedy umožňujících důmyslnější operace.
Databází se rozumí jednak vlastní data s jejich strukturou a jednak řídící
software pro ukládání, vyhledávání a údržbu dat – tzv. DBMS ( Data Base
Management System ). DBMS jsou zpravidla velmi rozsáhlé softwarové
systémy – produkované specializovanými výrobci - např.: MySQL,
Oracle, PointBase, Cloudscape, Sybase, IBM DB2 ...
Současné DB jsou relační a ovládané standardním jazykem SQL -
a ten též využívají javské aplikace pro styk s DBMS.
Výrobci dodávají ke svým DBMS drivery – tj. software splňující alespoň
ANSI SQL-92 pro přístup DB z javských programů.
Drivery lze vesměs zdarma stáhnout z Internetu - viz www.mysql.com ,
www.oracle.com atp. JDBC JDBC umí pracovat nejen s SQL3 a SQLJ, ale i se soubory obsahujícími
tabulková data. JDCB překonává funkcionalitu MS UDA ( zahrnující OLE
DB, ADO, RDS a ODBC ).
Podporuje dvou i třívrstvé modely přístupu k DB.
Pro JDBC 3.0 jsou relevantní balíčky java.sql a javax.sql od j2sdk 1.4 -
v J2EE ( Enterprise Edition ) jsou již od verze 1.3.
Od j2sdk 1.5 jsou k dispozici balíčky javax.sql.rowset, ~.serial, ~.spi
Identifikace DB pomocí URL:
jdcb:subprotocol:[//hostname:port/]subname
jdcb:namingService:DataSourceName[;attrName=attrValue]* JDBC-NET JDBC-ODBC
bridge ODBC Native API
based Native
Protocol JDBC
driver manager Java application
using JDBC API URL URL URL URL Driver category JDBC Middleware
( Connector ) proprietary DB protocols
( Direct ) Java pure - preferred library Typy driverů
Kategorie driverů Preferované a Java-pure:
JDCB-NET – Komunikuje s mezivrstvou vhodným síťovým
protokolem.
Native protocol – Překládá JDBC volání přímo do síťového protokolu
DBMS, což umožňuje klientovi přímé volání DB.
Pro dočasná řešení:
Native API based – Nástavba na klientské knihovně, překládá JDBC
volání do volání té knihovny.
JDBC-ODBC Bridge – Připouští ODBC drivery jako JDBC drivery.
Urychluje. Musí být instalován na každém klientovi.
Nerobustní.
DriverManager Driver Driver Statement Connection Connection Connection Statement Statement ResultSet ResultSet Flow Driver
Manager ResultSet Connection RowSet Statement PreparedStatement CallableStatement Clob Blob Array SQLData SavePoint Ref Driver DatabaseMetaData ParamaterMetaData ResultSetMetaData RowSetMetaData javax.sql SQLOutput SQLInput Struct Driver
PropertyInfo javax.sql Types 2.0 java.sql Exception SQL
Exception BatchUpdate
Exception SQL
Warning Data
Truncation Date Date java.util Time Timestamp SQLPermission Basic
Permission Permission java.security java.security java.sql ResultSet RowSet PooledConnection java.sql Connection
EventListener DataSource ResultSetMetaData RowSetMetaData java.sql EventObject Connection
Event java.util RowSet
Event ConnectionPool
DataSource RowSetInternal RowSetListener EventListener RowSetReader RowSetWriter XADataSource XAConnection MySQL
DataSource Oracle
DataSource firemní javax.sql Třída DriverManager Nemá dostupný konstruktor, všechny metody jsou statické.
Při své inicializaci se snaží natáhnout třídy zadané property jdbc.drivers.
a pak kdykoli dynamicky - např.:
Class.forName( "oracle.jdbc.driver.OracleDriver" );
Driver drv = new oracle.jdbc.driver.OracleDriver( );
jdbc.drivers = oracle.jdbc.driver.OracleDriver : acme.cool.Driver
Property se definuje jednak jako –D option nebo v souboru.
Při volání getConnection( ... ) se snaží najít vhodný driver pro požadované
připojení k DB.
Důležité metody:
Connection getConnection( String url, String user, String password )
Enumeration getDrivers( ) – pro výčet zaregistrovaných driverů
Driver getDriver( String url ) – pro přístup k driveru
void registerDriver( Driver driver ) - registrace
void deregisterDriver( Driver driver ) - uvolnění
void setLoginTimeout( int seconds ) – nastavení vyčkávacího času Interfejs Driver Má tyto metody:
boolean acceptsURL( String url ) – předběžný test zda je spojení možné
boolean jdbcCompliant( ) – test na shodu
DriverPropertyInfo[ ] getPropertyInfo( String url, Properties info )
Connection connect( String url, Properties info ) – pokus o připojení -
vrací null je-li driver nevhodný pro uvedené url.
int getMajorVersion( ) - vrací >= 1
int getMinorVersion( ) - vrací >= 0
Interfejs Connection
Připojení k DB provádějí přetížené metody getConnection( String url, ... ),
třídy DriverManager která volají metodu connect( ... ) interfejsu Driver.
Odpoví-li kladně, DriverManager vytvoří spojení, jinak vrátí null a
vyzkouší se další driver.
Nepodaří-li se spojení navázat dojde k SQLException.
Drivery se probírají nejdříve podle seznamu property a pak ty v paměti již
natažené.
Interfejs Connection
Statement createStatement( ... )
PreparedStatement prepareStatement( ... )
CallableStatement prepareCall( ... )
DatabaseMetaData getMetaData( )
String getCatalog( )
SQLWarning getWarnings( )
int getTransactionIsolation( )
void commit( )
void rollback( )
Interfejs Statement
ResultSet executeQuery( String sql )
int executeUpdate( String sql, ... ) – přetížené metod
boolean execute( String sql, ... ) – přetížené metody
int[ ] executeBatch( )
void close( )
void addBatch( String sql )
void clearBatch( )
SQLWarnings getWarnings( )
void clearWarning( )
getry-setry pro:
FetchSize
FetchDirection
MaxRows
MaxFieldSize
QueryTimeout Interfejs ResultSet
boolean next( ), previous( ), first( ), last( ) – pro kursor
boolean absolute( int row ), relative( int rows )
void beforeFirst( ), afterLast( ), moveToCurrentRow( ), moveToInsertRow( )
boolean isFist( ), isLast( ), isBeforeFirst( ), isAfterLast( )
void deleteRow( ), insertRow( ), updateRow( ), refreshRow( ),
cancelRowUpdates( )
boolean rowDeleted( ), rowInserted( ), rowUpdated( )
xxx getXXX( int colIndex ) / getXXX( String colName )
pro primitivy i objekty
void updateXXX( int colIndex, ... ) / updateXXX( String colName, ... )
ResultSetMetaData getResultSetMetaData( )
int getConcurrency( ) Interfejs ResultSetMetaData
int getColumnCount( )
int getColumnType( int col ), getColumnType( int col ),
getScale( int col ), getPrecision( int col )
int isNullable( int col )
boolean isAutoIncrement( int col ), isCaseSensitive( int col ),
isSigned(int col ), isSearchable( int col ), isReadOnly( int col ),
isWritable( int col ), isDefinitelyWritable( int col ),
isCurrency( int col )
String getCatalogueName( int col ), getSchemaName( int col ),
getColumnName( int col ), getColumnClassName( int col ),
getColumnLabel( int col ), getColumnTypeName( int col ),
getTableName( int col )
SQL vs. Java Typy CHAR, VARCHAR, LONGVARCHAR - String
NUMERIC, DECIMAL – java.math.BigDecimal
BIT – boolean
TINYINT – byte
SMALLINT – short
INTEGER – integer
BIGINT – long
REAL – float
FLOAT – double
BINARY, VARBINARY, LONGVARBINARY – byte[ ]
DATE – java.sql.Date
TIME – java.sql.Time
TIMESTAMP – java.sql.Timestamp
Ve verzi 2.0 jsou již zahrnuty SQL3 typy:
BLOB, CLOB, ARRAY a strukturované typy REF a objekt.
obsluhované metodami getXXX, setXXX a updateXXX. Příklad pro MySQL, Oracle a Derby Před spuštěním je třeba zajistit přístup k driverům, tj. classpath musí vést
ke zkompilovaným třídám driverů, které bývají uloženy v adresářích
souborů typu jar či zip - viz firemní stránky.
- mysql-connector-java-3.1.8a.zip ( http://dev.mysql.com/downloads )
classes12.zip ( www.oracle.com/technology/software/index.html )
AppServer\derby\lib\derbyclient.jar
Class.forName( "org.apache.derby.jdbc.ClientDriver" );
Class.forName( "org.gjt.mm.mysql.Driver" );
Class.forName( "oracle.jdbc.driver.OracleDriver" );
String derby = "jdbc:derby://localhost:1527/sun-appserv-samples" ;
String mysql = "jdbc:mysql://localhost:3306/Z" ;
String oracle = "jdbc:oracle:thin:@cs.felk.cvut.cz:1526:oracle" ;
Connection conn1 = DriverManager.getConnection( derby, “APP", “APP" );
Connection conn2 = DriverManager.getConnection( mysql, "root", "" );
Connection conn3 = DriverManager.getConnection( oracle, "scott", "tiger" );
Statement stmt1 = conn1.createStatement( ); Příklad pro MySQL a Oracle
stmt1.executeUpdate( " CREATE TABLE z1 ( ca char(10), cb char(10) ) " );
stmt1.executeUpdate( " INSERT INTO z1 ( ca, cb ) VALUES( 'key', 'val' ) " );
ResultSet rs1 = stmt1.executeQuery( " SELECT * FROM z1 " );
while( rs1.next( ) ) {
System.out.println ( rs1.getString( "ca" ) + " " + rs1.getString( "cb" ) );
} Interfejs DataSource Od verze 2.0 se doporučuje místo DriverManageru používat DataSource,
neboť je portabilní s využitím JNDI ( Java Naming and Directory Interface )
import javax.sql;
import com.mysql.jdbc.jdbc2.optional.*;
import oracle.jdbc.pool.*;
MysqlDataSource ds1;
OracleDataSource ds2;
try {
ds1 = new MysqlDataSource( );
ds2 = new OracleDataSource( );
} catch (SQLException ex) { ... }
ds1.setDataBaseName( "Z" );
ds1.setPort( 3306 );
ds1.getURL( "root" );
Connection conn1 = ds1.getConnection( );
... Prepared a Callable Statements
PreparedStatement ps = con.prepareStatement(
" UPDATE employees SET salary = ? WHERE id = ? " );
ps.setBigDecimal( 1, 1538.00 );
ps.setInt( 2, 777 );
CallableStatement cs = conn.prepareCall( " { call getTestData( ? , ? ) } " );
cs.registerOutParameter( 1 , java.sql.Types.TINYINT );
cs.registerOutParameter( 2 , java.sql.types.DECIMAL , 2 );
cs.executeUpdate( );
byte x = cs.getByte( 1 );
BigDecimal n = cs.getBigDecimal( 2, 2 );
high low first time
then high low
Data transfer
efficiency low high provided DB
supports prepared high Portability low high first time
then low high Configurability DB procedural
language Java language
SQL operation Java
SQL operation Writing code server
server
client
Where stored
server client
client Where is code
created Callable
Statement Prepared
Statement Statement Porovnání typů Statement Tools -> Derby Database -> Start Derby Server
Odpoví:
Starting Server D:\jdk1.5\bin\java
Server started, listening on port ...., display level: 0 ...
Window -> Runtime
Runtime -> Databases -> jdcb:derby://…/sample -> RIGHT BUTTON
Connect pbpublic pbpublic -> Advanced: Get schema
Bundled Tomcat -> Start
Podrobně: http://www.netbeans.org/kb/.../using-netbeans/dbconn.html Derby (NetBeans 5.0 AS 8.1)
RMI = Remote Method Invocation
Tato technologie využívá vzdálené objekty tím, že volá jejich metody.
Argumenty metod jsou požadavky a metoda případně vrátí výsledek.
Vzdálený objekt existuje v jiné VM - povětšinou na jiném počítači.
Klient komunikuje se vzdáleným objektem pouze přes interfejs, který:
musí být potomkem interfejsu Remote
všechny jeho metody vyznačují možný výhoz RemoteException
Vlastní vzdálený objekt, tj. implementace, musí být:
realizací programátorem definovaného interfejsu
potomkem třídy java.rmi.server.UnicastRemoteObject či Activatable ( ta zařídí export )
anebo musí být explicitně exportován metodou java.rmi.server.UnicastRemoteObject.export(...). JVM Java RMI client
(application layer) stub RRL Transport
layer JVM Java RMI server
(application layer) skeleton RRL Transport
layer socket JRMP on TCP/IP socket factory RRL = Remote Reference Layer Klient - Server Vývojář zodpovídá pouze za definice interfejsů a implementujících tříd a
generaci stub-sketetonů. Nestará se o komunikační protokol. Příprava Pro uskutečnění spojení mezi klientem a serverem je třeba na straně
klienta vytvoří tzv. stub. ( Pro verzi Javy 1.1 bylo nutné ještě na straně
serveru vytvářet tzv. skeleton. ) To zařizuje speciální kompilátor rmic,
který se nalézá v j2sdk/bin/... Stub vytváří rmic podle třídy vzdáleného
objektu.
V JBuilderu je proto nutno u těchto tříd zvolit:
-> Properties
Generate RMI stub/skeleton
Options: -keep –v1.2
Při rebuild se v patřičném podadresáři balíčku v classes\...\ vytvoří
MojeTrida_Stub.class
a v adresáři classes\Generated Source\...\MojeTrida_Stub.java. MujInterfejs Remote MojeTrida new Security
Manager Unicast
RemoteObject object client server stub rmic skel
eton Registry RMI / IIOP registry stub program MujInterfejs Pro v1.2 je skeleton integrován v UnicastRemoteObject RMI Spouštění RMI Server vytvoří instanci vzdáleného objektu a předá serializovaný stub do registry k registraci.
Klient se pokusí od registry získat handle ke vzdálenému objektu.
Registry mu vrátí serializovanou kopii stubu.
Klient z ní vytvoří instanci stubu.
Klientský program zavolá nějakou metodu stubu.
Stub kontaktuje skeleton v serveru.
Skeleton zavolá metodu instance vzdáleného objektu.
Ta vrátí výsledek skeletonu.
Ten vrátí výsledek stubu.
Stub vrátí výsledek klientskému programu.
Marshalled
Object ActivationSystem DGC Remote Registry ActivationMonitor Activator ActivationInstantiator Security
Manager Naming java.lang RMISecurity
Manager Activation
Desc Activation
GroupDesc Activation
ID Activation
GroupID java.rmi.activation Locate
Registry Lease VMID java.rmi.registry java.rmi.dgc Distributed Garbage Collection ( tag interface ) java.rmi.* Remote
Object Unicast
RemoteObject Remote
Server ActivationInstantiator Remote
Stub Activation
Group_Stub UID ObjID RMISocket
Factory RMIServerSocketFactory RMIClientSocketFactory RMIClass
Loader RMIClass
LoaderSpi Unreferenced RMIFailureHandler RemoteRef Externalizable ServerRef java.io Remote Activable Activation
Group java.rmi.activation java.rmi.activation java.rmi java.rmi.activation java.rmi.activation Portable
RemoteObject _Remote_Stub javax.rmi.CORBA.Stub java.rmi.server interfejs java.rmi.Registry public void bind( String name, Remote obj ) throws RemoteException,
AlreadyBoundException, AccessException
public void unbind( String name ) throws RemoteException,
NotBoundException, AccessException
public void rebind( String name, Remote obj ) throws RemoteException,
AccessException
public String[ ] list( ) throws RemoteException, AccessException
public Remote lookup( String name ) throws RemoteException,
NotBoundException, AccessException
Registry = Registratura Registry umožňuje evidovat vzdálené objekty pod jednoduchým jménem.
Každý servrový proces může udržovat vlastní registry nebo sdílet jedinou
podporující všechny virtuální stroje na lokálním systému.
Registry lze vytvořit zavoláním programu rmiregistry [port], který se
musí nalézat v adresáři classes - např. zkopírováním z jdk/bin – která
naslouchá na daném portu ( defaultně 1099 ). Není persistentní.
Registry se ovládá statickými metodami třídy java.rmi.Naming:
bind, unbind, rebind, list a lookup
Registry reg = LocateRegistry.createRegistry( port ); // SINGLETON
reg.bind(“Moje", new MojeTrida( ) ); Použití
MujInterfejs z = ( MujInterfejs )
Naming.lookup( "rmi://" + host + ":" + port + "/Moje" );
z.metoda1( ... );
RMI Naming Service Pro vyhledání vzdáleného objektu se očekává jméno ve tvaru
rmi://host:port/name
které uvede klient v metodě Naming.lookup.
( Defaulty jsou: rmi localhost 1099 ) java.rmi.MarshalledObject Po deserializaci instance MarshalledObject není její obsah deserializován.
Obsahuje totiž pole bytů, které může být později interpretováno jako
objekt.
Codebase URL je uložen uvnitř této struktury a ukazuje kde jsou
příslušné classy uloženy pro automatické stažení. Tedy lze deserializovat
na strojích nemající patřičnou třídu v classpath. Objekty mohou být
předávany přes více strojů aniž jsou plně deserializovány.
ArrayList data = ...
MarshalledObject mo = new MarshalledObject( data );
Object o = mo.get( ); Activation group ActivationGroupID ActivationGroupDesc Activation
Monitor ActivationID ActivationDesc Activatable object Aktivace objektů Aktivatabilní objekty jsou zpravidla vedeny na separátní(ch) JVM.
Tyto JVM se definují jako Activation Group - v ní je Activation Monitor,
který sleduje všechny příslušné objektu a i tu grupu. Objekty i grupy mají
ID a deskriptor. Aktivační grupy Aktivátor vytváří aktivační grupy. Tím je RMI démon v jdk/bin/rmid.exe
Aktivační grupy se vytvoří pomocí tříd z java.rmi.activation:
ActivationGroupDesc gd = new ActivationGroupDesc( null, null );
ActivationGroupID gi = ActivationGroup.getSystem( ).registerGroup( gd );
ActivationGroup.createGroup( gi, de, 0 ); // 0 – na kterémkoli portu
Aktivatabilní objekty Implementace vzdáleného objektu je buď potomkem třídy Activatable
ActivationGroup.create( ... viz výše
String[ ] names = { , , };
MarshalledObject mo = new MarshalledObject( names );
ActivationDesc desc = new ActivationDesc( gID, “ … “,null, mo);
Registrovat takto:
RemoteObject stub = (RemoteObject) Activatable.register(desc);
Naming.rebind(“MyRENOBject”, stub );
anebo je exportován:
V konstruktoru se přijme ActivationID id a MarshalledObject mo
names = (String[ ]) mo.get( );
Activatable.export( this, id, 0 ); // export do RMIRegistry
Tyto úpravy se týkají pouze serveru. Pro klienta je to transparentní.
Noření Členy tříd a interfejsů mohou být i definice jiných tříd a interfejsů.
Takto obalené členy mohou být public, protected, “default”, private a i
abstract. Je-li X obalem Y a Y je obalem Z, pak Z má jméno X$Y$Z.
Člen Z má přístup k členům všech svých obalů.
Kompilací vzniknou soubory X.class, X$Y.class a X$Y$Z.class.
Rozeznáváme:
Nested member ( vnořený člen ) - je static class či [ static ] interface.
Má přístup jen ke statickým členům svých obalů, může mít statické členy.
Inner class ( vnitřní ) - je nestatická třída bez statických deklarací a vnitřních interfejsů. Obé však může být zděděné.
Local class - lokální třída je definovaná v metodě či bloku.
Nemá modifikátoru přístupu.
K lokálním proměnným a parametrům má přístup jen jsou-li finální.
Annonymous class - anonymní třída nemá hlavičku. Lokální třídy Lokální třída ( local class ) je vnitřní tř
Vloženo: 23.04.2009
Velikost: 863,14 kB
Komentáře
Tento materiál neobsahuje žádné komentáře.
Mohlo by tě zajímat:
Skupina předmětu Y36PJV - Programování v jazyku Java
Reference vyučujících předmětu Y36PJV - Programování v jazyku Java
Podobné materiály
- 01M4 - Matematika 4 - Přednášky Prucha ReseniII
- 01M4 - Matematika 4 - Přednášky Prucha ReseniIII
- X01ALG - Úvod do algebry - Přednášky Horcik
- X01MA1 - Matematika 1 - Přednášky Tkadlec
- X16EKO - Ekonomika - Přednášky ekonomika
- X31EO1 - Elektrické obvody 1 - Přednášky EO1
- X31EO2 - Elektrické obvody 2 - Přednášky (2)
- X31EO2 - Elektrické obvody 2 - Přednášky
- X34ELE - Elektronika - Přednášky
- X36ALG - Algoritmizace - Přednášky algoritmizace
- X02FY1 - Fyzika 1 - Přednášky
- X17TEP - Teorie elektromagnetického pole - prednasky
- 34EL - Elektronika - prednasky
- X36PJV - Programování v jazyku Java - prednasky
- 12TD - Technická dokumentace - prednasky
- X12UEM - Úvod do elektrotechnických materiálů - prednasky od slova do slova
- Y36OMO - Objektové modelování - přednášky
Copyright 2025 unium.cz


