This commit is contained in:
2024-01-19 14:42:45 +03:00
parent 9f9e4188c0
commit d5430a231c
17 changed files with 224 additions and 94 deletions
+15
View File
@@ -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>
-1
View File
@@ -1,4 +1,3 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager">
+6
View File
@@ -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>
+22 -1
View File
@@ -1,5 +1,5 @@
<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>
<groupId>org.example</groupId>
<artifactId>MyMVC</artifactId>
@@ -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";
}
}
+35 -9
View File
@@ -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>