JavaRush /Blog Jawa /Random-JV /Pambuka kanggo Maven, Spring, MySQL, Hibernate lan aplika...
Макс
tingkat

Pambuka kanggo Maven, Spring, MySQL, Hibernate lan aplikasi CRUD pisanan (bagean 1)

Diterbitake ing grup
sugeng sonten. Ing artikel iki aku pengin nuduhake ketemu pisanan karo bab kaya Maven, Spring, Hibernate, MySQL lan Tomcat ing proses nggawe aplikasi CRUD prasaja. Iki minangka bagean pisanan saka 4. Artikel kasebut utamane kanggo wong-wong sing wis ngrampungake 30-40 tingkat ing kene, nanging durung ngumbara ngluwihi Jawa murni lan lagi wae diwiwiti (utawa bakal diwiwiti) kanggo mlebu ing jagad terbuka kanthi kabeh teknologi iki, frameworks lan tembung ora pati ngerti. Pambuka kanggo Maven, Spring, MySQL, Hibernate lan aplikasi CRUD pisanan (bagean 1) - 1

Isi:

Pambuka

Aku wiwit kenal karo teknologi lan kerangka kerja sing anyar kanggo aku kanthi nyinaoni macem-macem conto sing digunakake, amarga biasane aku ngerti sing paling apik nalika ndeleng tumindak nggunakake conto aplikasi lengkap. Biasane, conto kasebut yaiku aplikasi CRUD ( C reate, Read , U pdate, D elete), Internet kebak conto kerumitan sing beda-beda. Masalahe biasane ora nerangake kanthi rinci babagan carane, apa lan apa sing ditindakake ing kana, kenapa ketergantungan kasebut ditambahake, kenapa kelas kasebut dibutuhake, lsp. Ing kasus paling, padha njupuk aplikasi rampung rampung, karo file POM final, karo versi final saka kelas, lan mung mbukak liwat saben siji, tanpa fokus ing bab cilik sing mbokmenawa katon ketok kanggo wong experienced. Aku wis katon ing akèh conto kuwi lan biasane cetha carane kabeh bisa, nanging carane padha teka iki ora tanggung cetha. Mulane, aku mutusake manawa conto kasebut bakal migunani, ora saka posisi pangembang sing berpengalaman, nanging saka posisi pamula sing durung nate ngatasi Spring, Hibernate lan liya-liyane.
Pambuka kanggo Maven, Spring, MySQL, Hibernate lan aplikasi CRUD pisanan (bagean 1) - 2
Aku bakal nyoba kanggo njlèntrèhaké ing minangka akeh rinci sabisa (sa adoh saka pangerten ngidini kula) kabeh path nggawe aplikasi CRUD, miwiti karo soko ing tingkat Hello World paling gampang. Kaping pisanan, aku nindakake iki kanggo awake dhewe, amarga nalika sampeyan nyoba njlèntrèhaké, ngandhani, nerangake, luwih apik diserap lan diatur ing sirahmu. Nanging yen iki migunani kanggo wong lan mbantu dheweke ngerteni apa wae, aku bakal bungah banget. Ing conto iki, ayo nyoba nggawe aplikasi CRUD prasaja nggunakake Maven , Tomcat , Spring , Hibernate lan MySQL . Langkah awal kayata nginstal Maven , MySQL , nggunakake versi Ultimate saka idea, etc. Aku ora perlu njlèntrèhaké kanthi rinci, mesthine ora ana masalah karo iki. Wigati dicathet yen ing conto iki, konfigurasi bakal dikonfigurasi nggunakake kelas Java (disebut JavaConfig) tanpa nggunakake xml.

Nggawe Proyek

