Java EE Tomcat, Eclipse, podpięcie istniejącego projektu

Java EE Tomcat, Eclipse, podpięcie istniejącego projektu
TH
  • Rejestracja:prawie 9 lat
  • Ostatnio:prawie 6 lat
  • Postów:69
0

Cześć,
mam istniejący, jak na razie dość prosty projekt w Javie, którego celem jest stworzenia Rest API. Na początku nie zastanawiałem się jakiej technologii użyć do wystawienia pisanych przeze mnie funkcjonalności przez HTTP.

Dopiero teraz kiedy mam już trochę kodu napisanego zacząłem się nad tym zastanawiać. Po krótkich poszukiwaniach padło na JAX-RS + Tomcat. Nie miałem z tym nigdy do czynienia, więc kilka tutoriali i udało mi się uruchomić proste Hello World w przeglądarce.

Ten mój pierwotny projekt działał tak, że miał sobie w funkcję main, która odpowiadała za uruchomienie wszystkich funkcjonalności. Teraz pytanie co zrobić, żeby po uruchomieniu całego projektu na serwerze (Run on Server), zostało uruchomione to, co jest zapisane w funkcji main, tak żebym mógł za pomocą odpowiednich funkcji RESTowych dobrać się do zmiennych, funkcji, które zostały uruchomione w pierwotnek funkcji main.

Tak łopatologicznie, to chodzi mi po prosto o to, żeby wraz z uruchomieniem serwera wystartowało, to co już wcześniej zostało zaprogramowane.

Z góry bardzo dziękuję za pomoc

K5
  • Rejestracja:około 6 lat
  • Ostatnio:dzień
  • Postów:1001
0
thalion napisał(a):

Teraz pytanie co zrobić, żeby po uruchomieniu całego projektu na serwerze (Run on Server), zostało uruchomione to, co jest zapisane w funkcji main, tak żebym mógł za pomocą odpowiednich funkcji RESTowych dobrać się do zmiennych, funkcji, które zostały uruchomione w pierwotnek funkcji main.

?

A co takiego zostało "zaprogramowane" w tym mainie?

TH
  • Rejestracja:prawie 9 lat
  • Ostatnio:prawie 6 lat
  • Postów:69
0

Ok, myślałem, że nie ma to znaczenia ale skoro tak to spoko :)

Ogólnie program ma pozwalać zarządzać działaniem różnych urządzeń Smart Home, m.in. żarówkami Philips Hue. To co mam napisane to obsługa właśnie włączania i wyłączania żarówek. Celem całości jest umożliwienie zarządzania różnymi urządzeniami, które z założenia maja różne protokoły komunikacji. Moje API ma być takie samo dla wszystkich urządzeń i przykrywać protokoły poszczególnych producentów. Dzięki temu pisanie końcowej aplikacji klienckiej pozwala abstrahować od protokołu producenta, a więc upraszczać pracę. Teraz jest to jaśniejsze? :)

K5
  • Rejestracja:około 6 lat
  • Ostatnio:dzień
  • Postów:1001
0

Pisząc API RESTOWE tworzysz tzw endpointy. Nigdy nie robiłem / nie zastanawiałem się dłużej nad takim projektem (smart domu). Nawiązując do tych wspomnianych żarówek, pierwsze co mi przychodzi na myśl to coś w stylu:

  • główny endpoint: urządzenia
  • do konkretnego dostajesz sie po id: urzadzenia/54
  • wykonujesz PUT na: urzadzenia/54/zasilanie np z wartością true, które w dalszej logice "zamieniasz" na użycie odpowiedniej funkcji producenta do włączenia żarówki.

Ale na pewno nie robisz tego wszystkiego w mainie. W "mainie" masz jedynie startowanie Twojej aplikacji.
Reszta dzieje się na podstawie http requestów, które Twoja apka przyjmuje, przetwarza i na które odpowiada.

edytowany 4x, ostatnio: kixe52
TH
  • Rejestracja:prawie 9 lat
  • Ostatnio:prawie 6 lat
  • Postów:69
0

Tak, to się wszystko zgadza. Tylko że do tej pory miałem napisane wykrywanie żarówek (W przyszłości innych urządzeń) I trzymałem ich reprezentacje w obiektach Javy. Mam przygotowany klasy do tego i aplikacja po uruchomieniu wykrywa wszystkie dostępne urządzenia w sieci i pakuje je do jednej listy. I Chcilabym teraz żeby taki endpoint dostawał się do tej listy która została wygenerowana wcześniej - w momencie startu serwera, a nie wtedy kiedy zostanie wysłane żądanie HTTP na serwer.

Innymi słowy, gdzie należy umieścić kod uruchamiany wraz ze startem serwera, a nie wtedy kiedy przyjdzie request. Po to by móc w odpowiedniej chwili dobrać się do wykrytych urządzeń przechowywanych w liście

Tak, jak mówię nigdy z tego nie korzystałem, więc być może moje pytanie jest trywialne. Ale Myślę że teraz już wiadomo o co chodzi:)

K5
  • Rejestracja:około 6 lat
  • Ostatnio:dzień
  • Postów:1001
0

Nie wiem czy jest to dobry pomysł.
Możesz te reprezentacje urządzeń jako javowe obiekty, trzymać w bazie danych. Następnie wysyłając jakiś request pobierasz jedno konkretne urządzenie z bazy, sprawdzasz czy jest aktualnie dostępne w sieci i następnie wykonujesz sobie to co zechcesz.

Co jeśli włączysz apke, pobrane zostaną urządzenia aktualnie dostępne, apka będzie działać kilka godzin, w ciągu tego czasu odłączysz urządzenie, a użytkownik będzie chciał z niego skorzystać?
W liście "dostępnych urządzeń" będzie widoczne, ale w sieci już go nie będzie.

Oczywiście mój sposób myślenia może być błędny, więc poczekaj na więcej odpowiedzi ;)

TH
  • Rejestracja:prawie 9 lat
  • Ostatnio:prawie 6 lat
  • Postów:69
0

Rozumiem ale mi tutaj nie chodzi o rozważanie tego pomysłu w sumie, tylko o to gdzie w zasadzie umieścić kod, który zostanie uruchomiony wraz ze startem serwera. Tak żebym mógł się w odpowiednich endpointach dostać np. do zmiennych tam uruchomionych. Jak do tej pory potrafię pisać kod, który wykona się dopiero kiedy wyślę request. Pytanie, co zrobić, żeby napisać kod, który wykona się OD RAZU po uruchomieniu.

Pozdrawiam

K5
  • Rejestracja:około 6 lat
  • Ostatnio:dzień
  • Postów:1001
0
thalion napisał(a):

Tak żebym mógł się w odpowiednich endpointach dostać np. do zmiennych tam uruchomionych.

Dalej nie rozumiem tego zdania.

Nie wiem jak to jest w samej Javie EE, ale np w spring boot można (lecz nie powinno się) umieścić ten kod w klasie startującej twoją apkę webową - ta z adnotacja @SpringBootApplication.

Tak z ciekawosci, dlaczego wybór padł akurat na taki stack?
Dla początkujących SpringBoot jest bardzo przystępny.

damianem
  • Rejestracja:prawie 8 lat
  • Ostatnio:3 miesiące
  • Postów:205
0

Hmm, jeśli chcesz robić aplikację JAX-RS na Tomcacie, to musisz zbudować aplikację webową (artefaktem jest plik .war zamiast .jar), który będzie zawierał plik web.xml o którym możesz poczytać. Ten plik służy do "rejestrowania" takich rzeczy jak servlety i filtry Twojej aplikacji w serwerze. Powinieneś zarejestrować w tym pliku servlet Twojej implementacji JAX-RS (zakładam, że Jersey) oraz przekazać temu servletowi parametr, który określi, które pakiety skanować w poszukiwaniu Twoich REST kontrolerów.

TH
  • Rejestracja:prawie 9 lat
  • Ostatnio:prawie 6 lat
  • Postów:69
0

Obawiam się, że nie do końca rozumiem. :( Szukałem trochę na podstawie Twojego postu ale ciągle mam mętlik w głowie.

Popraw mnie proszę, jeśli się mylę ale rozumiem, że mam stworzyć z mojego projektu plik war i potem za pomocą web.xml dowiązać go do tomcata. Tylko, czy plikiem war może być kod, który nie ma nic wspólnego z aplikacją webową? Tzn, co ja tak na prawdę mam zrobić z moim do tej pory napisanym kodem, który jest czystą javą i obsługuje komunikację z żarówkami? Czy to on właśnie ma być skompilowany do wara i użyty w servlecie, czy muszę ten kod umieścić najpierw w funkcjach servletowych. Kurde.. nie rozumiem tego :/

EDIT:
Ok, trochę się udało. Po utworzeniu nowego projektu udało mi się sprawić, żeby w konsoli pojawił się Hello World. Trzeba było stworzyć klasę dziedziczącą po HttpServlet, stworzyć w niej metodę init() i dodać w pliku web.xml następujący kod:

Kopiuj
  <servlet>
    <servlet-name>ServletName</servlet-name>
    <servlet-class>Paczka.NazaKlasy</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>

Następnie ze swojego dotychczasowego projektu stworzyłem plik *.jar i ten plik wykorzystałem w tej klasie która wyświetliła Hello World. I OK, działa. Jest tylko jeden problem. Chciałbym, żeby obiekty, które tworzę były widoczne dla wszystkich endpointów. Innymi słowy, żeby były współdzielone. Czy jest to możliwe? Chcę uruchomić jara i załadować dane do obiektów które będą oczekiwać na zapytania do serwera.

EDIT 2:
No cóż.. sam sobie odpowiadam. Już wiem, więc zostawiam dla innych gdyby ktoś kiedyś szukał podobnych rzeczy.

Do współdzielenia informacji pomiędzy serwerami służy między innymi kontekst servletów.
W startującym servlecie wystarczy napisać

Kopiuj
this.getServletConfig().getServletContext().setAttribute("nazwa_atybuty", OBIEKT);

a w tym, w którym chcemy użyć tego obiektu

Kopiuj
this.getServletConfig().getServletContext().getAttribute("nazwa_atybuty", OBIEKT);

Dzięki za poświęcony czas :)

edytowany 2x, ostatnio: thalion
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)