JavaRush /جاوا بلاگ /Random-UR /Maven، Spring، MySQL، Hibernate اور پہلی CRUD ایپلیکیشن ک...
Макс
سطح

Maven، Spring، MySQL، Hibernate اور پہلی CRUD ایپلیکیشن کا تعارف (حصہ 2)

گروپ میں شائع ہوا۔
صبح بخیر اس مضمون میں میں اپنی پہلی ملاقات Maven، Spring، Hibernate، MySQL اور Tomcat جیسی چیزوں کے ساتھ شیئر کرنا چاہوں گا جو ایک سادہ CRUD ایپلیکیشن بنانے کے عمل میں ہے۔ یہ 4 کا دوسرا حصہ ہے۔ مضمون کا مقصد بنیادی طور پر ان لوگوں کے لیے ہے جنہوں نے یہاں پہلے ہی 30-40 درجے مکمل کر لیے ہیں، لیکن ابھی تک خالص جاوا سے آگے نہیں نکلے ہیں اور ابھی کھلی دنیا میں داخل ہونے والے ہیں (یا شروع ہونے والے ہیں)۔ یہ تمام ٹیکنالوجیز، فریم ورک اور دیگر نا واقف الفاظ۔ یہ مضمون کا دوسرا حصہ ہے "Maven، Spring، MySQL، Hibernate اور پہلی CRUD ایپلیکیشن کا تعارف۔" پہلا حصہ اس لنک پر عمل کرکے دیکھا جا سکتا ہے: Maven، Spring، MySQL، Hibernate اور پہلی CRUD ایپلیکیشن کا تعارف (حصہ 1)

مواد:

ٹھیک ہے، آئیے آگے بڑھتے ہیں، آئیے اب فلموں کا ایک پورا ذخیرہ بنانے کی کوشش کرتے ہیں۔ ہماری چھوٹی اور سادہ ایپلی کیشن میں، یقیناً، آپ بے وقوفی سے تمام منطق کو کنٹرولر میں درست کر سکتے ہیں، لیکن جیسا کہ پہلے ہی بتایا جا چکا ہے، بہتر ہے کہ فوری طور پر ہر چیز کو صحیح طریقے سے کرنے کا طریقہ سیکھ لیں۔ لہذا، آئیے کئی پرتیں بنائیں۔ ہمارے پاس ڈیٹا کے ساتھ کام کرنے کے لیے ایک DAO ذمہ دار ہوگا، ایک سروس ، جہاں ہر طرح کی دوسری منطق ہوگی، اور کنٹرولر صرف درخواستوں پر کارروائی کرے گا اور ضروری سروس طریقوں کو کال کرے گا۔

ڈیٹا تک رسائی آبجیکٹ

ڈیٹا ایکسیس آبجیکٹ (DAO) ایسا ڈیزائن پیٹرن ہے۔ نقطہ ایک خاص پرت بنانا ہے جو ڈیٹا تک رسائی کے لئے مکمل طور پر ذمہ دار ہو گی (ڈیٹا بیس یا دیگر اسٹوریج میکانزم کے ساتھ کام کرنا)۔ پیکیج میں daoہم ایک انٹرفیس بنائیں گے FilmDAOجس میں ایڈ، ڈیلیٹ وغیرہ جیسے طریقے ہوں گے۔ میں نے انہیں تھوڑا مختلف کہا، لیکن وہ بنیادی CRUD آپریشنز ( C reate، Read ، U pdate، D elete) سے مطابقت رکھتے ہیں۔

یہاں یہ بات قابل غور ہے کہ ڈی اے او کے علاوہ ریپوزٹری جیسی ایک اپروچ بھی ہے، وہ بہت ملتے جلتے دکھائی دیتے ہیں، دونوں ڈیٹا کے ساتھ کام کرنے کے لیے استعمال ہوتے ہیں۔ میں نے ابھی تک یہ نہیں سمجھا کہ ان طریقوں میں کیا خصوصیات ہیں اور ان میں کیا فرق ہے۔ اس لیے، مجھ سے یہاں غلطی ہو سکتی ہے اور اسے ایک ذخیرہ کہا جانا چاہیے، نہ کہ تاؤ، یا ہو سکتا ہے کہ یہ درمیان میں ہو۔ لیکن میں نے جو مثالیں دیکھی اور پڑھی ہیں ان میں سے اکثر میں اسے DAO کہا جاتا ہے، اس لیے میں شاید اسے وہی کہوں گا۔ ساتھ ہی، شاید کہیں آگے متن میں لفظ مخزن استعمال کروں گا۔ کسی بھی صورت میں، اگر میں اس میں کہیں غلط ہوں، تو براہ مہربانی مجھے معاف کر دیں.

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);
}
اب ہمیں اس کے نفاذ کی ضرورت ہے۔ ہم ابھی تک ڈیٹا بیس سے رابطہ نہیں کریں گے، یہ اب بھی تھوڑا خوفناک ہے۔ مشق کرنے اور اس کی عادت ڈالنے کے لیے، آئیے پہلے میموری میں سٹوریج کی نقل کریں اور کئی فلموں کے ساتھ ایک فہرست بنائیں۔ فہرست کو ذخیرہ کرنے کے لیے، ہم استعمال نہیں کریں گے List، لیکن ، پوری فہرست کو دیکھے بغیر، Mapاس کے ذریعے کسی مخصوص فلم کو بازیافت کرنا آسان بنانے کے لیے ۔ idنسل کے لیے idہم AtomicInteger استعمال کرتے ہیں ۔ آئیے ایک کلاس بنائیں FilmDAOImpl، تمام طریقوں کو نافذ کریں اور نقشہ کو پُر کریں۔ ایسا ہی کچھ۔
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);
    }
}

سروس

اب ایک سروس لیئر شامل کرتے ہیں۔ اصولی طور پر، اس مثال میں خود کو DAO تک محدود کرتے ہوئے، اس کے بغیر کرنا بالکل ممکن ہے؛ ایپلیکیشن بہت آسان ہوگی اور سروس میں کسی پیچیدہ منطق کا کوئی منصوبہ نہیں ہے۔ لیکن اچانک مستقبل میں آپ اس منصوبے میں ہر طرح کی پیچیدگیاں اور دلچسپ چیزیں شامل کرنا چاہیں گے، لہذا مکمل ہونے کی خاطر اسے رہنے دیں۔ ابھی کے لیے، یہ صرف DAO سے طریقوں کو کال کرے گا۔ serviceآئیے پیکیج میں ایک انٹرفیس بنائیں 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);
}
اور اس کا نفاذ:
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);
    }
}
پروجیکٹ کا ڈھانچہ اب اس طرح لگتا ہے:
Maven، Spring، MySQL، Hibernate اور پہلی CRUD ایپلیکیشن کا تعارف (حصہ 2) - 1

کنٹرولر اور مناظر

آئیے اب کنٹرولر طریقوں اور صفحات کو بھرنے پر کام کرتے ہیں۔ صفحات کو بھرتے وقت، ہمیں کچھ تکنیکوں کی ضرورت ہوگی۔ مثال کے طور پر، فلموں کی فہرست ظاہر کرنے کے لیے، ہمیں ایک لوپ کی ضرورت ہے، اگر، کہیے، ہم کچھ نوشتہ تبدیل کرنا چاہتے ہیں، پیرامیٹرس کے لحاظ سے، ہمیں شرائط وغیرہ کی ضرورت ہے۔ JSP (JavaServer Pages) فارمیٹ آپ کو جاوا کوڈ داخل کرنے کی اجازت دیتا ہے جس کے ساتھ یہ سب کچھ لاگو کیا جا سکتا ہے۔ لیکن میں صفحہ پر HTML کوڈ کے ساتھ ملا ہوا جاوا کوڈ استعمال نہیں کرنا چاہتا۔ یہ، کم از کم، بہت بدصورت ہوگا۔ خوش قسمتی سے، اس مسئلے کو حل کرنے کے لیے JSTL (JavaServer Pages Standard Tag Library) یا JSP سٹینڈرڈ ٹیگ لائبریری جیسی شاندار چیز موجود ہے ۔ یہ ہمیں مختلف ضروریات کے لیے اپنے JSP صفحات میں اضافی ٹیگز کا ایک پورا گروپ استعمال کرنے کی اجازت دیتا ہے۔ آئیے اسے اس سے جوڑتے ہیں pom.xml:
<dependency>
      <groupId>jstl</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
</dependency>
اب کنٹرولر پر ایک نظر ڈالتے ہیں۔ سب سے پہلے، آئیے وہاں سے آبجیکٹ کی تخلیق کو ہٹا دیں Film، یہ جانچ کے لیے کیا گیا تھا اور ہمیں کسی اور چیز کی ضرورت نہیں ہے۔ آئیے وہاں ایک سروس شامل کریں اور اس کے طریقوں کو کال کریں۔
public class FilmController {
    private FilmService filmService = new FilmServiceImpl();
ٹھیک ہے، اس کے مطابق ہم ہر کیس کے لیے طریقے بنائیں گے، شامل کریں، حذف کریں، وغیرہ۔ سب سے پہلے فلموں کی فہرست کے ساتھ مرکزی صفحہ ظاہر کرنے کا طریقہ:
@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;
    }
یہاں کوئی نئی بات نہیں ہے۔ ہم سروس سے فلموں کی فہرست حاصل کرتے ہیں اور اسے ماڈل میں شامل کرتے ہیں۔ اب مرکزی صفحہ بناتے ہیں films.jspکہ یہ طریقہ واپس آتا ہے:
<%@ 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>
آئیے اس صفحہ کو قریب سے دیکھتے ہیں کہ کیا ہے۔ <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> - یہاں JSTL کور منسلک ہے، جس میں سائیکل، حالات وغیرہ بنانے کے لیے اہم ٹیگز شامل ہیں۔ .
  • <table>- ٹیبل بنانے کے لیے ٹیگ۔
  • <tr>- میز کی قطار
  • <th>- کالم ہیڈر
  • <td>- ٹیبل سیل
سب سے پہلے، ہم کالموں کے ناموں کے ساتھ ٹیبل ہیڈر قطار بناتے ہیں۔ پھر ، ایک لوپ میں (جو ہم نے JSTL کور سے لیا ہے)، ہم پاس کردہ فہرست ( ) <c:forEach var="film" items="${filmsList}">کے تمام عناصر سے گزرتے ہیں ، ہر عنصر ( ) کے لیے ہم ایک نئی قطار بناتے ہیں اور ہر سیل میں متعلقہ قدر لکھتے ہیں۔ یہاں ایک نقطہ ہے، لگتا ہے کہ ریکارڈنگ کو سمجھنے کی ضرورت ہے ، یعنی فیلڈ تک براہ راست رسائی نہیں کی جاتی ہے، لیکن حاصل کرنے والے کو بلایا جاتا ہے۔ آخری کالم ( ) میں ہم حذف اور ترمیم کے لیے لنک بناتے ہیں (اب ہم متعلقہ طریقے بنائیں گے)۔ ٹھیک ہے، ذیل میں ایک نئی فلم شامل کرنے کے طریقہ کار کا لنک ہے۔ یہ اس کی طرح دکھتا ہے: اگلا، آئیے اس طریقہ پر ایک نظر ڈالتے ہیں جو کسی مخصوص فلم کے لیے ترمیم کا صفحہ واپس کرے گا: filmsListfilmfilm.idfilm.getId()action
@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;
    }
یہاں کچھ نیا نمودار ہوا ہے - یہ ایک تشریح ہے @PathVariable۔ یہ اشارہ کرتا ہے کہ یہ پیرامیٹر ( int id) ایڈریس بار سے حاصل کیا گیا ہے۔ ایڈریس بار میں اس پیرامیٹر کے مقام کی نشاندہی کرنے کے لیے، کنسٹرکشن کا استعمال کیا جاتا ہے {id}(ویسے، اگر متغیر کا نام ایک جیسا ہے، جیسا کہ اس معاملے میں، تو آپ کو قوسین میں اس کی نشاندہی کرنے کی ضرورت نہیں ہے، بلکہ صرف اسے لکھیں۔ @PathVariable int id)۔ لہذا، مرکزی صفحہ پر ہم نے ہر فلم کے لیے لنک بنائے ہیں جو اشارہ کرتے ہیں id:
<a href="/edit/${film.id}">edit</a>
پھر یہ ویلیو میتھڈ پیرامیٹر کو تفویض کی جاتی ہے اور پھر ہم اسے سروس کے ذریعے ریپوزٹری سے مخصوص فلم حاصل کرنے اور ماڈل میں شامل کرنے کے لیے استعمال کرتے ہیں۔ یہ ایڈیٹنگ پیج حاصل کرنے کا طریقہ تھا، اب ہمیں خود ایڈیٹنگ کے لیے ایک طریقہ چاہیے:
@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;
    }
طریقہ کار میں editPageہم نے ماڈل میں ایک وصف شامل کیا:
modelAndView.addObject("film", filmService.getById(id));
اور اب تشریح کی مدد سے @ModelAttributeہمیں یہ وصف ملتا ہے اور ہم اسے بدل سکتے ہیں۔ طریقہ کی درخواست کریں POSTکیونکہ یہاں ہم ڈیٹا پاس کریں گے۔ " redirect:/" کا مطلب یہ ہے کہ اس طریقہ پر عمل کرنے کے بعد ہمیں ایڈریس پر بھیج دیا جائے گا " /"، یعنی طریقہ چلے گا allFilmsاور ہم مرکزی صفحہ پر واپس آجائیں گے۔ اب صفحہ خود بناتے ہیں 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>- ڈیٹا اکٹھا کرنے اور بھیجنے کا ایک فارم، یہ بتاتا ہے کہ کون اس پر کارروائی کرے گا ( /edit)
  • <input>- صارف کے تعامل کے لیے انٹرفیس عناصر (بٹن، ان پٹ فیلڈز، وغیرہ)
  • <label>- ٹیکسٹ لیبل
لہذا، جب آپ بٹن پر کلک کریں گے، تو <input type="submit" value="Edit film">فارم سے ڈیٹا سرور کو بھیج دیا جائے گا (قدر کے ساتھ ایک پوشیدہ فیلڈ کو خاص طور پر شامل کیا گیا ہے idتاکہ سرور کو معلوم ہو کہ ڈیٹا بیس میں کون سے ریکارڈ کو اپ ڈیٹ کرنے کی ضرورت ہے)۔ طریقہ کار میں editFilmانہیں متعلقہ وصف والے فیلڈز میں تفویض کیا جائے گا film۔ اس کے بعد ہم تازہ ترین فہرست کے ساتھ مرکزی صفحہ پر واپس جائیں گے۔ ترمیم کا صفحہ اس طرح نظر آتا ہے: اب آئیے فہرست میں نئی ​​فلمیں شامل کرنا شروع کریں۔ ایسا کرنے کے لیے، آپ کو ڈیٹا داخل کرنے اور جمع کرانے کے لیے ایک فارم کی بھی ضرورت ہوگی۔ آپ مرکزی صفحہ پر ایک فارم بنا سکتے ہیں یا آپ ایک علیحدہ صفحہ بنا سکتے ہیں، جیسے editPage.jsp۔ لیکن، دوسری طرف، شامل کرنے کا فارم بالکل ویسا ہی ہوگا جیسا کہ ترمیم کے لیے، یعنی 4 ان پٹ فیلڈز اور جمع کرانے کا بٹن۔ تو پھر ایک نیا صفحہ کیوں بنائیں، آئیے استعمال کریں editPage.jsp۔ صفحہ حاصل کرنے کا طریقہ:
@RequestMapping(value = "/add", method = RequestMethod.GET)
    public ModelAndView addPage() {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("editPage");
        return modelAndView;
    }
طریقہ کار میں، editPageہم نے بعد میں اسے تبدیل کرنے کے لیے خصوصیت کو بھی پاس کیا، لیکن یہاں ہمیں صرف صفحہ موصول ہوتا ہے۔ اور شامل کرنے کا طریقہ:
@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;
    }
چونکہ ہم نے یہاں انتساب کو پاس نہیں کیا، اس لیے یہاں ایک نیا آبجیکٹ بنایا جائے گا Film۔ ٹھیک ہے، بنیادی طور پر یہاں کچھ بھی نیا نہیں ہے۔ یہ بات بھی قابل غور ہے کہ ہمارے پاس " /add" پر دونوں طریقے دستیاب ہیں۔ یہ اس حقیقت کی وجہ سے ممکن ہے کہ وہ مختلف قسم کی درخواستوں کا جواب دیتے ہیں۔ مرکزی صفحہ پر دیے گئے لنک پر عمل کرتے ہوئے ہم ایک GET درخواست کرتے ہیں، جو ہمیں addPage. اور جب شامل کرنے والے صفحے پر ہم ڈیٹا بھیجنے کے لیے بٹن پر کلک کرتے ہیں، POST کی درخواست کی جاتی ہے، اور addFilm. ایک نئی مووی شامل کرنے کے لیے، ہم نے وہی صفحہ استعمال کرنے کا فیصلہ کیا جو ترمیم کے لیے ہے۔ لیکن وہاں ڈیٹا " /edit" پتے پر بھیجا جاتا ہے:
<c:url value="/edit" var="var"/>
<form action="${var}" method="POST">
    <input type="submit" value="Edit film">
</form>
ہمیں صفحہ کو تھوڑا سا موافقت کرنے کی ضرورت ہے تاکہ یہ شامل کرنے اور ترمیم کرنے کے لیے مختلف طریقے سے برتاؤ کرے۔ اس مسئلے کو حل کرنے کے لیے، ہم اسی JSTL کور لائبریری سے شرائط استعمال کریں گے:
<%@ 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>
وہ. ہم صرف میدان کی جانچ کر رہے ہیں film.title۔ اگر یہ خالی ہے، تو یہ ایک نئی فلم ہے، ہمیں اس کے لیے تمام ڈیٹا بھرنا چاہیے اور اسے فہرست میں شامل کرنا چاہیے۔ اگر یہ فیلڈ خالی نہیں ہے، تو یہ فہرست میں سے ایک فلم ہے اور آپ کو اسے تبدیل کرنے کی ضرورت ہے۔ وہ. ہمیں اپنے صفحہ کے دو ورژن ملتے ہیں: ٹھیک ہے، فہرست سے فلم کو ہٹانے کا آخری کنٹرولر طریقہ:
@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;
    }
میرے خیال میں یہاں کسی بات پر تبصرہ کرنے کی ضرورت نہیں ہے، یہ سب کچھ پہلے ہی غور کیا جا چکا ہے۔ ہم پہلے ہی اس ایڈریس کے لنکس مرکزی صفحہ پر دے چکے ہیں۔ ٹھیک ہے، لگتا ہے یہاں سب کچھ تیار ہے، آپ اسے دوبارہ چلا سکتے ہیں اور دیکھ سکتے ہیں کہ سب کچھ کیسے کام کرتا ہے۔

موسم بہار کے اجزاء کے طور پر ذخیرہ اور خدمت

