Explorar el Código

3rd labs: PostreSQL

m_sudra hace 3 años
padre
commit
7ccfb2f4ff

+ 2 - 1
.gitignore

@@ -1,3 +1,4 @@
 .idea/
 target/
-*.iml
+*.iml
+out/

+ 39 - 7
wpfat_exercises/pom.xml

@@ -3,11 +3,9 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
-
-    <groupId>pl.sudra</groupId>
-    <artifactId>wpfat_exercises</artifactId>
+    <groupId>pl.dmcs</groupId>
+    <artifactId>Spring6</artifactId>
     <version>1.0-SNAPSHOT</version>
-
     <properties>
         <maven.compiler.source>17</maven.compiler.source>
         <maven.compiler.target>17</maven.compiler.target>
@@ -20,12 +18,46 @@
         <dependency>
             <groupId>org.springframework</groupId>
             <artifactId>spring-webmvc</artifactId>
-            <version>6.0.5</version>
+            <version>6.0.6</version>
         </dependency>
         <dependency>
             <groupId>jakarta.servlet</groupId>
             <artifactId>jakarta.servlet-api</artifactId>
-            <version>5.0.0</version>
+            <version>6.0.0</version>
+        </dependency>
+        <dependency>
+            <groupId>jakarta.servlet.jsp.jstl</groupId>
+            <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
+            <version>3.0.0</version>
+        </dependency>
+        <!-- to install support for jstl on Tomcat 10.x -->
+        <dependency>
+            <groupId>org.glassfish.web</groupId>
+            <artifactId>jakarta.servlet.jsp.jstl</artifactId>
+            <version>3.0.1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.hibernate.orm</groupId>
+            <artifactId>hibernate-core</artifactId>
+            <version>6.2.0.CR3</version>
+        </dependency>
+        <dependency>
+            <groupId>org.postgresql</groupId>
+            <artifactId>postgresql</artifactId>
+            <version>42.5.4</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.data</groupId>
+            <artifactId>spring-data-jpa</artifactId>
+            <version>3.0.3</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-dbcp2</artifactId>
+            <version>2.9.0</version>
         </dependency>
     </dependencies>
-</project>
+
+</project>
+
+

+ 67 - 0
wpfat_exercises/src/main/java/pl/sudra/configuration/HibernatePersistenceConfiguration.java

@@ -0,0 +1,67 @@
+package pl.sudra.configuration;
+
+import jakarta.persistence.EntityManagerFactory;
+import org.apache.commons.dbcp2.BasicDataSource;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+import org.springframework.orm.jpa.JpaTransactionManager;
+import org.springframework.orm.jpa.JpaVendorAdapter;
+import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
+import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
+import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+import javax.sql.DataSource;
+import java.util.Properties;
+
+@Configuration
+@EnableJpaRepositories(basePackages = {"pl.sudra.repository"})
+@EnableTransactionManagement
+public class HibernatePersistenceConfiguration {
+    // Hibernate configuration
+    @Bean(name = "dataSource")
+    public DataSource getDataSource() {
+        BasicDataSource dataSource = new BasicDataSource();
+        dataSource.setDriverClassName("org.postgresql.Driver");
+        dataSource.setUrl("jdbc:postgresql://localhost:5432/postgres?characterEncoding=utf-8");
+        dataSource.setUsername("postgres");
+        dataSource.setPassword("postgres");
+        return dataSource;
+    }
+
+    private Properties getHibernateProperties() {
+        Properties properties = new Properties();
+        properties.put("hibernate.show_sql", "true");
+        properties.put("hibernate.hbm2ddl.auto", "update");
+        properties.put("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
+        properties.put("hibernate.default_schema", "public");
+        return properties;
+    }
+
+    // JPA
+    @Bean
+    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
+        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
+        em.setDataSource(getDataSource());
+        em.setPackagesToScan(new String[] { "pl.sudra.domain" });
+
+        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
+        em.setJpaVendorAdapter(vendorAdapter);
+        em.setJpaProperties(getHibernateProperties());
+        return em;
+    }
+
+    @Bean
+    public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
+        JpaTransactionManager transactionManager = new JpaTransactionManager();
+        transactionManager.setEntityManagerFactory(emf);
+        return transactionManager;
+    }
+
+    @Bean
+    public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
+        return new PersistenceExceptionTranslationPostProcessor();
+    }
+}

+ 1 - 1
wpfat_exercises/src/main/java/pl/sudra/configuration/SpringInit.java

@@ -10,7 +10,7 @@ import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatche
 public class SpringInit extends AbstractAnnotationConfigDispatcherServletInitializer {
 
     protected Class<?>[] getRootConfigClasses() {
-        return new Class[]{SpringConfiguration.class};
+        return new Class[]{SpringConfiguration.class, HibernatePersistenceConfiguration.class};
     }
 
     protected Class<?>[] getServletConfigClasses() {

+ 39 - 9
wpfat_exercises/src/main/java/pl/sudra/controller/AppUserController.java

@@ -1,26 +1,56 @@
 package pl.sudra.controller;
 
+import jakarta.servlet.http.HttpServletRequest;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.ServletRequestUtils;
 import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.servlet.ModelAndView;
 import pl.sudra.domain.AppUser;
+import pl.sudra.service.AppUserService;
 
 @Controller
 public class AppUserController {
+
+    private AppUserService appUserService;
+
+    @Autowired
+    public AppUserController(AppUserService appUserService) {
+        this.appUserService = appUserService;
+    }
+
     @RequestMapping(value = "/appUsers")
-    public ModelAndView showAppUsers() {
-        return new ModelAndView("appUser", "appUser", new AppUser());
+    public String showAppUsers(Model model, HttpServletRequest request) {
+        int appUserId = ServletRequestUtils.getIntParameter(request, "appUserId", -1);
+        if (appUserId > 0) {
+            model.addAttribute("appUser", appUserService.getAppUser(appUserId));
+        } else
+            model.addAttribute("appUser", new AppUser());
+        model.addAttribute("appUserList", appUserService.listAppUser());
+        return "appUser";
     }
 
     @RequestMapping(value = "/addAppUser", method = RequestMethod.POST)
     public String addAppUser(@ModelAttribute("appUser") AppUser appUser) {
-        System.out.println("" +
-                "First Name: " + appUser.getFirstName() +
-                " Last Name: " + appUser.getLastName() +
-                " Tel.: " + appUser.getTelephone() +
-                " Email: " + appUser.getEmail());
+
+        System.out.println("First Name: " + appUser.getFirstName() +
+                " Last Name: " + appUser.getLastName() + " Tel.: " +
+                appUser.getTelephone() + " Email: " + appUser.getEmail());
+
+        if (appUser.getId() == 0)
+            appUserService.addAppUser(appUser);
+        else
+            appUserService.editAppUser(appUser);
+
         return "redirect:appUsers";
     }
-}
+
+    @RequestMapping("/delete/{appUserId}")
+    public String deleteUser(@PathVariable("appUserId") Long appUserId) {
+        appUserService.removeAppUser(appUserId);
+        return "redirect:/appUsers";
+    }
+}

+ 17 - 2
wpfat_exercises/src/main/java/pl/sudra/domain/AppUser.java

@@ -1,12 +1,28 @@
 package pl.sudra.domain;
 
+import jakarta.persistence.*;
+
+@Entity
+@Table(name = "appUser")
 public class AppUser {
 
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    long id;
+    @Column(name = "firstName", nullable = false)
     private String firstName;
     private String lastName;
     private String email;
     private String telephone;
 
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
     public String getFirstName() {
         return firstName;
     }
@@ -38,5 +54,4 @@ public class AppUser {
     public void setTelephone(String telephone) {
         this.telephone = telephone;
     }
-
-}
+}

+ 19 - 0
wpfat_exercises/src/main/java/pl/sudra/repository/AppUserRepository.java

@@ -0,0 +1,19 @@
+package pl.sudra.repository;
+
+import jakarta.transaction.Transactional;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+import pl.sudra.domain.AppUser;
+
+import java.util.List;
+
+@Transactional
+@Repository
+public interface AppUserRepository extends JpaRepository<AppUser, Long> {
+
+    List<AppUser> findByLastName(String lastName);
+
+    AppUser findById(long id);
+
+}
+

+ 19 - 0
wpfat_exercises/src/main/java/pl/sudra/service/AppUserService.java

@@ -0,0 +1,19 @@
+package pl.sudra.service;
+
+import pl.sudra.domain.AppUser;
+
+import java.util.List;
+
+public interface AppUserService {
+
+    void addAppUser(AppUser appUser);
+
+    void editAppUser(AppUser appUser);
+
+    List<AppUser> listAppUser();
+
+    void removeAppUser(long id);
+
+    AppUser getAppUser(long id);
+
+}

+ 47 - 0
wpfat_exercises/src/main/java/pl/sudra/service/AppUserServiceImpl.java

@@ -0,0 +1,47 @@
+package pl.sudra.service;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import pl.sudra.domain.AppUser;
+import pl.sudra.repository.AppUserRepository;
+
+import java.util.List;
+
+@Service
+public class AppUserServiceImpl implements AppUserService {
+
+    private AppUserRepository appUserRepository;
+
+    @Autowired
+    public AppUserServiceImpl(AppUserRepository appUserRepository) {
+        this.appUserRepository = appUserRepository;
+    }
+
+    @Transactional
+    public void addAppUser(AppUser appUser) {
+        appUserRepository.save(appUser);
+    }
+
+    @Transactional
+    public void editAppUser(AppUser appUser) {
+        appUserRepository.save(appUser);
+    }
+
+    @Transactional
+    public List<AppUser> listAppUser() {
+        return appUserRepository.findAll();
+    }
+
+    @Transactional
+    public void removeAppUser(long id) {
+        appUserRepository.deleteById(id);
+    }
+
+    @Transactional
+    public AppUser getAppUser(long id) {
+        return appUserRepository.findById(id);
+    }
+}
+
+

+ 47 - 13
wpfat_exercises/src/main/webapp/appUser.jsp

@@ -1,23 +1,26 @@
-<%@ page contentType="text/html;charset-UTF-@" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>
+<%@page contentType="text/html;charset=UTF-8" language="java" %>
+<%@taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@taglib uri="http://www.springframework.org/tags" prefix="spring" %>
+<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+
 <html>
-<head>
-    <title><spring:message code="label.addAppUser"/></title>
-</head>
+<head><title><spring:message code="label.addAppUser"/></title></head>
 <body>
 
 <div class="header">
-    <span style="display: inline-block; text-align: right; width: 100%">
-        <a style="..." href="?lang=pl">pl</a> |
-        <a style="..." href="?lang=en">en</a> |
-        <a style="..." href="?lang=de">de</a>
-    </span>
+    <span style="float: right">
+    	<a style="background-color: white" href="?lang=pl">pl</a> |
+        <a style="background-color: white" href="?lang=en">en</a> |
+        <a style="background-color: white" href="?lang=de">de</a>
+	</span>
 </div>
 
 <h1>App user info:</h1>
 <form:form method="post" action="addAppUser" modelAttribute="appUser">
     <table>
+        <tr>
+            <td><form:hidden path="id"/>
+        </tr>
         <tr>
             <td><form:label path="firstName"><spring:message code="label.firstName"/></form:label></td>
             <td><form:input path="firstName"/></td>
@@ -36,10 +39,41 @@
         </tr>
         <tr>
             <td colspan="2">
-                <input type="submit" value="<spring:message code="label.addAppUser"/>"/>
+                <c:if test="${appUser.id==0}">
+                    <input type="submit" value="<spring:message code="label.addAppUser"/>"/>
+                </c:if>
+                <c:if test="${appUser.id!=0}">
+                    <input type="submit" value="<spring:message code="label.editAppUser"/>"/>
+                </c:if>
             </td>
         </tr>
     </table>
 </form:form>
+
+<h3><spring:message code="label.userList"/></h3>
+
+<c:if test="${!empty appUserList}">
+    <table class="data">
+        <tr>
+            <th><spring:message code="label.firstName"/></th>
+            <th><spring:message code="label.lastName"/></th>
+            <th><spring:message code="label.email"/></th>
+            <th><spring:message code="label.telephone"/></th>
+            <th>&nbsp;</th>
+            <th>&nbsp;</th>
+        </tr>
+        <c:forEach items="${appUserList}" var="appUser">
+            <tr>
+                <td>${appUser.firstName}</td>
+                <td>${appUser.lastName}</td>
+                <td>${appUser.email}</td>
+                <td>${appUser.telephone}</td>
+                <td><a href="delete/${appUser.id}">delete</a></td>
+                <td><a href="appUsers?appUserId=${appUser.id}">edit</a></td>
+            </tr>
+        </c:forEach>
+    </table>
+</c:if>
 </body>
-</html>
+</html>
+

+ 3 - 1
wpfat_exercises/src/main/webapp/resources/i18n/messages_de.properties

@@ -2,4 +2,6 @@ label.firstName     =   Vorname
 label.lastName      =   Familiename
 label.email         =   Email
 label.telephone     =   Telefon
-label.addAppUser    =   Benutzer hinzuf&#252;gen
+label.addAppUser    =   Benutzer hinzuf&#252;gen
+label.userList      =   Liste der App Benutzer
+label.editAppUser   =   Benutzer bearbeiten

+ 3 - 1
wpfat_exercises/src/main/webapp/resources/i18n/messages_en.properties

@@ -2,4 +2,6 @@ label.firstName     =   First Name
 label.lastName      =   Last Name
 label.email         =   Email
 label.telephone     =   Telephone
-label.addAppUser    =   Add App User
+label.addAppUser    =   Add App User
+label.editAppUser   =   Edit App User
+label.userList      =   List of App Users

+ 3 - 1
wpfat_exercises/src/main/webapp/resources/i18n/messages_pl.properties

@@ -2,4 +2,6 @@ label.firstName     =   Imię
 label.lastName      =   Nazwisko
 label.email         =   Email
 label.telephone     =   Telefon
-label.addAppUser    =   Dodaj użytkownika apliakcji
+label.addAppUser    =   Dodaj użytkownika aplikacji
+label.editAppUser   =   Edytuj użytkownika aplikacji
+label.userList      =   Lista użytkowników aplikacji