Skocz do zawartości

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

januszcjk123

Nauka Spring - jak połączyć to z bazą?

Rekomendowane odpowiedzi

Cześć uczę się Javy, chciałem sobie zrobić formularz, który zapisuje dane w bazie i w związku z tym mam kilka pytań.

Oczywiście najpierw stworzyłem sobie klasę Person dałem pola name, password , gettery i setery. Następnie w pliku html stworzyłem sobie prosty formularz:

<form method="post" th:object="${person}" id="superForm">
   <center> <input type="text" th:field="*{name}" class="specialInput" id="input1" placeholder="Podaj Login"></center>
   <center><input type="text" th:field="*{password}" class="specialInput" id="input2" placeholder="Podaj Hasło"></center>
   <center> <input type="submit" value="Zaloguj"></center>
</form>

oraz stworzyłem klasę Controller z metodami, zrobiłem jakąs tam prostą walidację itp. no i rzeczywiście to działa po wpisaniu loginu i hasła przenosi mnie na inną stronę a przy błędzie muszę wpisać ponownie.

@Controller
public class IndexController {

   @RequestMapping(method = RequestMethod.GET, value = "formWithPojo")
   public String formWithPojo(Model model ) {
       model.addAttribute("person", new Person());
       return "formWithPojo";
   }

   @RequestMapping(method = RequestMethod.POST, value = "formWithPojo")
       public String formWithPojo1(@ModelAttribute Person person, @Valid formWithPojoDTO formWithPojoDTO, BindingResult result ){
       if(result.hasErrors()) {
           return "formWithPojo";
       }else
           return "redirect:/menu1";
           }

Chciałbym to teraz połączyć z Hibernate żeby w przypadku każdego logowania dodawało mi po prostu do bazy login i hasło . Korzystam z Xampa. Dodałem oczywiście w dependencies odpowiednie rzeczy do Hibernate i stworzyłem taki pliczek żeby mieć połączenie z bazą itp.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
       "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
       "http://hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
   <session-factory>
       <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
       <property name="hibernate.connection.url">jdbc:mysql://localhost:3308/carrent?useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC</property>
       <property name="hibernate.connection.username">root</property>
       <property name="hibernate.connection.password"></property>

       <property name="hibernate.show_sql">true</property>
       <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
       <property name="hbm2ddl.auto">create</property>

   </session-factory>
</hibernate-configuration>

Do tej pory jak się uczyłem samego hibernate to po prostu robiłem mapowanie , tworzyłem sobie plik odpowiadający nazwie klasy np.Person.hbm.xml w main robiłem otwarcie sesji i metodę która zapisuje po prostu poprzez settery użytkownika do bazy jednak kompletnie nie wiem jak to połączyć z formularzem. I jeszcze jedno pytanie jak chce zrobić żeby zwykłe kliknięcie na jakiś przycisk przekierowało mnie na konkretną stronę to jak to zrobić(używać wgl submit czy buton)? np. mam taki plik html


<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>Title</title>
   <link rel="stylesheet" href="style.css"/>
</head>
<body>

<center> <input type="submit" value="Zaloguj jako admin"  class="specialInput1" id="input11"></center>
<center> <input type="submit" value="Zaloguj jako gość" class="specialInput1" id="input12"></center>
<center> <input type="submit" value="Zarejestruj" class="specialInput1" id="input13"></center>
</body>
</html>

i chciałbym żeby kliknięcie w Zaloguj jako admin np. przekierowało mnie do logowania, a zarejestruj do rejestracji itp. Jak taką metodę napisać w kontrolerze?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jeśli chodzi o ogóły, to:

  • Na froncie jest jakiś formularz, to już masz
  • Controller przyjmuje zapytanie HTTP i pakuje dane z formularz do DTO, to też masz.
  • Serwis przepakowuje wedle jakiejś logiki DTO do klasy modelowej, reprezentującej encję bazodanową.
  • DAO/repository dostaje powyższy obiekt modelowy i gada z bazą danych.

Nazywa się to architekturą trójwarstwową - DAO, serwisy, Controller. Front jest czymś dodatkowym. Żeby controller widział serwis, a serwis widział DAO/repository potrzebujesz springowe Dependecy Injection (poszukaj coś o @Autowired i @Service).

 

 

Jeśli chodzi o Twój projekt, używasz strasznie przestarzałego podejścia i zaczynasz od zbyt trudnych rzeczy. Obecnie używa się Spring Boot. On stawia cały projekt za Ciebie na wbudowanym webserwerze i zapewnia potrzebne biblioteki. Odpalasz, jak standardową metodę main bez potrzeby stawiania Tomcata, tworzenia web.xml i innych staroci. Ma to ten minus, że nie wiesz, co się dzieje pod spodem i trzeba się tego potem douczyć, ale próg wejścia jest niski. Ja bym polecał zrobić najpierw sam backend, żeby skupić się na Javie i Spring i zaczął od wyciągania danych z bazy, a nie ich zapisu.

 

 

Zamiast @Controller, użyj @RestController - zwraca on wtedy dane w popularnym formacie dla kompów - JSON, które ładnie wyświetli FireFox. spring-boot-starter-web zapewni bibliotekę Jackson, która przerobi obiekt Javowy (DTO) na JSON (marshalling). Stwórz jakąś klasę DTO (np UserDto) i na start zwróć ją z controllera przez zwykłe new, żeby zobaczyć, że coś się wyświetla.

 

Potem weź się za serwis, który przepakuje Model (np. UserModel) do DTO. Na start może to być po prostu przepisanie pól imie i nazwisko. Do klasy modelowej dodaj adnotacje JPA - poczytaj o @Entity. Controller powinien mieć wstrzyknięty ten serwis poprzez @Autowired i odpytywać go o to DTO.

 

Na koniec warstwa dostępu do bazy. Łatwiej jest wziąć repository, które spring-boot-starter-data-jpa daje za friko. Wstrzykujesz je znów przez @Autowired do sewisu i wywołujesz gotowe metody. Ewentualnie dodajesz nową metodę do repository z własnym SQL, jeśli masz coś skomplikowanego. Na start użyj gotowej metody findAll(), która machnie select * from users.

 

Podsumowując: Controller po otrzymaniu zapytania HTTP odpytuje serwis o Dto do zwrócenia. Serwis tworzy to DTO z klasy modelowej, którą dostaje z repository. To zaś komunikuje się z bazą danych. Controller zwraca DTO w formacie JSON.

 

Jak to Ci się uda ogarnąć, spróbuj dodać sobie jakiś frontend, który wyświetli w html dane z controllera. Wtedy masz osobno działający backend pod jakimś adresem (na własnym kompie będzie to 127.0.0.1) i pod ten adres frontend powinien wysyłać zapytania. W ten sposób masz odosobniony backend od frontu i ten drugi jest łatwo wymienić na nowy bez rozgrzebywania całej aplikacji.

 

Potem możesz dodać formularz i obsłużyć zapis danych z formularza do bazy danych. Wygląda to niemal identycznie. Controller otrzymuje DTO z frontu, serwis pakuje je do modelu, a repository zapisuje do bazy. Jeśli chodzi o rejestrację i logowanie użytkowników - spring też to wspiera w module spring-boot-starter-security

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

  • Tematy

  • Odpowiedzi

    • Wiem co czujesz 🙂.Ja przy nim prawie pada z kompa wyrwałem.A ile było Pi.....e nie gram to nie zliczysz 😄.Ale najważniejsze że się udało.I masz satysfakcję bo to jeden z najtrudniejszych soulsowych bossow https://ebd.cda.pl/620x368/15092229f8 Patrz to
    • Więc wytłumacz mi jakim cudem bez mierzenia wystarczy odpalić gówno kalibrator HDR WINDOWS i zobaczyć w jakim trybie pokazuje detal na 1000 nit, a w jakim na 570. Potem to samo zrobić w dowolnej grze z kalibracja HDR. I w każdym innym ustawieniu niż HDR + APL HIGH, ustawienie gry na 1080 nit prześwietla obraz. Więc w swoim ustawieniu masz niby 1000 nit z uciętymi w opór detalami. Faktycznie, genialna sprawa A jak ustawisz detale na 570 to on nie ma prawa zaświecić 1000 bo właśnie to ograniczyłeś w ustawieniach.  Ale żeby nie było, zjem i odpalę grę I będę srogo zdziwiony jak nie ujrze przepalonych jasności. 
    • Przy każdej zmianie traci się na tym, że kupuje się nową kartę, a sprzedaje używaną, dlatego częste zmiany są niekorzystne finansowo, chyba że się zmienia używaną na używaną.
    • Intel kompletnie tutaj nie ma sensu raz że to do gier, a dwa że jeszcze do 1440p. Powinieneś skupić się na wydajności GPU i bić po RTX 4070 Ti Super - tutaj możesz trzymać się RTX ale CPU spokojnie brałbym 7500F bo to będzie idealne najlepsze połączenie. Za 7100 zł masz właśnie taki zestaw https://proline.pl/koszyk/2878bd11 a celując w maksa to przy dopłacie za 7500 zł z 7900 XTX https://proline.pl/koszyk/316e8335 
    • 14700F nigdy bym nie brał bo to totalny crap. Dostaniesz zawyżone napięcie, to ten CPU będzie siorbał niesamowicie dużo papu i nic z tym nie zrobisz. Do tego kompletnie nic nie wiesz jakie podzespoły otrzymasz. Druga sprawa, połączenie i7 + RTX 4070S jest dalekie od opłacalnej wydajności w zestawie do gier. Za 9200 zł na gotowo masz https://proline.pl/koszyk/35ad9d7d z Ryzen 7 7700 i RTX 4080 Super albo możesz dać i https://proline.pl/koszyk/8f26d0eb 7800X3D + RX 7900 XTX Office w jakiej wersji? 
  • Aktywni użytkownicy

×
×
  • Dodaj nową pozycję...