Java EE vs Spring (nie pytam o zarobki)

Odpowiedz Nowy wątek
2018-11-03 17:18
0

Jak już wspomniałem, nie interesuje mnie za co więcej płacą(chociaż wydaje mi się, że zdecydowanie więcej za springa :) )

Nie mogłem znaleźć za dużo informacji na temat porównania tych platform, jedynie że Spring był zdecydowanie łatwiejszy w czasach starej Javy EE, natomiast teraz nie ma już takiej różnicy i oba rozwiązania są tak samo popularne i dobre.

Które rozwiązanie nauczy mnie więcej z zakresu aplikacji sieciowych i jest bardziej uniwersalne ?
Łatwiej prześć ze springa na Jave EE czy odwrotnie ?
Które rozwiązanie jest bardziej "naukowe" - w sensie które jest używane w jakiś instytuach i poważnych projektach naukowych, a nie startupach, gdzie projekty umierają po miesiącu, po czym powstaje 5 kolejnych w tym samym czasie.
Co ma większą renomę ? Jak reagujecie gdy ktoś ogarnia springa a jak gdy Jave EE :)

Pozostało 580 znaków

2018-11-04 10:45
watpliwosci napisał(a):

Które rozwiązanie nauczy mnie więcej z zakresu aplikacji sieciowych i jest bardziej uniwersalne ?

Nauczy? Żadne, oba nieudolnie starają się ukryć rozproszenie aplikacji. Przy czym w Java EE, EJB - założenie oryginalne było takie, że potencjalnie każdy Bean działa w innym JVM, a tylko przypadkiem mogą być na jednej maszynie. W Springu, domyślnie beany sa na jednym JVM, a wyjątkowo, mogą być na różnych.

Robienie serwisów Rest wygląda w obu tak samo - i tak generalnie wygląda obecnie (mainstreamowe) robienie aplikacji sieciowych.

Warto zaznaczyć. Klasyczny Spring (popularne moduły) jest oparty o specyfikacje Java EE( Servlety, JPA itd).
Spring zawiera ponadtko dużo dodatków, modułów, któych nie ma w JavaEE.

Co więcej jest możliwe,praktycznie, robienie aplikacji, które będą działały zarówno w kontenerze Spring jak i pod serwerem aplikacji Java EE. (bez zmiany kodu).

Łatwiej prześć ze springa na Jave EE czy odwrotnie ?

Jeden pies.

Które rozwiązanie jest bardziej "naukowe" - w sensie które jest używane w jakiś instytuach i poważnych projektach naukowych, a nie startupach, gdzie projekty umierają po miesiącu, po czym powstaje 5 kolejnych w tym samym czasie.

Jakbyś patrzył co jest używane w poważnych projektach naukowych, to by Ci pewnie wyszedł NodeJS, R i Groovy :-) - na uczelniach sie wszytkiego używa, i raczej nie warto z tego wielkich wniosków wyciagać.

Jakkolwiek, obie platformy nie są w żadnym stopinu naukowe.

Z mojego punktu widzenia rdzeń obu platform (czyli beany) to zbrodnia na Javie i logice. Robienie PHP z Javy. Mamy język z kompilatorem, żeby nam sprawdzał błędy przed uruchominiem, ale korzystamy z framworka, który dodaje dużo magi (reflekcja, proxy, thread local) w runtime, po to żeby wywaliło się dopiero na produkcji... WTF?

Moim zdaniem, żaden poważny projekt, gdzie istotne są pieniądze. czas produkcji i jakość rozwiązania, nie powienien korzystać z Java EE lub klasycznego Springa.

Co ma większą renomę ? Jak reagujecie gdy ktoś ogarnia springa a jak gdy Jave EE :)

Renoma ? Czesto czuć niesmak jak się słyszy o Java EE, bo ludzie zapominają, że Spring to faktycznie to samo. Największy niesmak jest jak ktoś powie J2EE (buuuuu......)

Jak reaguje jak ktoś mówi, że ogarnia springa lub Java EE?
Zadaje pytanie kontrolne - z podstaw. Potwierdzam, że nie ogarnia i przechodzę do nastnęgo punktu (Btw. ja też nie ogarniam).

Warto zaznaczyć, że pewien pozdbiór Spring 5 - Sping WebFlux, nie dziedziczy nic po Java EE, jak również po Springu klasycznym . Jest to zupełnie inna historia (moim zdaniem WebFlux nie powienien nazywać się Spring). Natomiast pokazuje, że twórcy Springa przynajmniej słuchają trochę głosu ludu. Gdzie community Java EEJakarta EE odjechało już nawet nie wiadomo w jaką siną dal.

