рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░! рдореИрдВ рдЖрдкрдХреЗ рд▓рд┐рдП рдирд╛рдо рд╣рд╛
рдорд┐рдВрди рджреНрд╡рд╛рд░рд╛
"рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдорд╡реАрд╕реА + рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдЬреЗрдкреАрдП + рд╣рд╛рдЗрдмрд░рдиреЗрдЯ - рд╕реАрдЖрд░рдпреВрдбреА рдЙрджрд╛рд╣рд░рдг" рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВред
рдЗрд╕ рд╕реНрдкреНрд░рд┐рдВрдЧ рдЬрд╛рд╡рд╛ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ, рдЖрдк рд╕реАрдЦреЗрдВрдЧреЗ рдХрд┐ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдХреЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдЬреЗрдкреАрдП рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдорд╡реАрд╕реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреИрд╕реЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЬрд┐рд╕рд╕реЗ рдЖрдк рдХреНрд▓рд╛рдЗрдВрдЯ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░ рд╕рдХреЗрдВред
рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░, рдЖрдк рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдорд╡реАрд╕реА рдФрд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдЬреЗрдкреАрдП рддрдХрдиреАрдХреЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рдЬрд╛рд╡рд╛ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
рдЗрд╕ рдЧрд╛рдЗрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдФрд░ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпрд╛рдВ рд╣реИрдВ: рдЬрд╛рд╡рд╛ 8, рдЕрдкрд╛рдЪреЗ рдЯреЛрдореИрдЯреИрдЯ 9, рдорд╛рдИрдПрд╕рдХреНрдпреВрдПрд▓ рд╕рд░реНрд╡рд░ 5.7, рдЧреНрд░рд╣рдг рдЖрдИрдбреАрдИ 4.7 (рдСрдХреНрд╕реАрдЬрди), рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ 5.1, рд╣рд╛рдЗрдмрд░рдиреЗрдЯ 5.4, рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдЬреЗрдкреАрдП 2.1.5, рдФрд░ рд╕рд░реНрд╡рд┐рдХреНрд╕ 3.1ред
рдЪрд▓реЛ рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рдХрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
1. рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рдирд╛
рд╣рдо MySQL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо
рдЧреНрд░рд╛рд╣рдХ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рд╕реНрдХреАрдорд╛ рдирд╛рдо рдХреА
рдмрд┐рдХреНрд░реА рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред
рдЧреНрд░рд╛рд╣рдХ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ 4 рдлрд╝реАрд▓реНрдб рд╣реИрдВ:
рдЖрдИрдбреА ,
рдирд╛рдо ,
рдИрдореЗрд▓ рдФрд░
рдкрддрд╛ :
рд╕реНрдХреАрдорд╛ рдФрд░ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдирд┐рдореНрди MySQL рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ:
CREATE DATABASE `sales`; CREATE TABLE `customer` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(45) NOT NULL, `email` varchar(45) NOT NULL, `address` varchar(45) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2. рдЧреНрд░рд╣рдг рдореЗрдВ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг
рдЧреНрд░рд╣рдг рдореЗрдВ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рд╡реЗрдм рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдПрдВ, рдФрд░ рдЗрд╕реЗ рдПрдХ рдорд╛рд╡реЗрди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВ: рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рд░рд╛рдЗрдЯ-рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ,
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ> рдорд╛рд╡реЗрди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░реЗрдВ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред рдЦреБрд▓рдиреЗ рд╡рд╛рд▓реЗ
рдирдП POM рдбрд╛рдпрд▓реЙрдЧ рдмреЙрдХреНрд╕ рдореЗрдВ, рдирд┐рдореНрди рдЬрд╛рдирдХрд╛рд░реА рджрд░реНрдЬ рдХрд░реЗрдВ:
- рд╕рдореВрд╣ рдХреНрд░рдорд╛рдВрдХ:
net.codejava
- рдХрд▓рд╛рдХрд╛рд░реА рдЖрдИрдбреА:
CustomerManager
рдкреНрд░рдмрдВрдзрдХ
рдпрд╣ рднреА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЬрд╛рд╡рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП JRE рд╕рдВрд╕реНрдХрд░рдг 8 рдпрд╛ рдмрд╛рдж рдХрд╛ рд╣реИред
рдлрд┐рд░, рдЗрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
pom.xml
(Maven рдлрд╝рд╛рдЗрд▓) рдЦреЛрд▓реЗрдВред рд╕реНрдкреНрд░рд┐рдВрдЧ рдФрд░ рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП рд╕рдВрд╕реНрдХрд░рдг рдЧреБрдгреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВ:
<properties> <spring.version>5.1.5.RELEASE</spring.version> <hibernate.version>5.4.1.Final</hibernate.version> </properties>
рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрднрд░рддрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency>
рд╕реНрдкреНрд░рд┐рдВрдЧ MVC рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency>
рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ JPA рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> <version>2.1.5.RELEASE</version> </dependency>
рд╣рдо JPA рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд░реВрдк рдореЗрдВ рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрднрд░рддрд╛ рдЬреЛрдбрд╝реЗрдВ:
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>${hibernate.version}</version> </dependency>
MySQL рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ MySQL JDBC рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.14</version> <scope>runtime</scope> </dependency>
рдФрд░ рдЕрдм рдЬрд╛рд╡рд╛ рд╕рд░реНрд╡рд▓реЗрдЯ, JSP рдФрд░ JSTL рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрднрд░рддрд╛:
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.3.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдореВрд▓ рдореЗрдВ рджреЛ рдЬрд╛рд╡рд╛ рдкреИрдХреЗрдЬ рдмрдирд╛рдПрдБ:
-
net.codejava.config
: рд╡рд┐рдиреНрдпрд╛рд╕ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдПред
-
net.codejava.customer
: рдЖрд╡реЗрджрди рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдПред
3. рдПрдХ рдЬреЗрдкреАрдП рд╡рд┐рдиреНрдпрд╛рд╕ рдлрд╛рдЗрд▓ рдмрдирд╛рдирд╛
рдЪреВрдБрдХрд┐ рд╣рдо JPA рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЬреБрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреБрдгреЛрдВ рдХреЛ
persistence.xml
,
persistence.xml
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рди рдХрд┐
hibernate.cfg.xml
ред рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕реНрд░реЛрдд рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ
META-INF
рдирд╛рдордХ рдПрдХ рдирдИ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдПрдВ, рдЬрд┐рд╕рдореЗрдВ
persistence.xml
рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЗрд╕рдореЗрдВ рд░рдЦреЗрдВ:
рдФрд░ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдиреАрдЪреЗ рдХреЛрдб рджрд░реНрдЬ рдХрд░реЗрдВ:
<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd" version="2.1"> <persistence-unit name="SalesDB"> <properties> <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/sales" /> <property name="javax.persistence.jdbc.user" value="root" /> <property name="javax.persistence.jdbc.password" value="(password)" /> <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> <property name="hibernate.show_sql" value="true" /> <property name="hibernate.format_sql" value="true" /> </properties> </persistence-unit> </persistence>
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреБрдг рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ URL, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛, рдкрд╛рд╕рд╡рд░реНрдб рдФрд░ JDBC рдбреНрд░рд╛рдЗрд╡рд░ рд╡рд░реНрдЧред рдпрд╣ рднреА рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐
SalesDB
рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛрдб рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
4. рдПрдХ рдореЙрдбрд▓ рд╡рд░реНрдЧ рдмрдирд╛рдирд╛
рдПрдХ
Customer
рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ рдЬреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ
рдЧреНрд░рд╛рд╣рдХ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдореИрдк рдХрд░рддрд╛ рд╣реИ:
package net.codejava.customer; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity public class Customer { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String email; private String address; protected Customer() { } protected Customer(String name, String email, String address) { this.name = name; this.email = email; this.address = address; }
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо рдЗрд╕ рдХреНрд▓рд╛рд╕ рдХреЛ
рдЧреНрд░рд╛рд╣рдХ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдореИрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
@Entity
рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ (рдХреНрд▓рд╛рд╕ рдХрд╛ рдирд╛рдо рдЯреЗрдмрд▓ рдирд╛рдо рдХреЗ рд╕рдорд╛рди рд╣реИ)ред рд╕рднреА рд╡рд░реНрдЧ рдлрд╝реАрд▓реНрдб рдирд╛рдо рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдлрд╝реАрд▓реНрдб рдирд╛рдореЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реИрдВред
id
рдлрд╝реАрд▓реНрдб рдореЗрдВ рдПрдиреЛрдЯреЗрд╢рди
@Id
рдФрд░
@GeneratedValue
рджрд░реНрд╢рд╛рдП рдЧрдП рд╣реИрдВ рдХрд┐ рдпрд╣ рдлрд╝реАрд▓реНрдб рдПрдХ рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬреА рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдорд╛рди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИред
5. рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдорд╡реАрд╕реА рдФрд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдЬреЗрдкреАрдП рдХрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди
рдЕрдЧрд▓рд╛, рд╣рдо рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдорд╡реАрд╕реА рдФрд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдЬреЗрдкреАрдП рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВред рд╣рдо рдЬрд╛рд╡рд╛-рдЖрдзрд╛рд░рд┐рдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ XML рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рд░рд▓ рд╣реИред
рд╕реНрдкреНрд░рд┐рдВрдЧ рдбрд┐рд╕реНрдкреИрдЪрд░ рд╕рд░реНрд╡рд▓реЗрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ
рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдорд╡реАрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдирд┐рдореНрди рд╡рд░реНрдЧ рдХреЛ рд▓рд┐рдЦрдХрд░ рдЖрд╡реЗрджрди рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп рд╕реНрдкреНрд░рд┐рдВрдЧ рдбрд┐рд╕реНрдкреИрдЪрд░ рд╕рд░реНрд╡рд▓реЗрдЯ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
package net.codejava.config; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRegistration; import org.springframework.web.WebApplicationInitializer; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; import org.springframework.web.servlet.DispatcherServlet; public class WebAppInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext servletContext) throws ServletException { AnnotationConfigWebApplicationContext appContext = new AnnotationConfigWebApplicationContext(); appContext.register(WebMvcConfig.class); ServletRegistration.Dynamic dispatcher = servletContext.addServlet( "SpringDispatcher", new DispatcherServlet(appContext)); dispatcher.setLoadOnStartup(1); dispatcher.addMapping("/"); } }
рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ
onStartup()
рдкрджреНрдзрддрд┐ рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЛрдб рд╣реЛрдиреЗ рдкрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рд░реНрд╡рд▓реЗрдЯ рджреНрд╡рд╛рд░рд╛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╕реНрдкреНрд░рд┐рдВрдЧ рдбрд┐рд╕реНрдкреИрдЪрд░ рд╕рд░реНрд╡рд▓реЗрдЯ URL "/" рд╕реЗ рдореЗрд▓ рдХрд░рдХреЗ рд╕рднреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░
WebMvcConfig
рд╡рд░реНрдЧ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА
WebMvcConfig
рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рд╣реИред
рд╕реНрдкреНрд░рд┐рдВрдЧ MVC рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ
рдирд┐рдореНрди рдХреЛрдб рд╡рд╛рд▓реЗ
net.codejava.config
рдкреИрдХреЗрдЬ рдореЗрдВ
WebMvcConfig
рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдБ:
package net.codejava.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.view.InternalResourceViewResolver; @Configuration @ComponentScan("net.codejava ") public class WebMvcConfig { @Bean(name = "viewResolver") public InternalResourceViewResolver getViewResolver() { InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); viewResolver.setPrefix("/WEB-INF/views/"); viewResolver.setSuffix(".jsp"); return viewResolver; } }
рдпрд╣ рд╡рд░реНрдЧ рд╡рд╕рдВрдд рдХреЛ рдмрддрд╛ рд░рд╣реА
@Configuration
рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рд╣реИред
@ComponentScan
рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреЛ
net.codejava
рдкреИрдХреЗрдЬ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИред
рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ, рд╣рдо рдПрдХ рд╕реЗрдо рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЗрди рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрд╕рд░реНрдЧ рдФрд░ рдкреНрд░рддреНрдпрдп рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, JSP рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
WebContent/WEB-INF
рдЕрдВрджрд░
views
рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдПрдВред
рдпрд╣рд╛рдВ рдЖрдк рдЕрдиреНрдп рд╕реНрдкреНрд░рд┐рдВрдЧ MVC рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдЬреЗрдкреАрдП рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛
рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдЬреЗрдкреАрдП рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рджреЛ рдмреАрдиреНрд╕ рдШрдЯрдХ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
JpaTransactionManager
рдФрд░
JpaTransactionManager
ред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдПрдХ рдФрд░ рд╡рд┐рдиреНрдпрд╛рд╕ рд╡рд░реНрдЧ
JpaConfig
:
package net.codejava.config; import javax.persistence.EntityManagerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.LocalEntityManagerFactoryBean; import org.springframework.transaction.annotation.EnableTransactionManagement; @Configuration @EnableJpaRepositories(basePackages = {"net.codejava.customer"}) @EnableTransactionManagement public class JpaConfig { @Bean public LocalEntityManagerFactoryBean entityManagerFactory() { LocalEntityManagerFactoryBean factoryBean = new LocalEntityManagerFactoryBean(); factoryBean.setPersistenceUnitName("SalesDB"); return factoryBean; } @Bean public JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) { JpaTransactionManager transactionManager = new JpaTransactionManager(); transactionManager.setEntityManagerFactory(entityManagerFactory); return transactionManager; } }
рдпрд╣рд╛рдВ рд╣рдо рджреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
@EnableJpaRepositories
: рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ JPA рдХреЛ рд░рди рдЯрд╛рдЗрдо рдореЗрдВ рдЙрдкрдпреБрдХреНрдд рдХреЛрдб рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреИрдХреЗрдЬ (net.codejava) рдореЗрдВ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╡рд░реНрдЧреЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИред@EnableTransactionManagement
: рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ JPA рдХреЛ рд░рдирдЯрд╛рдЗрдо рдкрд░ рд▓реЗрдирджреЗрди рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИред
рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ, рдкрд╣рд▓рд╛ рддрд░реАрдХрд╛
EntityManagerFactory
рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджреЗрддрд╛ рд╣реИ, рдЬреЛ рд╣рдорд╛рд░реЗ
SalesDB
рдХреА рджреГрдврд╝рддрд╛ рдЗрдХрд╛рдИ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ (рдпрд╣ рдирд╛рдо
persistence.xml
рдКрдкрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИ)ред
рдЕрдВрддрд┐рдо рд╡рд┐рдзрд┐
EntityManagerFactory
рд▓рд┐рдП
JpaTransactionManager
рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реИ, рдкрд╣рд▓реЗ рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИред
рдпрд╣ рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ JPA рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдиреНрдпреВрдирддрдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реИред
рдПрдХ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдирд╛
рдПрдХ
CustomerRepository
CrudRepository
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдПрдБ рдЬреЛ рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдЬреЗрдкреАрдП рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд
CrudRepository
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИ:
package net.codejava.customer; import java.util.List; import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.query.Param; public interface CustomerRepository extends CrudRepository<Customer, Long> { }
рдпрд╣ рд▓рдЧрднрдЧ рд╕рднреА рдХреЛрдб рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдмрд╕ рд╕рд╣рдордд рд╣реВрдБ? рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ JPA рдХреЗ рд╕рд╛рде, рд╣рдореЗрдВ DAO (Java Data Acces Object) рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдмрд╕ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ рдЬреЛ
CrudRepository
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ CRUD рд╡рд┐рдзрд┐рдпреЛрдВ рдЬреИрд╕реЗ рдХрд┐
save()
,
findAll()
,
findById()
,
deleteById()
, рдЖрджрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рд░рди рд╕рдордп рдореЗрдВ, рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдЬреЗрдкреАрдП рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ред
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдореЗрдВ
CrudRepository
:
CrudRepository<Customer, Long>
рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╕рдордп рд╣рдореЗрдВ рдореЙрдбрд▓ рд╡рд░реНрдЧ рдФрд░ рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬреА рдлрд╝реАрд▓реНрдб рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
7. рдПрдХ рд╕реЗрд╡рд╛ рд╡рд░реНрдЧ рдмрдирд╛рдирд╛
рдЕрдЧрд▓рд╛,
CustomerService
рд╡рд░реНрдЧ рдмрдирд╛рдПрдБ:
package net.codejava.customer; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service @Transactional public class CustomerService { @Autowired CustomerRepository repo; public void save(Customer customer) { repo.save(customer); } public List<Customer> listAll() { return (List<Customer>) repo.findAll(); } public Customer get(Long id) { return repo.findById(id).get(); } public void delete(Long id) { repo.deleteById(id); } }
@Transactional
рдПрдиреЛрдЯреЗрд╢рди рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ рдЬреЛ рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдХреЛ
@Transactional
ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд▓реЗрдирджреЗрди рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рд╕рднреА рддрд░реАрдХреЛрдВ рдХреЛ рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдЬреЗрдкреАрдП рджреНрд╡рд╛рд░рд╛ рдмрд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдФрд░
CustomerRepository
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЙрджрд╛рд╣рд░рдг рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
@Autowired CustomerRepository repo;
рдпрд╣ рдЬрд╛рджреВ рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо DAO рдХреЛрдб рдирд╣реАрдВ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ JPA рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрдирд╛рдПрдЧрд╛ред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рд╕рднреА рддрд░реАрдХреЗ CRUD рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рд╣реИрдВред рдпрд╣ рдХреЗрд╡рд▓ рдкреВрд░реА рдХреЙрд▓ рдХреЛ
CustomerRepository
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рдпрд╣ рд╡рд░реНрдЧ рдЖрдкрдХреЛ рдирд┐рд░рд░реНрдердХ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╕рд╛рдп / рд╕реЗрд╡рд╛ рд╕реНрддрд░ рдХреЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА / рдбреАрдПрдУ рд╕реНрддрд░ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
8. рдПрдХ рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдорд╡реАрд╕реА рдирд┐рдпрдВрддреНрд░рдХ рдмрдирд╛рдирд╛
CustomerContoroller
рд╕реЗ рд╕рднреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ
CustomerContoroller
рдмрдирд╛рдПрдВ:
package net.codejava.customer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; @Controller public class CustomerController { @Autowired private CustomerService customerService;
рдпрд╣ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдкреНрд░рд┐рдВрдЧ MVC рдирд┐рдпрдВрддреНрд░рдХ рд╡рд░реНрдЧ рд╣реИ рдЬрд┐рд╕реЗ
@Controller
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдиреЛрдЯреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐
@Autowired
рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ
CustomerService
рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред
рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрднрд╛рдЧреЛрдВ рдореЗрдВ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд┐рдЦреЗрдВрдЧреЗред
9. рдЧреНрд░рд╛рд╣рдХ рд╕реВрдЪреА рдЬреЛрдбрд╝рдирд╛
рд╕рднреА рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рдореБрдЦ рдкреГрд╖реНрда рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ
CustomerController
рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ:
@RequestMapping("/") public ModelAndView home() { List<Customer> listCustomer = customerService.listAll(); ModelAndView mav = new ModelAndView("index"); mav.addObject("listCustomer", listCustomer); return mav; }
рдмреНрд░рд╛рдЙрдЬрд╝рд┐рдВрдЧ рд╣реЛрдо рдкреЗрдЬ (
index.jsp
) рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Customer Manager</title> </head> <body> <div align="center"> <h2>Customer Manager</h2> <form method="get" action="search"> <input type="text" name="keyword" /> <input type="submit" value="Search" /> </form> <h3><a href="/new">New Customer</a></h3> <table border="1" cellpadding="5"> <tr> <th>ID</th> <th>Name</th> <th>E-mail</th> <th>Address</th> <th>Action</th> </tr> <c:forEach items="${listCustomer}" var="customer"> <tr> <td>${customer.id}</td> <td>${customer.name}</td> <td>${customer.email}</td> <td>${customer.address}</td> <td> <a href="/edit?id=${customer.id}">Edit</a> <a href="/delete?id=${customer.id}">Delete</a> </td> </tr> </c:forEach> </table> </div> </body> </html>
рдЕрдм рдЖрдк рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЧреНрд░рд╛рд╣рдХ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдЬреЛрдбрд╝реЗрдВ рдФрд░
http://localhost:8080/CustomerManager/
рдФрд░ рдЖрдкрдХреЛ рдХреБрдЫ рд╕рдорд╛рди рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
10. рдПрдХ рдирдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЬреЛрдбрд╝рдирд╛
рдПрдХ рдирдпрд╛ рдЧреНрд░рд╛рд╣рдХ рдмрдирд╛рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рджреЛ рд╣реИрдВрдбрд▓рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдФрд░ рдкрд╣рд▓реЗ рдПрдХ рдЧреНрд░рд╛рд╣рдХ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рд░реВрдк рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛:
@RequestMapping("/new") public String newCustomerForm(Map<String, Object> model) { Customer customer = new Customer(); model.put("customer", customer); return "new_customer"; }
JSP рдлреЙрд░реНрдо рдХреЛ
new_customer.jsp
рдирд╛рдо рд╕реЗ рд╕реНрд╡рдпрдВ
new_customer.jsp
:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>New Customer</title> </head> <body> <div align="center"> <h2>New Customer</h2> <form:form action="save" method="post" modelAttribute="customer"> <table border="0" cellpadding="5"> <tr> <td>Name: </td> <td><form:input path="name" /></td> </tr> <tr> <td>Email: </td> <td><form:input path="email" /></td> </tr> <tr> <td>Address: </td> <td><form:input path="address" /></td> </tr> <tr> <td colspan="2"><input type="submit" value="Save"></td> </tr> </table> </form:form> </div> </body> </html>
рдЕрдм рдореБрдЦреНрдп рдкреГрд╖реНрда рдкрд░ рдЖрдкрдХреЛ
рдирдпрд╛ рдЧреНрд░рд╛рд╣рдХ рд▓рд┐рдВрдХ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛, рдЬрдм рдЖрдк рдЙрд╕ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВрдЧреЗ рддреЛ рдЖрдкрдХреЛ рдПрдХ рдирдпрд╛ рд░реВрдк рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
рджреВрд╕рд░рд╛ рд╣реИрдВрдбрд▓рд░ рддрд░реАрдХрд╛ рдЗрд╕ рдлреЙрд░реНрдо рдореЗрдВ
рд╕реЗрд╡ рдмрдЯрди рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░реЗрдЧрд╛:
@RequestMapping(value = "/save", method = RequestMethod.POST) public String saveCustomer(@ModelAttribute("customer") Customer customer) { customerService.save(customer); return "redirect:/"; }
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рдмрд╛рдж рд╣реЛрдо рдкреЗрдЬ рдкрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░рддрд╛ рд╣реИред
11. рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдмрджрд▓реЗрдВ
рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдбрд┐рдЯрд┐рдВрдЧ рдлрдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
CustomerController
рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдирд┐рдореНрди рд╣реИрдВрдбрд▓рд░ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ:
@RequestMapping("/edit") public ModelAndView editCustomerForm(@RequestParam long id) { ModelAndView mav = new ModelAndView("edit_customer"); Customer customer = customerService.get(id); mav.addObject("customer", customer); return mav; }
рдЖрдЗрдП
edit_customer.jsp
рдлреЙрд░реНрдо рд▓рд┐рдЦреЗрдВ, рдЬрд┐рд╕реЗ рдЗрд╕ рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Edit Customer</title> </head> <body> <div align="center"> <h2>Edit Customer</h2> <form:form action="save" method="post" modelAttribute="customer"> <table border="0" cellpadding="5"> <tr> <td>ID: </td> <td>${customer.id} <form:hidden path="id"/> </td> </tr> <tr> <td>Name: </td> <td><form:input path="name" /></td> </tr> <tr> <td>Email: </td> <td><form:input path="email" /></td> </tr> <tr> <td>Address: </td> <td><form:input path="address" /></td> </tr> <tr> <td colspan="2"><input type="submit" value="Save"></td> </tr> </table> </form:form> </div> </body> </html>
рд╣реЛрдо рдкреЗрдЬ рдкрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдмрдЧрд▓ рдореЗрдВ
рдПрдбрд┐рдЯ рд╣рд╛рдЗрдкрд░рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ, рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдбрд┐рдЯрд┐рдВрдЧ рдлреЙрд░реНрдо рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
рд╣реИрдВрдбрд▓рд░ рд╡рд┐рдзрд┐ рдЕрднреА рднреА
рд╕реЗрд╡ рдмрдЯрди рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рддреА рд╣реИред
12. рдПрдХ рдЧреНрд░рд╛рд╣рдХ рдХреЛ рд╣рдЯрд╛рдирд╛
рдбрд┐рд▓реАрдЯ рдлрдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
CustomerController
рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИрдВрдбрд▓рд░ рд╡рд┐рдзрд┐ рд▓рд┐рдЦреЗрдВ:
@RequestMapping("/delete") public String deleteCustomerForm(@RequestParam long id) { customerService.delete(id); return "redirect:/"; }
рдореБрдЦреНрдп рдкреГрд╖реНрда рдкрд░ рдЧреНрд░рд╛рд╣рдХ рдХреЗ рдмрдЧрд▓ рдореЗрдВ рд╕реНрдерд┐рдд рд╣рд╛рдЗрдкрд░рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд╕реВрдЪреА рдЕрдкрдбреЗрдЯ рдХреА рдЬрд╛рдПрдЧреАред
13. рдЧреНрд░рд╛рд╣рдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЦреЛрдЬреЗрдВ
рдЕрдВрдд рдореЗрдВ, рдЖрдЗрдП рдПрдХ рдЦреЛрдЬ рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХреАрд╡рд░реНрдб рджрд░реНрдЬ рдХрд░рдХреЗ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЦреЛрдЬ рдлрд╝рдВрдХреНрд╢рди рддреАрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдХреАрд╡рд░реНрдб рдЦреЛрдЬрддрд╛ рд╣реИ: рдирд╛рдо, рдИрдореЗрд▓ рдФрд░ рдкрддрд╛, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ
CustomerRepository
рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдЕрдкрдиреА рд╡рд┐рдзрд┐ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
package net.codejava.customer; import java.util.List; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.query.Param; public interface CustomerRepository extends CrudRepository<Customer, Long> { @Query(value = "SELECT c FROM Customer c WHERE c.name LIKE '%' || :keyword || '%'" + " OR c.email LIKE '%' || :keyword || '%'" + " OR c.address LIKE '%' || :keyword || '%'") public List<Customer> search(@Param("keyword") String keyword); }
search()
рд╡рд┐рдзрд┐ рд╕рд┐рд░реНрдл рдПрдХ рд╕рд╛рд░ рд╡рд┐рдзрд┐ рд╣реИ
@Query
рд╕рд╛рде рдПрдиреЛрдЯреЗрдЯ рдХрд┐рдпрд╛
@Query
рдЦреЛрдЬ рдХреНрд╡реЗрд░реА JPA рдХреНрд╡реЗрд░реА рд╣реИред
рдлрд┐рд░
CustomerService
рд╡рд░реНрдЧ рдореЗрдВ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ:
public List<Customer> search(String keyword) { return repo.search(keyword); }
рдЕрдм
CustomerController
рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реИрдВрдбрд▓рд░ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ:
@RequestMapping("/search") public ModelAndView search(@RequestParam String keyword) { List<Customer> result = customerService.search(keyword); ModelAndView mav = new ModelAndView("search"); mav.addObject("result", result); return mav; }
рдФрд░ рдПрдХ
search.jsp
рдЦреЛрдЬ рдкрд░рд┐рдгрд╛рдо
search.jsp
рдмрдирд╛рдПрдБ:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Search Result</title> </head> <body> <div align="center"> <h2>Search Result</h2> <table border="1" cellpadding="5"> <tr> <th>ID</th> <th>Name</th> <th>E-mail</th> <th>Address</th> </tr> <c:forEach items="${result}" var="customer"> <tr> <td>${customer.id}</td> <td>${customer.name}</td> <td>${customer.email}</td> <td>${customer.address}</td> </tr> </c:forEach> </table> </div> </body> </html>
рдЦреЛрдЬ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣реЛрдо рдкреЗрдЬ рдкрд░ рдЦреЛрдЬ рдлрд╝реАрд▓реНрдб рдореЗрдВ рдПрдХ рдХреАрд╡рд░реНрдб рджрд░реНрдЬ рдХрд░реЗрдВ, рдФрд░ Enter рджрдмрд╛рдПрдВред рдЖрдкрдХреЛ рдЦреЛрдЬ рдкрд░рд┐рдгрд╛рдо рдкреГрд╖реНрда рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
рдирд┐рд╖реНрдХрд░реНрд╖
рдЗрд╕ рдЧрд╛рдЗрдб рдореЗрдВ, рдЖрдкрдиреЗ рд╕реАрдЦрд╛ рдХрд┐ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдЬреЗрдкреАрдП рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдорд╡реАрд╕реА рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреИрд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдЬреЗрдкреАрдП рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЛ рдмрд╣реБрдд рдХрдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред
рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдБ рдЧреНрд░рд╣рдг рдЖрдИрдбреАрдИ рдореЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдВрд░рдЪрдирд╛ рд╣реИ:
рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!