آئیے ایک اور چھوٹی اصلاح کرتے ہیں۔ حقیقت یہ ہے کہ اب ہماری سٹوریج اور سروس صرف کلاسز ہیں، اور ان کو استعمال کرنے کے لیے ہمیں خود ایک کلاس آبجیکٹ بنانا ہوگا ( new FilmServiceImpl()لیکن ہمارے پاس بہار ایک وجہ سے جڑی ہوئی ہے ، اس لیے اسے اس معاملے کو خود کنٹرول کرنے دیں۔ اپنی کلاسوں کو اسپرنگ کے کنٹرول میں رکھنے کے لیے، ہمیں یہ بتانا ہوگا کہ وہ اجزاء ہیں۔ ایسا کرنے کے لیے، ہم انہیں خصوصی تشریحات کے ساتھ نشان زد کرتے ہیں:
@Repository
public class FilmDAOImpl implements FilmDAO {
@Service
public class FilmServiceImpl implements FilmService {
تشریحات @Repositoryاور @Serviceنیز @Controllerسے ماخوذ ہیں @Component۔ ان تین تشریحات کی مخصوص خصوصیات اور فرق کیا ہیں اور یہ ایک سادہ جزو سے کس طرح مختلف ہیں اسے دستاویزات یا گائیڈز میں الگ سے پڑھنا چاہیے۔ ابھی کے لیے، یہ جاننا کافی ہے کہ یہ تشریحات بہار کو بتاتی ہیں کہ یہ کلاسیں بالترتیب ایک ذخیرہ اور ایک خدمت ہیں۔ اور اب ہمیں خود ان کلاسوں کی ٹھوس اشیاء بنانے کی ضرورت نہیں ہے:
private FilmService filmService = new FilmServiceImpl();
اس کے بجائے، آپ فیلڈ کو ایک خاص تشریح کے ساتھ نشان زد کر سکتے ہیں اور موسم بہار مناسب نفاذ کا انتخاب کرے گا:
@Autowired
private FilmService filmService;
تشریح @Autowired(آٹو بائنڈنگ) بہار کو بتاتی ہے کہ اسے اپنے سیاق و سباق میں کھودنا چاہئے اور یہاں ایک مناسب بین کی جگہ لینا چاہئے۔ بہت آرام سے۔ اگر اس سے پہلے کہ ہم انٹرفیس استعمال کرتے تھے تاکہ طریقوں کے مخصوص نفاذ کے بارے میں فکر نہ کریں، اب ہمیں خود انٹرفیس کے نفاذ کے بارے میں فکر کرنے کی ضرورت نہیں ہے اور یہاں تک کہ اس کا نام بھی جاننے کی ضرورت ہے۔ خیال یہ ہے کہ فیلڈ پر آٹو بائنڈنگ استعمال کرنے کی سفارش نہیں کی جاتی ہے؛ کنسٹرکٹر یا سیٹٹر استعمال کرنا بہتر ہے۔ دستاویزات میں اس کے بارے میں مزید پڑھیں۔ ہمارے لئے، اصول میں، یہ اہم نہیں ہے، ہم اسے محفوظ طریقے سے اس طرح چھوڑ سکتے ہیں. لیکن، چونکہ خیال اس کے لیے پوچھ رہا ہے، ہم اس بات کا احترام کریں گے کہ ہر چیز خوبصورت ہے اور بغیر کسی پیلے رنگ کی وارننگ کے۔ کنٹرولر کلاس میں، آئیے ایک سیٹر بنائیں اور اس کی تشریح کریں:
@Controller
public class FilmController {

    private FilmService filmService;

    @Autowired
    public void setFilmService(FilmService filmService) {
        this.filmService = filmService;
    }
اور اسی طرح ہم FilmDAOکلاس میں ایک سیٹر بناتے ہیں FilmServiceImpl۔ جاری رکھنے کے لیے... Maven، Spring، MySQL، Hibernate اور پہلی CRUD ایپلیکیشن کا تعارف (حصہ 1) Maven، Spring، MySQL، Hibernate اور پہلی CRUD ایپلیکیشن (حصہ 2) متعارف کروا رہا ہے Maven، Spring، MySQL، Hibernate اور the پہلی CRUD ایپلیکیشن (حصہ 3) Maven، Spring، MySQL، Hibernate اور پہلی CRUD ایپلی کیشن کا تعارف (حصہ 4)
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION