diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml
new file mode 100644
index 0000000..5b9c571
--- /dev/null
+++ b/.idea/dataSources.xml
@@ -0,0 +1,15 @@
+
+
+
+
+ postgresql
+ true
+ org.postgresql.Driver
+ jdbc:postgresql://192.168.0.10:5432/java
+
+
+
+ $ProjectFileDir$
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 0a13117..a107768 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,4 +1,3 @@
-
diff --git a/.idea/sqldialects.xml b/.idea/sqldialects.xml
new file mode 100644
index 0000000..c2b288a
--- /dev/null
+++ b/.idea/sqldialects.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 8c34ca3..092653f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,5 +1,5 @@
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4.0.0
org.example
MyMVC
@@ -64,6 +64,27 @@
compile
+
+ org.hibernate.validator
+ hibernate-validator
+ 6.1.6.Final
+
+
+
+
+ org.postgresql
+ postgresql
+ 42.7.1
+
+
+
+
+
+ org.springframework
+ spring-jdbc
+ 5.3.31
+
+
MyMVC
diff --git a/src/main/java/org/example/config/MySpringMvcDispatcherSerlvetIntitializer.java b/src/main/java/org/example/config/MySpringMvcDispatcherSerlvetIntitializer.java
new file mode 100644
index 0000000..2c6aff3
--- /dev/null
+++ b/src/main/java/org/example/config/MySpringMvcDispatcherSerlvetIntitializer.java
@@ -0,0 +1,36 @@
+package org.example.config;
+
+import org.springframework.web.filter.HiddenHttpMethodFilter;
+import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
+
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+
+
+public class MySpringMvcDispatcherSerlvetIntitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
+ @Override
+ protected Class>[] getRootConfigClasses() {
+ return null;
+ }
+
+ @Override
+ protected Class>[] getServletConfigClasses() {
+ return new Class[]{SpringConfig.class};
+ }
+
+ @Override
+ protected String[] getServletMappings() {
+ return new String[]{"/"};
+ }
+
+ @Override
+ public void onStartup(ServletContext aServletContext) throws ServletException {
+ super.onStartup(aServletContext);
+ registerHiddenFieldFilter(aServletContext);
+ }
+
+ private void registerHiddenFieldFilter(ServletContext aContext) {
+ aContext.addFilter("hiddenHttpMethodFilter",
+ new HiddenHttpMethodFilter()).addMappingForUrlPatterns(null ,true, "/*");
+ }
+}
diff --git a/src/main/java/org/example/config/MySpringServletInit.java b/src/main/java/org/example/config/MySpringServletInit.java
deleted file mode 100644
index a131007..0000000
--- a/src/main/java/org/example/config/MySpringServletInit.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.example.config;
-
-import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
-
-public class MySpringServletInit extends AbstractAnnotationConfigDispatcherServletInitializer {
-
- @Override
- protected Class>[] getRootConfigClasses() {
- return null;
- }
-
- @Override
- protected Class>[] getServletConfigClasses() {
- return new Class[] {SpringConfig.class};
- }
-
- @Override
- protected String[] getServletMappings() {
- return new String[] {"/"};
- }
-}
diff --git a/src/main/java/org/example/config/SpringConfig.java b/src/main/java/org/example/config/SpringConfig.java
index 1f8bb03..4fb6a81 100644
--- a/src/main/java/org/example/config/SpringConfig.java
+++ b/src/main/java/org/example/config/SpringConfig.java
@@ -5,13 +5,20 @@ import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.thymeleaf.spring5.SpringTemplateEngine;
import org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver;
import org.thymeleaf.spring5.view.ThymeleafViewResolver;
+import javax.sql.DataSource;
+import java.sql.DriverManager;
+/**
+ * @author Neil Alishev
+ */
@Configuration
@ComponentScan("org.example")
@EnableWebMvc
@@ -47,4 +54,19 @@ public class SpringConfig implements WebMvcConfigurer {
resolver.setTemplateEngine(templateEngine());
registry.viewResolver(resolver);
}
-}
\ No newline at end of file
+
+ @Bean
+ public DataSource dataSource(){
+ DriverManagerDataSource dataSource = new DriverManagerDataSource();
+ dataSource.setDriverClassName("org.postgresql.Driver");
+ dataSource.setUrl("jdbc:postgresql://192.168.0.10:5432/java");
+ dataSource.setUsername("sanders");
+ dataSource.setPassword("sanders");
+ return dataSource;
+ }
+
+ @Bean
+ public JdbcTemplate jdbcTemplate() {
+ return new JdbcTemplate(dataSource());
+ }
+}
diff --git a/src/main/java/org/example/controllers/FirstController.java b/src/main/java/org/example/controllers/FirstController.java
deleted file mode 100644
index 0c288be..0000000
--- a/src/main/java/org/example/controllers/FirstController.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package org.example.controllers;
-
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-
-import javax.servlet.http.HttpServletRequest;
-
-@Controller
-public class FirstController {
- @GetMapping("/Hello")
- public String helloPage(@RequestParam(value = "name") String name, Model model){
-
- model.addAttribute("message",name);
- System.out.println(name);
- return "first/hello";
- }
- @GetMapping("/goodbye")
- public String goobyePage(){
- return "first/goodbye";
- }
-}
diff --git a/src/main/java/org/example/controllers/PeopleController.java b/src/main/java/org/example/controllers/PeopleController.java
index bb2ac2e..ddff969 100644
--- a/src/main/java/org/example/controllers/PeopleController.java
+++ b/src/main/java/org/example/controllers/PeopleController.java
@@ -5,8 +5,11 @@ import org.example.models.Person;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
+import javax.validation.Valid;
+
@Controller
@RequestMapping("/people")
public class PeopleController {
@@ -35,8 +38,28 @@ public class PeopleController {
}
@PostMapping()
- public String create(@ModelAttribute("person") Person person){
+ public String create(@ModelAttribute("person") @Valid Person person
+ , BindingResult bindingResult) {
+ if (bindingResult.hasErrors())
+ return "people/new";
+
personDAO.save(person);
return "redirect:people";
}
+
+ @GetMapping("/{id}/edit")
+ public String edit(@PathVariable("id") int id, Model model) {
+ model.addAttribute("person",personDAO.show(id));
+ return "people/edit";
+ }
+
+ @PatchMapping("/{id}")
+ public String update(@ModelAttribute("person") @Valid Person person, BindingResult bindingResult, @PathVariable("id") int id) {
+
+ if (bindingResult.hasErrors())
+ return "people/edit";
+
+ personDAO.update( id,person);
+ return "redirect:/people";
+ }
}
diff --git a/src/main/java/org/example/dao/PersonDAO.java b/src/main/java/org/example/dao/PersonDAO.java
index 0872233..3c9ed1f 100644
--- a/src/main/java/org/example/dao/PersonDAO.java
+++ b/src/main/java/org/example/dao/PersonDAO.java
@@ -1,30 +1,56 @@
package org.example.dao;
import org.example.models.Person;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
+import java.sql.*;
import java.util.ArrayList;
import java.util.List;
-import java.util.stream.Collectors;
+/**
+ * @author Neil Alishev
+ */
@Component
public class PersonDAO {
- private final List people = new ArrayList();
- {
- people.add(new Person("MAO",1));
- people.add(new Person("Sanders", people.size()+1));
+
+ private final JdbcTemplate jdbcTemplate;
+
+ @Autowired
+ public PersonDAO(JdbcTemplate jdbcTemplate) {
+ this.jdbcTemplate = jdbcTemplate;
}
public List index() {
- return people;
+ return jdbcTemplate.query("SELECT * FROM Person" , new BeanPropertyRowMapper<>(Person.class));
}
public Person show(int id) {
- return people.stream().filter(person -> person.getId() == id).findAny().orElse(null);
+// return people.stream().filter(person -> person.getId() == id).findAny().orElse(null);
+ return jdbcTemplate.query("SELECT * FROM Person where id = ?" , new Object[]{id}, new BeanPropertyRowMapper<>(Person.class))
+ .stream()
+ .findAny()
+ .orElse(null);
+
}
public void save(Person person) {
- person.setId(people.size()+1);
- people.add(person);
+ jdbcTemplate.update("Insert into person VALUES (1,?,?,?)"
+ , person.getName(),person.getAge(),person.getEmail()
+ );
+
+
}
-}
+
+ public void update(int id, Person person) {
+ jdbcTemplate.update("update person set name = ?, age = ?, email = ? where id = ?"
+ ,person.getName(),person.getAge(),person.getEmail(),person.getId()
+ );
+ }
+
+ public void delete(int id) {
+// people.removeIf(p -> p.getId() == id);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/org/example/models/Person.java b/src/main/java/org/example/models/Person.java
index 02b1a32..9f6e116 100644
--- a/src/main/java/org/example/models/Person.java
+++ b/src/main/java/org/example/models/Person.java
@@ -5,11 +5,27 @@ import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
+import javax.validation.constraints.Email;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.Size;
+
+
@Getter@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Person
{
+ @NotEmpty(message = "Name should not be empty")
+ @Size(min = 2, max = 30, message = "Name should be between 2 and 30 characters")
private String name;
+
private int id;
+ @Min(value = 0, message = "Age should be greater than 0")
+ private int age;
+
+ @NotEmpty(message = "Email should not be empty")
+ @Email(message = "Email should be valid")
+ private String email;
+
}
diff --git a/src/main/webapp/WEB-INF/views/first/goodbye.html b/src/main/webapp/WEB-INF/views/first/goodbye.html
deleted file mode 100644
index 089a55b..0000000
--- a/src/main/webapp/WEB-INF/views/first/goodbye.html
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
- My app
-
-
-
-
-Hello world!
-
-
-
-
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/views/first/hello.html b/src/main/webapp/WEB-INF/views/first/hello.html
deleted file mode 100644
index 46b5658..0000000
--- a/src/main/webapp/WEB-INF/views/first/hello.html
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
- My app
-
-
-
-
-Hello world!
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/views/people/edit.html b/src/main/webapp/WEB-INF/views/people/edit.html
new file mode 100644
index 0000000..6d35bd2
--- /dev/null
+++ b/src/main/webapp/WEB-INF/views/people/edit.html
@@ -0,0 +1,26 @@
+
+
+
+
+ Edit
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/views/people/index.html b/src/main/webapp/WEB-INF/views/people/index.html
index 85c3891..3eb97f1 100644
--- a/src/main/webapp/WEB-INF/views/people/index.html
+++ b/src/main/webapp/WEB-INF/views/people/index.html
@@ -10,12 +10,15 @@
Hello world!
-
+
+Create new person
+