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">
|
<project version="4">
|
||||||
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
||||||
<component name="MavenProjectsManager">
|
<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>
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<groupId>org.example</groupId>
|
<groupId>org.example</groupId>
|
||||||
<artifactId>MyMVC</artifactId>
|
<artifactId>MyMVC</artifactId>
|
||||||
@@ -64,6 +64,27 @@
|
|||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</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>
|
</dependencies>
|
||||||
<build>
|
<build>
|
||||||
<finalName>MyMVC</finalName>
|
<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.Bean;
|
||||||
import org.springframework.context.annotation.ComponentScan;
|
import org.springframework.context.annotation.ComponentScan;
|
||||||
import org.springframework.context.annotation.Configuration;
|
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.EnableWebMvc;
|
||||||
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
|
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
|
||||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
||||||
import org.thymeleaf.spring5.SpringTemplateEngine;
|
import org.thymeleaf.spring5.SpringTemplateEngine;
|
||||||
import org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver;
|
import org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver;
|
||||||
import org.thymeleaf.spring5.view.ThymeleafViewResolver;
|
import org.thymeleaf.spring5.view.ThymeleafViewResolver;
|
||||||
|
import javax.sql.DataSource;
|
||||||
|
import java.sql.DriverManager;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Neil Alishev
|
||||||
|
*/
|
||||||
@Configuration
|
@Configuration
|
||||||
@ComponentScan("org.example")
|
@ComponentScan("org.example")
|
||||||
@EnableWebMvc
|
@EnableWebMvc
|
||||||
@@ -47,4 +54,19 @@ public class SpringConfig implements WebMvcConfigurer {
|
|||||||
resolver.setTemplateEngine(templateEngine());
|
resolver.setTemplateEngine(templateEngine());
|
||||||
registry.viewResolver(resolver);
|
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.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Controller;
|
import org.springframework.stereotype.Controller;
|
||||||
import org.springframework.ui.Model;
|
import org.springframework.ui.Model;
|
||||||
|
import org.springframework.validation.BindingResult;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import javax.validation.Valid;
|
||||||
|
|
||||||
@Controller
|
@Controller
|
||||||
@RequestMapping("/people")
|
@RequestMapping("/people")
|
||||||
public class PeopleController {
|
public class PeopleController {
|
||||||
@@ -35,8 +38,28 @@ public class PeopleController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping()
|
@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);
|
personDAO.save(person);
|
||||||
return "redirect:people";
|
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;
|
package org.example.dao;
|
||||||
|
|
||||||
import org.example.models.Person;
|
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 org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.sql.*;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Neil Alishev
|
||||||
|
*/
|
||||||
@Component
|
@Component
|
||||||
public class PersonDAO {
|
public class PersonDAO {
|
||||||
private final List<Person> people = new ArrayList<Person>();
|
|
||||||
{
|
private final JdbcTemplate jdbcTemplate;
|
||||||
people.add(new Person("MAO",1));
|
|
||||||
people.add(new Person("Sanders", people.size()+1));
|
@Autowired
|
||||||
|
public PersonDAO(JdbcTemplate jdbcTemplate) {
|
||||||
|
this.jdbcTemplate = jdbcTemplate;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Person> index() {
|
public List<Person> index() {
|
||||||
return people;
|
return jdbcTemplate.query("SELECT * FROM Person" , new BeanPropertyRowMapper<>(Person.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
public Person show(int id) {
|
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) {
|
public void save(Person person) {
|
||||||
person.setId(people.size()+1);
|
jdbcTemplate.update("Insert into person VALUES (1,?,?,?)"
|
||||||
people.add(person);
|
, 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.NoArgsConstructor;
|
||||||
import lombok.Setter;
|
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
|
@Getter@Setter
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
public class Person
|
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 String name;
|
||||||
|
|
||||||
private int id;
|
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>
|
<p>Hello world!</p>
|
||||||
|
|
||||||
|
|
||||||
<div th:each="person : ${people}">
|
<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>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a href="/people/new">Create new person</a>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
@@ -9,6 +9,15 @@
|
|||||||
<form th:method="POST" th:action="@{/people}" th:object="${person}">
|
<form th:method="POST" th:action="@{/people}" th:object="${person}">
|
||||||
<label for="name">Enter name: </label>
|
<label for="name">Enter name: </label>
|
||||||
<input type="text" th:field="*{name}" id="name"/>
|
<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/>
|
<br/>
|
||||||
<input type="submit" value="Create!"/>
|
<input type="submit" value="Create!"/>
|
||||||
</form>
|
</form>
|
||||||
|
|||||||
@@ -6,7 +6,11 @@
|
|||||||
<title>Person</title>
|
<title>Person</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<p th:text="${person.getId()}"> </p>
|
<p th:text="${person.getName() + ', ' + person.getAge()}">VALUE</p>
|
||||||
<p th:text="${person.getName()}"> </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>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
Reference in New Issue
Block a user