JavaRush /Java Blog /Random-TK /Maven, Bahar, MySQL, Gibernate we ilkinji CRUD programmas...
Макс
Dereje

Maven, Bahar, MySQL, Gibernate we ilkinji CRUD programmasy bilen tanyşlyk (2-nji bölüm)

Toparda çap edildi
Günüňiz haýyrly bolsun! Bu makalada ýönekeý CRUD programmasyny döretmek prosesinde Maven, Bahar, Gibernate, MySQL we Tomcat ýaly zatlar bilen ilkinji duşuşygymy paýlaşmak isleýärin. Bu 4-nji bölümiň ikinji bölümi. Makala, esasan, bu ýerde eýýäm 30-40 derejäni tamamlan, ýöne entek arassa Java-dan geçmedik we açyk dünýä girmäge başlaýan (ýa-da başlajak) adamlar üçin niýetlenendir. bu tehnologiýalaryň, çarçuwalaryň we beýleki nätanyş sözleriň hemmesi. Bu "Maven, Bahar, MySQL, Gibernate we ilkinji CRUD programmasy" atly makalanyň ikinji bölümi. Birinji bölümi şu baglanyşyga eýerip görmek bolýar: Maven, Bahar, MySQL, Gibernate we ilkinji CRUD programmasy (1-nji bölüm)

Mazmuny:

Geliň, dowam edeliň, indi filmleriň ammaryny birleşdirmäge synanyşalyň. Elbetde, kiçijik we ýönekeý programmamyzda ähli logikany samsyklyk bilen dolandyryja goýup bilersiňiz, ýöne öňem belläp geçişimiz ýaly hemme zady nädip dogry etmelidigini derrew öwrenmek has gowudyr. Şonuň üçin geliň birnäçe gatlak döredeliň. Maglumatlar, Hyzmat bilen işlemek üçin jogapkär DAO-ymyz bolar , bu ýerde her dürli logika bolar we Dolandyryjy diňe haýyşlary ýerine ýetirer we zerur hyzmat usullaryna jaň eder.

Maglumatlara giriş obýekti

Maglumatlara elýeterlilik obýekti (DAO) şeýle dizaýn nusgasydyr. Esasy zat, maglumatlara (maglumatlar bazasy ýa-da beýleki saklaýyş mehanizmi bilen işlemek) diňe jogapkärçilik çekjek ýörite gatlak döretmekdir. Bukjada goşmak, aýyrmak we ş.m. ýaly usullar boljak daointerfeýs dörederis. FilmDAOOlara birneme başgaça jaň etdim, ýöne olar esasy CRUD amallaryna gabat gelýär ( C reate, Read , U pdate, D elete).

Bu ýerde bellemeli zat, DAO-dan başga-da, Ammar ýaly çemeleşme hem bar, olar gaty meňzeýär, ikisi hem maglumatlar bilen işlemek üçin ulanylýar. Bu çemeleşmeleriň haýsy aýratynlyklarynyň bardygyny we olaryň arasyndaky tapawudyň nämedigini entek bilmedim. Şonuň üçin bu ýerde ýalňyşýan bolmagym mümkin we muny Tao däl-de, ammar diýip atlandyrmaly, belki-de arasynda bir zat bar. Iöne gören we öwrenen mysallarymyň köpüsine DAO diýilýär, şonuň üçinem belki şol bir atlandyraryn. Şol bir wagtyň özünde, belki tekstiň başga bir ýerinde ammar sözüni ulanaryn. Her niçigem bolsa, bu ýerde bir ýerde ýalňyşmaýan bolsam, meni bagyşlaň.

package testgroup.filmography.dao;

import testgroup.filmography.model.Film;

import java.util.List;

public interface FilmDAO {
    List<Film> allFilms();
    void add(Film film);
    void delete(Film film);
    void edit(Film film);
    Film getById(int id);
}
Indi onuň durmuşa geçirilmegi zerur. Maglumatlar bazasyny entek birikdirip bilmeris, henizem gorkunç. Amaly we öwrenişmek üçin, ilki bilen ýatda saklamagy simulasiýa edeliň we birnäçe film bilen sanaw döredeliň. Sanawy saklamak üçin, belli bir filmi tutuş sanawdan geçmän, Listözüne çekmek üçin ulanarys. Nesil üçin AtomicInteger ulanýarys . Geliň, synp döredeliň , ähli usullary durmuşa geçireliň we kartany dolduralyň. Şeýle bir zat. MapididFilmDAOImpl
package testgroup.filmography.dao;

import testgroup.filmography.model.Film;

import java.util.*;

public class FilmDAOImpl implements FilmDAO {
    private static final AtomicInteger AUTO_ID = new AtomicInteger(0);
    private static Map<Integer, Film> films = new HashMap<>();

    static {
        Film film1 = new Film();
        film1.setId(AUTO_ID.getAndIncrement());
        film1.setTitle("Inception");
        film1.setYear(2010);
        film1.setGenre("sci-fi");
        film1.setWatched(true);
        films.put(film1.getId(), film1);

        // + film2, film3, film4, ...
    }
    @Override
    public List<Film> allFilms() {
        return new ArrayList<>(films.values());
    }

    @Override
    public void add(Film film) {
        film.setId(AUTO_ID.getAndIncrement());
        films.put(film.getId(), film);
    }

    @Override
    public void delete(Film film) {
        films.remove(film.getId());
    }

    @Override
    public void edit(Film film) {
        films.put(film.getId(), film);
    }

    @Override
    public Film getById(int id) {
        return films.get(id);
    }
}

Hyzmat

Indi hyzmat gatlagyny goşalyň. Aslynda, bu mysalda özümizi DAO bilen çäklendirip, onsuz etmek gaty mümkin; programma gaty ýönekeý bolar we hyzmatda haýsydyr bir çylşyrymly logika üçin meýilnama ýok. Suddenlyöne birden gelejekde taslama her dürli kynçylyklar we gyzykly zatlar goşmak islärsiňiz, doly bolmagy üçin goýuň. Häzirlikçe, diňe DAO-dan usullary çagyrar. Geliň, bukjada serviceinterfeýs döredeliň FilmService.
package testgroup.filmography.service;

import testgroup.filmography.model.Film;

import java.util.List;

public interface FilmService {
    List<Film> allFilms();
    void add(Film film);
    void delete(Film film);
    void edit(Film film);
    Film getById(int id);
}
Ony durmuşa geçirmek:
package testgroup.filmography.service;

import testgroup.filmography.dao.FilmDAO;
import testgroup.filmography.dao.FilmDAOImpl;
import testgroup.filmography.model.Film;

import java.util.List;

public class FilmServiceImpl implements FilmService {
    private FilmDAO filmDAO = new FilmDAOImpl();

    @Override
    public List<Film> allFilms() {
        return filmDAO.allFilms();
    }

    @Override
    public void add(Film film) {
        filmDAO.add(film);
    }

    @Override
    public void delete(Film film) {
        filmDAO.delete(film);
    }

    @Override
    public void edit(Film film) {
        filmDAO.edit(film);
    }

    @Override
    public Film getById(int id) {
        return filmDAO.getById(id);
    }
}
Taslamanyň gurluşy indi şeýle görünýär:
Maven, Bahar, MySQL, Gibernate we ilkinji CRUD programmasy (2-nji bölüm) bilen tanyşlyk

Dolandyryjy we görnüşler

Indi gözegçilik ediji usullaryň üstünde işläliň we sahypalary dolduralyň. Sahypalary dolduranymyzda, käbir usullar gerek bolar. Mysal üçin, filmleriň sanawyny görkezmek üçin bir aýlaw gerek, eger-de parametrlere baglylykda käbir ýazgylary üýtgetmek islesek, şertler we ş.m. JSP (JavaServer Sahypalary) formaty, bularyň hemmesini durmuşa geçirip boljak java kod goýmalaryny ulanmaga mümkinçilik berýär. Emma sahypadaky HTML kody bilen garylan java koduny ulanmak islämok. Iň bolmanda gaty erbet bolar. Bagtymyza, bu meseläni çözmek üçin JSTL (JavaServer Pages Standard Tag Library) ýa-da JSP Standard Tag Kitaphanasy ýaly ajaýyp zat bar . Dürli zerurlyklar üçin JSP sahypalarymyzda bir topar goşmaça bellikleri ulanmaga mümkinçilik berýär. Geliň pom.xml:
<dependency>
      <groupId>jstl</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
</dependency>
Indi kontrolleýere göz aýlalyň. Ilki bilen, obýektiň döredilmegini ol ýerden aýyralyň Film, bu synag üçin edildi we bize başga zat gerek däl. Geliň, ol ýere bir hyzmat goşalyň we usullaryna jaň edeliň.
public class FilmController {
    private FilmService filmService = new FilmServiceImpl();
Bolýar, şoňa görä her iş üçin usul dörederis, goşarys, pozarys we ş.m. Ilki bilen filmleriň sanawy bilen esasy sahypany görkezmegiň usuly:
@RequestMapping(method = RequestMethod.GET)
    public ModelAndView allFilms() {
        List<Film> films = filmService.allFilms();
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("films");
        modelAndView.addObject("filmsList", films);
        return modelAndView;
    }
Bu ýerde täze zat ýok. Hyzmatdan filmleriň sanawyny alýarys we modele goşýarys. films.jspIndi bu usulyň gaýdyp gelýän esasy sahypasyny edeliň :
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>FILMS</title>
</head>
<body>

<h2>Films</h2>
<table>
    <tr>
        <th>id</th>
        <th>title</th>
        <th>year</th>
        <th>genre</th>
        <th>watched</th>
        <th>action</th>
    </tr>
    <c:forEach var="film" items="${filmsList}">
        <tr>
            <td>${film.id}</td>
            <td>${film.title}</td>
            <td>${film.year}</td>
            <td>${film.genre}</td>
            <td>${film.watched}</td>
            <td>
                <a href="/edit/${film.id}">edit</a>
                <a href="/delete/${film.id}">delete</a>
            </td>
        </tr>
    </c:forEach>
</table>

<h2>Add</h2>
<c:url value="/add" var="add"/>
<a href="${add}">Add new film</a>
</body>
</html>
Nämäniň bardygyny görmek üçin bu sahypa has içgin seredeliň. <% @ taglib prefiksi = "c" uri = "http://java.sun.com/jsp/jstl/core"%> - bu ýerde siklleri, şertleri we ş.m. döretmek üçin esasy bellikleri öz içine alýan JSTL ýadrosy birikdirildi. .
  • <table>- tablisa döretmek üçin bellik.
  • <tr>- stol hatary
  • <th>- sütün sözbaşy
  • <td>- stol öýjügi
Ilki bilen sütünleriň atlary bilen tablisanyň sözbaşy hataryny düzýäris. Soň bolsa <c:forEach var="film" items="${filmsList}">, aýlawda (JSTL ýadrosyndan aldyk), geçen sanawyň ( filmsList) elementleriniň hemmesinden geçýäris, her element ( film) üçin täze hatar döredýäris we her öýjüge degişli bahany ýazýarys. Bu ýerde bir nokat bar, ýazga düşünilmeli film.idýaly film.getId(). Meýdana gönüden-göni girip bolmaýar, ýöne alyjy diýilýär. Iň soňky sütünde ( action) pozmak we redaktirlemek üçin baglanyşyklar edýäris (häzir degişli usullary dörederis). Aşakda täze film goşmagyň usulyna baglanyşyk bar. Görnüşi ýaly: Indiki, belli bir film üçin redaktirleme sahypasyny yzyna gaýtaryp berjek usula göz aýlalyň:
@RequestMapping(value = "/edit/{id}", method = RequestMethod.GET)
    public ModelAndView editPage(@PathVariable("id") int id) {
        Film film = filmService.getById(id);
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("editPage");
        modelAndView.addObject("film", film);
        return modelAndView;
    }
Bu ýerde täze bir zat peýda boldy - bu düşündiriş @PathVariable. int idBu parametriň ( ) salgy salgysyndan alnandygyny görkezýär . Salgy setirinde bu parametriň ýerleşişini görkezmek üçin gurluşyk ulanylýar {id}(ýogsa-da, üýtgeýän adyň edil şu ýagdaýda bolşy ýaly bolsa, ony gabygyň içinde görkezmeli däl, diňe ýazyň @PathVariable int id). Şeýlelik bilen, baş sahypada her film üçin baglanyşyklar etdik id:
<a href="/edit/${film.id}">edit</a>
Soňra bu baha usuly parametrine bellenýär we soňra hyzmatyň üsti bilen ammardan belli bir film almak we modele goşmak üçin ulanýarys. Bu redaktirleme sahypasyny almagyň usulydy, indi bize redaktirlemegiň usuly gerek:
@RequestMapping(value = "/edit", method = RequestMethod.POST)
    public ModelAndView editFilm(@ModelAttribute("film") Film film) {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("redirect:/");
        filmService.edit(film);
        return modelAndView;
    }
Usulda editPagemodele bir atribut goşduk:
modelAndView.addObject("film", filmService.getById(id));
Indi düşündirişiň kömegi bilen @ModelAttributebu häsiýeti alýarys we üýtgedip bileris. Usuly talap ediň POST, sebäbi bu ýerde maglumatlary geçireris. " redirect:/" bu usuly ýerine ýetirenimizden soň adrese gönükdiriljekdigimizi aňladýar " /, ýagny usul işlär allFilmswe esasy sahypa dolanarys. Indi sahypanyň özi edeliň editPage.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Edit</title>
</head>
<body>
<c:url value="/edit" var="var"/>
<form action="${var}" method="POST">
    <input type="hidden" name="id" value="${film.id}">
    <label for="title">Title</label>
    <input type="text" name="title" id="title">
    <label for="year">Year</label>
    <input type="text" name="year" id="year">
    <label for="genre">Genre</label>
    <input type="text" name="genre" id="genre">
    <label for="watched">Watched</label>
    <input type="text" name="watched" id="watched">
    <input type="submit" value="Edit film">
</form>
</body>
</html>
  • <form>- maglumatlary ýygnamak we ibermek üçin forma, kimiň işlejekdigini görkezýär ( /edit)
  • <input>- ulanyjynyň özara gatnaşygy üçin interfeýs elementleri (düwmeler, giriş meýdanlary we ş.m.)
  • <label>- tekst belligi
Şeýlelik bilen, düwmä basanyňyzda, <input type="submit" value="Edit film">formadaky maglumatlar serwere iberiler ( idserwer maglumatlar bazasyndaky haýsy ýazgyny täzelemelidigini bilmek üçin gymmaty bilen görünmeýän meýdan ýörite goşuldy). Usulda editFilmdegişli atribut meýdanlaryna bellener film. Soňra täzelenen sanaw bilen esasy sahypa dolanarys. Redaktirleme sahypasy şuňa meňzeýär: Indi sanawa täze filmler goşup başlalyň. Munuň üçin maglumatlary girizmek we tabşyrmak üçin bir forma hem gerek bolar. Esasy sahypada forma ýasap bilersiňiz ýa-da ýaly aýratyn sahypa ýasap bilersiňiz editPage.jsp. Emma, ​​beýleki tarapdan, goşmak üçin forma redaktirleme bilen birmeňzeş bolar, ýagny. 4 giriş meýdançasy we tabşyrmak düwmesi. Onda näme üçin täze sahypa döredeliň, ulanalyň editPage.jsp. Sahypany almagyň usuly:
@RequestMapping(value = "/add", method = RequestMethod.GET)
    public ModelAndView addPage() {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("editPage");
        return modelAndView;
    }
Usulda, editPagesoňra üýtgetmek üçin atributy goşmaça geçirdik, ýöne bu ýerde sahypany alýarys. Goşmagyň usuly:
@RequestMapping(value = "/add", method = RequestMethod.POST)
    public ModelAndView addFilm(@ModelAttribute("film") Film film) {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("redirect:/");
        filmService.add(film);
        return modelAndView;
    }
Bu ýerde atributdan geçmändigimiz üçin bu ýerde täze bir obýekt dörediler Film. Dogrusy, bu ýerde täze zat ýok. Şeýle hem, "" -de elýeterli iki usulyň bardygyny bellemelidiris /add. Bu, dürli haýyşlara jogap berýändikleri sebäpli mümkindir. Esasy sahypadaky baglanyşyga eýerip, bize alyp barýan GET haýyşyny edýäris addPage. Goşulýan sahypada maglumat ibermek üçin düwmä basanymyzda, POST haýyşy edilýär we addFilm. Täze film goşmak üçin redaktirleme ýaly sahypany ulanmagy makul bildik. Emma ol ýerde maglumatlar "" adrese iberilýär /edit:
<c:url value="/edit" var="var"/>
<form action="${var}" method="POST">
    <input type="submit" value="Edit film">
</form>
Sahypany goşmak we redaktirlemek üçin başgaça hereket etmegi üçin sahypany birneme üýtgetmeli. Bu meseläni çözmek üçin şol bir JSTL esasy kitaphanasyndaky şertleri ulanarys:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <c:if test="${empty film.title}">
        <title>Add</title>
    </c:if>
    <c:if test="${!empty film.title}">
        <title>Edit</title>
    </c:if>
</head>
<body>
<c:if test="${empty film.title}">
    <c:url value="/add" var="var"/>
</c:if>
<c:if test="${!empty film.title}">
    <c:url value="/edit" var="var"/>
</c:if>
<form action="${var}" method="POST">
    <c:if test="${!empty film.title}">
        <input type="hidden" name="id" value="${film.id}">
    </c:if>
    <label for="title">Title</label>
    <input type="text" name="title" id="title">
    <label for="year">Year</label>
    <input type="text" name="year" id="year">
    <label for="genre">Genre</label>
    <input type="text" name="genre" id="genre">
    <label for="watched">Watched</label>
    <input type="text" name="watched" id="watched">
    <c:if test="${empty film.title}">
        <input type="submit" value="Add new film">
    </c:if>
    <c:if test="${!empty film.title}">
        <input type="submit" value="Edit film">
    </c:if>
</form>
</body>
</html>
Bular. meýdany barlaýarys film.title. Boş bolsa, bu täze film, biz onuň üçin ähli maglumatlary doldurmaly we sanawa goşmaly. Bu meýdan boş bolmasa, sanawdan bir film we ony diňe üýtgetmeli. Bu. sahypamyzyň iki wersiýasyny alýarys: Filmi sanawdan aýyrmak üçin iň soňky gözegçilik usuly:
@RequestMapping(value="/delete/{id}", method = RequestMethod.GET)
    public ModelAndView deleteFilm(@PathVariable("id") int id) {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("redirect:/");
        Film film = filmService.getById(id);
        filmService.delete(film);
        return modelAndView;
    }
Meniň pikirimçe, bu ýerde hiç zat barada teswir ýazmagyň zerurlygy ýok, bularyň hemmesi eýýäm göz öňünde tutulypdyr. Bu sahypada esasy sahypada eýýäm baglanyşyklar etdik. Dogrusy, bu ýerde hemme zat taýyn ýaly, ony täzeden işledip, hemme zadyň nähili işleýändigini görüp bilersiňiz.

Bahar komponentleri hökmünde ammar we hyzmat

Moreene bir kiçijik düzediş edeliň. Hakykat, indi ammarymyz we hyzmatymyz diňe synplar, olary ulanmak üçin özümiz synp obýektini döretmeli ( new FilmServiceImpl()). Emma Bahary bir sebäbe görä baglanyşdyrdyk , şonuň üçinem bu meseläni özi dolandyrsyn. Sapaklarymyzy Baharyň gözegçiligi astynda saklamak üçin, olaryň düzüm bölekdigini görkezmeli. Munuň üçin olary ýörite bellikler bilen belleýäris:
@Repository
public class FilmDAOImpl implements FilmDAO {
@Service
public class FilmServiceImpl implements FilmService {
Annotasiýalar @Repositorywe @Serviceşonuň ýaly-da @Controlleralnan @Component. Bu üç düşündirişiň aýratyn aýratynlyklary we tapawutlary haýsylar we olaryň ýönekeý komponentden tapawudy resminamalarda ýa-da gollanmalarda aýratyn okalmalydyr. Häzirlikçe, bu düşündirişleriň Bahara bu synplaryň degişlilikde ammar we hyzmatdygyny aýdýandygyny bilmek ýeterlikdir. Indi bu synplaryň anyk zatlaryny özümiz döretmeli däl:
private FilmService filmService = new FilmServiceImpl();
Munuň ýerine meýdançany ýörite bellik bilen belläp bilersiňiz we Bahar degişli ýerine ýetirişi saýlar:
@Autowired
private FilmService filmService;
Annotasiýa @Autowired(awto-baglaýjy) Baharyň mazmunyny öwrenip, bu ýerde laýyk noýba çalşmalydygyny aýdýar. Örän rahat. Öň usullaryň anyk ýerine ýetirilişi barada alada galmazlyk üçin interfeýsleri ulanan bolsak, indi interfeýsiň durmuşa geçirilmegi barada alada etmeli däl, hatda adyny bilýäris. Bu pikir, meýdanda awtomatiki baglanyşyk ulanmak maslahat berilmeýär, konstruktor ýa-da sazlaýjy ulanmak has gowudyr. Bu barada has giňişleýin resminamalarda okaň. Aslynda biziň üçin bu möhüm däl, ony arkaýyn goýup bileris. Emma, ​​pikir soraýanlygy sebäpli, hemme zadyň owadan we hiç hili sary duýduryşsyz hormat goýarys. Dolandyryjy synpda, sazlaýjy döredeliň we düşündiriş bereliň:
@Controller
public class FilmController {

    private FilmService filmService;

    @Autowired
    public void setFilmService(FilmService filmService) {
        this.filmService = filmService;
    }
FilmDAOEdil şonuň ýaly-da, synpda bir sazlaýjy ýasaýarys FilmServiceImpl. Dowam etmek üçin ... Maven, Bahar, MySQL, Gibernate we ilkinji CRUD programmasy (1-nji bölüm) Maven, Bahar, MySQL, Gibernate we ilkinji CRUD programmasy bilen tanyşdyrmak (2-nji bölüm) Maven, Bahar, MySQL, Gibernate we the ilkinji CRUD programmasy (3-nji bölüm) Maven, Bahar, MySQL, Gibernate we ilkinji CRUD programmasy (4-nji bölüm)
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION