JavaRush /Блоги Java /Random-TG /Барномаи аввалини шумо бо истифода аз сервлетҳои Java

Барномаи аввалини шумо бо истифода аз сервлетҳои Java

Дар гурӯҳ нашр шудааст
Салом ба ҳама! Дар ин мақола, шумо бо консепсияи асосии таҳияи веб-сервлетҳо шинос мешавед ва метавонед бо истифода аз онҳо як барномаи оддӣ нависед. Аввалин барномаи шумо бо истифода аз сервлетҳои Java - 1Барои роҳ надодан ба қадамҳои нолозим, мо аз сифр оғоз намекунем ва корро дар мақолаи қаблии ман дар бораи Hibernate идома медиҳем . Аммо, азбаски мо бо сервлетҳо нав оғоз карда истодаем, ман ҳама чизеро, ки ба синфи Auto алоқаманданд, аз барнома хориҷ кардам ва танҳо синфи User ва амалҳои онро гузоштам. Сохтори лоиҳа чунин хоҳад буд: Аввалин барномаи шумо бо истифода аз сервлетҳои Java - 2Пас, сервлетҳо! Википедиа мегӯяд: "Сервлет интерфейси Java мебошад, ки амалисозии он функсияҳои serverро васеъ мекунад. Сервлет бо муштариён тавассути принсипи дархост-ҷавоб муносибат мекунад." Ва воқеан ҳам ҳаст. Дар ин ҷо мо аввал бо мафҳуми «меъмории барномаҳои муштарӣ-server» дучор мешавем. Моҳияти он хеле содда аст ва ба як расм мувофиқат мекунад ( аз ин ҷо гирифта шудааст ).
Барномаи аввалини шумо бо истифода аз Java Servlets - 3
Мизоҷ бо ирсоли дархости HTTP бо server тамос мегирад. Сервер маълумоти заруриро тавлид мекунад (масалан, онро аз базаи маълумот мегирад) ва ба муштарӣ бармегардонад. Мисоли оддитарин: дар як шабакаи иҷтимоӣ шумо тугмаи "Дӯстон" -ро пахш мекунед ва ба ин васила ба server дархост мефиристед. Сервер рӯйхати дӯстони шуморо дар пойгоҳи додаҳо тафтиш мекунад ва онро ба шумо (муштарӣ) бармегардонад. Рӯйхати дархостҳои HTTP хеле калон аст, аммо агар шумо ҳеҷ гоҳ бо онҳо дучор нашуда бошед, пас барои беҳтар фаҳмидани онҳо беҳтар аст, ки дар бораи онҳо хонед, масалан, дар ин ҷо . Вазифаи мо ин аст: Эҷоди барномаи CRUD бо истифода аз сервлетҳо. Барнома бояд қодир бошад, ки корбаронро аз пойгоҳи додаҳо бо истифода аз сервлет, ки дархостҳои HTTP коркард мекунад, эҷод, тағир додан ва нест кунад. Замимаи мо аз мақолаи Hibernate аллакай медонист, ки ин корро анҷом диҳад, аммо он мустақиман аз codeи Java, дақиқтараш, аз усули main() идора карда мешуд. Дар ин ҷо дархостҳо аз ҷониби муштарӣ фиристода мешаванд, яъне шумо :) Аввалин чизе, ки мо бояд кунем, ин илова кардани вобастагии нав ба файли pom.xml мост.
<xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.itis4</groupId>
    <artifactId>UsersDaoProject</artifactId>
    <version>1.0-SNAPSHOT</version>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.6</version>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <!-- PostgreSQL  -->
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>9.4.1212.jre7</version>
        </dependency>

        <!-- Hibernate 5.2.6 Final -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.2.6.Final</version>
        </dependency>

        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.3.4.RELEASE</version>
        </dependency>

    </dependencies>

</project>
Мо 3 вобастагӣ илова кардем:
  1. Худи китобхонаи javax.servlet-api;
  2. Китобхонаи барчаспҳои JSTL. Он барои сохтани тарафи муштарӣ, яъне саҳифаҳои JSP лозим мешавад;
  3. Spring-WebMVC. Мо ба як синфи баҳор ниёз дорем, ки дар бораи он каме дертар сӯҳбат хоҳем кард.