Dadi, amarga aku anyar, kita ora bakal nggunakake archetypes sing ora jelas. Spring initializr isih muni banget medeni. Mulane, kita bakal nggawe proyek Maven prasaja sing paling biasa. Aku ora duwe jeneng domain, supaya ing groupid aku mung bakal nulis testgroup, lan ing artifactid aku bakal nulis jeneng, contone, filmography(iki bakal dhaftar film). Kita nggawe proyek lan milih Enable auto-importnalika ide kasebut menehi saran. Thanks kanggo iki, saben-saben kita nggawe owah-owahan menyang file POM (Model Obyek Proyek, file iki nggambarake kabeh struktur proyek Maven), kabeh bakal langsung ditrapake ing proyek kasebut. Pustaka kasebut bakal dijupuk saka gudang lokal yen kita wis duwe, utawa yen kita nggunakake sawetara dependensi anyar sing durung ditangani sadurunge, Maven mung bakal ngundhuh liwat Internet saka gudang pusat. Maven uga nduweni fungsi kanggo ngundhuh sumber lan dokumentasi (Download Sumber lan / utawa Dokumentasi). Iku uga banget trep, yen soko ora cetha karo sawetara kelas utawa cara, sampeyan bisa pindhah menyang kode sumber lan ndeleng carane iku kabeh bisa nang. Ayo ditambahake sawetara rincian. Iki bakal dadi aplikasi web lan kita bakal nggunakake Tomcat . Kanggo nyebarake aplikasi menyang Tomcat, sampeyan kudu nransfer ing kono ing wangun arsip perang (Web Application Resource, format khusus kanggo aplikasi web). Kanggo nindakake iki, tambahake baris ing ngisor iki menyang file POM supaya aplikasi kasebut dikompilasi dadi arsip perang:
<packaging>war</packaging>
Ya, sampeyan uga butuh direktori khusus kanggo sumber web, ing kasus kita bakal ana kaca jsp lan sawetara sumber web. Ayo nggawe maindirektori webapp. Sampeyan kudu kasebut persis lan dumunung ing maincara sing padha karo java, resourcesamarga iki minangka struktur direktori Maven standar. Sawise kita nginstal paket kasebut warlan kanthi mangkono nemtokake manawa iki minangka proyek web, direktori kasebut webappbakal ditandhani kanthi otomatis minangka sumber aplikasi Web (bakal ana titik biru) lan kabeh sing ana gandhengane karo web bakal digoleki ing folder iki. Lan siji wayahe. Kanthi gawan, Maven nggunakake versi basa 1.5, nanging aku pengin nggunakake, contone, versi 1.8 - Java 8 (Sampeyan bisa njupuk 10, utawa 11, nanging isih ora ana rencana kanggo nggunakake fitur saka ing kono, supaya dadi 8. ). Iki bisa ditanggulangi kanthi gampang, kita nulis ing Google kaya "Maven java 8" lan ndeleng apa sing kudu ditambahake menyang file POM supaya Maven nyusun kelas kita kanggo versi sing dibutuhake. Akibaté, kita duwe ing ngisor iki: Pambuka kanggo Maven, Spring, MySQL, Hibernate lan aplikasi CRUD pisanan (bagean 1) - 3

Sambungan MVC spring

Sampeyan kudu miwiti nang endi wae. Miturut rencana, kita bakal nyambungake database lan nggunakake Hibernate, nanging iki kabeh muni rada medeni kanggo saiki. Kita kudu nindakake sing luwih prasaja dhisik. Spring MVC, iki wis luwih apik, kita wis menowo karo pola MVC kanggo dangu, iki digunakake ing setengah saka tugas gedhe mesthi. Saka kene kita bakal miwiti nari. Kanggo nggawe aplikasi web karo Spring MVC, kita uga kudu Servlet-API, i.e. bab kasebut kanthi bantuan interaksi panjaluk-tanggapan bakal ditindakake. Ayo dadi nyoba kanggo nyambung iki. Kita menyang Google, goleki dependensi sing dibutuhake ing repositori Maven lan tambahake menyang file pom.xml. Pambuka kanggo Maven, Spring, MySQL, Hibernate lan aplikasi CRUD pisanan (bagean 1) - 4Ing bagean Pustaka Eksternal sampeyan bisa ndeleng manawa ora mung spring-webmvc sing dimuat , nanging uga akeh perkara liyane. Sing. kita ora perlu nambah dependensi kanggo inti spring , context , kacang buncis , etc. sing kita butuhake, kabeh sing dibutuhake ditarik munggah bebarengan karo spring-webmvc .

