Forum Coders' city Strona Główna Coders' city
Nasza pasja to programowanie!
 

 PomocPomoc   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy  RejestracjaRejestracja 
Archiwum starego forum + teoria    RSS & Panel/SideBar
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Potrzebuję szybkiej odpowiedzi na moje pytanie... Zasady

Wywołanie metody Java z poziomu Javascript



 
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Java
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Altaro



Dołączył: 27 Kwi 2011
Posty: 3
Skąd: Łódź

PostWysłany: Sro Maj 04, 2016 8:53 am  OP    Temat postu: Wywołanie metody Java z poziomu Javascript Odpowiedz z cytatem Pisownia

Witam, czy da się zrobić to tak że, na onsubmit czyli :
Kod:
<div class="buttons-container">
            <input class="button" type="submit" onsubmit="checkProgress()" value="Rozpocznij proces kopiowania" />

        </div>


wykonuje się funkcja checkProgress(), która odpala metodę Java:

Kod:
public Integer actionRetrieveProgress() {
         String actionId = p.getParam("actionId");
        WorkerDelegate workerDelegate = new WorkerDelegate(getUserData(), workerHost, workerPort);

        ProgressDto progressDto = workerDelegate.retrieveActionProgress(actionId);
        paramsMap.put("progress", progressDto.getCurrentProgress());
        paramsMap.put("to_processed", progressDto.getProcessPool());
        paramsMap.put("copyingAssortmentReportId", actionId);
        return progressDto.getCurrentProgress();
    }


która zwraca Integer z aktualnym progresem ( progres jest logowany w tabeli sql więc stamtąd mógłbym pobierać cyfrę progresu )
i jest on wklejany do
Kod:
<div id=progress></div>
?

i takie sprawdzanie/podmiana cyfry idzie na przykład co trzy sekundy
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Numer GG
Luke



Dołączył: 17 Cze 2007
Posty: 1891
Skąd: Szczecin

PostWysłany: Sro Maj 04, 2016 9:07 am      Temat postu: Odpowiedz z cytatem Pisownia

Da się, ale nie tak bezpośrednio, jak to sobie wyobrażasz. JavaScript działa w przeglądarce klienta, a javowa aplikacja (jak się domyślam) na serwerze.

Musisz więc stworzyć jakieś API, z którym połączysz się za pomocą AJAX, odbierzesz odpowiedź i umieścisz ją gdzie trzeba w drzewie DOM.

W razie potrzeby pytaj o konkretne zagadnienia.

_________________
Moje projekty | Tani hosting
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora
lethern



Dołączył: 09 Paź 2007
Posty: 1104

PostWysłany: Sro Maj 04, 2016 10:34 am      Temat postu: Odpowiedz z cytatem Pisownia

(Nie napisałeś jakiej technologii używasz w Javie, tj. do generowania stron?)
zgodzę się z poprzednikiem, po stronie javy potrzebujesz webmethody, która by ogarniała odpalanie tego zadania (zakładam że najpierw musisz to zadanie wystartować, zanim zaczniesz sprawdzać jego progress), sprawdzanie czy zadanie/wątek istnieje (np. per sesja) i zwracanie jakiejś informacji (np. progress)
(zauważ że wspomniałem o temacie "per sesja" (per user, per id etc), bo raczej nie chcesz żeby użytkownicy wchodzili sobie w paradę etc., więc może być lepiej przechowywać jakiś token / session id i używać go przy komunikacji)

_________________
używasz Dev-Cpp? tools->editor options -> use tab character (włącz), smart tabs (wyłącz)... albo ściągnij np. Visual Studio C++ free.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email
Altaro



Dołączył: 27 Kwi 2011
Posty: 3
Skąd: Łódź

PostWysłany: Sro Maj 04, 2016 1:44 pm  OP    Temat postu: Odpowiedz z cytatem Pisownia

tak więc zrobiłem @RemoteMethod i otrzymuje z niej Dto-sa

front wygląda tak :
Kod:

<c:if test="${not empty app.copyingAssortmentReportId}">
        <div id="before" class="msg-ok" style="display: block;">
            Skopiowano <div id="progress"></div> z <div id="to-processed"></div>
        </div>
        <div id="after" class="msg-ok" style="display: none;">
            Kopiowanie zostało zakończone. <a href="<c:url value='/raport/${app.copyingAssortmentReportId}' />">Pobierz raport</a>
        </div>
    </c:if>
    <form id="submitCopying" action="${burl}" method="POST" class="iformat-copying-assortment-box" >
        <div class="option-container">
            <div class="iformat-copying-assortment-filter-option">
                <div class="option-label">Dostawca źródłowy:</div>
                <tg:AjaxAutoCombo id="fromSupplier" hideAfterAdd="true" width="${width+160}" />
            </div><div class="cl"></div>
<div class="buttons-container">
            <input class="button" type="button" onclick="checkProgress()" value="Rozpocznij proces kopiowania" />
        </div>
    </form>



<script type="text/javascript">

    function checkProgress() {
        setInterval(function () {
            checkCopyAssortmentProgress();
        }, 3000);
        var form = $("#submitCopying");
        form.submit();
    }

    function checkCopyAssortmentProgress() {
        var reportRequestDto = { actionId: '${app.copyingAssortmentReportId}'};
        GlobalActionsRemote.retrieveProgressDto(
                reportRequestDto, {
                    callback : onRemoteCopyAssortmentActionSuccess,
                    errorHandler: onRemoteCopyAssortmentActionFailure
                }
        );
    }

    function onRemoteCopyAssortmentActionSuccess(response) {
        if (response.error || !response.content) {
            alert2("Wystąpił błąd podczas zapisywania danych.");
            return;
        }
        var progressDto = JSON.parse( response.content );
        document.getElementById('progress').innerHTML = progressDto.currentProgress;
        document.getElementById('to-processed').innerHTML = progressDto.processPool;

        if (progressDto.currentProgress === progressDto.processPool) {
            document.getElementById('before').style.display == 'none'
            document.getElementById('after').style.display == 'block'
        }
    }

    function onRemoteCopyAssortmentActionFailure(errorMsg) {
        alert2("Wystąpił błąd podczas zapisywania danych2.");
    }
</script>




powiedzcie mi... dlaczego to nie działa ? na froncie nie podmieniają się divy... no chyba że "checkCopyAssortmentProgress()" odpalę sobie ręcznie z konsoli w przeglądarce... tak jakby w ogóle ten "setInterval" nie działał...
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Numer GG
Wyświetl posty z ostatnich:   
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Java Wszystkie czasy w strefie CET (Europa)

Strona 1 z 1

 
Skocz do:  
Możesz pisać nowe tematy
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Możesz dodawać załączniki na tym forum
Możesz pobierać pliki z tego forum




Debug: strone wygenerowano w 0.09338 sekund, zapytan = 11
contact

| Darmowe programy i porady Jelcyna | Tansze zakupy w Helionie | MS Office Blog |