SlideShare a Scribd company logo
Ak.god. 2018./2019.
Projekt
Preddiplomski projekt
Uvod u Spring
Zaštićeno licencom http://creativecommons.org/licenses/by-nc-sa/2.5/hr/
Zavod za telekomunikacije
Projekt
Creative Commons
■ slobodno smijete:
l dijeliti — umnožavati, distribuirati i javnosti priopćavati djelo
l remiksirati — prerađivati djelo
■ pod sljedećim uvjetima:
l imenovanje. Morate priznati i označiti autorstvo djela na način kako je
specificirao autor ili davatelj licence (ali ne način koji bi sugerirao da Vi ili
Vaše korištenje njegova djela imate njegovu izravnu podršku).
l nekomercijalno. Ovo djelo ne smijete koristiti u komercijalne svrhe.
l dijeli pod istim uvjetima. Ako ovo djelo izmijenite, preoblikujete ili
stvarate koristeći ga, preradu možete distribuirati samo pod licencom koja
je ista ili slična ovoj.
U slučaju daljnjeg korištenja ili distribuiranja morate drugima jasno dati do znanja licencne uvjete
ovog djela. Najbolji način da to učinite je linkom na ovu internetsku stranicu.
Od svakog od gornjih uvjeta moguće je odstupiti, ako dobijete dopuštenje nositelja autorskog prava.
Ništa u ovoj licenci ne narušava ili ograničava autorova moralna prava.
Tekst licencije preuzet je s http://creativecommons.org/.
&214.11.2018.
Zavod za telekomunikacije
Projekt
Sadržaj predavanja
♦ Gradle
♦ Spring
♦ Spring boot
♦ Povezivanje s bazom podataka (unutarnjom i vanjskom)
♦ Entiteti
♦ Spring Boot devtools
♦ HTTP
♦ REST
♦ Instaliranje na poslužitelj
&314.11.2018.
Zavod za telekomunikacije
Projekt
Gradle
♦ alat za izgradnju aplikacija i sustava poput: Maven, Ant, Make
! poslovi: compile, test, package, run, deploy, ...
♦ temelji se na jeziku Groovy
♦ koristi pakete koji se koriste u Mavenu
! http://search.maven.org
♦ lakše se proširuje nego Maven (može biti dobro ili loše)
♦ datoteka koja definira projekt: build.gradle
♦ obično se projekt distribuira sa alatom gradle i popratnim
skriptama
♦ potrebna mu je samo Java za izvršavanje
♦ adresa: http://gradle.org/
♦ Eclipse plugin - dolazi ugrađen
&414.11.2018.
Zavod za telekomunikacije
Projekt
Spring Framework - http://spring.io
♦ prva verzija 2003. koju je napravio Rod Johnson
♦ radni okvir za lakši razvoj aplikacija
♦ bavi se konfiguracijom objekata u sustavu (IoC – inversion of control)
! upravlja poslovnim objektima kao običnim objektima (POJO – plain old java
objects)
! brine se za kreiranje objekata
! povezuje kreirane objekte (IoC, wiring up, DI - dependency injection)
! upravlja njihovim životnim ciklusom
♦ složene veze između objekata se definiraju u XML-u ili pomoću
bilješki (annotation)
♦ odvaja poslovnu logiku od mehanizama za ispravan rad sustava
(transakcije, logiranje, ...)
♦ vrlo je složen za početnika jer ima puno stvari ugrađeno
&514.11.2018.
Zavod za telekomunikacije
Projekt
Mogućnosti Spring Frameworka
♦ POJO
♦ DI / AOP (Aspect Oriented Programming)
♦ logging
♦ timers, asynchronous calls
♦ lako testiranje
♦ Web MVC (Model View Controller) / REST
♦ ORM (Object Relational Mapping), JDBC, Hibernate, JDO
♦ sigurnost
♦ ...
&614.11.2018.
Zavod za telekomunikacije
Projekt
Arhitektura Spring Frameworka - dokumentacija
&714.11.2018.
Zavod za telekomunikacije
Projekt
Projekti unutar spring.io
♦ Spring IO Platform
♦ Spring Boot
♦ Spring Framework
♦ Spring Cloud Data Flow
♦ Spring Cloud
♦ Spring Data
♦ Spring Integration
♦ Spring Security
♦ ...
&814.11.2018.
Zavod za telekomunikacije
Projekt
Spring Boot
♦ jedan od podprojekata Springa
! http://projects.spring.io/spring-boot/
♦ pojednostavnjuje korištenje Springa, pogotovo stvaranje novog projekta
♦ podržava:
! automatsku konfiguraciju
! pretraživanja klasa na putu (path)
♦ aplikacija ima manje koda
♦ kod web-aplikacija - omogućuje izradu samostalnih aplikacija
! web-poslužitelj zapakiran u jar
! jednostavnije instaliranje
! aplikacija spremna za produkcijsku okolinu
♦ primjeri projekata
♦ Spring framework guru tutorials
&914.11.2018.
Zavod za telekomunikacije
Projekt
Spring u Eclipseu
♦ Za Eclipse postoji plugin Spring Tools 4
♦ Instalacija
! instalirati STS preko Eclipse Marketplacea
♦ Trenutna verzija je STS 4.0.1
♦ Projekt možemo napraviti pomoću:
! File -> New -> Spring Starter Project ili
! napraviti projekt preko web-stranice http://start.spring.io
" pa onda napraviti import
&1014.11.2018.
Zavod za telekomunikacije
Projekt
Izrada jednostavnog projekta (1)
♦ otići na stranicu http://start.spring.io ili
♦ odabrati:
! Gradle project
! Spring Boot: 1.5.17
! Group: hr.fer.ilj.spring.example
! Artifact: simple
! klik na Generate Project - skinuti će se zip s projektom
♦ Eclipse:
! kopirati direktorij projekta u workspace
! File -> Import -> Gradle/Existing Gradle Project
! Root Folder staviti na odzipani projekt
! Next -> Next
! odabrati projekt
! klik na Finish
&1114.11.2018.
Zavod za telekomunikacije
Projekt
Izrada jednostavnog projekta (2)
♦ struktura projekta
♦ pogledati:
! SimpleApplication
" klasa koja se pokreće
! build.gradle
" skripta za "građenje"
! application.properties
" vanjska konfiguracija
&1214.11.2018.
Zavod za telekomunikacije
Projekt
Klasa SimpleApplication
package	hr.fer.ilj.simple;



import	org.springframework.boot.SpringApplication;	
import	org.springframework.boot.autoconfigure.SpringBootApplication;





@SpringBootApplication

public	class	SimpleApplication	{

		

		public	static	void	main(String[]	args)	{

				SpringApplication.run(SimpleApplication.class,	args);	
		}

}

&1314.11.2018.
Zavod za telekomunikacije
Projekt
SimpleApplication - pokretanje
import	org.springframework.boot.CommandLineRunner;

import	org.springframework.boot.SpringApplication;

import	org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

public	class	SimpleApplication	implements	CommandLineRunner	{

		

		public	static	void	main(String[]	args)	{

				SpringApplication.run(SimpleApplication.class,	args);

		}



		@Override

		public	void	run(String...	args)	throws	Exception	{

				System.out.println("**************");

		}

}	
&1414.11.2018.
Zavod za telekomunikacije
Projekt
Ispis svih beanova
@SpringBootApplication

public	class	SimpleApplication	implements	CommandLineRunner	{

		

		public	static	void	main(String[]	args)	{

				ApplicationContext	ctx	=	SpringApplication.run(	
						SimpleApplication.class,	args);

				

				for(String	name:	ctx.getBeanDefinitionNames())

						System.out.println(name);

		}	
...	
}

&1514.11.2018.
Zavod za telekomunikacije
Projekt
Beanovi i DI (Dependency Injection)
♦ Objekte koje stvara i s kojima upravalja Springov kontejner se zovu
beanovi
♦ DI - dependency injection
! objekti definiraju ovisnosti o drugim objektima
! mora imati ili: atribute, setere ili konstruktor kroz koji se ovisnosti postavljaju
! kontejner onda ubacuje ovisnosti kada stvara baenove
! koristi posebne metode za instanciranje i postavljanje ovisnih objekata da bi
objekti normalno funkcionirali
♦ doseg beanova - @Scope("tip")
! singleton (podrazumijevano) - jedna instanca u JVM-u
! prototip - novi objekt svaki put kada se zahtjeva bean
! zahtjev (request) - kod svakog zahtjeva se stvara novi bean
! sjednica (session) - za svakog korisnika jedan bean
! globalna sjednica - koristi se kod portleta
&1614.11.2018.
Zavod za telekomunikacije
Projekt
Ubrizgavanje beanova (1)
@SpringBootApplication

public	class	SimpleApplication	implements	CommandLineRunner	{

...	
		@Override

		public	void	run(String...	args)	throws	Exception	{

				System.out.println("**************");

				

				for(String	name:	ctx.getBeanDefinitionNames())

						System.out.println(name);

		}

}
&1714.11.2018.
Zavod za telekomunikacije
Projekt
Ubrizgavanje beanova (2)
1. preko atributa (field)
@Autowired

private	ApplicationContext	ctx;	
2. preko konstruktora
private	ApplicationContext	ctx;



public	SimpleApplication(ApplicationContext	ctx)	{

		this.ctx	=	ctx;

}	
3. preko setera
private	ApplicationContext	ctx;



@Autowired

public	void	setCtx(ApplicationContext	ctx)	{

		this.ctx	=	ctx;

}
&1814.11.2018.
Zavod za telekomunikacije
Projekt
Definiranje beanova
♦ dva načina:
! u konfiguracijskoj klasi (npr. SimpleApplication) definirati metodu
koja je označena da vraća bean (@Bean)
! označiti klasu s @Component
" mehanizam pretraživanja puta može pronaći takvu klasu
" podvrste:
# @Controller - predstavlja kontroler u Web MVC-u
# @Service - predstavlja namjeru da je to usluga
# @Repository - predstavlja komponentu koja pristupa podacima
# @RestController - predstavlja kontroler u Web MVC-u koja vraća podatke
koji se serializiraju u JSON ili XML
&1914.11.2018.
Zavod za telekomunikacije
Projekt
GreetingService - POJO


public	class	GreetingService	{

		

		public	String	hello()	{

				return	"Bok!";

		}

}	
&2014.11.2018.
Zavod za telekomunikacije
Projekt
GreetingService - ubrizgavanje
@SpringBootApplication

public	class	SimpleApplication	implements	CommandLineRunner	{

		private	GreetingService	greetingService;

		

		@Autowired

		public	void	setGreetingService(GreetingService	greetingService)	{

				this.greetingService	=	greetingService;

		}



		@Override

		public	void	run(String...	args)	throws	Exception	{

				System.out.println("**************");

				System.out.println(greetingService.hello());

		}

...	
}
&2114.11.2018.
Zavod za telekomunikacije
Projekt
Bean GreetingService definiran u konfiguraciji
@SpringBootApplication

public	class	SimpleApplication	implements	CommandLineRunner	{

...		

		@Bean

		public	GreetingService	getService()	{

				return	new	GreetingService();

		}

}	


public	class	GreetingService	{

		public	String	hello()	{

				return	"Bok!";

		}

}	


&2214.11.2018.
Zavod za telekomunikacije
Projekt
Bean GreetingService definiran u klasi
@Service

public	class	GreetingService	{

		

		public	String	hello()	{

				return	"Bok!";

		}

}

&2314.11.2018.
Zavod za telekomunikacije
Projekt
SimpleApplication - loading configuration
package hr.fer.tel.spring.example;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SimpleApplication implements CommandLineRunner {
@Autowired
private MyProps props;
public static void main(String[] args) {
SpringApplication.run(SimpleApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
System.out.println("*********** " + props.getText());
}
}
&2414.11.2018.
Zavod za telekomunikacije
Projekt
My Properties
package hr.fer.tel.spring.example;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class MyProps {
@Value("${prop.name}")
private String someText;
public String getText() {
return someText;
}
}
&2514.11.2018.
Zavod za telekomunikacije
Projekt
application.properties
prop.name=My text from properties file.
&2614.11.2018.
Više o načinima podešavanja konfiguracije mžete naći u dokumentaciji u
poglavlju 24. Externalized Configuration
Zavod za telekomunikacije
Projekt &27
Web / HTTP
14.11.2018.
Zavod za telekomunikacije
Projekt
Protokol Hypertext Transfer Protocol (HTTP)
♦ internetski protokol aplikacijskog sloja
♦ definira format i način razmjene poruka
! tekstualan zapis, sličan formatu e-mail poruke i standarda MIME
♦ vrste poruka:
! zahtjev (“metoda”)
" definira operaciju (metodu), resurs, protokol
" naziv "metoda" potječe područja objektno-orijentiranog programiranja
! odgovor (rezultat)
" rezultat (uspjeh, neuspjeh, greška,...) opisan statusnim kôdom
" neke vrste odgovora u tijelu imaju sadržaj zatraženog resursa
&2814.11.2018.
Zavod za telekomunikacije
Projekt
Primjer HTTP-zahtjeva
1.GET /predmet/rassus HTTP/1.1
2.Host: www.fer.unizg.hr
3.User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:
7.0.1) Gecko/20100101 Firefox/7.0.1
4.Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/
*;q=0.8
5.Accept-Language: hr,en;q=0.7,en-us;q=0.3
6.Accept-Encoding: gzip, deflate
7.Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
8.Connection: keep-alive
9.Cache-Control: max-age=0
&2914.11.2018.
Zavod za telekomunikacije
Projekt
Primjer HTTP-zahtjeva
1.GET /predmet/rassus HTTP/1.1
2.Host: www.fer.unizg.hr
3.User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:
7.0.1) Gecko/20100101 Firefox/7.0.1
4.Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/
*;q=0.8
5.Accept-Language: hr,en;q=0.7,en-us;q=0.3
6.Accept-Encoding: gzip, deflate
7.Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
8.Connection: keep-alive
9.Cache-Control: max-age=0
&2914.11.2018.
početni redak
Zavod za telekomunikacije
Projekt
Primjer HTTP-zahtjeva
1.GET /predmet/rassus HTTP/1.1
2.Host: www.fer.unizg.hr
3.User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:
7.0.1) Gecko/20100101 Firefox/7.0.1
4.Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/
*;q=0.8
5.Accept-Language: hr,en;q=0.7,en-us;q=0.3
6.Accept-Encoding: gzip, deflate
7.Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
8.Connection: keep-alive
9.Cache-Control: max-age=0
&2914.11.2018.
početni redak
polja zaglavlja:
opća zaglavlja

zaglavlja karakteristična za zahtjev ili odgovor
zaglavlja karakteristična za entitet
Zavod za telekomunikacije
Projekt
Primjer HTTP-zahtjeva
1.GET /predmet/rassus HTTP/1.1
2.Host: www.fer.unizg.hr
3.User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:
7.0.1) Gecko/20100101 Firefox/7.0.1
4.Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/
*;q=0.8
5.Accept-Language: hr,en;q=0.7,en-us;q=0.3
6.Accept-Encoding: gzip, deflate
7.Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
8.Connection: keep-alive
9.Cache-Control: max-age=0
&2914.11.2018.
početni redak
polja zaglavlja:
opća zaglavlja

zaglavlja karakteristična za zahtjev ili odgovor
zaglavlja karakteristična za entitet
prazan redak
Zavod za telekomunikacije
Projekt
Primjer HTTP-zahtjeva
1.GET /predmet/rassus HTTP/1.1
2.Host: www.fer.unizg.hr
3.User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:
7.0.1) Gecko/20100101 Firefox/7.0.1
4.Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/
*;q=0.8
5.Accept-Language: hr,en;q=0.7,en-us;q=0.3
6.Accept-Encoding: gzip, deflate
7.Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
8.Connection: keep-alive
9.Cache-Control: max-age=0
&2914.11.2018.
početni redak
polja zaglavlja:
opća zaglavlja

zaglavlja karakteristična za zahtjev ili odgovor
zaglavlja karakteristična za entitet
prazan redak
tijelo poruke
Zavod za telekomunikacije
Projekt
Primjer HTTP-zahtjeva
1.GET /predmet/rassus HTTP/1.1
2.Host: www.fer.unizg.hr
3.User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:
7.0.1) Gecko/20100101 Firefox/7.0.1
4.Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/
*;q=0.8
5.Accept-Language: hr,en;q=0.7,en-us;q=0.3
6.Accept-Encoding: gzip, deflate
7.Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
8.Connection: keep-alive
9.Cache-Control: max-age=0
&3014.11.2018.
Zavod za telekomunikacije
Projekt
Primjer HTTP-zahtjeva
1.GET /predmet/rassus HTTP/1.1
2.Host: www.fer.unizg.hr
3.User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:
7.0.1) Gecko/20100101 Firefox/7.0.1
4.Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/
*;q=0.8
5.Accept-Language: hr,en;q=0.7,en-us;q=0.3
6.Accept-Encoding: gzip, deflate
7.Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
8.Connection: keep-alive
9.Cache-Control: max-age=0
&3014.11.2018.
Obavezni dijelovi
Zavod za telekomunikacije
Projekt
Metode zahtjeva
♦ metoda zahtjeva određuje što se traži od resursa
♦ HTTP/1.1 definira 8 metoda i omogućuje dodavanje novih
metoda (extensions):
! OPTIONS - informiranje i mogućnostima resursa i poslužitelja
! GET - za dohvaćanje resursa (najčešća)
! HEAD - za dohvaćanje podataka o resursu (npr. veličina,
postojanje)
! POST - aktiviranje resursa (npr. slanje podataka obrazaca)
! PUT - postavljanje entiteta (npr. promjena podataka - kod
REST-a)
! DELETE - brisanje resursa (npr. kod REST-a)
! TRACE - za dijagnostiku
! CONNECT - za buduću uporabu (ne implementira se)
&3114.11.2018.
Zavod za telekomunikacije
Projekt
Primjer HTTP-odgovora
1.HTTP/1.1 200 OK
2.Date: Wed, 12 Oct 2011 08:19:32 GMT
3.Server: Apache/2.2.20 (FreeBSD) mod_ssl/2.2.20 OpenSSL/0.9.8q mod_fcgid/
2.3.6
4.Expires: Thu, 19 Nov 1981 08:52:00 GMT
5.Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-
check=0
6.Pragma: no-cache
7.P3P: CP="NOI CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa HISa OTPa OUR BUS IND
UNI COM NAV INT"
8.Set-Cookie: CMS=2p72ge55hqm92itadsfu83pc25; expires=Wed, 19-Oct-2011
20:19:32 GMT; path=/; domain=www.fer.unizg.hr; HttpOnly
9.Vary: Accept-Encoding
10.Transfer-Encoding: chunked
11.Content-Type: text/html; charset=utf-8
12.
13.d9e7
14.<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://
www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
15.<html xmlns="http://www.w3.org/1999/xhtml">
16.
17.<head>
18.<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
19. ...
&3214.11.2018.
Zavod za telekomunikacije
Projekt
Primjer HTTP-odgovora
1.HTTP/1.1 200 OK
2.Date: Wed, 12 Oct 2011 08:19:32 GMT
3.Server: Apache/2.2.20 (FreeBSD) mod_ssl/2.2.20 OpenSSL/0.9.8q mod_fcgid/
2.3.6
4.Expires: Thu, 19 Nov 1981 08:52:00 GMT
5.Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-
check=0
6.Pragma: no-cache
7.P3P: CP="NOI CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa HISa OTPa OUR BUS IND
UNI COM NAV INT"
8.Set-Cookie: CMS=2p72ge55hqm92itadsfu83pc25; expires=Wed, 19-Oct-2011
20:19:32 GMT; path=/; domain=www.fer.unizg.hr; HttpOnly
9.Vary: Accept-Encoding
10.Transfer-Encoding: chunked
11.Content-Type: text/html; charset=utf-8
12.
13.d9e7
14.<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://
www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
15.<html xmlns="http://www.w3.org/1999/xhtml">
16.
17.<head>
18.<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
19. ...
&3214.11.2018.
početni redak
Zavod za telekomunikacije
Projekt
Primjer HTTP-odgovora
1.HTTP/1.1 200 OK
2.Date: Wed, 12 Oct 2011 08:19:32 GMT
3.Server: Apache/2.2.20 (FreeBSD) mod_ssl/2.2.20 OpenSSL/0.9.8q mod_fcgid/
2.3.6
4.Expires: Thu, 19 Nov 1981 08:52:00 GMT
5.Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-
check=0
6.Pragma: no-cache
7.P3P: CP="NOI CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa HISa OTPa OUR BUS IND
UNI COM NAV INT"
8.Set-Cookie: CMS=2p72ge55hqm92itadsfu83pc25; expires=Wed, 19-Oct-2011
20:19:32 GMT; path=/; domain=www.fer.unizg.hr; HttpOnly
9.Vary: Accept-Encoding
10.Transfer-Encoding: chunked
11.Content-Type: text/html; charset=utf-8
12.
13.d9e7
14.<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://
www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
15.<html xmlns="http://www.w3.org/1999/xhtml">
16.
17.<head>
18.<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
19. ...
&3214.11.2018.
početni redak
polja zaglavlja:
opća zaglavlja

zaglavlja karakteristična za zahtjev ili odgovor
zaglavlja karakteristična za entitet
Zavod za telekomunikacije
Projekt
Primjer HTTP-odgovora
1.HTTP/1.1 200 OK
2.Date: Wed, 12 Oct 2011 08:19:32 GMT
3.Server: Apache/2.2.20 (FreeBSD) mod_ssl/2.2.20 OpenSSL/0.9.8q mod_fcgid/
2.3.6
4.Expires: Thu, 19 Nov 1981 08:52:00 GMT
5.Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-
check=0
6.Pragma: no-cache
7.P3P: CP="NOI CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa HISa OTPa OUR BUS IND
UNI COM NAV INT"
8.Set-Cookie: CMS=2p72ge55hqm92itadsfu83pc25; expires=Wed, 19-Oct-2011
20:19:32 GMT; path=/; domain=www.fer.unizg.hr; HttpOnly
9.Vary: Accept-Encoding
10.Transfer-Encoding: chunked
11.Content-Type: text/html; charset=utf-8
12.
13.d9e7
14.<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://
www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
15.<html xmlns="http://www.w3.org/1999/xhtml">
16.
17.<head>
18.<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
19. ...
&3214.11.2018.
početni redak
polja zaglavlja:
opća zaglavlja

zaglavlja karakteristična za zahtjev ili odgovor
zaglavlja karakteristična za entitet
prazan redak
Zavod za telekomunikacije
Projekt
Primjer HTTP-odgovora
1.HTTP/1.1 200 OK
2.Date: Wed, 12 Oct 2011 08:19:32 GMT
3.Server: Apache/2.2.20 (FreeBSD) mod_ssl/2.2.20 OpenSSL/0.9.8q mod_fcgid/
2.3.6
4.Expires: Thu, 19 Nov 1981 08:52:00 GMT
5.Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-
check=0
6.Pragma: no-cache
7.P3P: CP="NOI CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa HISa OTPa OUR BUS IND
UNI COM NAV INT"
8.Set-Cookie: CMS=2p72ge55hqm92itadsfu83pc25; expires=Wed, 19-Oct-2011
20:19:32 GMT; path=/; domain=www.fer.unizg.hr; HttpOnly
9.Vary: Accept-Encoding
10.Transfer-Encoding: chunked
11.Content-Type: text/html; charset=utf-8
12.
13.d9e7
14.<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://
www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
15.<html xmlns="http://www.w3.org/1999/xhtml">
16.
17.<head>
18.<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
19. ...
&3214.11.2018.
početni redak
polja zaglavlja:
opća zaglavlja

zaglavlja karakteristična za zahtjev ili odgovor
zaglavlja karakteristična za entitet
prazan redak
tijelo poruke
Zavod za telekomunikacije
Projekt
HTTP-odgovor
♦ početni redak (protokol, statusni kod i opis)
! kategorije statusnih kodova:
" 1xx – Informativne - ni uspjeh, ni neuspjeh
" 2xx – Uspjeh - poslužitelj je primio, razumio i ispunio zahtjev
" 3xx – Preusmjeravanje - potrebno poduzeti dodatne akcije
" 4xx – Greška na klijentu - zahtjev je neispravan
" 5xx – Greška na poslužitelju - zahtjev je ispravan, ali ga poslužitelj ne
može ispuniti
♦ u tijelu odgovora se obično prenosi reprezentacija resursa
(“entitet”) koju preglednik treba prikazati korisniku (npr.
HTML)
♦ primjer nekih polja zaglavlja:
! Content-Type: format entiteta
! Content-Length: duljina entiteta u tijelu (u oktetima)
&3314.11.2018.
Zavod za telekomunikacije
Projekt
Primjer: sensors
♦ popis očitanja senzora
♦ inicijalizacija iz datoteke i spremanje u bazu
! podaci:
" Temperature, Pressure, Humidity, CO, NO2, SO2
" datoteka CSV - biblioteka OpenCSV - Tutorial
♦ prikaz u JSON-u (REST)
! uređivanje (dodavanje, promjena, brisanje) podataka
&3414.11.2018.
Zavod za telekomunikacije
Projekt
Spring Boot DevTools
♦ Kod razvoja ubrzavaju ponovno učitavanje resursa i klasa
! dodati knjižnicu u build.gradle:
compile('org.springframework.boot:spring-boot-devtools')
♦ Kada se program prevede ponovno se učitaju klase na
poslužitelju
♦ Ponovno učitavanje resursa iz preglednika
! treba instalirati plugin u preglednik: http://livereload.com/extensions/
♦ više na: https://spring.io/blog/2015/06/17/devtools-in-spring-
boot-1-3
&3514.11.2018.
Zavod za telekomunikacije
Projekt
Stvaranje Spring projekta
♦ otvoriti stranicu https://start.spring.io
♦ klik na "Switch to the full version"
♦ odabrati: Gradle Project
♦ popuniti:
! Group: hr.fer.spring
! Artifact: sensors
! Name: sensors
! Packaging: Jar
! Java Version: 1.8
! Language: Java
! odabrati: Web, JPA, H2, Actuator, DevTools
! klik na Generate Project
! Eclipse -> import Gradle project
&3614.11.2018.
Zavod za telekomunikacije
Projekt
Učitavanje podataka iz datoteke (1)
public	class	SensorReading	{	
			private	String	temperature,	pressure,	humidity,	co,	no2,	so2;	
	//	konstruktori:	bez	argumenata	
			//	set,	get	metode	
			//	toString	
}
&3714.11.2018.
Zavod za telekomunikacije
Projekt
Učitavanje podataka iz datoteke (2)
@SpringBootApplication	
public	class	SensorsApplication	implements	CommandLineRunner	{	
...	
	 @Override	
	 public	void	run(String...	args)	throws	Exception	{	
	 	 List<SensorReading>	readings	=	loadData();	
	 	 readings.stream().forEach(System.out::println);	
	 }	
	 private	List<SensorReading>	loadData()	throws	Exception	{	
	 	 String	fileName	=	"mjerenja.csv";	
	 	 return	new	CsvToBeanBuilder<SensorReading>(	
									new	FileReader(fileName))	
	 	 	 	.withType(SensorReading.class).build().parse();	
	 }	
}
&3814.11.2018.
Zavod za telekomunikacije
Projekt &39
JPA
Java Persistance API
14.11.2018.
Zavod za telekomunikacije
Projekt
Java Persistence API - JPA
♦ specifikacija JPA 2.0 - JSR 317
♦ omogućuje programeru preslikavanje, spremanje promjenu i
dohvaćanje podataka iz/u objekata u/iz bazu/e podataka
♦ popularne implementacije:
! Hibernate (podrazumijevano se koristi u Springu)
! EclipseLink - referentna implementacija
! Apache OpenJPA
♦ entitet je klasa koja se može spremiti u bazu podataka
! mora biti označena bilješkom
♦ koristi se Java Persistence Query Language (JPQL)
! sličan SQL-u
&4014.11.2018.
Zavod za telekomunikacije
Projekt
Bilješke (javax.persistence) - tutorial
♦ atributi ili metode get/set
" Ne smije se miješati označavanje atributa i metoda. Treba odabrati samo jedan način u jednoj klasi.
! @Column	(name="newColumnName") - označavanje kolone
! @Id - jedinstveni identifikator
! @GeneratedValue - zajedno s @Id označava da je vrijednost generirana automatski
! @Transient - atribut neće biti spremljen u bazu
! @NotNull - ne smije biti null
! @ElementCollection(fetch=EAGER ili LAZY) - označava kolekcije
♦ klasa
! @Entity - označava da je klase entitet koji se preslikava
♦ relacije
! @OneToOne(mappedBy="attributeOfTheOwningClass")	
! @OneToMany(mappedBy="attributeOfTheOwningClass")	
! @ManyToOne	
! @ManyToMany
&4114.11.2018.
Zavod za telekomunikacije
Projekt
Klasa SensorReading - entitet
@Entity	
public	class	SensorReading	{	
	 @Id	
	 private	Integer	id;	
	 private	String	temperature,	pressure,	humidity,	co,	no2,	so2;	
...	
}
&4214.11.2018.
Zavod za telekomunikacije
Projekt
Klasa PersonRepository
//	Person	je	objekt,	a	Long	je	ključ	
public	interface	SensorRepository	extends		
		JpaRepository<SensorReading,	Long>	{		
}
&4314.11.2018.
Zavod za telekomunikacije
Projekt
Spremanje podataka
@SpringBootApplication	
public	class	SensorsApplication	implements	CommandLineRunner	{	
	 @Autowired	
	 SensorRepository	repo;	
...	
	 @Override	
	 public	void	run(String...	args)	throws	Exception	{	
	 	 List<SensorReading>	readings	=	loadData();	
	 	 //	prepare	data	for	saving	
	 	 int	i	=	0;	
	 	 for(SensorReading	reading:	readings)	{	
	 	 	 reading.setId(i++);	
	 	 }	
	 	 	
	 	 repo.save(readings);	
	 	 	
	 	 readings.stream().forEach(System.out::println);	
	 }	
...
&4414.11.2018.
Zavod za telekomunikacije
Projekt
H2 konzola
♦ na poveznici http://localhost:8080/h2-console
! imamo konzolu za pregledavanje baze podataka
! spajamo se na: jdbc:h2:mem:testdb
&4514.11.2018.
Zavod za telekomunikacije
Projekt
Eksterna baza podataka - postgres
♦ pokrenuti bazu i pomoću pgAdmina stvoriti bazu s imenom
sensors
♦ u gradle.build zamijeniti H2 s PostreSQL-om
...
dependencies {
...
//runtime('com.h2database:h2')
runtime('org.postgresql:postgresql')
}
...
♦ u application.properties dodati
spring.datasource.url= jdbc:postgresql://localhost:5432/sensors
spring.datasource.username=postgres
spring.datasource.password=
# none, validate, update, create, create-drop
spring.jpa.hibernate.ddl-auto=create
&4614.11.2018.
Ak.god. 2018./2019.
Projekt
REST
Zavod za telekomunikacije
Projekt
Web-usluge temeljene prijenosu prikaza stanja resursa (REST)
♦ REST (Representational State Transfer)
♦ pojmovi: The REST Way ili RESTful services
♦ pojam je skovao Roy Fielding u svojoj doktorskoj disertaciji
♦ nije standard već arhitekturni stil
♦ sve se temelji na resursima koji su predstavljeni URL-ovima:
➡ http://localhost:8080/persons - popis svih korisnika
➡ http://localhost:8080/persons/1 - korisnik s identifikatorom 1
♦ koristi protokol: HTTP (GET, POST, PUT, DELETE, PATCH)
♦ koristi podatke: JSON, XML, sirovi (npr. za slike, video)
♦ bez stanja (stateless), priručni spremnik (cache)
&4814.11.2018.
Zavod za telekomunikacije
Projekt
Arhitektura web-aplikacije (REST)
&4914.11.2018.
sloj pristupa
podacima
sloj poslovne
logike
@Service
:PersonService
repository
:PersonRepository
4: dohvaća i
sprema
podatke
@Entity
:Person
sloj usluge
web-poslužitelj (REST)
1: HTTP
zahtjev
2: obradi(HttpRequest)
7: HTTP
odgovor
@RestController
:PersonResource
3: poziva
Jackson
mapping
5:proslijediobradu
(PersonRepresentation)
6: JSON
ili XML
Person
Representation
@Entity
:Person
Zavod za telekomunikacije
Projekt
Format JSON (Javascript Object Notation)
♦ podatak - par: ime/vrijednost
"firstName":"Pero"
! vrijednosti mogu biti:
" broj, string, boolean (true, false), polje, objekt, null
♦ objekt su parovi u vitičastim zagradama, npr.:
{ "firstName" : "Pero", "lastName" : "Perić" }
! ime u objektu mora biti jedinstveno
♦ polje su vrijednosti u uglatim zagradama, npr.:
[ { "name": "Pero Perić", ... }, 

{ "name": "Iva Ivić", ... }, 

...]
&5014.11.2018.
Zavod za telekomunikacije
Projekt
Primjer zahtjeva i odgovora
• HTTP GET http://localhost:8080/currentReading
{	
				"id":	82,	
				"temperature":	"21",	
				"pressure":	"995",	
				"humidity":	"64",	
				"co":	"187",	
				"no2":	"",	
				"so2":	"0"	
}
&5114.11.2018.
Zavod za telekomunikacije
Projekt
Primjer REST kontrolera
@RestController	
public	class	SensorReadingController	{	
	 private	SensorRepository	repo;	
	 	
	 public	SensorReadingController(SensorRepository	repo)	{	
	 	 this.repo	=	repo;	
	 }	
	 @GetMapping("/currentReading")	
	 public	SensorReading	currentReading()	{	
	 	 LocalTime	time	=	LocalTime.now();	
	 	 int	id	=	time.getHour()	*	4	+	time.getMinute()	/	15;	
	 	 return	repo.findOne(id);	
	 }	
}	
&5214.11.2018.
Zavod za telekomunikacije
Projekt
Tipično korištenje usluga REST
♦ za Create, Read, Update and Delete (CRUD)
♦ primjer gotove usluge: Twitter
&5314.11.2018.
HTTP CRUD
POST Create, (Overwrite/Replace)
GET Read
PUT Update, (Create, Delete)
DELETE Delete
PATCH Partial update
Zavod za telekomunikacije
Projekt
Primjer dohvaćanja
♦ Chrome extensions (https://chrome.google.com/webstore/search/rest):
! Advanced Rest Client ili
! Postman
♦ u terminalu:
! curl
! HTTPie
&5414.11.2018.
Zavod za telekomunikacije
Projekt
Vrata poslužitelja
♦ u application.properties dodati
server.port=8000
&5514.11.2018.
Zavod za telekomunikacije
Projekt
Instaliranje aplikacije na udaljenom računalu (1)
♦ Prevođenje Mavenom ili Gradleom rezultira izradom jara koji
u sebi ima sve ovisnosti
♦ Prenošenje jara na odredišno računalo
! Uobičajeno je da se prenosi pomoću ssh protokola
" Windows: WinSCP ili instaliranjem Windows Subsystem for Linux (WSL) -
video
" Linux/Unix: komanda scp
# scp	[[user@]host1:]file1	...	[[user@]host2:]file2	
♦ Spajanje pomoću SSH na poslužitelj:
" Windows: alat Putty
" Linux/Unix: komanda ssh
# ssh	{user}@{host}
&5614.11.2018.
Zavod za telekomunikacije
Projekt
Instaliranje aplikacije na udaljenom računalu (2)
♦ Pokretanje poslužitelja
! Pokreće se s java	-jar	{datoteka}.jar
" Ako samo tako pokrenemo nakon odspajanja od poslužitelja taj proces će se
ugasiti pa je zato potrebno koristiti mehanizme koji će to spriječiti
! Korištenje alata screen - tutorial - shortcuts
" screen	-S	ime - pokretanje screena s imenom sjednice
" C-a	d - odspajanje iz screena
" screen	-ls - ispis sjednica
" screen	-r	ime - spajanje na postojeću sjednicu
" C-a	c - stvaranje novog prozora u screenu
" C-a	" - vizualno prebacivanje u novi prozor
" C-a	ESC - micanje kursorom po prozoru screena, ENTER za izlazak
&5714.11.2018.

More Related Content

Similar to Spring - preddiplomski 2018./2019.

Panel diskusija - usporedba Web frameworka (IT Showoff)
Panel diskusija - usporedba Web frameworka (IT Showoff)Panel diskusija - usporedba Web frameworka (IT Showoff)
Panel diskusija - usporedba Web frameworka (IT Showoff)
IT Showoff
 
(WS14) Tomislav Tipuric - Cloud kao aplikacijska platforma
(WS14) Tomislav Tipuric - Cloud kao aplikacijska platforma(WS14) Tomislav Tipuric - Cloud kao aplikacijska platforma
(WS14) Tomislav Tipuric - Cloud kao aplikacijska platformaWeb::Strategija
 
Mobile development
Mobile developmentMobile development
Mobile development
Kruno Ris
 
PHP za pocetnike - predavanje 7
PHP za pocetnike - predavanje 7PHP za pocetnike - predavanje 7
PHP za pocetnike - predavanje 7
Nermin Sehic
 
Mean Stack JavaCro 2014
Mean Stack JavaCro 2014Mean Stack JavaCro 2014
Mean Stack JavaCro 2014
Nenad Pecanac
 
Angular 2 and TypeScript - 2016 Dump Day
Angular 2 and TypeScript - 2016 Dump DayAngular 2 and TypeScript - 2016 Dump Day
Angular 2 and TypeScript - 2016 Dump Day
NETMedia
 
Kako pretvoriti server_sobu_u_cloud
Kako pretvoriti server_sobu_u_cloudKako pretvoriti server_sobu_u_cloud
Kako pretvoriti server_sobu_u_cloud
Dubravko Marak
 
JavaCro'14 - Is there a single “correct” web architecture for business apps –...
JavaCro'14 - Is there a single “correct” web architecture for business apps –...JavaCro'14 - Is there a single “correct” web architecture for business apps –...
JavaCro'14 - Is there a single “correct” web architecture for business apps –...
HUJAK - Hrvatska udruga Java korisnika / Croatian Java User Association
 
REST API - iskustva iz prakse
REST API - iskustva iz prakseREST API - iskustva iz prakse
REST API - iskustva iz prakse
Denis Kranjčec
 
Backend, MVC, languages and frameworks for Backend
Backend, MVC, languages and frameworks for BackendBackend, MVC, languages and frameworks for Backend
Backend, MVC, languages and frameworks for Backend
Dragos Strugar
 
Vert.x - asinkroni skalabilni i poliglotni framework nove generacije
Vert.x - asinkroni skalabilni i poliglotni framework nove generacijeVert.x - asinkroni skalabilni i poliglotni framework nove generacije
Vert.x - asinkroni skalabilni i poliglotni framework nove generacije
Mihovil Rister
 
Javantura Zagreb 2014 - Vert.x 1.3 - Mihovil Rister
Javantura Zagreb 2014 - Vert.x 1.3 - Mihovil RisterJavantura Zagreb 2014 - Vert.x 1.3 - Mihovil Rister
Javantura Zagreb 2014 - Vert.x 1.3 - Mihovil Rister
HUJAK - Hrvatska udruga Java korisnika / Croatian Java User Association
 
Vert.x - Mihovil Rister, Javantura
Vert.x - Mihovil Rister, JavanturaVert.x - Mihovil Rister, Javantura
Vert.x - Mihovil Rister, Javantura
Five
 
JavaCro'14 - MEAN Stack – How & When – Nenad Pećanac
JavaCro'14 - MEAN Stack – How & When – Nenad PećanacJavaCro'14 - MEAN Stack – How & When – Nenad Pećanac
JavaCro'14 - MEAN Stack – How & When – Nenad Pećanac
HUJAK - Hrvatska udruga Java korisnika / Croatian Java User Association
 
[TVZ računarstvo] Dinamičke web aplikacije, predavanje 9.
[TVZ računarstvo] Dinamičke web aplikacije, predavanje 9. [TVZ računarstvo] Dinamičke web aplikacije, predavanje 9.
[TVZ računarstvo] Dinamičke web aplikacije, predavanje 9.
Stipe Predanic
 
Kako izvuci (naj)vise iz vaseg share pointa 2013
Kako izvuci (naj)vise iz vaseg share pointa 2013Kako izvuci (naj)vise iz vaseg share pointa 2013
Kako izvuci (naj)vise iz vaseg share pointa 2013
Matija Blagus
 
Javantura Zagreb 2014 - Java na klijenstskoj strani - Ivan Vučak
Javantura Zagreb 2014 - Java na klijenstskoj strani - Ivan VučakJavantura Zagreb 2014 - Java na klijenstskoj strani - Ivan Vučak
Javantura Zagreb 2014 - Java na klijenstskoj strani - Ivan Vučak
HUJAK - Hrvatska udruga Java korisnika / Croatian Java User Association
 

Similar to Spring - preddiplomski 2018./2019. (20)

Panel diskusija - usporedba Web frameworka (IT Showoff)
Panel diskusija - usporedba Web frameworka (IT Showoff)Panel diskusija - usporedba Web frameworka (IT Showoff)
Panel diskusija - usporedba Web frameworka (IT Showoff)
 
(WS14) Tomislav Tipuric - Cloud kao aplikacijska platforma
(WS14) Tomislav Tipuric - Cloud kao aplikacijska platforma(WS14) Tomislav Tipuric - Cloud kao aplikacijska platforma
(WS14) Tomislav Tipuric - Cloud kao aplikacijska platforma
 
Mobile development
Mobile developmentMobile development
Mobile development
 
PHP za pocetnike - predavanje 7
PHP za pocetnike - predavanje 7PHP za pocetnike - predavanje 7
PHP za pocetnike - predavanje 7
 
Mean Stack JavaCro 2014
Mean Stack JavaCro 2014Mean Stack JavaCro 2014
Mean Stack JavaCro 2014
 
Angular 2 and TypeScript - 2016 Dump Day
Angular 2 and TypeScript - 2016 Dump DayAngular 2 and TypeScript - 2016 Dump Day
Angular 2 and TypeScript - 2016 Dump Day
 
Kako pretvoriti server_sobu_u_cloud
Kako pretvoriti server_sobu_u_cloudKako pretvoriti server_sobu_u_cloud
Kako pretvoriti server_sobu_u_cloud
 
JavaCro'14 - Is there a single “correct” web architecture for business apps –...
JavaCro'14 - Is there a single “correct” web architecture for business apps –...JavaCro'14 - Is there a single “correct” web architecture for business apps –...
JavaCro'14 - Is there a single “correct” web architecture for business apps –...
 
REST API - iskustva iz prakse
REST API - iskustva iz prakseREST API - iskustva iz prakse
REST API - iskustva iz prakse
 
Backend, MVC, languages and frameworks for Backend
Backend, MVC, languages and frameworks for BackendBackend, MVC, languages and frameworks for Backend
Backend, MVC, languages and frameworks for Backend
 
Programski jezik java
Programski jezik javaProgramski jezik java
Programski jezik java
 
Programski jezik java
Programski jezik javaProgramski jezik java
Programski jezik java
 
Vert.x - asinkroni skalabilni i poliglotni framework nove generacije
Vert.x - asinkroni skalabilni i poliglotni framework nove generacijeVert.x - asinkroni skalabilni i poliglotni framework nove generacije
Vert.x - asinkroni skalabilni i poliglotni framework nove generacije
 
Javantura Zagreb 2014 - Vert.x 1.3 - Mihovil Rister
Javantura Zagreb 2014 - Vert.x 1.3 - Mihovil RisterJavantura Zagreb 2014 - Vert.x 1.3 - Mihovil Rister
Javantura Zagreb 2014 - Vert.x 1.3 - Mihovil Rister
 
Vert.x - Mihovil Rister, Javantura
Vert.x - Mihovil Rister, JavanturaVert.x - Mihovil Rister, Javantura
Vert.x - Mihovil Rister, Javantura
 
JavaCro'14 - MEAN Stack – How & When – Nenad Pećanac
JavaCro'14 - MEAN Stack – How & When – Nenad PećanacJavaCro'14 - MEAN Stack – How & When – Nenad Pećanac
JavaCro'14 - MEAN Stack – How & When – Nenad Pećanac
 
[TVZ računarstvo] Dinamičke web aplikacije, predavanje 9.
[TVZ računarstvo] Dinamičke web aplikacije, predavanje 9. [TVZ računarstvo] Dinamičke web aplikacije, predavanje 9.
[TVZ računarstvo] Dinamičke web aplikacije, predavanje 9.
 
Kako izvuci (naj)vise iz vaseg share pointa 2013
Kako izvuci (naj)vise iz vaseg share pointa 2013Kako izvuci (naj)vise iz vaseg share pointa 2013
Kako izvuci (naj)vise iz vaseg share pointa 2013
 
Javantura Zagreb 2014 - Java na klijenstskoj strani - Ivan Vučak
Javantura Zagreb 2014 - Java na klijenstskoj strani - Ivan VučakJavantura Zagreb 2014 - Java na klijenstskoj strani - Ivan Vučak
Javantura Zagreb 2014 - Java na klijenstskoj strani - Ivan Vučak
 
Oblikovni obrasci
Oblikovni obrasciOblikovni obrasci
Oblikovni obrasci
 

Spring - preddiplomski 2018./2019.

  • 1. Ak.god. 2018./2019. Projekt Preddiplomski projekt Uvod u Spring Zaštićeno licencom http://creativecommons.org/licenses/by-nc-sa/2.5/hr/
  • 2. Zavod za telekomunikacije Projekt Creative Commons ■ slobodno smijete: l dijeliti — umnožavati, distribuirati i javnosti priopćavati djelo l remiksirati — prerađivati djelo ■ pod sljedećim uvjetima: l imenovanje. Morate priznati i označiti autorstvo djela na način kako je specificirao autor ili davatelj licence (ali ne način koji bi sugerirao da Vi ili Vaše korištenje njegova djela imate njegovu izravnu podršku). l nekomercijalno. Ovo djelo ne smijete koristiti u komercijalne svrhe. l dijeli pod istim uvjetima. Ako ovo djelo izmijenite, preoblikujete ili stvarate koristeći ga, preradu možete distribuirati samo pod licencom koja je ista ili slična ovoj. U slučaju daljnjeg korištenja ili distribuiranja morate drugima jasno dati do znanja licencne uvjete ovog djela. Najbolji način da to učinite je linkom na ovu internetsku stranicu. Od svakog od gornjih uvjeta moguće je odstupiti, ako dobijete dopuštenje nositelja autorskog prava. Ništa u ovoj licenci ne narušava ili ograničava autorova moralna prava. Tekst licencije preuzet je s http://creativecommons.org/. &214.11.2018.
  • 3. Zavod za telekomunikacije Projekt Sadržaj predavanja ♦ Gradle ♦ Spring ♦ Spring boot ♦ Povezivanje s bazom podataka (unutarnjom i vanjskom) ♦ Entiteti ♦ Spring Boot devtools ♦ HTTP ♦ REST ♦ Instaliranje na poslužitelj &314.11.2018.
  • 4. Zavod za telekomunikacije Projekt Gradle ♦ alat za izgradnju aplikacija i sustava poput: Maven, Ant, Make ! poslovi: compile, test, package, run, deploy, ... ♦ temelji se na jeziku Groovy ♦ koristi pakete koji se koriste u Mavenu ! http://search.maven.org ♦ lakše se proširuje nego Maven (može biti dobro ili loše) ♦ datoteka koja definira projekt: build.gradle ♦ obično se projekt distribuira sa alatom gradle i popratnim skriptama ♦ potrebna mu je samo Java za izvršavanje ♦ adresa: http://gradle.org/ ♦ Eclipse plugin - dolazi ugrađen &414.11.2018.
  • 5. Zavod za telekomunikacije Projekt Spring Framework - http://spring.io ♦ prva verzija 2003. koju je napravio Rod Johnson ♦ radni okvir za lakši razvoj aplikacija ♦ bavi se konfiguracijom objekata u sustavu (IoC – inversion of control) ! upravlja poslovnim objektima kao običnim objektima (POJO – plain old java objects) ! brine se za kreiranje objekata ! povezuje kreirane objekte (IoC, wiring up, DI - dependency injection) ! upravlja njihovim životnim ciklusom ♦ složene veze između objekata se definiraju u XML-u ili pomoću bilješki (annotation) ♦ odvaja poslovnu logiku od mehanizama za ispravan rad sustava (transakcije, logiranje, ...) ♦ vrlo je složen za početnika jer ima puno stvari ugrađeno &514.11.2018.
  • 6. Zavod za telekomunikacije Projekt Mogućnosti Spring Frameworka ♦ POJO ♦ DI / AOP (Aspect Oriented Programming) ♦ logging ♦ timers, asynchronous calls ♦ lako testiranje ♦ Web MVC (Model View Controller) / REST ♦ ORM (Object Relational Mapping), JDBC, Hibernate, JDO ♦ sigurnost ♦ ... &614.11.2018.
  • 7. Zavod za telekomunikacije Projekt Arhitektura Spring Frameworka - dokumentacija &714.11.2018.
  • 8. Zavod za telekomunikacije Projekt Projekti unutar spring.io ♦ Spring IO Platform ♦ Spring Boot ♦ Spring Framework ♦ Spring Cloud Data Flow ♦ Spring Cloud ♦ Spring Data ♦ Spring Integration ♦ Spring Security ♦ ... &814.11.2018.
  • 9. Zavod za telekomunikacije Projekt Spring Boot ♦ jedan od podprojekata Springa ! http://projects.spring.io/spring-boot/ ♦ pojednostavnjuje korištenje Springa, pogotovo stvaranje novog projekta ♦ podržava: ! automatsku konfiguraciju ! pretraživanja klasa na putu (path) ♦ aplikacija ima manje koda ♦ kod web-aplikacija - omogućuje izradu samostalnih aplikacija ! web-poslužitelj zapakiran u jar ! jednostavnije instaliranje ! aplikacija spremna za produkcijsku okolinu ♦ primjeri projekata ♦ Spring framework guru tutorials &914.11.2018.
  • 10. Zavod za telekomunikacije Projekt Spring u Eclipseu ♦ Za Eclipse postoji plugin Spring Tools 4 ♦ Instalacija ! instalirati STS preko Eclipse Marketplacea ♦ Trenutna verzija je STS 4.0.1 ♦ Projekt možemo napraviti pomoću: ! File -> New -> Spring Starter Project ili ! napraviti projekt preko web-stranice http://start.spring.io " pa onda napraviti import &1014.11.2018.
  • 11. Zavod za telekomunikacije Projekt Izrada jednostavnog projekta (1) ♦ otići na stranicu http://start.spring.io ili ♦ odabrati: ! Gradle project ! Spring Boot: 1.5.17 ! Group: hr.fer.ilj.spring.example ! Artifact: simple ! klik na Generate Project - skinuti će se zip s projektom ♦ Eclipse: ! kopirati direktorij projekta u workspace ! File -> Import -> Gradle/Existing Gradle Project ! Root Folder staviti na odzipani projekt ! Next -> Next ! odabrati projekt ! klik na Finish &1114.11.2018.
  • 12. Zavod za telekomunikacije Projekt Izrada jednostavnog projekta (2) ♦ struktura projekta ♦ pogledati: ! SimpleApplication " klasa koja se pokreće ! build.gradle " skripta za "građenje" ! application.properties " vanjska konfiguracija &1214.11.2018.
  • 13. Zavod za telekomunikacije Projekt Klasa SimpleApplication package hr.fer.ilj.simple;
 
 import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
 
 
 @SpringBootApplication
 public class SimpleApplication {
 
 public static void main(String[] args) {
 SpringApplication.run(SimpleApplication.class, args); }
 }
 &1314.11.2018.
  • 14. Zavod za telekomunikacije Projekt SimpleApplication - pokretanje import org.springframework.boot.CommandLineRunner;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 @SpringBootApplication
 public class SimpleApplication implements CommandLineRunner {
 
 public static void main(String[] args) {
 SpringApplication.run(SimpleApplication.class, args);
 }
 
 @Override
 public void run(String... args) throws Exception {
 System.out.println("**************");
 }
 } &1414.11.2018.
  • 15. Zavod za telekomunikacije Projekt Ispis svih beanova @SpringBootApplication
 public class SimpleApplication implements CommandLineRunner {
 
 public static void main(String[] args) {
 ApplicationContext ctx = SpringApplication.run( SimpleApplication.class, args);
 
 for(String name: ctx.getBeanDefinitionNames())
 System.out.println(name);
 } ... }
 &1514.11.2018.
  • 16. Zavod za telekomunikacije Projekt Beanovi i DI (Dependency Injection) ♦ Objekte koje stvara i s kojima upravalja Springov kontejner se zovu beanovi ♦ DI - dependency injection ! objekti definiraju ovisnosti o drugim objektima ! mora imati ili: atribute, setere ili konstruktor kroz koji se ovisnosti postavljaju ! kontejner onda ubacuje ovisnosti kada stvara baenove ! koristi posebne metode za instanciranje i postavljanje ovisnih objekata da bi objekti normalno funkcionirali ♦ doseg beanova - @Scope("tip") ! singleton (podrazumijevano) - jedna instanca u JVM-u ! prototip - novi objekt svaki put kada se zahtjeva bean ! zahtjev (request) - kod svakog zahtjeva se stvara novi bean ! sjednica (session) - za svakog korisnika jedan bean ! globalna sjednica - koristi se kod portleta &1614.11.2018.
  • 17. Zavod za telekomunikacije Projekt Ubrizgavanje beanova (1) @SpringBootApplication
 public class SimpleApplication implements CommandLineRunner {
 ... @Override
 public void run(String... args) throws Exception {
 System.out.println("**************");
 
 for(String name: ctx.getBeanDefinitionNames())
 System.out.println(name);
 }
 } &1714.11.2018.
  • 18. Zavod za telekomunikacije Projekt Ubrizgavanje beanova (2) 1. preko atributa (field) @Autowired
 private ApplicationContext ctx; 2. preko konstruktora private ApplicationContext ctx;
 
 public SimpleApplication(ApplicationContext ctx) {
 this.ctx = ctx;
 } 3. preko setera private ApplicationContext ctx;
 
 @Autowired
 public void setCtx(ApplicationContext ctx) {
 this.ctx = ctx;
 } &1814.11.2018.
  • 19. Zavod za telekomunikacije Projekt Definiranje beanova ♦ dva načina: ! u konfiguracijskoj klasi (npr. SimpleApplication) definirati metodu koja je označena da vraća bean (@Bean) ! označiti klasu s @Component " mehanizam pretraživanja puta može pronaći takvu klasu " podvrste: # @Controller - predstavlja kontroler u Web MVC-u # @Service - predstavlja namjeru da je to usluga # @Repository - predstavlja komponentu koja pristupa podacima # @RestController - predstavlja kontroler u Web MVC-u koja vraća podatke koji se serializiraju u JSON ili XML &1914.11.2018.
  • 20. Zavod za telekomunikacije Projekt GreetingService - POJO 
 public class GreetingService {
 
 public String hello() {
 return "Bok!";
 }
 } &2014.11.2018.
  • 21. Zavod za telekomunikacije Projekt GreetingService - ubrizgavanje @SpringBootApplication
 public class SimpleApplication implements CommandLineRunner {
 private GreetingService greetingService;
 
 @Autowired
 public void setGreetingService(GreetingService greetingService) {
 this.greetingService = greetingService;
 }
 
 @Override
 public void run(String... args) throws Exception {
 System.out.println("**************");
 System.out.println(greetingService.hello());
 }
 ... } &2114.11.2018.
  • 22. Zavod za telekomunikacije Projekt Bean GreetingService definiran u konfiguraciji @SpringBootApplication
 public class SimpleApplication implements CommandLineRunner {
 ... 
 @Bean
 public GreetingService getService() {
 return new GreetingService();
 }
 } 
 public class GreetingService {
 public String hello() {
 return "Bok!";
 }
 } 
 &2214.11.2018.
  • 23. Zavod za telekomunikacije Projekt Bean GreetingService definiran u klasi @Service
 public class GreetingService {
 
 public String hello() {
 return "Bok!";
 }
 }
 &2314.11.2018.
  • 24. Zavod za telekomunikacije Projekt SimpleApplication - loading configuration package hr.fer.tel.spring.example; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class SimpleApplication implements CommandLineRunner { @Autowired private MyProps props; public static void main(String[] args) { SpringApplication.run(SimpleApplication.class, args); } @Override public void run(String... args) throws Exception { System.out.println("*********** " + props.getText()); } } &2414.11.2018.
  • 25. Zavod za telekomunikacije Projekt My Properties package hr.fer.tel.spring.example; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class MyProps { @Value("${prop.name}") private String someText; public String getText() { return someText; } } &2514.11.2018.
  • 26. Zavod za telekomunikacije Projekt application.properties prop.name=My text from properties file. &2614.11.2018. Više o načinima podešavanja konfiguracije mžete naći u dokumentaciji u poglavlju 24. Externalized Configuration
  • 27. Zavod za telekomunikacije Projekt &27 Web / HTTP 14.11.2018.
  • 28. Zavod za telekomunikacije Projekt Protokol Hypertext Transfer Protocol (HTTP) ♦ internetski protokol aplikacijskog sloja ♦ definira format i način razmjene poruka ! tekstualan zapis, sličan formatu e-mail poruke i standarda MIME ♦ vrste poruka: ! zahtjev (“metoda”) " definira operaciju (metodu), resurs, protokol " naziv "metoda" potječe područja objektno-orijentiranog programiranja ! odgovor (rezultat) " rezultat (uspjeh, neuspjeh, greška,...) opisan statusnim kôdom " neke vrste odgovora u tijelu imaju sadržaj zatraženog resursa &2814.11.2018.
  • 29. Zavod za telekomunikacije Projekt Primjer HTTP-zahtjeva 1.GET /predmet/rassus HTTP/1.1 2.Host: www.fer.unizg.hr 3.User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv: 7.0.1) Gecko/20100101 Firefox/7.0.1 4.Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/ *;q=0.8 5.Accept-Language: hr,en;q=0.7,en-us;q=0.3 6.Accept-Encoding: gzip, deflate 7.Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 8.Connection: keep-alive 9.Cache-Control: max-age=0 &2914.11.2018.
  • 30. Zavod za telekomunikacije Projekt Primjer HTTP-zahtjeva 1.GET /predmet/rassus HTTP/1.1 2.Host: www.fer.unizg.hr 3.User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv: 7.0.1) Gecko/20100101 Firefox/7.0.1 4.Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/ *;q=0.8 5.Accept-Language: hr,en;q=0.7,en-us;q=0.3 6.Accept-Encoding: gzip, deflate 7.Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 8.Connection: keep-alive 9.Cache-Control: max-age=0 &2914.11.2018. početni redak
  • 31. Zavod za telekomunikacije Projekt Primjer HTTP-zahtjeva 1.GET /predmet/rassus HTTP/1.1 2.Host: www.fer.unizg.hr 3.User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv: 7.0.1) Gecko/20100101 Firefox/7.0.1 4.Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/ *;q=0.8 5.Accept-Language: hr,en;q=0.7,en-us;q=0.3 6.Accept-Encoding: gzip, deflate 7.Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 8.Connection: keep-alive 9.Cache-Control: max-age=0 &2914.11.2018. početni redak polja zaglavlja: opća zaglavlja
 zaglavlja karakteristična za zahtjev ili odgovor zaglavlja karakteristična za entitet
  • 32. Zavod za telekomunikacije Projekt Primjer HTTP-zahtjeva 1.GET /predmet/rassus HTTP/1.1 2.Host: www.fer.unizg.hr 3.User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv: 7.0.1) Gecko/20100101 Firefox/7.0.1 4.Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/ *;q=0.8 5.Accept-Language: hr,en;q=0.7,en-us;q=0.3 6.Accept-Encoding: gzip, deflate 7.Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 8.Connection: keep-alive 9.Cache-Control: max-age=0 &2914.11.2018. početni redak polja zaglavlja: opća zaglavlja
 zaglavlja karakteristična za zahtjev ili odgovor zaglavlja karakteristična za entitet prazan redak
  • 33. Zavod za telekomunikacije Projekt Primjer HTTP-zahtjeva 1.GET /predmet/rassus HTTP/1.1 2.Host: www.fer.unizg.hr 3.User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv: 7.0.1) Gecko/20100101 Firefox/7.0.1 4.Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/ *;q=0.8 5.Accept-Language: hr,en;q=0.7,en-us;q=0.3 6.Accept-Encoding: gzip, deflate 7.Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 8.Connection: keep-alive 9.Cache-Control: max-age=0 &2914.11.2018. početni redak polja zaglavlja: opća zaglavlja
 zaglavlja karakteristična za zahtjev ili odgovor zaglavlja karakteristična za entitet prazan redak tijelo poruke
  • 34. Zavod za telekomunikacije Projekt Primjer HTTP-zahtjeva 1.GET /predmet/rassus HTTP/1.1 2.Host: www.fer.unizg.hr 3.User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv: 7.0.1) Gecko/20100101 Firefox/7.0.1 4.Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/ *;q=0.8 5.Accept-Language: hr,en;q=0.7,en-us;q=0.3 6.Accept-Encoding: gzip, deflate 7.Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 8.Connection: keep-alive 9.Cache-Control: max-age=0 &3014.11.2018.
  • 35. Zavod za telekomunikacije Projekt Primjer HTTP-zahtjeva 1.GET /predmet/rassus HTTP/1.1 2.Host: www.fer.unizg.hr 3.User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv: 7.0.1) Gecko/20100101 Firefox/7.0.1 4.Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/ *;q=0.8 5.Accept-Language: hr,en;q=0.7,en-us;q=0.3 6.Accept-Encoding: gzip, deflate 7.Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 8.Connection: keep-alive 9.Cache-Control: max-age=0 &3014.11.2018. Obavezni dijelovi
  • 36. Zavod za telekomunikacije Projekt Metode zahtjeva ♦ metoda zahtjeva određuje što se traži od resursa ♦ HTTP/1.1 definira 8 metoda i omogućuje dodavanje novih metoda (extensions): ! OPTIONS - informiranje i mogućnostima resursa i poslužitelja ! GET - za dohvaćanje resursa (najčešća) ! HEAD - za dohvaćanje podataka o resursu (npr. veličina, postojanje) ! POST - aktiviranje resursa (npr. slanje podataka obrazaca) ! PUT - postavljanje entiteta (npr. promjena podataka - kod REST-a) ! DELETE - brisanje resursa (npr. kod REST-a) ! TRACE - za dijagnostiku ! CONNECT - za buduću uporabu (ne implementira se) &3114.11.2018.
  • 37. Zavod za telekomunikacije Projekt Primjer HTTP-odgovora 1.HTTP/1.1 200 OK 2.Date: Wed, 12 Oct 2011 08:19:32 GMT 3.Server: Apache/2.2.20 (FreeBSD) mod_ssl/2.2.20 OpenSSL/0.9.8q mod_fcgid/ 2.3.6 4.Expires: Thu, 19 Nov 1981 08:52:00 GMT 5.Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre- check=0 6.Pragma: no-cache 7.P3P: CP="NOI CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa HISa OTPa OUR BUS IND UNI COM NAV INT" 8.Set-Cookie: CMS=2p72ge55hqm92itadsfu83pc25; expires=Wed, 19-Oct-2011 20:19:32 GMT; path=/; domain=www.fer.unizg.hr; HttpOnly 9.Vary: Accept-Encoding 10.Transfer-Encoding: chunked 11.Content-Type: text/html; charset=utf-8 12. 13.d9e7 14.<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:// www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 15.<html xmlns="http://www.w3.org/1999/xhtml"> 16. 17.<head> 18.<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 19. ... &3214.11.2018.
  • 38. Zavod za telekomunikacije Projekt Primjer HTTP-odgovora 1.HTTP/1.1 200 OK 2.Date: Wed, 12 Oct 2011 08:19:32 GMT 3.Server: Apache/2.2.20 (FreeBSD) mod_ssl/2.2.20 OpenSSL/0.9.8q mod_fcgid/ 2.3.6 4.Expires: Thu, 19 Nov 1981 08:52:00 GMT 5.Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre- check=0 6.Pragma: no-cache 7.P3P: CP="NOI CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa HISa OTPa OUR BUS IND UNI COM NAV INT" 8.Set-Cookie: CMS=2p72ge55hqm92itadsfu83pc25; expires=Wed, 19-Oct-2011 20:19:32 GMT; path=/; domain=www.fer.unizg.hr; HttpOnly 9.Vary: Accept-Encoding 10.Transfer-Encoding: chunked 11.Content-Type: text/html; charset=utf-8 12. 13.d9e7 14.<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:// www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 15.<html xmlns="http://www.w3.org/1999/xhtml"> 16. 17.<head> 18.<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 19. ... &3214.11.2018. početni redak
  • 39. Zavod za telekomunikacije Projekt Primjer HTTP-odgovora 1.HTTP/1.1 200 OK 2.Date: Wed, 12 Oct 2011 08:19:32 GMT 3.Server: Apache/2.2.20 (FreeBSD) mod_ssl/2.2.20 OpenSSL/0.9.8q mod_fcgid/ 2.3.6 4.Expires: Thu, 19 Nov 1981 08:52:00 GMT 5.Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre- check=0 6.Pragma: no-cache 7.P3P: CP="NOI CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa HISa OTPa OUR BUS IND UNI COM NAV INT" 8.Set-Cookie: CMS=2p72ge55hqm92itadsfu83pc25; expires=Wed, 19-Oct-2011 20:19:32 GMT; path=/; domain=www.fer.unizg.hr; HttpOnly 9.Vary: Accept-Encoding 10.Transfer-Encoding: chunked 11.Content-Type: text/html; charset=utf-8 12. 13.d9e7 14.<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:// www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 15.<html xmlns="http://www.w3.org/1999/xhtml"> 16. 17.<head> 18.<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 19. ... &3214.11.2018. početni redak polja zaglavlja: opća zaglavlja
 zaglavlja karakteristična za zahtjev ili odgovor zaglavlja karakteristična za entitet
  • 40. Zavod za telekomunikacije Projekt Primjer HTTP-odgovora 1.HTTP/1.1 200 OK 2.Date: Wed, 12 Oct 2011 08:19:32 GMT 3.Server: Apache/2.2.20 (FreeBSD) mod_ssl/2.2.20 OpenSSL/0.9.8q mod_fcgid/ 2.3.6 4.Expires: Thu, 19 Nov 1981 08:52:00 GMT 5.Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre- check=0 6.Pragma: no-cache 7.P3P: CP="NOI CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa HISa OTPa OUR BUS IND UNI COM NAV INT" 8.Set-Cookie: CMS=2p72ge55hqm92itadsfu83pc25; expires=Wed, 19-Oct-2011 20:19:32 GMT; path=/; domain=www.fer.unizg.hr; HttpOnly 9.Vary: Accept-Encoding 10.Transfer-Encoding: chunked 11.Content-Type: text/html; charset=utf-8 12. 13.d9e7 14.<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:// www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 15.<html xmlns="http://www.w3.org/1999/xhtml"> 16. 17.<head> 18.<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 19. ... &3214.11.2018. početni redak polja zaglavlja: opća zaglavlja
 zaglavlja karakteristična za zahtjev ili odgovor zaglavlja karakteristična za entitet prazan redak
  • 41. Zavod za telekomunikacije Projekt Primjer HTTP-odgovora 1.HTTP/1.1 200 OK 2.Date: Wed, 12 Oct 2011 08:19:32 GMT 3.Server: Apache/2.2.20 (FreeBSD) mod_ssl/2.2.20 OpenSSL/0.9.8q mod_fcgid/ 2.3.6 4.Expires: Thu, 19 Nov 1981 08:52:00 GMT 5.Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre- check=0 6.Pragma: no-cache 7.P3P: CP="NOI CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa HISa OTPa OUR BUS IND UNI COM NAV INT" 8.Set-Cookie: CMS=2p72ge55hqm92itadsfu83pc25; expires=Wed, 19-Oct-2011 20:19:32 GMT; path=/; domain=www.fer.unizg.hr; HttpOnly 9.Vary: Accept-Encoding 10.Transfer-Encoding: chunked 11.Content-Type: text/html; charset=utf-8 12. 13.d9e7 14.<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:// www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 15.<html xmlns="http://www.w3.org/1999/xhtml"> 16. 17.<head> 18.<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 19. ... &3214.11.2018. početni redak polja zaglavlja: opća zaglavlja
 zaglavlja karakteristična za zahtjev ili odgovor zaglavlja karakteristična za entitet prazan redak tijelo poruke
  • 42. Zavod za telekomunikacije Projekt HTTP-odgovor ♦ početni redak (protokol, statusni kod i opis) ! kategorije statusnih kodova: " 1xx – Informativne - ni uspjeh, ni neuspjeh " 2xx – Uspjeh - poslužitelj je primio, razumio i ispunio zahtjev " 3xx – Preusmjeravanje - potrebno poduzeti dodatne akcije " 4xx – Greška na klijentu - zahtjev je neispravan " 5xx – Greška na poslužitelju - zahtjev je ispravan, ali ga poslužitelj ne može ispuniti ♦ u tijelu odgovora se obično prenosi reprezentacija resursa (“entitet”) koju preglednik treba prikazati korisniku (npr. HTML) ♦ primjer nekih polja zaglavlja: ! Content-Type: format entiteta ! Content-Length: duljina entiteta u tijelu (u oktetima) &3314.11.2018.
  • 43. Zavod za telekomunikacije Projekt Primjer: sensors ♦ popis očitanja senzora ♦ inicijalizacija iz datoteke i spremanje u bazu ! podaci: " Temperature, Pressure, Humidity, CO, NO2, SO2 " datoteka CSV - biblioteka OpenCSV - Tutorial ♦ prikaz u JSON-u (REST) ! uređivanje (dodavanje, promjena, brisanje) podataka &3414.11.2018.
  • 44. Zavod za telekomunikacije Projekt Spring Boot DevTools ♦ Kod razvoja ubrzavaju ponovno učitavanje resursa i klasa ! dodati knjižnicu u build.gradle: compile('org.springframework.boot:spring-boot-devtools') ♦ Kada se program prevede ponovno se učitaju klase na poslužitelju ♦ Ponovno učitavanje resursa iz preglednika ! treba instalirati plugin u preglednik: http://livereload.com/extensions/ ♦ više na: https://spring.io/blog/2015/06/17/devtools-in-spring- boot-1-3 &3514.11.2018.
  • 45. Zavod za telekomunikacije Projekt Stvaranje Spring projekta ♦ otvoriti stranicu https://start.spring.io ♦ klik na "Switch to the full version" ♦ odabrati: Gradle Project ♦ popuniti: ! Group: hr.fer.spring ! Artifact: sensors ! Name: sensors ! Packaging: Jar ! Java Version: 1.8 ! Language: Java ! odabrati: Web, JPA, H2, Actuator, DevTools ! klik na Generate Project ! Eclipse -> import Gradle project &3614.11.2018.
  • 46. Zavod za telekomunikacije Projekt Učitavanje podataka iz datoteke (1) public class SensorReading { private String temperature, pressure, humidity, co, no2, so2; // konstruktori: bez argumenata // set, get metode // toString } &3714.11.2018.
  • 47. Zavod za telekomunikacije Projekt Učitavanje podataka iz datoteke (2) @SpringBootApplication public class SensorsApplication implements CommandLineRunner { ... @Override public void run(String... args) throws Exception { List<SensorReading> readings = loadData(); readings.stream().forEach(System.out::println); } private List<SensorReading> loadData() throws Exception { String fileName = "mjerenja.csv"; return new CsvToBeanBuilder<SensorReading>( new FileReader(fileName)) .withType(SensorReading.class).build().parse(); } } &3814.11.2018.
  • 48. Zavod za telekomunikacije Projekt &39 JPA Java Persistance API 14.11.2018.
  • 49. Zavod za telekomunikacije Projekt Java Persistence API - JPA ♦ specifikacija JPA 2.0 - JSR 317 ♦ omogućuje programeru preslikavanje, spremanje promjenu i dohvaćanje podataka iz/u objekata u/iz bazu/e podataka ♦ popularne implementacije: ! Hibernate (podrazumijevano se koristi u Springu) ! EclipseLink - referentna implementacija ! Apache OpenJPA ♦ entitet je klasa koja se može spremiti u bazu podataka ! mora biti označena bilješkom ♦ koristi se Java Persistence Query Language (JPQL) ! sličan SQL-u &4014.11.2018.
  • 50. Zavod za telekomunikacije Projekt Bilješke (javax.persistence) - tutorial ♦ atributi ili metode get/set " Ne smije se miješati označavanje atributa i metoda. Treba odabrati samo jedan način u jednoj klasi. ! @Column (name="newColumnName") - označavanje kolone ! @Id - jedinstveni identifikator ! @GeneratedValue - zajedno s @Id označava da je vrijednost generirana automatski ! @Transient - atribut neće biti spremljen u bazu ! @NotNull - ne smije biti null ! @ElementCollection(fetch=EAGER ili LAZY) - označava kolekcije ♦ klasa ! @Entity - označava da je klase entitet koji se preslikava ♦ relacije ! @OneToOne(mappedBy="attributeOfTheOwningClass") ! @OneToMany(mappedBy="attributeOfTheOwningClass") ! @ManyToOne ! @ManyToMany &4114.11.2018.
  • 51. Zavod za telekomunikacije Projekt Klasa SensorReading - entitet @Entity public class SensorReading { @Id private Integer id; private String temperature, pressure, humidity, co, no2, so2; ... } &4214.11.2018.
  • 52. Zavod za telekomunikacije Projekt Klasa PersonRepository // Person je objekt, a Long je ključ public interface SensorRepository extends JpaRepository<SensorReading, Long> { } &4314.11.2018.
  • 53. Zavod za telekomunikacije Projekt Spremanje podataka @SpringBootApplication public class SensorsApplication implements CommandLineRunner { @Autowired SensorRepository repo; ... @Override public void run(String... args) throws Exception { List<SensorReading> readings = loadData(); // prepare data for saving int i = 0; for(SensorReading reading: readings) { reading.setId(i++); } repo.save(readings); readings.stream().forEach(System.out::println); } ... &4414.11.2018.
  • 54. Zavod za telekomunikacije Projekt H2 konzola ♦ na poveznici http://localhost:8080/h2-console ! imamo konzolu za pregledavanje baze podataka ! spajamo se na: jdbc:h2:mem:testdb &4514.11.2018.
  • 55. Zavod za telekomunikacije Projekt Eksterna baza podataka - postgres ♦ pokrenuti bazu i pomoću pgAdmina stvoriti bazu s imenom sensors ♦ u gradle.build zamijeniti H2 s PostreSQL-om ... dependencies { ... //runtime('com.h2database:h2') runtime('org.postgresql:postgresql') } ... ♦ u application.properties dodati spring.datasource.url= jdbc:postgresql://localhost:5432/sensors spring.datasource.username=postgres spring.datasource.password= # none, validate, update, create, create-drop spring.jpa.hibernate.ddl-auto=create &4614.11.2018.
  • 57. Zavod za telekomunikacije Projekt Web-usluge temeljene prijenosu prikaza stanja resursa (REST) ♦ REST (Representational State Transfer) ♦ pojmovi: The REST Way ili RESTful services ♦ pojam je skovao Roy Fielding u svojoj doktorskoj disertaciji ♦ nije standard već arhitekturni stil ♦ sve se temelji na resursima koji su predstavljeni URL-ovima: ➡ http://localhost:8080/persons - popis svih korisnika ➡ http://localhost:8080/persons/1 - korisnik s identifikatorom 1 ♦ koristi protokol: HTTP (GET, POST, PUT, DELETE, PATCH) ♦ koristi podatke: JSON, XML, sirovi (npr. za slike, video) ♦ bez stanja (stateless), priručni spremnik (cache) &4814.11.2018.
  • 58. Zavod za telekomunikacije Projekt Arhitektura web-aplikacije (REST) &4914.11.2018. sloj pristupa podacima sloj poslovne logike @Service :PersonService repository :PersonRepository 4: dohvaća i sprema podatke @Entity :Person sloj usluge web-poslužitelj (REST) 1: HTTP zahtjev 2: obradi(HttpRequest) 7: HTTP odgovor @RestController :PersonResource 3: poziva Jackson mapping 5:proslijediobradu (PersonRepresentation) 6: JSON ili XML Person Representation @Entity :Person
  • 59. Zavod za telekomunikacije Projekt Format JSON (Javascript Object Notation) ♦ podatak - par: ime/vrijednost "firstName":"Pero" ! vrijednosti mogu biti: " broj, string, boolean (true, false), polje, objekt, null ♦ objekt su parovi u vitičastim zagradama, npr.: { "firstName" : "Pero", "lastName" : "Perić" } ! ime u objektu mora biti jedinstveno ♦ polje su vrijednosti u uglatim zagradama, npr.: [ { "name": "Pero Perić", ... }, 
 { "name": "Iva Ivić", ... }, 
 ...] &5014.11.2018.
  • 60. Zavod za telekomunikacije Projekt Primjer zahtjeva i odgovora • HTTP GET http://localhost:8080/currentReading { "id": 82, "temperature": "21", "pressure": "995", "humidity": "64", "co": "187", "no2": "", "so2": "0" } &5114.11.2018.
  • 61. Zavod za telekomunikacije Projekt Primjer REST kontrolera @RestController public class SensorReadingController { private SensorRepository repo; public SensorReadingController(SensorRepository repo) { this.repo = repo; } @GetMapping("/currentReading") public SensorReading currentReading() { LocalTime time = LocalTime.now(); int id = time.getHour() * 4 + time.getMinute() / 15; return repo.findOne(id); } } &5214.11.2018.
  • 62. Zavod za telekomunikacije Projekt Tipično korištenje usluga REST ♦ za Create, Read, Update and Delete (CRUD) ♦ primjer gotove usluge: Twitter &5314.11.2018. HTTP CRUD POST Create, (Overwrite/Replace) GET Read PUT Update, (Create, Delete) DELETE Delete PATCH Partial update
  • 63. Zavod za telekomunikacije Projekt Primjer dohvaćanja ♦ Chrome extensions (https://chrome.google.com/webstore/search/rest): ! Advanced Rest Client ili ! Postman ♦ u terminalu: ! curl ! HTTPie &5414.11.2018.
  • 64. Zavod za telekomunikacije Projekt Vrata poslužitelja ♦ u application.properties dodati server.port=8000 &5514.11.2018.
  • 65. Zavod za telekomunikacije Projekt Instaliranje aplikacije na udaljenom računalu (1) ♦ Prevođenje Mavenom ili Gradleom rezultira izradom jara koji u sebi ima sve ovisnosti ♦ Prenošenje jara na odredišno računalo ! Uobičajeno je da se prenosi pomoću ssh protokola " Windows: WinSCP ili instaliranjem Windows Subsystem for Linux (WSL) - video " Linux/Unix: komanda scp # scp [[user@]host1:]file1 ... [[user@]host2:]file2 ♦ Spajanje pomoću SSH na poslužitelj: " Windows: alat Putty " Linux/Unix: komanda ssh # ssh {user}@{host} &5614.11.2018.
  • 66. Zavod za telekomunikacije Projekt Instaliranje aplikacije na udaljenom računalu (2) ♦ Pokretanje poslužitelja ! Pokreće se s java -jar {datoteka}.jar " Ako samo tako pokrenemo nakon odspajanja od poslužitelja taj proces će se ugasiti pa je zato potrebno koristiti mehanizme koji će to spriječiti ! Korištenje alata screen - tutorial - shortcuts " screen -S ime - pokretanje screena s imenom sjednice " C-a d - odspajanje iz screena " screen -ls - ispis sjednica " screen -r ime - spajanje na postojeću sjednicu " C-a c - stvaranje novog prozora u screenu " C-a " - vizualno prebacivanje u novi prozor " C-a ESC - micanje kursorom po prozoru screena, ENTER za izlazak &5714.11.2018.