Z ciekawostek:
Kiedyś byłem wielkim miłośnikiem Java EE, EJB itd. Ale to było przed java 8 i zanim poznałem alternatywy.


Bardzo lubie Singletony, dlatego robię po kilka instancji każdego.
edytowany 6x, ostatnio: jarekr000000, 2018-11-04 11:26
jakie mamy alternatywy ? prócz php ? - watpliwosci 2018-11-04 11:58
alternatywy: zależy do czego. Bo ogólnie to dobrą alternatywą jest Java. - jarekr000000 2018-11-04 12:07

Pozostało 580 znaków

2018-11-04 11:04
6

Programistom Javy poleciłbym przerobić jakiś tutorial z PHP/CSS/HTML.
Tak, aby zobaczyć że do zrobienia stronki tej czy innej nie potrzeba InitialContextProxyEnterpriseInjectorFactory.
Potem oczywiście można się bawić w Java patterny (te czy inne), ale będzie się pamiętało jak to jest miło jak jest prosto.

Pozostało 580 znaków

2018-11-04 11:17
2

@vpiotr: dobre :D Jednak z drugiej strony Spring Boot ukrył przed śmiertelnikami te dziwne klasy z nazwami dłuższymi niż normalne zdanie.
Przecież teraz RESTa można zrobić w 5 minut w Springu.

A bez Springa w 2 minuty :-) - jarekr000000 2018-11-04 11:30
Tu masz przykład : https://www.baeldung.com/spark-framework-rest-api . Hello world wygląda tak: public static void main(String[] args) { get("/hello", (request, response) -> "Hello World!"); } - jarekr000000 2018-11-04 12:43
:o Nawet nie miałem pojęcia o takiej technologii :) Dzięki za oświecenie. - NeutrinoSpinZero 2018-11-04 12:45
@NeutrinoSpinZero: to słabo czytasz forum skoro nie słyszałeś :-) - Aryman1983 2018-11-05 13:58

Pozostało 580 znaków

2018-11-04 12:00
0

Już kilka razy słyszałem, że można zrobić to w 5 minut. Ja póbuję już tydzień - ale z logowaniem i wylogowaniem do tego api... wciąż nie mam pojęcia czego użyć.

Napisz co chcesz zrobić, a wtedy dobierze się rozwiązanie. - jarekr000000 2018-11-04 12:07
Akurat jak używasz do tego Spring Security, to na początku jest droga przez mękę. Sam tak miałem, ogólnie wkurza mnie Spring Security ponieważ jest ciężko go "rozkopać", żeby zaimplementować własną implementację jakiegoś intefrejsu. - NeutrinoSpinZero 2018-11-04 12:44

Pozostało 580 znaków

2018-11-04 12:03
3
vpiotr napisał(a):

Programistom Javy poleciłbym przerobić jakiś tutorial z PHP/CSS/HTML.
Tak, aby zobaczyć że do zrobienia stronki tej czy innej nie potrzeba InitialContextProxyEnterpriseInjectorFactory.
Potem oczywiście można się bawić w Java patterny (te czy inne), ale będzie się pamiętało jak to jest miło jak jest prosto.

To bardzo ciekawy aspekt kulturowy.
Zasadniczo to już 15 temu można było pisać w javaie tak jak w (klasycznym) PHP. Wystarzyło użyć JSP i taglibów (sql) i scriptletów. (przykład ze stronki: http://www.ntu.edu.sg/home/eh[...]amming/java/JSPByExample.html)

<html>
<head><title>First JSP</title></head>
<body>
  <%
    double num = Math.random();
    if (num > 0.95) {
  %>
      <h2>You'll have a luck day!</h2><p>(<%= num %>)</p>
  <%
    } else {
  %>
      <h2>Well, life goes on ... </h2><p>(<%= num %>)</p>
  <%
    }
  %>
  <a href="<%= request.getRequestURI() %>"><h3>Try Again</h3></a>
</body>
</html>

Tylko, że jak rozsądny javowiec chce dodać swie liczby to jednak nie może po chamsku zrobić 2 + 2, tylko musi użyć co najmniej MathManager.getMathematics().getSummationStrategyFactoryBuilderBean().forSimpleUniverse().build().createMaths().setFirstsNumber(2) [...] itd.

Btw. nie zachęcam do pisania w JSP, bo ma wiele wad PHP... ale czasami naprawe można robić prosto.


Bardzo lubie Singletony, dlatego robię po kilka instancji każdego.
edytowany 2x, ostatnio: jarekr000000, 2018-11-04 12:30
Pokaż pozostałe 11 komentarzy
W serwisie skarpetkowym. - vpiotr 2018-11-04 13:58
Pewnie mój dziwaczny edytor tak zrobił. Nie zauważyłem, większy problem to raczej czemu to jest void - ale to pewnie był przykład negatywny więc nawet się nie przejąłem :-) (Ale dzięki, bo widzę jak ten bład naprawić). - jarekr000000 2018-11-04 14:01
Tam były ze 3 metody tak zrobione, może źle skonfigurowany formatter. - vpiotr 2018-11-04 14:04
Tak, wiem nawet gdzie. Kujowy edytor kodu niestety. To, z resztą, jedna z wielu wad mojego cudeńka, pacuje nad lepszą wersją tego. - jarekr000000 2018-11-04 14:18

Pozostało 580 znaków

2018-11-04 12:42
0

Odpowiadam tu bo w komentarzu by się nie zmieściło @jarekr000000
Mam bazę danych z użytkownikami i ich danymi, chciałbym aby była możliwośc zalogowania i wygenerowania tokenu (każdy user ma swoje hasło w tej tabeli), później każdy user może przy użyciu tego tokenu dodać nowe dane do swojej tabeli lub pobrać stare(tylko swoje) no i żeby przy wylogowaniu ten token był niszczony. Nie może być to zwykła strona tylko API, chce aby różne strony mógły się do tego podpiąć.
Ślepo ucze się Javy EE i Springa jednoczesnie w nadziei że w końcu któreś rozwiązanie doprowadzi mnie do zwycięstwa.

użytkownikami i ich danymi A co to są te dane. Jakiś string, mapa ? - jarekr000000 2018-11-04 13:32
lista z lokalizacjami usera, lista z czasem tych lokalizacji, czas zalogowania/wylogowania usera i komentarz usera do tych lokalizacji - watpliwosci 2018-11-04 13:39

Pozostało 580 znaków

2018-11-04 12:49
0

Nawiązując do tematu, ja nie wiem w sumie czy warto się tej Javy jeszcze uczyć.
Skoro mamy takie technologie jak Nodejs albo np. ultra fajny i prosty Go lang, dziwię się, że jeszcze powstają kolejne projekty w Springu.

W tym JSie niedługo już wszystko będzie można napisać ;p

Pozostało 580 znaków

2018-11-04 13:21
3
NeutrinoSpinZero napisał(a):

Nawiązując do tematu, ja nie wiem w sumie czy warto się tej Javy jeszcze uczyć.
Skoro mamy takie technologie jak Nodejs albo np. ultra fajny i prosty Go lang, dziwię się, że jeszcze powstają kolejne projekty w Springu.

W tym JSie niedługo już wszystko będzie można napisać ;p

Java to nie tylko Spring czy JavaEE
W javie możesz pisać serwery, prosto i w podobny sposób, jak w NodeJS express (zobacz: wspomniany przeze mnie SparkJava).

Różnica jest jednak w Języku.

O JS to szkoda nawet mówić, a ten Go to jest tak fajny jak 30letni Wartburg.

Wcale nie kocham przesadnie Javy - wolę pisać w Scali, Haskellu i w najgorszym razie w Kotlinie.

Tym niemniej Java jest to jezyk dość dobrze zaprojektowany i mimo, że w najnowszych wersjach już się trochę robi syf - to nadal jest to projekt dużo lepszy od potworka JS. Brendan E. miał dobry pomysł, ale od razu go zrypał( podobno przez naciski marketingowców), nawet w najnowszych wersjach EcmaScript niestety nadal widać bolączki słabego początku - niektóre chyba już nie do naprawienia (truthy - chyba najgorsze, (==) !== (===) też słabe, choć w tym miejscu java ma też zwałkę, tylko na innym poziomie (== vs equals) i mniej niebezpieczną ).

Go ma jakis koncept, i to całkiem spójny, tylko jest to koncept zignorowania 30 lat postępu technicznego :-).
(Niedawno była dyskusja o tym: Crystal vs Go ,https://github.com/ksimka/go-is-not-good).


Bardzo lubie Singletony, dlatego robię po kilka instancji każdego.
edytowany 7x, ostatnio: jarekr000000, 2018-11-04 15:37
Całkiem fajny ten SparkJava. Widizałeś to gdzieś na produkcji? - eL 2018-11-05 08:01
Zobacz sobie Javalin jeszcze, dla mnie fajniejszy - Leroy 2018-11-05 13:35
Javalin kiedyś widziałem. Ogólnie bardzo podobne. Problem w tym że osobiście nigdzie i nigdy się z tym na produkcji nie spotkałem i zastanawiam się czy to nie jest trochę tak z takimi rzeczami że wiele osób mówi że no fajne, podoba mi się itp ale i tak na produkcje wezmą spring'a a to traktują jako ciekawostkę. Pytanie więc czy przyszłośc tego typu frameworków nie jest trochę niepewna przez to że niewiele osób z nich korzysta a z tego co widzę już kilka lat istnieją i bardzo dużego zainteresowania nie widać. - eL 2018-11-06 07:04
Mainstream to to nie jest, ale fakt, że nawet najnowszy Spring sie podpasował też o czymś świadczy. - jarekr000000 2018-11-06 08:03

Pozostało 580 znaków

2018-11-04 15:32
0

@jarekr000000: dobrze poczytać posty od kogoś dobrze zorientowanego :)
Ja jestem w programowaniu 1 rok dopiero, więc pełnię na razie rolę odtwórczą, nie mam prawa w sumie wydawać opinii, bo i na jakiej podstawie.
Często jednak się w necie angielsko języcznym natykam na wróżenie szybkiej śmierci padlinie - Javie.
Nieukrywam, że przez takie gadanie szukam alternatyw i współbierznie staram się zapoznawać pomału z innymi językami.

Pozostało 580 znaków

2018-11-04 16:13
3
watpliwosci napisał(a):

Odpowiadam tu bo w komentarzu by się nie zmieściło @jarekr000000
Mam bazę danych z użytkownikami i ich danymi, chciałbym aby była możliwośc zalogowania i wygenerowania tokenu (każdy user ma swoje hasło w tej tabeli), później każdy user może przy użyciu tego tokenu dodać nowe dane do swojej tabeli lub pobrać stare(tylko swoje) no i żeby przy wylogowaniu ten token był niszczony. Nie może być to zwykła strona tylko API, chce aby różne strony mógły się do tego podpiąć.

To tutaj zalążek alternatywy:


import io.vavr.collection.HashMap;
import io.vavr.collection.List;
import io.vavr.collection.Map;
import io.vavr.control.Option;
import io.vavr.control.Try;
import spark.Spark;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicReference;

import static spark.Spark.*;

public class LocationService {

    private DataService dataService = new DataService();

    public static void main(String[] args) throws InterruptedException {
        new LocationService().init();
        Thread.sleep(10000);
    }

    private void init() {
        Spark.exception(Exception.class, (exception, request, response) -> {
            try (ByteArrayOutputStream bous = new ByteArrayOutputStream();
                 PrintStream ps = new PrintStream(bous)
            ) {
                exception.printStackTrace(ps);
                response.body(bous.toString());
            } catch (IOException ioe) {
                //Exception while logging exception lol
                ioe.printStackTrace();
            }

        });

        path("session", () -> {
            post("/:login", (req, resp) -> {
                var login = req.params("login");
                var pass = req.body();
                return dataService.login(login, pass).getOrElse("");
            });
            delete("/:session", (req, resp) ->
                    dataService.logout(req.params("session"))
            );
        });
        path("location", () -> {
            get("/:session", (req, resp) ->
                    dataService.location(req.params("session"))
            );
            post("/:session", (req, resp)->
                dataService.addLocation(req.params(":session"), req.body())
            );
        });
    }

}

class UserData {
    public final String login;

    public final List<String> locations;

    UserData(String login, List<String> locations) {
        this.login = login;
        this.locations = locations;
    }

    //TODO probably not the best security
    boolean login(String password) {
        return login.equals(password);
    }

    public UserData addLocation(String newLocation) {
        return new UserData(login, locations.prepend(newLocation));
    }
}

class DataService {
    private final AtomicReference<Map<String, UserData>> users = new AtomicReference<>(HashMap.empty());
    private final AtomicReference<Map<UUID, String>> sessions = new AtomicReference(HashMap.empty());

    {
        users.getAndUpdate(users -> users.put("irek",
                new UserData("irek", List.of("Pcim"))));
        users.getAndUpdate(users -> users.put("jurek",
                new UserData("jurek", List.of("Pcim Dolny"))));
    }

    Option<String> login(String login, String password) {
        return users.get().get(login)
                .filter(u -> u.login(password))
                .map(u -> UUID.randomUUID())
                .peek(uuid ->
                        sessions.updateAndGet(s -> s.put(uuid, login))
                )
                .map(u -> u.toString());
    }

    Boolean logout(String uuidString) {
        return Try.of(() -> UUID.fromString(uuidString))
                .map(uuid -> sessions.getAndUpdate(s -> s.remove(uuid))
                        .containsKey(uuid)).getOrElse(false);

    }

    List<String> location(String uuid) {
        return userSession(uuid).map(user -> user.locations)
                .getOrElse(List.empty());
    }

    List<String> addLocation(String uuid, String newLocation) {
        return userSession(uuid)
                .map(user -> user.addLocation(newLocation))
                .peek(user -> users.updateAndGet(u -> u.put(user.login, user)))
                .map(user -> user.locations)
                .getOrElse(List.empty());
    }

    private Option<UserData> userSession(String uuidString) {
        return Try.of(() -> UUID.fromString(uuidString))
                .toOption()
                .flatMap(uuid -> sessions.get().get(uuid))
                .flatMap(userLogin -> users.get().get(userLogin));
    }

}

Do projektu trzeba dodać dwie zależności:

    compile 'com.sparkjava:spark-core:2.7.2'
    compile 'io.vavr:vavr:0.9.2'

Korzystanie:

login
> curl -X POST -d 'irek' localhost:4567/session/irek
3354ca35-6939-48e6-9ff4-51711bd53886

logout
> curl -X DELETE localhost:4567/session/707f0438-02db-4c5c-aa9c-492a7ec98939

lokacje
> curl localhost:4567/location/3354ca35-6939-48e6-9ff4-51711bd53886
List(Pcim)

dodanie lokacji
>  curl -d 'Kostomłoty' localhost:4567/location/3354ca35-6939-48e6-9ff4-51711bd53886
List(Kostomłoty, Pcim)

Oczywiście security w powyższym jest zabawne, ale to sobie poprawisz. Baza jest w pamięci więc nie wyłączaj kompa i będzie dobrze :-).


Bardzo lubie Singletony, dlatego robię po kilka instancji każdego.
edytowany 3x, ostatnio: jarekr000000, 2018-11-04 16:16
Pokaż pozostałe 4 komentarze
tak, wielkie dzięki za przykład, działa, zrobił mi się jakiś dodatkowy zły import, będę pamiętał kto mi pomógł :) a z tą javą 1.7 to chodziło mi, że u nas w firmie z niej korzystamy i nie znam sztuczek od 1.8 w górę - watpliwosci 2018-11-04 22:05
Czy oparcie protokołu HTTP i pokrewnej tematyki w Javie na rozwiązaniach nie-servletowych akceptują środowiska korporacyjne? Jakiś Spark, jakiś Ratpack, jakieś projekty nad Netty, jeszcze kilka by wymienił. - AnyKtokolwiek 2018-11-05 11:52
Z doświadczenia powiem, że korpo architekci strasznie tskich prostych rozwiązań nienaeidzą. Wymyślają tony powodów, żeby ubijać w zarodku ( 1 na 6 z tych argumentów jest w miare sensowny). U mnie jeden korpo klient własnie ubił taki projekt w zarodku. Z drugiej strony - jak korpo czegoś nie cierpi to jest duża szansa, że to sensowne rozwiązanie. - jarekr000000 2018-11-05 12:35
Jaki jest ten "szósty element" ? Moje domniemanie idzie w kierunek: mini-serwery nie upilnują obszernych logicznie projektów, ale nie wiem czy prawidłowo myślę. - AnyKtokolwiek 2018-11-05 15:36
@AnyKtokolwiek: głównie rozwiązania security. Istniejące moduły do Springa, JavaEE bazujące na przekazywaniu security w kontekście. Przez to jak wywołujesz w kodzie jakiś serwis to samo Ci się wszystko dolepia. Częściowo jest to też security by obscurity, bo developer nawet nie ma dostępu ( w teorii) do tych danych w kontekście. W praktyce tak 1/4 zadań mogę zrobić w sensownym czasie tylko dlatego, że zasadzam się w tych modułach z breakpointami i np. kradne tokeny z jednych kompów i odpalam na drugich :-)). - jarekr000000 2018-11-05 15:58

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0