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 + + + +
+ + +
Name Error
+
+ + +
Age Error
+
+ + +
Email Error
+
+ +
+ + + \ 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!

-
- user + user
+ +Create new person + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/views/people/new.html b/src/main/webapp/WEB-INF/views/people/new.html index 68d4c35..4a2842c 100644 --- a/src/main/webapp/WEB-INF/views/people/new.html +++ b/src/main/webapp/WEB-INF/views/people/new.html @@ -9,6 +9,15 @@
+
Name Error
+
+ + +
Age Error
+
+ + +
Email Error

diff --git a/src/main/webapp/WEB-INF/views/people/show.html b/src/main/webapp/WEB-INF/views/people/show.html index fc58a90..2836dbd 100644 --- a/src/main/webapp/WEB-INF/views/people/show.html +++ b/src/main/webapp/WEB-INF/views/people/show.html @@ -6,7 +6,11 @@ Person -

-

+

VALUE

+

VALUE

+

VALUE

+ +Edit + \ No newline at end of file