JavaRush /Блоги Java /Random-TG /Хидматҳои веб. Қадами 2. Чӣ тавр содда кардани навиштани ...
eGarmin
Сатҳи

Хидматҳои веб. Қадами 2. Чӣ тавр содда кардани навиштани муштарӣ?

Дар гурӯҳ нашр шудааст
Дар ин ёддошти зуд, ман мехоҳам рамзи муштарии хидматрасонии вебро, ки мо дар қадами қаблӣ навишта будем, аз нав дида бароям . Дар ин ҳолат, ман тахмин мекунам, ки шумо IDEA кушодаед ва дар он лоиҳа аз Қадами 1 мавҷуд аст. Хизматрасонии веби мо бояд дар ин лоиҳа оғоз шавад:
package ru.javarush.client;

// нужно, чтобы получить wsdl описание и через него
// дотянуться до самого веб-сервиса
import java.net.URL;
// такой эксепшн возникнет при работе с an objectом URL
import java.net.MalformedURLException;

// классы, чтобы пропарсить xml-ку c wsdl описанием
// и дотянуться до тега service в нем
import javax.xml.namespace.QName;
import javax.xml.ws.Service;

// интерфейс нашего веб-сервиса (нам больше и нужно)
import ru.javarush.ws.HelloWebService;

public class HelloWebServiceClient {
    public static void main(String[] args) throws MalformedURLException {
        // создаем ссылку на wsdl описание
        URL url = new URL("http://localhost:1986/wss/hello?wsdl");

        // Параметры следующего конструктора смотрим в самом первом теге WSDL описания - definitions
        // 1-ый аргумент смотрим в атрибуте targetNamespace
        // 2-ой аргумент смотрим в атрибуте name
        QName qname = new QName("http://ws.javarush.ru/", "HelloWebServiceImplService");

        // Теперь мы можем дотянуться до тега service в wsdl описании,
        Service service = Service.create(url, qname);
        // а далее и до вложенного в него тега port, чтобы
        // получить ссылку на удаленный от нас an object веб-сервиса
        HelloWebService hello = service.getPort(HelloWebService.class);

        // Ура! Теперь можно вызывать удаленный метод
        System.out.println(hello.getHelloString("JavaRush"));
    }
}
Аҳамият диҳед, ки чӣ қадар мо бояд пешакӣ донем. Илова бар он, ки ба шумо дастрасӣ ба тавсифи wsdl лозим аст (бе ин, бубахшед, ҳеҷ роҳе нест):
URL url = new URL("http://localhost:1986/wss/hello?wsdl");
шумо бояд ин файли xml-ро худатон кушоед ва ба тег definitionsва дар он атрибутҳо нигоҳ кунед targetNamespaceва nameба созанда занг занед QName:
QName qname = new QName("http://ws.javarush.ru/", "HelloWebServiceImplService");
пас шумо бояд ба тег дастӣ пайваст шавед service:
Service service = Service.create(url, qname);
ва дар он ба тег port:
HelloWebService hello = service.getPort(HelloWebService.class);
ва танҳо пас аз он мо метавонем усули дурдастро даъват кунем:
hello.getHelloString("JavaRush")
Саволе ба миён меояд: магар ин аст, ки бобою бобоёни мо дар майдони набард ҷон додаанд, ки ҳоло мо ҳама корро дастӣ анҷом медиҳем? Ва агар он ҳатто хидмати веби мо нест, балки ягон каси дигар бошад. Он гоҳ ин раванд боз ҳам ногувортар мешавад. Формати XML барои хондани мошинҳо тарҳрезӣ шудааст, на одамон. Пас биёед бигзор машина кори ифлосро ичро кунад ва аз процесс лаззат барад. Барои ин ба мо лозим нест, ки ягон кори махсусе кунем, зеро... SDK дӯстдоштаи мо, ки JDK дар Java ном дорад, як утorтаи махсус бо номи wsimport -ро дар бар мегирад . Аммо аввал чизҳои аввал... Аввалан, биёед лоиҳаи навро дар IDEA бо интихоби Файл > Лоиҳаи нав... аз меню ва додани номи лоиҳа HelloWS созем . Вақте ки аз мо мепурсанд, ки лоиҳаи навтаъсисро дар куҷо кушоем, мо бояд ҷавоб диҳем Равзанаи нав , яъне. дар равзанаи нав, зеро ман бори дигар қайд мекунам, ки кушода будани лоиҳаи қаблӣ хеле муҳим аст, зеро Мо аз Қадами 1 дар хотир дорем, ки мо хидмати веби худро дар ин лоиҳа иҷро мекунем. Шумо метавонед, албатта, онро танҳо тавассути консоли Windows оғоз кунед, аммо ман ин корро дӯст намедорам. Аз лоиҳаи нав консолро бо интихоби Намоиш > Воситаи Windows > Терминал кушоед ё танҳо пахш кардани Alt+F12 . Ҳоло мо дар решаи лоиҳа қарор дорем ва мо бояд ба ҷузвдони src ворид шавем , бинобар ин мо фармони зеринро ба консол ворид мекунем: cd src Ҳоло вақти истифодаи утorтаи wsimport аст . Он аз рӯи принсипи зерин кор мекунад: мо ба он тавсифи WSDL мегузорем ва дар ҷавоб он файлҳои ноустуворро (ба ном Stub-синфҳо) эҷод мекунад, ки аллакай дорои тамоми функсияҳое мебошанд, ки барои дастрасӣ ба хидмати веб лозим аст. Ин синфҳо дар баста ҷойгир карда мешаванд ru.javarush.ws. Агар шумо пурсед, ки номи баста аз куҷост, ҷавоб ин аст: номи баста фазои номи ҳадафи баръакси тавсифи WSDL мебошад . Хусусиятро targetNamespaceдар барчасп definitionsаз WSDL дар хотир нигоҳ доред . Дар он ҷо мо чунин навишта будем http:// ws.javarush.ru/. Ва ин суроғаи сайт нест, ҳамин тавр тасвир кардани фазои номҳо дар xml маъмул аст ва агар мо http://он чизеро, ки бо тартиби баръакс боқӣ мондааст, партофта ва васеъ кунем, мо номи бастаи худро мегирем. Пас, биёед утorтаро иҷро кунем: wsimport -keep http://localhost:1986/wss/hello?wsdl Барои он ки он кор кунад, роҳ ба он бояд дар тағирёбандаи муҳити PATH муайян карда шавад , ё шумо метавонед танҳо роҳи пурраи онро истифода баред. Барои ман он дар папкаи C:\Program Files\Java\jdk1.8.0_31\bin ҷойгир аст . Лутфан қайд кунед, ки танҳо ба шумо лозим аст, ки файли WSDL- ро тавассути калиди -keep интиқол диҳед , ки он тавассути истиноди фосилавӣ дастрас аст, агар мо хидмати вебро ғайрифаъол накунем. Ин синфҳои ноустувор чист? Танҳо ду нафари онҳо вуҷуд доранд. Яке аз онхостHelloWebService, ки аслан ҳамон интерфейси хидматрасонии веб аст, ки мо дар Қадами 1 дастӣ офаридаем. Фарқият ҳадди аққал аст ва он дар он аст, ки эзоҳҳое, ки мо аллакай дучор шудаем, каме дигар истифода мешаванд ва илова бар ин, эзоҳҳои иловагӣ истифода мешаванд, ки Ман гуфтам, ки ман чизе намедонам, аммо азбаски ҳама чиз қаблан барои мо бе онҳо кор мекард, пас онҳо бешубҳа ҳатмӣ нестанд. Синфи дуюм stub мебошад HelloWebServiceImplService, ки аз синф мерос мегирад Service. Мо аллакай бо синф Serviceдар муштарии худ дучор омадаем. Ман рамзи ин синфро намедиҳам, зеро... Ман базӯр омода нестам, ки ҳамаи сатрҳои онро шарҳ диҳам, аммо моҳияти синф дар он аст, ки ҳама чизеро, ки мо қаблан дар муштарӣ барои пайваст шудан ба хидмати веб дастӣ навишта будем, дар ин синф ба таври худкор эҷод карда мешавад ва мо танҳо лозим аст, ки яке аз усулҳои онро даъват кунед ва мо ҳама чизро дар кори кушод дорем. Пас, биёед рамзи муштарии худро дар як лоиҳаи нав бо истифода аз ин синфҳо аз нав нависед ва боварӣ ҳосил кунем, ки code мухтасартар аст. Аввалан, дар папкаи src лоиҳаи нав, биёед бастаеро эҷод кунем ru.javarush.clientва дар он синф HelloWebServiceClientбо усули main:
package ru.javarush.client;

// подключаем классы-заглушки
import ru.javarush.ws.*;

public class HelloWebServiceClient {
    public static void main(String[] args) {
        // подключаемся к тегу service в wsdl описании
        HelloWebServiceImplService helloService = new HelloWebServiceImplService();
        // получив информацию из тега service подключаемся к самому веб-сервису
        HelloWebService hello = helloService.getHelloWebServiceImplPort();

        // обращаемся к веб-сервису и выводим результат в консоль
        System.out.println( hello.getHelloString("JavaRush Community") );
    }
}
Таҳлor code ибтидоӣ аст ва он чизе ки ман дар шарҳҳо тавсиф кардам, кофӣ аст. Пас аз оғоз кардани муштарӣ, мо бояд сатрро бубинем: Hello, JavaRush Community!Ҳамзамон, муштарӣ аз лоиҳа аз Қадами 1 корашро идома медиҳад ва матни худро, ки мо дар он навишта будем, намоиш медиҳад, яъне: Hello, JavaRush! Дар ин лаҳза, шояд мо метавонем ин корро анҷом диҳем. Қадам, зеро максадаш ба амал омад. Мо фаҳмидем, ки агар тавсифи WSDL- и хидмати веб мавҷуд бошад , jdk омода аст ба мо тавлиди автоматии stubсинфҳои ноустуворро пешниҳод кунад, то навиштани муштариро барои ин хидматрасонии веб содда кунад. Ба андешаи ман, ин як хусусияти хеле муфид аст, вақте ки шумо мехоҳед хидмати веби ягон каси дигарро санҷед ва ба тавсифи WSDL- и он нигоҳ накунед . Нигоҳе ба оянда Дар мақолаи навбатӣ дар бораи хидматҳои веб, ман мехоҳам ғояҳоро дар бораи ҷойгиркунии хидмати веб дар контейнери сервлети Tomcat ва serverҳои гуногуни барномаҳо баён кунам, то ба шумо лозим нест, ки хидмати вебро ҳамчун хидматрасонӣ иҷро кунед. аризаи алоҳида, тавре ки мо дар 2 Қадами аввал кардем. Аммо пеш аз ин, ман фикр мекунам, ки дар мавзӯи сервлетҳо, контейнерҳои сервлет чӣ гунаанд ва онҳо аз serverҳои барномавӣ ва веби муқаррарӣ чӣ фарқ доранд, як кӯтоҳи кӯтоҳе анҷом диҳед... . Илова бар ин, мо бояд дар бораи serverҳои барномаҳо шарҳи мухтасаре диҳем , ки ба андешаи ман, сазовори таваҷҷӯҳи мо мебошанд.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION