Spring Boot karkasas

M.GžegoževskisJavaProgramavimasJavaAbout 7 min

Spring karkasas sudarytas iš apie 20 astkirų modulių skirtų kurti programinę įranga naudojant Javaopen in new window kalbos plain old Javaopen in new window objects (POJO). Tai įgalina galimybę prisitaikyti prie Javaopen in new window SE modelio programavimo ir pilnai arba dalinai kuriant JAVAopen in new window EE programinę įrangą skirtą įmonėms. Spring platformos/karkaso nauda:

  • Neturint transaction APIopen in new window vykdyti duomenų bazės tranzakcijas.
  • Sukurti metodą, kuris atlieka prisijungimą prie nutolosios paslaugos neturint nuotolinio prisijungimo APIopen in new window.
  • Sukurti žiniučių apdorojimo metodą be papildomo JMS APIopen in new window panaudojimo.
  • Daugelis populiariausių paslaugų yra numatyta su šiuo karkasu pvz. Monitoringo programa, greitas Web servisų sūkurimas ir paleidimas pvz. REST APIopen in new window, 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į.

Related image
Related image

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/guidesopen in new window.

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/open in new window.

Naudojantis Spring DATA kuriant REST APIopen in new window, įprastinės SQL užklausos yra aprašomos naudojant Javaopen in new window 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=wZKmA6XodNEopen in new window

Norint sukurti Web aplikaciją su grafine vartotojo sąsaja naudojant Spring Boot karkasą yra naudojamas įprastinis MVC projektavimo šablonas. Modelis tai paprastas Javaopen in new window 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 + JSTLopen in new window, Thymeleafopen in new window, Freemarkeropen in new window, Handlebarsopen in new window, jtwigopen in new window, Velocityopen in new window, HTTLopen in new window, Scalateopen in new window, Jadeopen in new window, Mustache - Based on JMustacheopen in new window, Pebbleopen in new window 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/open in new window. Arba vadovautis šiais žingsniais:

  • Pasirinkti programinę įrangą pvz: IntelliJ IDEA.
    1. Pasirinkti projektų kūrimo įrankį: Maven, Gradle ar kitą, startinę konfigūraciją galima rasti oficialioje svetainėje: https://spring.io/guidesopen in new window.
    2. 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.

    • JPA - Javaopen in new window persistence APIopen in new window sąsaja su DB.

    • MySQL - duomenų bazė.

    • DevTools - Nereikia perkrauti visos programos iš naujo.

      5.4 pav. Siūlomas Spring Initializr įrankio bibliotekų sąrašas

    1. 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/open in new window - 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 Javaopen in new window Packages taip sudarant projekto struktūrą:

    • Domain package sukurti Entity (Modelis) priklausomai nuo pasirinktos temos pavyzdžiui: Gyvunas.javaopen in new window, kadangi naudojama Lombok įprastinis Javaopen in new window 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 open in new window**ir ją patalpinti į repositories package:

      interface GyvunasRepository extends CrudRepository<Gyvunas, Long>{}
      
    • Service kataloge sukurti interfeisą: GyvunasService.javaopen in new window ir jo įgyvendinimą: GyvunasServiceImpl.javaopen in new window:

      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.javaopen in new window 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.javaopen in new window:

      @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/open in new window

    • 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/gyvunaiopen in new window jeigu viskas tvarkoje turėtų atvaizduoti panašų vaizdą (žr. 5.5 pav.).

      5.5 pav. Naršyklėje atvaizduotas Gyvunai.html turinys

Comments
  • Latest
  • Oldest
  • Hottest
Powered by Waline v2.14.1