Фаъолияти сервлетҳо аз ҷониби контейнери сервлет идора карда мешавад. Дар ҳолати мо мо Apache Tomcat-ро истифода хоҳем бурд. Чизи хеле маъмул ва шумо эҳтимол дар бораи он шунидаед :) Давраи ҳаёти сервлет аз қадамҳои зерин иборат аст:
  1. Агар дар контейнер сервлет набошад.
    • Синфи сервлет аз ҷониби контейнер бор карда мешавад.
    • Контейнер як мисоли синфи сервлетро эҷод мекунад.
    • Контейнер усули init() -ро даъват мекунад. Ин усул сервлетро оғоз мекунад ва аввал пеш аз он ки сервлет ба дархостҳо хидмат расонад, даъват карда мешавад. Усули init() дар давоми тамоми давраи ҳаёти худ танҳо як маротиба даъват карда мешавад.
  2. Хизматрасонии дархости муштарӣ. Ҳар як дархост дар риштаи алоҳидаи худ коркард карда мешавад. Контейнер барои ҳар як дархост усули хидмат () -ро даъват мекунад. Ин усул намуди дархости воридшударо муайян мекунад ва онро ба усули ба ин навъи коркарди дархост мувофиқ тақсим мекунад. Таҳиягари сервлет бояд татбиқи ин усулҳоро таъмин намояд. Агар дархосте гирифта шавад, ки барои он усул иҷро нашудааст, усули синфи волидайн даъват карда мешавад ва одатан бо баргардонидани хато ба дархосткунанда анҷом меёбад.
  3. Дар ҳолате, ки контейнер бояд сервлетро нест кунад, он усули destroy() -ро даъват мекунад, ки сервлетро аз хидмат хориҷ мекунад. Мисли усули init(), ин усул низ дар давоми тамоми давраи сервлет як маротиба даъват карда мешавад.
Сервлети мо хеле содда хоҳад буд:
package servlets;

import models.User;
import services.UserService;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

public class UserSimpleServlet extends HttpServlet {

    private UserService service = new UserService();

    public void init(ServletConfig servletConfig) {
        try {
            super.init(servletConfig);
        } catch (ServletException e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        List<User> users = service.findAllUsers();
        req.setAttribute("users", users);
        RequestDispatcher dispatcher = req.getRequestDispatcher("/showUsers.jsp");
        dispatcher.forward(req, resp);

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {

        String name = req.getParameter("name");
        int age = Integer.parseInt(req.getParameter("age"));
        User user = new User(name, age);
        service.saveUser(user);
        resp.sendRedirect("/users");

    }

    @Override
    protected void  doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        int id = Integer.parseInt(req.getParameter("id"));
        User user = service.findUser(id);
        user.setName(req.getParameter("name"));
        user.setAge(Integer.parseInt(req.getParameter("age")));
        service.updateUser(user);
        resp.sendRedirect("/users");
    }

    @Override
    protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        int id = Integer.parseInt(req.getParameter("id"));
        service.deleteUser(service.findUser(id));
        resp.sendRedirect("/users");
    }
}
Тавре ки шумо мебинед, он усули init()-ро дар бар мегирад, ки дар боло тавсиф шуда буд ва 4 усулро амалӣ мекунад, ки бо чаҳор дархости HTTP мувофиқанд - doGet(), doPost(), doPut() ва doDelete(). Ҳар яке аз онҳо ба мо имкон медиҳад, ки мутаносибан корбаронро қабул, эҷод, таҳрир ва нест кунем. Усулҳо ҳамчун an objectҳои вуруди синфҳои javax.servlet.http.HttpServletRequest ва javax.servlet.http.HttpServletResponse - яъне дархости ба server фиристодашуда ва посухе, ки муштарӣ қабул мекунад, мегиранд. Дар дохor усулҳо усулҳои зарурии синфи UserService иҷро карда мешаванд, ҷавоб барои муштарӣ тавлид мешавад ва сипас ба суроғаи / истифодабарандагон равона карда мешавад. Масалан, дар усули doGet() мо рӯйхати ҳамаи корбаронро мегирем. Баъдан, мо an objectи синфи RequestDispatcher эҷод мекунем, ки ба мо имкон медиҳад an objectҳоро ба дархости Http дохил кунем ва инчунин онро ба манбаи мушаххас (масалан, саҳифаи муштарии JSP) равона кунем. Дар усули doPut() (навсозии маълумоти корбар) мо дархости HTTP-ро коркард мекунем, аз он id, ном ва параметрҳои синну солро мегирем, корбарро бо идентификатори муайяншуда меёбем, ба ӯ ном ва синну солеро, ки бо ӯ дар дархост кунед ва ба саҳифа / корбарон баргардед. Аммо, барои дуруст кор кардани ҳамаи ин усулҳо, мо бояд сервлетро танзим кунем. Барои ин мо файли web.xml-ро дар папкаи WEB-INF истифода мебарем.
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1"
         xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">

    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

    <servlet>
        <servlet-name>UserSimpleServlet</servlet-name>
        <servlet-class>servlets.UserSimpleServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>UserSimpleServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <filter>
        <filter-name>hiddenHttpMethodFilter</filter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>hiddenHttpMethodFilter</filter-name>
        <servlet-name>UserSimpleServlet</servlet-name>
    </filter-mapping>

