5
This commit is contained in:
Generated
+15
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
|
||||
<data-source source="LOCAL" name="java@192.168.0.10" uuid="e1b7329a-5d4a-4e4d-b764-a1cee101f03b">
|
||||
<driver-ref>postgresql</driver-ref>
|
||||
<synchronize>true</synchronize>
|
||||
<jdbc-driver>org.postgresql.Driver</jdbc-driver>
|
||||
<jdbc-url>jdbc:postgresql://192.168.0.10:5432/java</jdbc-url>
|
||||
<jdbc-additional-properties>
|
||||
<property name="com.intellij.clouds.kubernetes.db.enabled" value="false" />
|
||||
</jdbc-additional-properties>
|
||||
<working-dir>$ProjectFileDir$</working-dir>
|
||||
</data-source>
|
||||
</component>
|
||||
</project>
|
||||
Generated
-1
@@ -1,4 +1,3 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
||||
<component name="MavenProjectsManager">
|
||||
|
||||
Generated
+6
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="SqlDialectMappings">
|
||||
<file url="file://$PROJECT_DIR$/src/main/java/org/example/dao/PersonDAO.java" dialect="PostgreSQL" />
|
||||
</component>
|
||||
</project>
|
||||
@@ -64,6 +64,27 @@
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.hibernate.validator</groupId>
|
||||
<artifactId>hibernate-validator</artifactId>
|
||||
<version>6.1.6.Final</version>
|
||||
</dependency>
|
||||
|
||||
<!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
|
||||
<dependency>
|
||||
<groupId>org.postgresql</groupId>
|
||||
<artifactId>postgresql</artifactId>
|
||||
<version>42.7.1</version>
|
||||
</dependency>
|
||||
|
||||
|
||||
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-jdbc</artifactId>
|
||||
<version>5.3.31</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
<build>
|
||||
<finalName>MyMVC</finalName>
|
||||
|
||||
@@ -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, "/*");
|
||||
}
|
||||
}
|
||||
@@ -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[] {"/"};
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@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());
|
||||
}
|
||||
}
|
||||
@@ -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";
|
||||
}
|
||||
}
|
||||
@@ -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";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<Person> people = new ArrayList<Person>();
|
||||
{
|
||||
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<Person> 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);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="ISO-8859-1">
|
||||
<title>My app</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<p>Hello world!</p>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -1,17 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html xmlns:th="http://www.thymeleaf.org" lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="ISO-8859-1">
|
||||
<title>My app</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<p>Hello world!</p>
|
||||
|
||||
<p th:text="${message}"></p>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -0,0 +1,26 @@
|
||||
<!DOCTYPE html>
|
||||
<html xmlns:th="http://www.thymeleaf.org" lang="en">
|
||||
<head>
|
||||
<meta charset="ISO-8859-1">
|
||||
<title>Edit</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<form th:method="PATCH" th:action="@{/people/{id}(id=${person.getId()})}" th:object="${person}">
|
||||
<label for="name">Enter name: </label>
|
||||
<input type="text" th:field="*{name}" id="name"/>
|
||||
<div style="color:red" th:if="${#fields.hasErrors('name')}" th:errors="*{name}">Name Error</div>
|
||||
<br/>
|
||||
<label for="age">Enter age: </label>
|
||||
<input type="text" th:field="*{age}" id="age"/>
|
||||
<div style="color:red" th:if="${#fields.hasErrors('age')}" th:errors="*{age}">Age Error</div>
|
||||
<br/>
|
||||
<label for="email">Enter email: </label>
|
||||
<input type="text" th:field="*{email}" id="email"/>
|
||||
<div style="color:red" th:if="${#fields.hasErrors('email')}" th:errors="*{email}">Email Error</div>
|
||||
<br/>
|
||||
<input type="submit" value="Update!"/>
|
||||
</form>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -10,12 +10,15 @@
|
||||
|
||||
<p>Hello world!</p>
|
||||
|
||||
|
||||
<div th:each="person : ${people}">
|
||||
<a th:href="@{/people/{id}(id=${person.getId()})}" th:text="${person.getName()}">user</a>
|
||||
<a th:href="@{/people/{id}(id=${person.getId()})}"
|
||||
th:text="${person.getName() + ', ' + person.getAge()}">user</a>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<a href="/people/new">Create new person</a>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -9,6 +9,15 @@
|
||||
<form th:method="POST" th:action="@{/people}" th:object="${person}">
|
||||
<label for="name">Enter name: </label>
|
||||
<input type="text" th:field="*{name}" id="name"/>
|
||||
<div style="color:red" th:if="${#fields.hasErrors('name')}" th:errors="*{name}">Name Error</div>
|
||||
<br/>
|
||||
<label for="age">Enter age: </label>
|
||||
<input type="text" th:field="*{age}" id="age"/>
|
||||
<div style="color:red" th:if="${#fields.hasErrors('age')}" th:errors="*{age}">Age Error</div>
|
||||
<br/>
|
||||
<label for="email">Enter email: </label>
|
||||
<input type="text" th:field="*{email}" id="email"/>
|
||||
<div style="color:red" th:if="${#fields.hasErrors('email')}" th:errors="*{email}">Email Error</div>
|
||||
<br/>
|
||||
<input type="submit" value="Create!"/>
|
||||
</form>
|
||||
|
||||
@@ -6,7 +6,11 @@
|
||||
<title>Person</title>
|
||||
</head>
|
||||
<body>
|
||||
<p th:text="${person.getId()}"> </p>
|
||||
<p th:text="${person.getName()}"> </p>
|
||||
<p th:text="${person.getName() + ', ' + person.getAge()}">VALUE</p>
|
||||
<p th:text="${'Email: ' + person.getEmail()}">VALUE</p>
|
||||
<p th:text="${person.getId()}">VALUE</p>
|
||||
|
||||
<a th:href="@{/people/{id}/edit(id=${person.getId()})}">Edit</a>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user