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ę.

×
×
  • Dodaj nową pozycję...