Kita kudu nggawe wewaler cilik. Biasane dianjurake supaya tetep nambah dependensi kanthi kapisah kanggo saben perpustakaan sing digunakake, sanajan wis digabung karo sing wis ditambahake, amarga iki bisa mbantu supaya sawetara masalah lan glitches.

Conto prasaja. Ayo dadi ngomong kita nambah dependensi sing nggunakake sawetara API, lan ing wektu sing padha bakal narik munggah sawetara jenis implementasine kanggo API iki. Banjur kita nambah katergantungan liyane sing nggunakake API padha lan uga narik sawetara implementasine kanggo iki, nanging wektu iki beda. Mangkono, kita bakal duwe 2 implementasine beda saka API sing padha. Lan yen kita dhewe pengin nggunakake sawetara cara saka API iki nang endi wae, banjur ana masalah, amarga sistem ora bakal ngerti kang implementasine kanggo nggunakake, iku bakal milih acak, mbok menawa ora kita samesthine. Lan yen sampeyan kanthi tegas nemtokake ketergantungan kanggo salah sawijining implementasine, banjur prioritas bakal diwenehake.

Nanging, iki dudu rekomendasi sing ketat; utamane ditrapake kanggo proyek gedhe sing digunakake macem-macem perpustakaan saka macem-macem perusahaan. Kita ora bakal nindakake ing kene, supaya ora mbukak file POM kakehan; ora ana masalah. Nanging sanadyan, iku isih worth mbudidaya iki.

Cathetan siji maneh. Apa tegese providedgumantung javax.servlet-api? Lingkup minangka ruang lingkup ketergantungan, providedtegese dependensi bakal kasedhiya ing tahap kompilasi lan nguji aplikasi kasebut, nanging ora bakal diarsipake. Kasunyatane yaiku kanggo nyebarake aplikasi kasebut, kita bakal nggunakake wadhah servlet, Tomcat, lan wis ana perpustakaan kasebut ing njero, mula ora perlu ditransfer menyang kana lan beban arsip kanthi beban sing ora perlu. Looking ahead, kanggo alesan sing padha kita bakal nindakake tanpa cara biasanipun main, amarga wis ana nang Tomcat.

Nggawe Kaca lan Controller

Ayo nyoba masak sing prasaja saiki. Pisanan, ayo nggawe webappdirektori tambahan, contone pages, ing ngendi tampilan bakal disimpen, i.e. jsp kaca, lan nggawe saperangan kaca. Kita butuh kaca sing bakal ditampilake dhaptar film, contone films.jsp, lan mbok menawa kita bisa nggawe kaca sing kapisah kanggo nyunting, ayo editPage.jsp. Kita ora bakal ngisi apa wae sing serius saiki; mung kanggo nyoba, kita bakal nggawe link ing kaca siji menyang kaca liyane. Saiki kita butuh kelas sing bakal ngolah panjaluk, yaiku. pengontrol. Ayo nambah paket anyar controllerlan nggawe kelas ing FilmController(umum, ora perlu ngemas kabeh ing paket sing beda-beda, aplikasi iki bakal cilik lan prasaja, nanging ing proyek normal bisa uga ana akeh pengontrol, kelas konfigurasi, model. , lan liya-liyane, mula sanajan diwiwiti kanthi proyek cilik, luwih becik langsung digunakake kanggo nindakake kabeh kanthi tertib lan terstruktur supaya ora ana kekacoan). Ing kelas iki, kita bakal nggawe metode sing bakal ngasilake tampilan kanggo nanggepi panjaluk.
package testgroup.filmography.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class FilmController {

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public ModelAndView allFilms() {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("films");
        return modelAndView;
    }

    @RequestMapping(value = "/edit", method = RequestMethod.GET)
    public ModelAndView editPage() {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("editPage");
        return modelAndView;
    }
}
Apa gunane? Spring MVC duwe bab sing diarani DispatcherServlet. Iki kaya pengontrol utama, kabeh panjaluk sing mlebu ngliwati lan banjur dikirim menyang pengontrol tartamtu. Anotasi @Controllermung ngandhani Spring MVC yen kelas iki minangka pengontrol (uga, logis umume), dispatcher bakal mriksa anotasi @RequestMappingkanggo nelpon cara sing cocog. Anotasi @RequestMappingngidini sampeyan nyetel alamat kanggo metode pengontrol, sing bakal kasedhiya ing klien (browser). Sampeyan uga bisa ditrapake ing kelas controller kanggo nyetel, supaya bisa ngomong, alamat root kanggo kabeh cara. allFilms()Parameter kanggo metode kasebut valuedisetel menyang " /", mula bakal langsung diarani nalika kombinasi http://host:port/ dilebokake ing browser (yaiku, kanthi standar yaiku http://localhost:8080/ utawa http. ://127.0.0.1:8080/ ). Parameter kasebut methodnemtokake jinis panyuwunan sing didhukung (GET, POST, PUT, lsp.). Amarga ing kene mung nampa data, GET digunakake. Mengko, nalika cara kanggo nambah lan nyunting katon, wis ana panjalukan POST. (Miturut cara, tinimbang anotasi @RequestMappingnuduhake cara, sampeyan bisa nggunakake anotasi @GetMapping, @PostMappingetc. @GetMappingpadha @RequestMapping(method = RequestMethod.GET)). Ing metode kita, kita nggawe obyek ModelAndViewlan nyetel jeneng tampilan sing kudu dibalekake.

Konfigurasi

Ayo dadi pindhah menyang nyetel konfigurasi. configAyo nggawe kelas ing paket kasebut WebConfig. Bakal duwe mung siji cara sing ngasilake obyek saka jinis ViewResolver, iki antarmuka sing perlu kanggo nemokake perwakilan kanthi jeneng.
package testgroup.filmography.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "testgroup.filmography")
public class WebConfig {

    @Bean
    ViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/pages/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }
}
@Configurationngandhani Spring sing kelas iki kelas konfigurasi lan ngandhut definisi lan dependensi beansaka komponen. Kacang buncis minangka obyek sing dikelola dening Spring. Anotasi digunakake kanggo nemtokake kacang buncis @Bean. @EnableWebMvcngidini sampeyan ngimpor konfigurasi Spring MVC saka file WebMvcConfigurationSupport. Sampeyan uga bisa ngleksanakake, contone, antarmuka WebMvcConfigurersing wis Bunch kabèh cara, lan ngatur kabeh sing dikarepake, nanging kita ora perlu kanggo pindhah menyang, setelan standar bakal cukup. @ComponentScanngandhani Spring ngendi kanggo nggoleki komponen sing kudu ngatur, i.e. kelas sing ditandhani karo anotasi @Componentutawa turunan kayata @Controller, @Repository, @Service. Anotasi kasebut kanthi otomatis nemtokake kacang kelas. Ing cara, viewResolver()kita nggawe implementasine lan nemtokake ngendi persis kanggo nggoleki perwakilan ing webapp. Mulane, nalika ing cara controller kita nyetel jeneng " films" tampilan bakal ditemokake minangka " /pages/films.jsp" Dadi, kita duwe kelas konfigurasi, nanging saiki iku mung sawetara kelas kapisah, iku ora mengaruhi aplikasi kita ing sembarang cara. . Kita kudu ndhaptar konfigurasi iki ing konteks Spring. Kanggo iki sampeyan butuh kelas AbstractAnnotationConfigDispatcherServletInitializer. Ing paket, configkita nggawe penerus sawijining, ngandika AppInitializer , lan ngleksanakake cara.
package testgroup.filmography.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[0];
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{WebConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}
Cara pungkasan ndhaptar alamat lan ana 2 cara liyane kanggo ndhaptar kelas konfigurasi. Konfigurasi web, ngendi ViewResolver's lan kaya ditetepake, diselehake ing getServletConfigClasses(). Iku luwih apik kanggo maca babagan kabeh iki ing dokumentasi lan macem-macem panuntun, nanging ing kasus kita iku ora perlu kanggo delve menyang iki durung, kita, WebConfiging asas, bisa RootClassesditetepake ing loro, malah bisa nemtokake loro bebarengan, iku isih bisa digunakake. . Siji maneh. Bisa uga ana masalah karo enkoding nalika, nalika ngirim nilai karo karakter Rusia saka formulir, asil bakal scribbles. Kanggo ngatasi masalah iki, kita bakal nambah filter sing bakal ngolah panjalukan. Kita pindhah menyang kelas AppInitializer lan mbatalake cara getServletFilters, ing ngendi kita nuduhake enkoding sing dikarepake, mesthine kudu padha ing ngendi wae, kaya ing kaca lan ing database:
protected Filter[] getServletFilters() {
        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        characterEncodingFilter.setForceEncoding(true);
        return new Filter[] {characterEncodingFilter};
    }
