Spring Boot karkasas
Spring karkasas sudarytas iš apie 20 astkirų modulių skirtų kurti programinę įranga naudojant Java kalbos plain old Java objects (POJO). Tai įgalina galimybę prisitaikyti prie Java SE modelio programavimo ir pilnai arba dalinai kuriant JAVA EE programinę įrangą skirtą įmonėms. Spring platformos/karkaso nauda:
- Neturint transaction API vykdyti duomenų bazės tranzakcijas.
- Sukurti metodą, kuris atlieka prisijungimą prie nutolosios paslaugos neturint nuotolinio prisijungimo API.
- Sukurti žiniučių apdorojimo metodą be papildomo JMS API panaudojimo.
- Daugelis populiariausių paslaugų yra numatyta su šiuo karkasu pvz. Monitoringo programa, greitas Web servisų sūkurimas ir paleidimas pvz. REST API, mikroservisų sukūrimas, jar archyvo sukūrimas, kuriame yra visa reikiama konfigūracija: Aplikacijų serveris, duomenų bazė ir papildomi įrankiai paleisti programinei įrangai.
Spring karkaso sandara žiūrėti 5.1 paveikslėlį.

5.1 pav. Spring karkaso sandara
Spring projekto kurimas yra gan paprastas kadangi tai yra suderinama su Maven ir Gradle projekto kūrimo įrankiais.
Naudojantiems Maven konfigūraciją sukurti minimalią Spring Web aplikaciją pakanka pridėti startinį bibliotekų rinkinį "spring-boot-starter-web":
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.1.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
Gradle naudotojiems analogiškai bus sukurta Spring Web aplikacija pridėjus startinį bibliotekų rinkinį "spring-boot-starter-web":
dependencies {
compile("org.springframework.boot:spring-boot-starter-web:1.5.1.RELEASE")
}
Pradedantiesiems naudoti Spring karkasą rekomenduojama sukurti pirmąją aplikaciją naudojant Spring Boot. Spring Boot yra spartus būdas kurti aplikacijas Spring karkaso pagrindu, kurios yra paruoštos produkcijai. Projekto konfigūravimas vietoje programinio kodo rašymo tai siūlo Spring Boot. Taip yra paspartinamas procesas kurti Spring aplikacijas kiek įmanoma greičiau.
Nuo ko pradėti plačiau pasiskaityti galite pagal dominančią sritį oficialioje Spring karkaso svetainėje kur yra pateikti aplikacijų pavyzdžiai su detaliomis pamokomis ir programinio kodo pavyzdžiais rasite čia: https://spring.io/guides.
Modernios programavimo aplinkos IDE turi galimybę pasirinkti dažniausiai naudojamas bibliotekas pasirenkant iš duoto sąrašo naudojant Spring Initializr įrankį. Įrankis skirtas sugeneruoti Spring Boot startinį projektą su pasirinktomis bibliotekomis. Jeigu Spring Initializr nėra įdiegtas, galima naudotis šio įrankio internetinę versiją ir sukurti projektą, kuris yra atsiunčiamas ir paleidžiamas naudojantis Maven arba Gradle įrankiu. Detaliau Spring Initializr įrankį galite panagrinėti šiuo adresu: http://start.spring.io/.
Naudojantis Spring DATA kuriant REST API, įprastinės SQL užklausos yra aprašomos naudojant Java interfeisą ir SQL užklausa yra aprašoma tiesiog metodo pavadinime:
@RepositoryRestResource
interface ClassRoomRepository extends CrudRepository<ClassRoom, Long>{
List<ClassRoom> findByEmployeesFirstNameContains(@Param("q")String firstName);
}
@RepositoryRestResource
interface EmployeeRepository extends CrudRepository<Employee, Long>{
List<Employee> findTop5ByFirstName(@Param("q") String firstName);
List<Employee> findDistinctByRoleNotIn(@Param("pareigos") String role);
}
Plačiau apie Spring Data - https://www.youtube.com/watch?v=wZKmA6XodNE
Norint sukurti Web aplikaciją su grafine vartotojo sąsaja naudojant Spring Boot karkasą yra naudojamas įprastinis MVC projektavimo šablonas. Modelis tai paprastas Java POJO. Vaizdas (angl. View) yra naudojami template engines, kurių yra labai daug. Pasirinktinai galite rinktis bet kurį iš siūlomų variklių skirtų kurti grafinę vartotojo sąsają:
JSP + JSTL, Thymeleaf, Freemarker, Handlebars, jtwig, Velocity, HTTL, Scalate, Jade, Mustache - Based on JMustache, Pebble ir kiti.
Kad atvaizuoti vaizdą naršyklėje reikia duomenų iš "BackEnd", šie duomenis yra perduodami Controller pagalba į View. IntelliJ IDEA pagal nutylėjimą kuriant Spring Boot projektą yra siūlomas Thymeleaf šablonų variklis. Štai taip atrodo šio šablonų variklio View dokumentas:
<div>
<form class="form-horizontal" th:object="${product}" th:action="@{/product}"method="post">
<input type="hidden" th:field="*{id}"/>
<input type="hidden" th:field="*{version}"/>
<div class="form-group">
<label class="col-sm-2 control-label">Description:</label>
<div class="col-sm-10">
<input type="text" class="form-control" th:field="*{description}"/>
</div>
Įvykdžius šį programinį kodą bus atvaizduotas šis vaizdas žr. 5.3 pav.
5.3. pav. Thymeleaf šablonų variklio rezultatas
Kaip sukurti Spring Web MVC projektą galite vadovautis šiuo pavyzdžiu: https://springframework.guru/spring-boot-web-application-part-4-spring-mvc/. Arba vadovautis šiais žingsniais:
- Pasirinkti programinę įrangą pvz: IntelliJ IDEA.
- Pasirinkti projektų kūrimo įrankį: Maven, Gradle ar kitą, startinę konfigūraciją galima rasti oficialioje svetainėje: https://spring.io/guides.
- Siūloma konfigūracija (žr. 5.4 pav.):
Web - Full Stack programa.
Lombok - kuriant entity nereikia get/set.
Security - apribojimai ir papildomos funkcijos.
Thymeleaf - varyklis generuoti šablonus/html.
MySQL - duomenų bazė.
DevTools - Nereikia perkrauti visos programos iš naujo.
5.4 pav. Siūlomas Spring Initializr įrankio bibliotekų sąrašas
applications.properties dokumente priklausomai nuo pasirinktos duomenų bazės, nurodyti prisijungimo informacija:
spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.username=root spring.datasource.password=slaptažodis spring.datasource.driverClassName=com.mysql.jdbc.Driver
Naudojantis IntelliJ IDEA spausti:View > Tool windows > Database,
Iššokusiame lange
pasirinkti + simbolį prijungti savo egzistuojančią arba naują duomenų bazę.
Papildomai privalote atnaujinti savo Maven ar Gradle dependency, jeigu keitėte duomenų bazę ar norite pakeisti į kitą.
Pastaba! Įvykdyti savo programą ir įsitikinti jog viskas sklandžiai veikia.
http://localhost:8080/ - pagal nutylėjimą, kadangi naudojama Security yra:
Prisijungimo vardas: user;
Slaptažodis: default security password: 263196a4-313b-4d19-919c-97aebbbce72e (Rasite konsolėje kompiliuojant savo programą).
sukurti klasę Security ir ją įkelti į configuration package
@Configuration public class Security extends WebSecurityConfigurerAdapter{ @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests().antMatchers("/").permitAll(); http.csrf().disable(); http.headers().frameOptions().disable(); } }
Siūloma sukurti Java Packages taip sudarant projekto struktūrą:
Domain package sukurti Entity (Modelis) priklausomai nuo pasirinktos temos pavyzdžiui: Gyvunas.java, kadangi naudojama Lombok įprastinis Java POJO atrodo ženkliai paprastesnis:
@Data @Entity public class Gyvunas { @Id @GeneratedValue Long id; private String amzius; private String pavadinimas; protected Gyvunas(){} public Gyvunas(String amzius, String pavadinimas) { this.amzius = amzius; this.pavadinimas = pavadinimas; } }
Sukurti repozitoriją **GyvunasRepository.java **ir ją patalpinti į repositories package:
interface GyvunasRepository extends CrudRepository<Gyvunas, Long>{}
Service kataloge sukurti interfeisą: GyvunasService.java ir jo įgyvendinimą: GyvunasServiceImpl.java:
interface GyvunasService { Iterable<Gyvunas> atvaizduotiGyvunus(); Gyvunas gyvunasPagalId(Integer id); Gyvunas issaugotiGyvuna(Gyvunas gyvunas); void panaikintiGyvuna(Integer id); }
@Service class GyvunasServiceImpl implements GyvunasService{ private GyvunasRepository gyvunasRepository; @Autowired public void setGyvunasRepository(GyvunasRepository gyvunasRepository) { this.gyvunasRepository = gyvunasRepository; } @Override public Iterable<Gyvunas> atvaizduotiGyvunus() { return gyvunasRepository.findAll(); } @Override Gyvunas gyvunasPagalId(Integer id){ return gyvunasRepository.findOne(id); } @Override Gyvunas issaugotiGyvuna(Gyvunas gyvunas){ return gyvunasRepository.save(gyvunas); } @Override void panaikintiGyvuna(Integer id){ return gyvunasRepository.delete(id); } }
Sukurti klasę UzpildomDuomenimis.java skirtą užpildyti duomenų bazę testiniais duomenimis:
@Component public class UzpildomDuomenimis implements ApplicationListener<ContextRefreshedEvent>{ private GyvunasRepository gyvunasRepository; @Autowired public void setGyvunasRepository(GyvunasRepository gyvunasRepository) { this.gyvunasRepository = gyvunasRepository; } @Override public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) { for (int i = 0; i < 15; i++) gyvunasRepository.save(new Gyvunas("belekas", "Lape"+i)); } }
Patikrinti ar jūsų duomenų bazė yra užpildoma duomenimis, tada pereiti į tolimesnį žingsnį Controllers package sukurti naują kontrolerio klasę IndexController.java:
@Controller public class IndexController { @RequestMapping("/") String index(){ return "index"; } }
templates kataloge sukurti index.html. Paleisti projektą ir naršyklėje patrikrinti ar veikia internetinė svetainė ir atvaizduoja index.html turinį: http://localhost:8080/
Sukurti fragments katalogą ir jame sukurti 2 failus: Headerinc.html -> privalomas naudojant Thymeleaf template engine ir Header.html:
headerinc.html turinys:
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head lang="en" th:fragment="head"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <link href="http://cdn.jsdelivr.net/webjars/bootstrap/3.3.4/css/bootstrap.min.css" th:href="@{/webjars/bootstrap/3.3.4/css/bootstrap.min.css}" rel="stylesheet" media="screen" /> <script src="http://cdn.jsdelivr.net/webjars/jquery/2.1.4/jquery.min.js" th:src="@{/webjars/jquery/2.1.4/jquery.min.js}"></script> <link href="../static/css/guru.css" th:href="@{/css/guru.css}" rel="stylesheet" media="screen"/> </head>
header.html turinys:
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head lang="en"> </head> <body> <div class="container"> <div th:fragment="header"> <nav class="navbar navbar-default"> <div class="container-fluid"> <div class="navbar-header"> <a class="navbar-brand" href="#" th:href="@{/}">Home</a> <ul class="nav navbar-nav"> <li><a href="#" th:href="@{/products}">Products</a></li> <li><a href="#" th:href="@{/product/new}">Create Product</a></li></ul> </div> </div> </nav> <div class="jumbotron"> <div class="row text-center"> <div class=""> <h2>Spring karkasas</h2> <h3>Spring Boot Web Aplikacija</h3> </div> </div> <div class="row text-center"> <img src="../../static/images/NewBannerBOOTS_2.png" width="400" th:src="@{/images/NewBannerBOOTS_2.png}"/> </div> </div> </div> </div> </body> </html>
index.html turinys:
<!DOCTYPE html> <html> <head lang="en"> <title>Spring Framework Guru</title> <!--/*/ <th:block th:include="fragments/headerinc :: head"></th:block> /*/--> </head> <body> <div class="container"> <!--/*/ <th:block th:include="fragments/header :: header"></th:block> /*/--> </div> </body> </html>
Sukurti antrą kontrolerį, kurio pagalba atvaizduosime gyvūnų sąrašą:
@Controller public class GyvunasController { private GyvunasService gyvunasService; @Autowired public void setProductService(GyvunasService gyvunasService) { this.gyvunasService = gyvunasService; } @RequestMapping(value = "/gyvunai", method = RequestMethod.GET) public String list(Model model){ model.addAttribute("gyvunai", gyvunasService.atvaizduotiGuvunus()); return "gyvunai"; } }
Sukurti gyvunai.html:
<body> <div class="container"> <!--/*/ <th:block th:include="fragments/header :: header"></th:block> /*/--> <div th:if="${not #lists.isEmpty(gyvunai)}"> <h2>Product List</h2> <table class="table table-striped"> <tr> <th>Pavadinimas</th> <th>Amzius</th> </tr> <tr th:each="gyvunas : ${gyvunai}"> <td th:text="${gyvunas.pavadinimas}">Gyvunas</td> <td th:text="${gyvunas.amzius}">Amzius</td> </tr> </table> </div> </div>
Naršyklėje atidaryti šią nuorodą: http://localhost:8080/gyvunai jeigu viskas tvarkoje turėtų atvaizduoti panašų vaizdą (žr. 5.5 pav.).
5.5 pav. Naršyklėje atvaizduotas Gyvunai.html turinys