</web-app>
Ҳама барчаспҳои ин файл, аслан, интуитивӣ мебошанд, аммо биёед онҳоро пайдарпай аз назар гузаронем. <хуш омадед-файл-рӯйхат> - саҳифаи ибтидоии JSP муайян карда шудааст, ки ҳангоми оғоз кардани барнома аввал кушода мешавад. Дар ҳолати мо, ин саҳифаи index.jsp аст. <servlet> - ба қайд гирифтани синфи UserSimpleServlet мо ҳамчун сервлет. <servlet-mapping> теги хеле муҳим аст. Он URL-ҳоеро муайян мекунад, ки аз ҷониби сервлет коркард карда мешаванд. Дар ҳолати мо, ин ҳама URL-ҳоянд, аз ин рӯ мо танҳо "/" -ро нишон медиҳем. Аммо, масалан, агар мо як барнома бо корбарон ва мошинҳои онҳо дошта бошем, мо метавонем сервлети дуюм - SimpleAutoServlet эҷод кунем. Пас харитасозӣ барои сервлети корбар "/ истифодабарандагон" (яъне дархостҳои марбут ба коркарди корбарон) ва барои сервлети худкор "/autos" хоҳад буд. Ва ниҳоят, <филтр>. Он ба таври дохилӣ an objectи синфи org.springframework.web.filter.HiddenHttpMethodFilter-ро муайян мекунад. Мақола ба Баҳор дахл надорад, бинобар ин ман дар ин бора муфассал сӯҳбат намекунам. Фақат бигӯям, ки он ба замимаи мо танҳо ҳамчун хусусияти иловагӣ замима шудааст. Гап дар он аст, ки мо барои сохтани тарафи муштарӣ саҳифаҳои JSP-ро истифода хоҳем бурд. Маълумоти мо дар саҳифа ҳамчун ҷадвал бо рӯйхати корбарон намоиш дода мешавад. Дар дохor саҳифаҳои JSP, барчаспҳои HTML <form/> истифода мешаванд. Ва танҳо дархостҳои HTTP GET ва POST метавонанд барои фиристодани маълумот аз <form/> истифода шаванд. Яъне, барои ҳар се амалиёт - навсозӣ, нест кардан ва эҷод кардани корбар - мо бояд танҳо дархостҳои POST-ро истифода барем. Истифодаи дархостҳои PUT ва DELETE барои мо дастрас нест. Ва, аслан, ин комилан муқаррарӣ ва осон аст, аммо синфи HiddenHttpMethodFilter ба мо имкон медиҳад, ки онҳоро истифода барем. Ин фарқияти байни амалҳои барномаро барои хонанда равшантар мекунад. Ниҳоят, биёед ба тарафи муштарӣ гузарем. Он бо панҷ саҳифаи JSP муаррифӣ шудааст. index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Здравствуйте!</title>
</head>
<body>
Если вы хотите начать работу с базой данных пользователей - <br>
нажмите кнопку ниже:

<form action = "users" method="get">
    <input type="submit" value="Начать работу с базой данных">
</form>
</body>
</html>
addUser.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Добавить нового пользователя</title>
</head>
<body>
<form action = "/users" method="post">
    <input required type="text" name="name" placeholder="Name">
    <input required type="text" name="age" placeholder="Возраст">
    <input type="submit" value="Сохранить">
</form>
</body>
</html>
deleteUser.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Удалить пользователя</title>
</head>
<body>

Вы действительно хотите удалить пользователя ${param.id}?

&lform action="/users/${param.id}" method="post">
    <input type="hidden" name="id" value="${param.id}">
    <input type="hidden" name="_method" value="delete">
    <input type="submit" value="Удалить">
</form>

</body>
</html>
showUsers.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Список пользователей</title>
</head>
<body>
<table border="2">
    <tr>
        <td>ID</td>
        <td>Name</td>
        <td>Возраст</td>
        <td>Действия</td>
    </tr>
    <c:forEach items="${users}" var = "user">
        <tr>
            <td>${user.getId()}</td>
            <td>${user.getName()}</td>
            <td>${user.getAge()}</td>
            <td>
                <form action = "updateUser.jsp" method="post">
                    <input type="hidden" name="id" value="${user.getId()}">
                    <input type="hidden" name="name" value="${user.getName()}">
                    <input type="hidden" name="age" value="${user.getAge()}">
                    <input type="submit" value="Изменить" style="float:left">
                </form>
                <form action="deleteUser.jsp" method="post">
                    <input type="hidden" name="id" value="${user.getId()}">
                    <input type="submit" value="Удалить" style="float:left">
                </form></td>
        </tr>
    </c:forEach>
</table>

<form action = "addUser.jsp">
    <input type="submit" value="Добавить нового пользователя">
</form>
</body>
</html>
updateUser.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Изменить данные пользователя</title>
</head>
<body>

Редактировать пользователя

<form action="/users/${param.id}" method="post">
    <input type="hidden" name = "id" value="${param.id}">
    <input type="text" name="name" value="${param.name}" placeholder=${param.name}>
    <input type="text" name="age" value="${param.age}" placeholder=${param.age}>
    <input type="hidden" name="_method" value="put">
    <input type="submit" value="Обновить">
</form>

</body>
</html>
Саҳифаи JSP (Java Server Page) ду намуди матнро дар бар мегирад: маълумоти сарчашмаи статикӣ, ки метавонанд дар яке аз форматҳои матнӣ (HTML, SVG, WML ё XML) бошанд ва унсурҳои JSP, ки мундариҷаи динамикӣ бунёд мекунанд. Барои фаҳмидани он ки JSP чист, ман ба худам иҷозат медиҳам, ки як пораи мақолаи хеле хуби як муаллифро нусхабардорӣ ва часбонам ( аз ин ҷо ). "Аслан, JSP ҳангоми бори аввал дастрас шуданаш ба сервлет табдил дода мешавад ва ҳамчун сервлет кор мекунад. Барои фаҳмидани ин хеле муҳим аст. JSP саҳифае мисли саҳифаи HTML НЕСТ - барои як барномасози навкор муҳим аст, ки ба таври возеҳ дарк кунад, ки ин сервлети дигар аст - ба шумо танҳо лозим нест, ки баромади онро барномарезӣ кунед. Он шумо метавонед танҳо кашед. Ва маълумотро дар ҷойҳои лозима иваз кунед. Аммо азбаски саҳифаи JSP ҳадди аққал ба ягон навъ ба HTML шабоҳат дорад, барои дизайнер осонтар хоҳад буд. Ва ман бори дигар ба шурӯъкунандагон ҚАТЪИЯТ мегӯям - JSP як SERVLET аст . Он бо ҳама маълумот дар server омода карда мешавад. Дар ин ҷо ҳама маълумот ворид карда мешавад. Ва корбар дар браузер саҳифаи HTML-и тайёрро мегирад, ки ягон аломати JAVA доранд." Шумо метавонед худатон бубинед, ки саҳифаи JSP воқеан сервлет аст, зеро ҳар як саҳифа усуле дорад, ки бояд иҷро шавад. Масалан, дар саҳифаи ибтидоии index.jsp гуфта мешавад, ки ҳангоми пахш кардани тугмаи "Оғози кор бо пойгоҳи додаҳо" method="get" иҷро мешавад. Дар саҳифаи addUser.jsp, ки барои эҷоди корбари нав масъул аст, вақте ки шумо тугмаи захираро пахш мекунед, method="post" иҷро мешавад. Қисми боқимондаи JSP аз аломатгузории муқаррарии статикии HTML иборат аст, аз ин рӯ мо дар бораи онҳо ба таври муфассал таваққуф намекунем - ин мавзӯи мақолаи алоҳидаест, ки дар Интернет бисёранд. Ҳамин тавр, мо замимаи худро офаридаем, танҳо санҷидани он дар амал аст! Барои ин ба мо контейнери сервлети дар боло зикршуда Apache Tomcat лозим аст. Шумо метавонед гурбаро аз вебсайти расмӣ зеркашӣ кунед (ман versionи 8-ро истифода мебарам). Баъдан, мо бояд дар IDEA конфигуратсия эҷод кунем, то барномаи худро тавассути Tomcat иҷро кунем. Барои ин, ҷадвали "Таҳрири конфигуратсияҳо" -ро кушоед, Аввалин барномаи шумо бо истифода аз Java Servlets - 4конфигуратсияи нав эҷод кунед Аввалин барномаи шумо бо истифода аз Java Servlets - 5ва Tomcat Server Local -ро интихоб кунед. Дар ҷадвали Сервери Барномаҳо, роҳро ба ҷузвдоне, ки Tomcat ҷойгир аст, муайян кунед.. Аввалин барномаи шумо бо истифода аз Java Servlets - 6Баъдан, ба ҷадвали Ҷойгиркунӣ гузаред. Аввалин барномаи шумо бо истифода аз Java Servlets - 7Дар ин ҷо мо ҷойгиркунии замимаи худро дар serverи маҳаллӣ танзим мекунем. "+" -ро клик кунед, "Artifact" -ро интихоб кунед -> Номи лоиҳаи шумо: ҷанг (мо барномаро ба файли ҷанг ҷамъоварӣ мекунем). Аввалин барномаи шумо бо истифода аз Java Servlets - 8Ин аст, асосан! Дар саҳифаи "Сервер" шумо мебинед, ки ҳамон барнома дар "http://localhost:8080/" кор мекунад. Ин конфигуратсияро захира кунед ва ба он чизе номгузорӣ кунед (номи конфигуратсияи ман "Томми" аст). Минбаъд, дар ҷадвали Maven дар IDEA (дар тарафи рост) мо плагини ҷангро барои сохтани лоиҳаи худ ба файли ҷанг истифода хоҳем кард (Плагинҳо -> ҷанг -> ҷанг: ҷанг). Аввалин барномаи шумо бо истифода аз сервлетҳои Java - 9Аввалин барномаи шумо бо истифода аз сервлетҳои Java - 10Муваффақият! Саҳифаи ибтидоӣ оғоз ёфт. Акнун тугмаи "Оғози кор бо пойгоҳи додаҳо" -ро клик кунед. Саҳифаи JSP-и мо index.jsp дархости GET-ро тавлид мекунад, ки аз ҷониби server коркард мешавад. Сервер посух тавлид мекунад ва онро дар шакли рӯйхати ҳамаи корбарони мавҷуда ба мо бармегардонад (агар, албатта, онҳо дар пойгоҳи додаҳо бошанд). Ва дар ин ҷо ҳастанд! Аввалин барномаи шумо бо истифода аз сервлетҳои Java - 12Биёед кӯшиш кунем, ки яке аз корбаронро нест кунем: Аввалин барномаи шумо бо истифода аз сервлетҳои Java - 13Ин ҳам кор мекунад! Ҳамин тавр, мо аввалин барномаи худро бо истифода аз сервлетҳо навиштем. Тавре ки шумо мебинед, ҳама чиз он қадар душвор набуд :) Ҳамчун вазифаи хонагӣ, шумо метавонед, масалан, функсияи кор бо мошинҳоро аз мақолаи қаблӣ ба барнома баргардонед. Онхое. сервлети алоҳида ва саҳифаҳои jsp барои мошинҳо эҷод кунед ва ба замимаи мо таълим диҳед, ки рӯйхати мошинҳои корбарро намоиш диҳед, ба ӯ мошинҳои нав илова кунед, инчунин онҳоро таҳрир ва нест кунед. PS Servlets ва JSP технологияҳои хеле қадимӣ мебошанд ва дар Интернет шумо метавонед аксар вақт шарҳҳоро дар рӯҳияи "ин партовҳо ба кӣ лозим аст?" Ҷавоб хеле оддӣ аст - он пеш аз ҳама ба онҳое лозим аст, ки дар лоиҳаҳои воқеӣ кор хоҳанд кард, ки дар он имкон дорад, ки бо истифода аз онҳо codeҳои зиёде навишта шаванд. Ва дидани "маводи кӯҳна" ба чизи нав, бидуни фаҳмидани он, ки он чӣ гуна кор мекунад, ҳаловатбахш аст :) Барои омӯзиши амиқтари мавзӯи JSP ва сервлетҳо, шумо метавонед китоби "Head First Servlets and JSP" (дар Танҳо забони англисӣ). Он аз ҷониби ҳамон муаллифон ҳамчун суперкитоби машҳури "Head First Java" навишта шудааст, ки барои бисёриҳо кафолати сифат шуда метавонад :) Ман умедворам, ки ин мақола барои хонандагон муфид буд! Агар хоҳед, ки мақолаҳои навро бубинед, дастгири кардани муаллифро дар озмун бо "Лайк" -ро фаромӯш накунед. Ё беҳтараш - "Ба ман хеле маъқул аст" :) Ташаккур барои таваҷҷуҳ ва дар таҳсилатон барори кор!
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION