Zdjęcie w tle
Yeboy

Yeboy

Debiutant
  • 2wpisy
  • 10komentarzy
Wpis dotyczy #java #spring
Cześć.
Chciałbym Was zapytać o jedną dość laicką kwestię.
Studiuję sobie trochę jak Spring działą pod spodem i ogólnie budowanie appek pure MVC / RESTful.
Ciekawi mnie jedna kwestia. W momencie kiedy tworzymy powiedzmy apkę opartą o architekturę czysto MVC, czyli mamy:
- Model (dane),
- View (JSP lub jakieś zewnętrze biblioteki np. Thymeleaf etc.)
- Controller (tu ogarniamy dane z modelu i przesyłamy te dane wraz ze wskazanie, który widok ma być wyświetlony).
Załużmy, że używamy Spring Boota ze starterem web, który konfiguruje Nam:
- DispatcherServleta (nie musimy mapować serwletów, wkazywać root configuracji itp.)
- ViewResolvera 
+ nie musimy generalnie config klasy dowozić wraz z @EnableWebMvc, @ComponentScan, @Configuration itd. 
Jeśli używamy Spring Bootowej domyślnej auto-konfiguracji to odpada Nam tworzenie beanów itd. 
Spring Boota ma wbudowany kontener servletów Tomcat, więc to również Nam odpada + mamy spakowane dependencje w startery. 
Świetnie. Teraz załużmy, że startujemy Naszą apkę. Mamy napisane wszystkie warstwy MVC. 
Nasza apka jest z automatu deployowana jako war na serwer Tomcat. 
(Wiem, że Spring Boot ogarnia większość tych rzeczy sam, ale żeby zadać odpowiednie pytanie, muszę to jakoś opisać ( ͡o ͜ʖ ͡o) )
Ok, to lecimy. 
- User wysyła requesta
- Nasza apka odbiera requesta, zczytuje konfigurację z web.xml lub java-based-config.class gdzie skonfigurowany jest DispatcherServlet.
- Teraz ten DispatcherServlet (innymi słowy Front Controller) tworzy tzw. WebApplicationContext container (ten kontekst rozszerza ApplicationContext) z pliku, który w XML musi wyglądać następująco "nazwaServletu-servlet.xml" np. "frontcontroller-dispacher-servlet.xml". W tym pliku konfiguracyjnym wskazujemy ścieżkę do zeskanowania, w której będziemy trzymać klasy z adnotacją @Controller. W momencie kiedy taka klasa zostanie znaleziona, to trafia do wspomnianego kontenera. 
- teraz powiedzmy, że user wykonał rządanie pod adresem /test.com/hello. Ścieżka w pliku konfiguracyjnym web.xml była następująca /test.com/*, a więc ten adress łapie się w zakresie danego DispatcherServleta. Jeśli się łapie, to uderzamy do konfiguracji dispachera, czyli pliku "frontcontroller-dispatcher-servlet.xml". W tym pliku jak już wyżej wspomniałem mamy ścieżkę, która jest skanowana pod kątem klas z @Controller. 
- teraz tzw. Handler Mapping znajduje pasujący controller na podstawie URL i tak jakby zwraca go z powrotem do DispatcherServletu. 
- teraz tzw. Handler Adapter egzekwuje/wywołuje logikę biznesową wewnątrz controllera.
- controller woła serwis 
- serwis woła warstwę DAO 
- DAO łączy się z baza danych i lecimy z powrotem do góry
- DAO -> service
- service -> controller 
- controller -> Handler Adapter 
- Handler Adapter -> Dispatcher
- teraz na podstawie zwróconego ModelAndView (lub samego Stringa wskazującego na nazwę widoku) Dispatcher komunikuje się z tzw. ViewResolverem. 
- ViewResolver znajduje po prefixie i sufixie odpowiedni View i zwraca lokację widoku do Dispatchera
- Dispatcher znając lokację docelowego widoku przesyła do niego model (dane) i następnie ten widok jest zwracany jako Response.
Czy dobrze rozumiem workflow MVC? 
Natomiast moje docelowe pytanie, to jak wewnętrznie wygląda workflow dla właśnie aplikacji RESTfulowej. Nie mamy wtedy żadnych widoków, używamy właśnie @RestController, który zawiera w sobie adnotacje @Controller + @RequestBody. Dzięki temu wiemy, że taki controller zwracać ma response w postaci JSON lub XML. Klient w headerze ("Accept") wysyła info o tym, w jakiej postaci chce uzyskać odpowiedź i wtedy uruchamiany jest odpowiedni HttpMessageConverter, np. MappingJackson2HttpMessageConverter. 
Okej, ale co z działaniem pod spodem. Coś musi wykrywać, do jakiego controllera uderzyć. Czy działa to na podobnej zasadzie, tylko pomijany jest po prostu widok i od strzała wysyłany jest JSON/XML?
Z góry dziękuje każdemu, któremu chciało się powyższy esej przeczytać.
splatch

@Yeboy Twoja dedukcja jest mniej więcej poprawna. Końcowy etap, o który pytasz wygląda w ten sposób że jest coś takiego co się nazywa ViewResolver, który jest odpowiedzialny za wybranie odpowiedniego widoku. Dodatkowo jest implementacja ContentNegotiatingViewResolver, która na podstawie nagłówka Accept szuka najlepiej pasującej implementacji widoku.

Jeśli bijesz przeglądarką - masz Accept: text/html, jak wywołujesz coś do API to zazwyczaj będziesz miał application/json i tak dalej.

Logikę view resolvera możesz prześledzić samodzielnie, jest ona odpalana przed samym widokiem.


Druga kwestia odnośnie samego mapowania metod - domyślnie kontrolery mają po jednej metodzie na każdą ścieżkę. W JAXRS, być może w Springu też, jest tak że metod do każdej ścieżki może być kilka i wybierana jest ta, która ma najlepsze dopasowanie do ścieżki i samej treści zapytania. Czyli przy GET /, Accept: text/html najpierw pójdzie metoda z @RequestMapping(consumes=text/html), później z @RequestMapping(consumes=text/*) a na końcu będzie @RequestMapping.


Co do samego widoku i tego jak on działa - wystarczy że wyrzuci coś do HttpServletResponse i output stream. Czyli dla JSP/freemarker itd będzie procesowanie szablonów a dla XML/JSON po prostu zrzucenie modelu prosto do odpowiedniego formatu.

Zaloguj się aby komentować

Cześć Ludziska! ( ͡~ ͜ʖ ͡°)
Jestem tu nowym użytkownikiem, który przybył na Hejto ze sławnego (a ostatnimi czasy osławionego niestety) Wykopu i zaintrygowała mnie kwestia Waszego podejścia do jednej z kluczowych rzeczy, która na owym portalu strasznie mnie zrażała do *jakiejkolwiek interakcji z tamtejszą społecznością.
Mianowicie, czy uważasz, że kontent typu #przegryw, #blackpill, #patostreamy, #incel itp. powinien być zakazany z poziomu regulaminu portalu, czy jednak uważasz, że wolność słowa, wyrażania swoich wszelakich opinii/poglądów itd. jest dla Ciebie kwestią nadrzędną i tego typu wpisy powinny być mimo wszystko dostępne?
Jak podchodzicie do tej kwestii?
Poniżej ankieta, czysto dla mnie informacyjna. Nie zamierzam rozpętywać tu żadnej gówno-burzy, więc jeśli komuś brakuje kultury, to uprzejmie proszę zapukać do innych drzwi.
W samych odpowiedziach w ankiecie nie chciałem rozwijać wątku, dlaczego TAK lub dlaczego NIE, ponieważ temat jest zwyczajnie dość skomplikowany, dlatego bardzo zachęcam do uargumentowania swoich odpowiedzi w sekcji komentarzy.
*ok, żeby nie popadać w dramatyzm/'przesadyzm', muszę oddać Wykopowi, że niektóre tagi były wolne od powyższego problemu (nazywam rzeczy po imieniu, więc mojej odpowiedzi w ankiecie pewnie się już domyślacie), ale ogólny odbiór kontentu był imo jednak przez te wszystkie wyzwiska i niskich lotów wpisy dość niski.
Zachęcam również do przejrzenia postu użytkownika @Reminev , który poruszył kwestię "dlaczego banowanie poszczególnych tagów nie załatwia niestety problemu'.
Oto link: Ludzie ktorzy mowia zeby zostawic przegrywow i patusow i po - Reminev - Hejto.pl

Czy uważasz, że kontent typu #przegryw, #blackpill, #patostreamy, #incel itp. powinien być zakazany z poziomu regulaminu portalu?

80 Głosów
mdobak

Moim zdaniem, jak autorzy portalu uważają, że źle wpływa to na odbiór ich strony to mogą po prostu wrzucać to domyślnie na czarno nowym użytkownikom i ukrywać niezalogowanym. Ale informacja o tym, że niektóre treści są domyślnie ukryte powinna być zakomunikowana tak, aby nikt tego nie przeoczył.

pozytywny_gosc1

odbierdolta się od naszych przegrywów i blackpillu i od nas!

Blackmore

Po pierwsze to jest absurdalne z biznesowego punktu widzenia, bo zwyczajnie zabije hejto. Polska jest liderem jesli chodzi o przegryw obecnie przez wzgląd na to, że zaliczyliśmy spadek przyrostu demograficznego w ostatnich 4 dekadach, sporo Polek wiąże się z obcokrajowcami, a dodatkowo przyjeżdża do nas coraz więcej imigrantów - w 75% mężczyzn. Ogromny odsetek młodych Polaków płci męskiej to przegrywy albo ludzie, którzy otarli się o przegryw (bo sorry, ale znalezienie sobie partnerki po 30-tce to nie żaden wygryw). I to właśnie taka kategoria osób najwięcej czasu spędza w Internecie tj. przebywa na takich stronach. Osoby, które mają bogate realne życie albo rodziny raczej rzadko mają czas, aby spędzać czas na forach internetowych i coś pisać.


Ktoś pewnie poda przykład Reddita - tyle, ze to jest zupełnie inna sytuacja bo to angielskojęzyczna strona tj. dla nich targetem jest cały Świat. Z ich punktu widzenia pozbycie się inceli mogło być nawet dobrą decyzją biznesową, bo i bez nich mają sporo użytkowników.


Po drugie - to, że takie treści odstraszają kobiety to mit. Kobiety nigdy nie udzielały się masowo na forach internetowych, chyba że było to forum stricte dla kobiet w rodzaju wizażu. Na niemal każdym forum kobiety to niewielka mniejszość.


Po trzecie koncepcja zakazywania jakiś poglądów, bo komuś się one nie podobają jest czymś kompletnie absurdalnym, wprost abstrakcyjnym. Pomyślcie sobie jakby wyglądał Świat gdyby wszędzie większość zakazywała poglądów mniejszości, które im się nie podobają i ranią ich delikatne uczucia. Przecież istnieje opcja czarnolistowania osób i tagów.


Po czwarte to zwyczajne świństwo, bo wielu ludziom udzielanie się na takich tagach zwyczajnie pomaga. Mogą się wyżalić, poczuć że jest więcej takich osób jak oni, znaleźć rady na wyjście ze swojej sytuacji - dużo sensowniejsze niż "uderz w stół", "idź na terapię" albo "kurs tańca", tudzież "lepiej dobierz pasek od spodni". Dla kogoś w wieku 17 lat wiedza, że może sobie kupić buty z wkładkami podwyższającymi, że musi dbać o swoje życie towarzyskie i krąg przyjaciół oraz znajomych (bo na Tinderze albo zagadując do randomowych lasek w klubie jest bez szans), że musi reagować na proces łysienia jak najszybciej, że istnieje opcja przeszczepu, że w ostateczności może spróbować geomaxxingu - jest bardzo cenna. Tak samo cenna dla kogoś z wyglądem 2/10, że nawet nie warto próbować, tylko zająć się czymś innym - co sprawia przyjemność, zamiast robić z siebie pośmiewisko. Twierdzenia, że ludzi to dobija i jest to dla nich szkodliwe, to mylenie przyczyn ze skutkiem. Szkodliwy i toksyczny jest raczej współczesny Świat stworzony przez lewicowych ideologów.


Ludzie po prostu chcą, aby problem z którym czują się niekomfortowo zniknął z ich oczu. Po wojnie ulice rosyjskich miast były pełne kalek bez rąk i nóg. Stanowili oni przykry widok, psuli zdrowym ludziom humor swoim istnieniem. Stalin ich powywoził do różnych miejsc na daleką Północ albo Syberię, gdzie mogli sobie życ z dala od oczu innych ludzi. I to jest właśnie ten sam sposób myślenia - usunąć przegrywów, aby nie psuli humoru innym - przypominaniem o swoim istnieniu. Inni jeszcze napiszą, ze wstydzą się przyznać, ze piszą na Hejto/Wykopie, bo to miejsce jest kojarzone z przegrywami.

Zaloguj się aby komentować