Skip to content

Commit 73dd1d8

Browse files
committed
Add Lesson 41 code
1 parent ead1d67 commit 73dd1d8

12 files changed

Lines changed: 601 additions & 0 deletions

File tree

Lesson41.SelectOption/pom.xml

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
3+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
7+
<groupId>ru.alishev.springcourse</groupId>
8+
<artifactId>spring-app</artifactId>
9+
<version>1.0-SNAPSHOT</version>
10+
<packaging>war</packaging>
11+
12+
<name>spring-mvc-app1 Maven Webapp</name>
13+
<!-- FIXME change it to the project's website -->
14+
<url>http://www.example.com</url>
15+
16+
<properties>
17+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
18+
<maven.compiler.source>1.7</maven.compiler.source>
19+
<maven.compiler.target>1.7</maven.compiler.target>
20+
21+
<spring.version>5.2.1.RELEASE</spring.version>
22+
</properties>
23+
24+
<dependencies>
25+
<dependency>
26+
<groupId>junit</groupId>
27+
<artifactId>junit</artifactId>
28+
<version>4.11</version>
29+
<scope>test</scope>
30+
</dependency>
31+
32+
<dependency>
33+
<groupId>org.springframework</groupId>
34+
<artifactId>spring-core</artifactId>
35+
<version>${spring.version}</version>
36+
</dependency>
37+
38+
<dependency>
39+
<groupId>org.springframework</groupId>
40+
<artifactId>spring-context</artifactId>
41+
<version>${spring.version}</version>
42+
</dependency>
43+
44+
<dependency>
45+
<groupId>org.springframework</groupId>
46+
<artifactId>spring-web</artifactId>
47+
<version>${spring.version}</version>
48+
</dependency>
49+
50+
<dependency>
51+
<groupId>org.springframework</groupId>
52+
<artifactId>spring-webmvc</artifactId>
53+
<version>${spring.version}</version>
54+
</dependency>
55+
56+
<dependency>
57+
<groupId>org.springframework</groupId>
58+
<artifactId>spring-jdbc</artifactId>
59+
<version>${spring.version}</version>
60+
</dependency>
61+
62+
<dependency>
63+
<groupId>org.thymeleaf</groupId>
64+
<artifactId>thymeleaf-spring5</artifactId>
65+
<version>3.0.11.RELEASE</version>
66+
</dependency>
67+
68+
<dependency>
69+
<groupId>javax.servlet</groupId>
70+
<artifactId>javax.servlet-api</artifactId>
71+
<version>4.0.1</version>
72+
<scope>provided</scope>
73+
</dependency>
74+
75+
<dependency>
76+
<groupId>org.hibernate.validator</groupId>
77+
<artifactId>hibernate-validator</artifactId>
78+
<version>6.1.6.Final</version>
79+
</dependency>
80+
81+
<!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
82+
<dependency>
83+
<groupId>org.postgresql</groupId>
84+
<artifactId>postgresql</artifactId>
85+
<version>42.2.18</version>
86+
</dependency>
87+
</dependencies>
88+
89+
<build>
90+
<finalName>spring-mvc-app1</finalName>
91+
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
92+
<plugins>
93+
<plugin>
94+
<artifactId>maven-clean-plugin</artifactId>
95+
<version>3.1.0</version>
96+
</plugin>
97+
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
98+
<plugin>
99+
<artifactId>maven-resources-plugin</artifactId>
100+
<version>3.0.2</version>
101+
</plugin>
102+
<plugin>
103+
<artifactId>maven-compiler-plugin</artifactId>
104+
<version>3.8.0</version>
105+
</plugin>
106+
<plugin>
107+
<artifactId>maven-surefire-plugin</artifactId>
108+
<version>2.22.1</version>
109+
</plugin>
110+
<plugin>
111+
<artifactId>maven-war-plugin</artifactId>
112+
<version>3.2.2</version>
113+
</plugin>
114+
<plugin>
115+
<artifactId>maven-install-plugin</artifactId>
116+
<version>2.5.2</version>
117+
</plugin>
118+
<plugin>
119+
<artifactId>maven-deploy-plugin</artifactId>
120+
<version>2.8.2</version>
121+
</plugin>
122+
</plugins>
123+
</pluginManagement>
124+
<plugins>
125+
<plugin>
126+
<groupId>org.apache.maven.plugins</groupId>
127+
<artifactId>maven-compiler-plugin</artifactId>
128+
<configuration>
129+
<source>8</source>
130+
<target>8</target>
131+
</configuration>
132+
</plugin>
133+
</plugins>
134+
</build>
135+
</project>
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package ru.alishev.springcourse.config;
2+
3+
import org.springframework.web.filter.CharacterEncodingFilter;
4+
import org.springframework.web.filter.HiddenHttpMethodFilter;
5+
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
6+
7+
import javax.servlet.DispatcherType;
8+
import javax.servlet.FilterRegistration;
9+
import javax.servlet.ServletContext;
10+
import javax.servlet.ServletException;
11+
import java.util.EnumSet;
12+
13+
/**
14+
* @author Neil Alishev
15+
*/
16+
public class MySpringMvcDispatcherSerlvetIntitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
17+
@Override
18+
protected Class<?>[] getRootConfigClasses() {
19+
return null;
20+
}
21+
22+
@Override
23+
protected Class<?>[] getServletConfigClasses() {
24+
return new Class[]{SpringConfig.class};
25+
}
26+
27+
@Override
28+
protected String[] getServletMappings() {
29+
return new String[]{"/"};
30+
}
31+
32+
@Override
33+
public void onStartup(ServletContext aServletContext) throws ServletException {
34+
super.onStartup(aServletContext);
35+
registerCharacterEncodingFilter(aServletContext);
36+
registerHiddenFieldFilter(aServletContext);
37+
}
38+
39+
private void registerHiddenFieldFilter(ServletContext aContext) {
40+
aContext.addFilter("hiddenHttpMethodFilter",
41+
new HiddenHttpMethodFilter()).addMappingForUrlPatterns(null ,true, "/*");
42+
}
43+
44+
private void registerCharacterEncodingFilter(ServletContext aContext) {
45+
EnumSet<DispatcherType> dispatcherTypes = EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD);
46+
47+
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
48+
characterEncodingFilter.setEncoding("UTF-8");
49+
characterEncodingFilter.setForceEncoding(true);
50+
51+
FilterRegistration.Dynamic characterEncoding = aContext.addFilter("characterEncoding", characterEncodingFilter);
52+
characterEncoding.addMappingForUrlPatterns(dispatcherTypes, true, "/*");
53+
}
54+
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package ru.alishev.springcourse.config;
2+
3+
import org.springframework.beans.factory.annotation.Autowired;
4+
import org.springframework.context.ApplicationContext;
5+
import org.springframework.context.annotation.Bean;
6+
import org.springframework.context.annotation.ComponentScan;
7+
import org.springframework.context.annotation.Configuration;
8+
import org.springframework.jdbc.core.JdbcTemplate;
9+
import org.springframework.jdbc.datasource.DriverManagerDataSource;
10+
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
11+
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
12+
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
13+
import org.thymeleaf.spring5.SpringTemplateEngine;
14+
import org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver;
15+
import org.thymeleaf.spring5.view.ThymeleafViewResolver;
16+
17+
import javax.sql.DataSource;
18+
19+
/**
20+
* @author Neil Alishev
21+
*/
22+
@Configuration
23+
@ComponentScan("ru.alishev.springcourse")
24+
@EnableWebMvc
25+
public class SpringConfig implements WebMvcConfigurer {
26+
27+
private final ApplicationContext applicationContext;
28+
29+
@Autowired
30+
public SpringConfig(ApplicationContext applicationContext) {
31+
this.applicationContext = applicationContext;
32+
}
33+
34+
@Bean
35+
public SpringResourceTemplateResolver templateResolver() {
36+
SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
37+
templateResolver.setApplicationContext(applicationContext);
38+
templateResolver.setPrefix("/WEB-INF/views/");
39+
templateResolver.setSuffix(".html");
40+
templateResolver.setCharacterEncoding("UTF-8");
41+
return templateResolver;
42+
}
43+
44+
@Bean
45+
public SpringTemplateEngine templateEngine() {
46+
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
47+
templateEngine.setTemplateResolver(templateResolver());
48+
templateEngine.setEnableSpringELCompiler(true);
49+
return templateEngine;
50+
}
51+
52+
@Override
53+
public void configureViewResolvers(ViewResolverRegistry registry) {
54+
ThymeleafViewResolver resolver = new ThymeleafViewResolver();
55+
resolver.setTemplateEngine(templateEngine());
56+
resolver.setCharacterEncoding("UTF-8");
57+
58+
registry.viewResolver(resolver);
59+
}
60+
61+
@Bean
62+
public DataSource dataSource() {
63+
DriverManagerDataSource dataSource = new DriverManagerDataSource();
64+
65+
dataSource.setDriverClassName("org.postgresql.Driver");
66+
dataSource.setUrl("jdbc:postgresql://localhost:5432/first_db");
67+
dataSource.setUsername("postgres");
68+
dataSource.setPassword("postgres");
69+
70+
return dataSource;
71+
}
72+
73+
@Bean
74+
public JdbcTemplate jdbcTemplate() {
75+
return new JdbcTemplate(dataSource());
76+
}
77+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package ru.alishev.springcourse.controllers;
2+
3+
import org.springframework.beans.factory.annotation.Autowired;
4+
import org.springframework.stereotype.Controller;
5+
import org.springframework.ui.Model;
6+
import org.springframework.web.bind.annotation.*;
7+
import ru.alishev.springcourse.dao.PersonDAO;
8+
import ru.alishev.springcourse.models.Person;
9+
10+
/**
11+
* @author Neil Alishev
12+
*/
13+
@Controller
14+
@RequestMapping("/admin")
15+
public class AdminController {
16+
17+
private final PersonDAO personDAO;
18+
19+
@Autowired
20+
public AdminController(PersonDAO personDAO) {
21+
this.personDAO = personDAO;
22+
}
23+
24+
@GetMapping()
25+
public String adminPage(Model model, @ModelAttribute("person") Person person) {
26+
model.addAttribute("people", personDAO.index());
27+
28+
return "adminPage";
29+
}
30+
31+
@PatchMapping("/add")
32+
public String makeAdmin(@ModelAttribute("person") Person person) {
33+
System.out.println(person.getId());
34+
35+
return "redirect:/people";
36+
}
37+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package ru.alishev.springcourse.controllers;
2+
3+
import org.springframework.beans.factory.annotation.Autowired;
4+
import org.springframework.stereotype.Controller;
5+
import org.springframework.ui.Model;
6+
import org.springframework.validation.BindingResult;
7+
import org.springframework.web.bind.annotation.*;
8+
import ru.alishev.springcourse.dao.PersonDAO;
9+
import ru.alishev.springcourse.models.Person;
10+
11+
import javax.validation.Valid;
12+
13+
/**
14+
* @author Neil Alishev
15+
*/
16+
@Controller
17+
@RequestMapping("/people")
18+
public class PeopleController {
19+
20+
private final PersonDAO personDAO;
21+
22+
@Autowired
23+
public PeopleController(PersonDAO personDAO) {
24+
this.personDAO = personDAO;
25+
}
26+
27+
@GetMapping()
28+
public String index(Model model) {
29+
model.addAttribute("people", personDAO.index());
30+
return "people/index";
31+
}
32+
33+
@GetMapping("/{id}")
34+
public String show(@PathVariable("id") int id, Model model) {
35+
model.addAttribute("person", personDAO.show(id));
36+
return "people/show";
37+
}
38+
39+
@GetMapping("/new")
40+
public String newPerson(@ModelAttribute("person") Person person) {
41+
return "people/new";
42+
}
43+
44+
@PostMapping()
45+
public String create(@ModelAttribute("person") @Valid Person person,
46+
BindingResult bindingResult) {
47+
if (bindingResult.hasErrors())
48+
return "people/new";
49+
50+
personDAO.save(person);
51+
return "redirect:/people";
52+
}
53+
54+
@GetMapping("/{id}/edit")
55+
public String edit(Model model, @PathVariable("id") int id) {
56+
model.addAttribute("person", personDAO.show(id));
57+
return "people/edit";
58+
}
59+
60+
@PatchMapping("/{id}")
61+
public String update(@ModelAttribute("person") @Valid Person person, BindingResult bindingResult,
62+
@PathVariable("id") int id) {
63+
if (bindingResult.hasErrors())
64+
return "people/edit";
65+
66+
personDAO.update(id, person);
67+
return "redirect:/people";
68+
}
69+
70+
@DeleteMapping("/{id}")
71+
public String delete(@PathVariable("id") int id) {
72+
personDAO.delete(id);
73+
return "redirect:/people";
74+
}
75+
}

0 commit comments

Comments
 (0)