Inggih, kabeh katon wis diatur, sampeyan bisa nyoba kanggo mbukak lan ndeleng apa mengkono. Run -> Run -> Sunting Konfigurasi -> Tambah Konfigurasi Anyar -> Tomcat Server -> Lokal Sabanjure, sampeyan kudu milih artefak kanggo nyebarke. Ide kasebut dhewe bakal menehi tandha Pènget: Ora ana artefak sing ditandhani kanggo panyebaran . Klik tombol fix banjur pilih ...: war exploded . Utawa sampeyan bisa pindhah menyang Deployment -> add -> Artefact -> ...: war exploded . Pambuka kanggo Maven, Spring, MySQL, Hibernate lan aplikasi CRUD pisanan (bagean 1) - 5Lan sampeyan uga kudu pindhah menyang Penyebaran lan nyetel lapangan konteks Applecation (iki bakal dadi bagean saka alamat url ing ngendi aplikasi bakal kasedhiya ing browser) menyang " /". Pambuka kanggo Maven, Spring, MySQL, Hibernate lan aplikasi CRUD pisanan (bagean 1) - 6Banjur aplikasi kita bakal langsung kasedhiya ing http://localhost:8080/ (nanging sampeyan uga bisa nemtokake apa wae ing kana, contone " /filmography", banjur sampeyan mung kudu nambah iki menyang kabeh alamat, contone, ora bakal ana. " http://localhost:8080/edit" , nanging bakal dadi "http://localhost:8080/filmography/edit" ). Klik Run lan ngenteni nganti diwiwiti. Mangkene apa sing dakkarepake: Pambuka kanggo Maven, Spring, MySQL, Hibernate lan aplikasi CRUD pisanan (bagean 1) - 7Kabeh katon apik, nanging ana siji caveat. Kasunyatane, kaca kita saiki bisa diakses umum lan bisa diakses langsung kanthi nulis path ing bilah alamat. Kita ngetik http://localhost:8080/pages/films.jsp lan saiki kita wis nampa kaca kita tanpa kawruh controller. Piye wae iki ora bener, mula kita bakal nggawe webappdirektori khusus WEB-INF. Apa sing ana ing njero bakal didhelikake saka umum lan mung bisa diakses liwat pengontrol. Kita nyelehake direktori kasebut kanthi tampilan ( pages) ing WEB-INF, lan ViewResolverbanjur ditambahake menyang awalan:
viewResolver.setPrefix("/WEB-INF/pages/");
Saiki kita entuk kaca ing http://localhost:8080 , nanging yen kita nyoba langsung menyang http://localhost:8080/WEB-INF/pages/films.jsp kita entuk kesalahan 404. Inggih, apik, kita duwe web paling prasaja -aplikasi, Hello World minangka padha ngomong. Struktur proyek saiki katon kaya iki:
Pambuka kanggo Maven, Spring, MySQL, Hibernate lan aplikasi CRUD pisanan (bagean 1) - 8

Model

Kita wis duwe tampilan lan pengontrol, nanging ing MVC uga ana huruf kaping 3, dadi kanggo ngrampungake gambar kita uga bakal nambah model. Ing paket, modelayo nggawe kelas Film, contone, karo kolom ing ngisor iki: int id, String title(judhul), int year(taun rilis), String genre(genre) lan boolean watched(i.e. sampeyan wis nonton film iki utawa ora).
package testgroup.filmography.model;

public class Film {
    private int id;
    private String title;
    private int year;
    private String genre;
    private boolean watched;
// + Getters and setters
}
Ora ana sing istimewa, mung kelas biasa, lapangan pribadi, getter lan setter. Obyek saka kelas kuwi uga disebut POJO(Plain Old Java Object), uga, i.e. "obyek jawa prasaja". Ayo saiki nyoba nggawe obyek kasebut lan nampilake ing kaca kasebut. Saiki, kita ora bakal kuwatir banget babagan carane nggawe lan miwiti. Kanggo nyoba, ayo nggawe kanthi bodho langsung ing pengontrol, umpamane, kaya iki:
public class FilmController {
    private static Film film;

    static {
        film = new Film();
        film.setTitle("Inception");
        film.setYear(2010);
        film.setGenre("sci-fi");
        film.setWatched(true);
    }
Lan tambahake obyek iki menyang kita ModelAndViewnggunakake metode addObject:
@RequestMapping(method = RequestMethod.GET)
    public ModelAndView allFilms() {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("films");
        modelAndView.addObject("film", film);
        return modelAndView;
    }
Saiki kita bisa nampilake obyek iki ing kaca kita. Ing films.jsptinimbang Hello World kita bakal nulis ${film}lan obyek sing cocog karo jeneng atribut " film" bakal diganti ing kene. Ayo nyoba mbukak lan ndeleng apa sing kedadeyan (kanggo output obyek sing jelas, kelas kasebut Filmdidefinisikan maneh toString()):
Pambuka kanggo Maven, Spring, MySQL, Hibernate lan aplikasi CRUD pisanan (bagean 1) - 9

Model-View-Controller

Ing tahap iki, kita wis katon duwe aplikasi Spring MVC lengkap. Sadurunge nerusake, luwih becik mriksa kabeh maneh lan nemtokake cara kerjane. Ing Internet sampeyan bisa nemokake akeh gambar lan diagram babagan iki, aku seneng iki:
Pambuka kanggo Maven, Spring, MySQL, Hibernate lan aplikasi CRUD pisanan (bagean 1) - 10
Nalika kita nulis panjalukan ing baris browser, iku ditampa Dispatcher Servlet, banjur nemokake controller cocok kanggo proses panjalukan iki nggunakake HandlerMapping(iki antarmuka kanggo milih controller, mriksa kang saka pengontrol kasedhiya duwe cara sing nampa alamat kuwi) , nelpon cara sing cocok lan Controllerngasilake informasi babagan tampilan, banjur dispatcher nemokake tampilan sing dikarepake kanthi jeneng nggunakake ViewResolver'a, sawise data model ditransfer menyang tampilan iki lan entuk kaca kita minangka output. Mergo iki. Diterusake ... Ngenalake Maven, Spring, MySQL, Hibernate lan aplikasi CRUD pisanan (bagean 1) Ngenalake Maven, Spring, MySQL, Hibernate lan aplikasi CRUD pisanan (bagean 2) Ngenalake Maven, Spring, MySQL, Hibernate lan aplikasi CRUD pisanan (bagean 3) Pambuka kanggo Maven, Spring, MySQL, Hibernate lan aplikasi CRUD pisanan (bagean 4)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION