рдореВрд▓ рджрд╕реНрддрд╛рд╡реЗрдЬрджреВрд╕рд░рд╛ рднрд╛рдЧрддреАрд╕рд░рд╛ рднрд╛рдЧрд╕рд╛рдордЧреНрд░реА рдХреА рддрд╛рд▓рд┐рдХрд╛:
1. рд╡рд╕рдВрдд рдХреЗ рд╕рд╛рде рдерд╛рдЗрдореЗрд▓реАрдл рдПрдХреАрдХрд░рдг
2. рд╕реНрдкреНрд░рд┐рдВрдЧрд╕реНрдЯреИрдВрдбрд░реНрдб рдмреЛрд▓реА
3. рджреГрд╢реНрдп рдФрд░ рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рджреЗрдЦреЗрдВ
3.1 рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдорд╡реАрд╕реА рдореЗрдВ рджреГрд╢реНрдп рдФрд░ рджреГрд╢реНрдп рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░
3.2 рджреГрд╢реНрдп рдФрд░ рджреГрд╢реНрдп рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рдерд╛рдЗрдореЗрд▓реНрдл рдореЗрдВ
4. рд╕реНрдкреНрд░рд┐рдВрдЧ рдерд╛рдЗрдо рдмреАрдЬ рд╕реНрдЯрд╛рд░реНрдЯрд░ рдореИрдиреЗрдЬрд░
рек.рез рд╕рдВрдХрд▓реНрдкрдирд╛
рек.реи рд╡реНрдпрд╛рдкрд╛рд░рд┐рдХ рдкрд░рдд
4.3 рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдорд╡реАрд╕реА рд╡рд┐рдиреНрдпрд╛рд╕
4.4 рдирд┐рдпрдВрддреНрд░рдХ
4.5 рд░реВрдкрд╛рдВрддрд░рдг рд╕реЗрд╡рд╛ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛
5 рдкреНрд░рджрд░реНрд╢рди рдмреАрдЬ рд╕реНрдЯрд╛рд░реНрдЯрд░ рдбреЗрдЯрд╛
6 рдлреЙрд░реНрдо рдмрдирд╛рдирд╛
6.1 рдПрдХ рдХрдорд╛рдВрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛
6.2 рдЗрдирдкреБрдЯ
6.3 рдЪреЗрдХрдмреЙрдХреНрд╕ рдлрд╝реАрд▓реНрдб
6.4 рд░реЗрдбрд┐рдпреЛ рдмрдЯрди рдлрд╝реАрд▓реНрдб
6.5 рдбреНрд░реЙрдкрдбрд╛рдЙрди / рд╕реВрдЪреА рдЪрдпрдирдХрд░реНрддрд╛
6.6 рдЧрддрд┐рд╢реАрд▓ рдХреНрд╖реЗрддреНрд░
7 рд╕рддреНрдпрд╛рдкрди рдФрд░ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢
7.1 рдлрд╝реАрд▓реНрдб рддреНрд░реБрдЯрд┐рдпрд╛рдБ
7.2 рд╕рднреА рддреНрд░реБрдЯрд┐рдпрд╛рдВ
7.3 рд╡реИрд╢реНрд╡рд┐рдХ рддреНрд░реБрдЯрд┐рдпрд╛рдВ
7.4 рд░реВрдкреЛрдВ рдХреЗ рдмрд╛рд╣рд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛
7.5 рдЕрдореАрд░ рддреНрд░реБрдЯрд┐ рд╡рд╕реНрддреБрдУрдВ
8 рдпрд╣ рдЕрднреА рднреА рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╣реИ!
9 рд░реВрдкрд╛рдВрддрд░рдг рд╕реЗрд╡рд╛
9.1 рд╡рд┐рдиреНрдпрд╛рд╕
9.2 рдбрдмрд▓ рдмреНрд░реИрдХреЗрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕
9.3 рд░реВрдкреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
9.4 # рд░реВрдкрд╛рдВрддрд░рдг рд░реВрдкрд╛рдВрддрд░рдг рд╡рд╕реНрддреБ
рдЯреЗрдореНрдкрд▓реЗрдЯ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЯреБрдХрдбрд╝реЗ (AJAX рдЖрджрд┐) рдХреЗ 10 рдкреНрд░рддрд┐рдкрд╛рджрди рдЯреБрдХрдбрд╝реЗ
10.1 рдПрдХ рджреГрд╢реНрдп рдмреАрди рдореЗрдВ рдЯреБрдХрдбрд╝реЗ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛
10.2 рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдореЗрдВ рдЯреБрдХрдбрд╝реЗ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛
11 рдЙрдиреНрдирдд рдПрдХреАрдХрд░рдг рд╕реБрд╡рд┐рдзрд╛рдПрдБ
11.1 RequestDataValueProcessor рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг
11.1 рдХрдВрдЯреНрд░реЛрд▓рд░реНрд╕ рдХреЛ URI рдмрд┐рд▓реНрдбрд┐рдВрдЧ
12 рд╕реНрдкреНрд░рд┐рдВрдЧ рд╡реЗрдмрдлреНрд▓реЛ рдПрдХреАрдХрд░рдг
рд╕реНрдкреНрд░рд┐рдВрдЧ рд╡реЗрдмрдлреНрд▓реЛ рдореЗрдВ 12.2 AJAX рд╕реНрдирд┐рдкреЗрдЯ
рдпрд╣ рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛ рдмрддрд╛рддреА рд╣реИ рдХрд┐
Thymeleaf рдХреЛ рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ (рд▓реЗрдХрд┐рди рди рдХреЗрд╡рд▓) рд╕реНрдкреНрд░рд┐рдВрдЧ MVCред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ Thymeleaf рдореЗрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг 3.x рдФрд░ 4.x рдХреЗ рд▓рд┐рдП рдПрдХреАрдХрд░рдг рд╣реИ рдФрд░ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ thymeleaf-spring3 рдФрд░ thymeleaf-spring4 рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ .jar рдлрд╝рд╛рдЗрд▓реЛрдВ (thymeleaf-spring3- {version} .jar рдФрд░ thymeleaf-spring4- {version} .jar) рдореЗрдВ рдкреИрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ Thymeleaf рд╕реНрдкреНрд░рд┐рдВрдЧ рдЗрдВрдЯреАрдЧреНрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдЖрдкрдХреЗ рдХреНрд▓рд╛рд╕ рдкрде рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕ рдЧрд╛рдЗрдб рдореЗрдВ рдХреЛрдб рдирдореВрдиреЗ рдФрд░ рдирдореВрдирд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реНрдкреНрд░рд┐рдВрдЧ 4.x рдФрд░ рдЗрд╕рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдерд╛рдЗрдореЗрд▓реНрдл рдЗрдВрдЯреАрдЧреНрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рдкрд╛рда рдХреА рд╕рд╛рдордЧреНрд░реА рднреА рд╕реНрдкреНрд░рд┐рдВрдЧ 3.x рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИред рдпрджрд┐ рдЖрдкрдХрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрдкреНрд░рд┐рдВрдЧ 3.x рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдХреЛрдб рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ org.thymeleaf.spring4 рдХреЛ org.thymeleaf.spring3 рдХреЗ рд╕рд╛рде рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред
1. рд╡рд╕рдВрдд рдХреЗ рд╕рд╛рде рдерд╛рдЗрдореЗрд▓реАрдл рдПрдХреАрдХрд░рдг
Thymeleaf рд╕реНрдкреНрд░рд┐рдВрдЧ рдЗрдВрдЯреАрдЧреНрд░реЗрд╢рди рдХрд╛ рдПрдХ рд╕реЗрдЯ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рд╕реНрдкреНрд░рд┐рдВрдЧ MVC рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдПрдХ рдкреВрд░реА рддрд░рд╣ рдХрд╛рд░реНрдпрд╛рддреНрдордХ JSP рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдпреЗ рдПрдХреАрдХрд░рдг рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВрдЧреЗ:
- рдЕрдкрдиреЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдорд╡реАрд╕реА рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рддрд░реАрдХреЛрдВ рдХреА рдореИрдкрд┐рдВрдЧ рдХреЛ рдерд╛рдЗрдореЗрд▓рдл рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдкреИрдЯрд░реНрди рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреА рддрд░рд╣ рдХрд░реЗрдВ, рдЬреИрд╕реЗ рдЖрдк рдЗрд╕реЗ JSP рдХреЗ рд╕рд╛рде рдХрд░рддреЗ рд╣реИрдВред
- рдЕрдкрдиреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ OGNL рдХреЗ рдмрдЬрд╛рдп рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рд▓реИрдВрдЧреНрд╡реЗрдЬ (Spring EL) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
- рдЕрдкрдиреЗ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдРрд╕реЗ рдлрд╝реЙрд░реНрдо рдмрдирд╛рдПрдБ рдЬреЛ рдЖрдкрдХреЗ рдлрд╝реЙрд░реНрдо рд╕рдорд░реНрдерди рдШрдЯрдХреЛрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдХреАрдХреГрдд рд╣реЛрдВ, рдЬрд┐рд╕рдореЗрдВ рд╕рдВрдкрддреНрддрд┐ рд╕рдВрдкрд╛рджрдХреЛрдВ, рд░реВрдкрд╛рдВрддрд░рдг рд╕реЗрд╡рд╛рдУрдВ рдФрд░ рд╕рддреНрдпрд╛рдкрди рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢рд╛рдорд┐рд▓ рд╣реИред
- рд╕реНрдкреНрд░рд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдмрдВрдзрд┐рдд рд╕рдВрджреЗрд╢ рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рдЕрдВрддрд░реНрд░рд╛рд╖реНрдЯреНрд░реАрдпрдХрд░рдг рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ (рдирд┐рдпрдорд┐рдд рд╕рдВрджреЗрд╢ рд╕реНрд░реЛрдд рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ)ред
- рджреЗрд╢реА рд╕реНрдкреНрд░рд┐рдВрдЧ рд╕рдВрд╕рд╛рдзрди рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдкреИрдЯрд░реНрди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВред
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ "
рдерд┐рдореЗрд▓реНрдлрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ "
рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдорд╛рдирдХ рдмреЛрд▓реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛рддрд╛ рд╣реИред
2. рд╕реНрдкреНрд░рд┐рдВрдЧрд╕реНрдЯреИрдВрдбрд░реНрдб рдмреЛрд▓реА
рдЖрд╕рд╛рди рдФрд░ рдмреЗрд╣рддрд░ рдПрдХреАрдХрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдерд╛рдЗрдореЗрд▓реНрдл рдПрдХ рдмреЛрд▓реА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡рд╕рдВрдд рдХреЗ рд╕рд╛рде рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рд╡рд┐рд╢реЗрд╖ рдмреЛрд▓реА рдорд╛рдирдХ Thymeleaf рдмреЛрд▓реА рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдФрд░ рдЗрд╕реЗ рдХреНрд▓рд╛рд╕ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдорд╛рдирдХ рдмреЛрд▓реА рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА, рд╕реНрдкреНрд░рд┐рдВрдЧрд╕реНрдЯреИрдВрдбрд░реНрдб рдмреЛрд▓реА рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ:
- рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рд▓реИрдВрдЧреНрд╡реЗрдЬ (рд╕реНрдкреНрд░рд┐рдВрдЧ рдИрдПрд▓ рдпрд╛ рд╕реНрдкреЗрд▓) рдХреЛ рдПрдХ рдЪрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдУрдЬреАрдПрдирдПрд▓ рдирд╣реАрдВред рдЗрд╕рд▓рд┐рдП, рд╕рднреА $ {...} рдФрд░ * {...} рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рднрд╛рд╖рд╛ рдЗрдВрдЬрди рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реНрдкреНрд░рд┐рдВрдЧ рдИрдПрд▓ рд╕рдВрдХрд▓рдХ рд╕рдорд░реНрдерди (рд╕реНрдкреНрд░рд┐рдВрдЧ 4.2.4+) рдЙрдкрд▓рдмреНрдз рд╣реИред
- рд╕реНрдкреНрд░рд┐рдВрдЧрд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХрд┐рд╕реА рднреА рдШрдЯрдХ рддрдХ рдкрд╣реБрдВрдЪ: $ {@ myBean.doSomething ()}
- рдкреНрд░рдкрддреНрд░ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ: th: рдлрд╝реАрд▓реНрдб , th: рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдФрд░ th: errorclass , рдирдП th: рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬреЛ рдЖрдкрдХреЛ рдлрд╝реЙрд░реНрдо рдЖрджреЗрд╢ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
- рдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рд╡рд┐рдзрд┐ # themes.code (...) рд╣реИ , рдЬреЛ JSP рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ : рдереАрдо рдХрд╕реНрдЯрдо рдЯреИрдЧред
- рдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╡рд┐рдзрд┐, # mvc.uri (...) , рдЬреЛ JSP рд╕реНрдкреНрд░рд┐рдВрдЧ рдХрд╕реНрдЯрдо рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ : mvcUrl (...) (рдХреЗрд╡рд▓ рд╕реНрдкреНрд░рд┐рдВрдЧ 4.1+ рдореЗрдВ)ред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдкрдХреЛ рдЗрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рд╕реАрдзреЗ рдЕрдкрдиреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдирд┐рдпрдорд┐рдд рдЯреЗрдореНрдкреНрд▓реЗрдЯрдЧрд╛рдЗрди рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реЗрд╖ рдПрдХреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдирдП рдЯреЗрдореНрдкрд▓реЗрдЯ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЪрд░рдгреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ:
org.thymeleaf.spring4.SpringTemplateEngine ред
рдмреАрди рд╡рд┐рдиреНрдпрд╛рд╕ рдЙрджрд╛рд╣рд░рдг:
@Bean public SpringResourceTemplateResolver templateResolver(){
рдпрд╛ XML- рдЖрдзрд╛рд░рд┐рдд рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛:
<bean id="templateResolver" class="org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver"> <property name="prefix" value="/WEB-INF/templates/" /> <property name="suffix" value=".html" /> <property name="templateMode" value="HTML" /> <property name="cacheable" value="true" /> </bean> <bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine"> <property name="templateResolver" ref="templateResolver" /> <property name="enableSpringELCompiler" value="true" /> </bean>
3. рджреГрд╢реНрдп рдФрд░ рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рджреЗрдЦреЗрдВ
3.1 рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдорд╡реАрд╕реА рдореЗрдВ рджреГрд╢реНрдп рдФрд░ рджреГрд╢реНрдп рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░
рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдорд╡реАрд╕реА рдХреЗ рджреЛ рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реИрдВ рдЬреЛ рдЗрд╕рдХреА рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдореВрд▓ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВ:
- org.springframework.web.servlet.View
- org.springframework.web.servlet.ViewResolver
рд╣рдорд╛рд░реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдореЙрдбрд▓ рдкреГрд╖реНрда
рджреЗрдЦреЗрдВ рдФрд░ рдЖрдкрдХреЛ рдмреАрди рдШрдЯрдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдХреЗ рдЙрдирдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдФрд░ рдкреВрд░реНрд╡ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВред рджреГрд╢реНрдп рд╡рд╛рд╕реНрддрд╡рд┐рдХ HTML рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВ, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЬрди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдерд╛рдЗрдореЗрд▓рдлред
ViewResolvers рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВ рдЬреЛ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдСрдкрд░реЗрд╢рди рдФрд░ рд▓реЛрдХреЗрд▓ рдХреЗ рд▓рд┐рдП
рд╡реНрдпреВ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВред рдЖрдорддреМрд░ рдкрд░, рдирд┐рдпрдВрддреНрд░рдХ ViewResolvers рдХреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд╛рдо (рдирд┐рдпрдВрддреНрд░рдХ рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рд╕реНрдЯреНрд░рд┐рдВрдЧ) рдХреЗ рд╕рд╛рде рджреГрд╢реНрдп рдХреЛ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рджреГрд╢реНрдп рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд╕рднреА рд╕рд╛рдзрдиреЛрдВ рдХреЛ рдПрдХ рдХреНрд░рдордмрджреНрдз рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рдПрдХ рдЗрд╕ рджреГрд╢реНрдп рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рджреГрд╢реНрдп рд╡рд╕реНрддреБ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддреА рд╣реИ рдФрд░ рдирд┐рдпрдВрддреНрд░рдг рдЗрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред HTML рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рд╕рднреА рдкреГрд╖реНрдареЛрдВ рдХреЛ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЙрди рд▓реЛрдЧреЛрдВ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рд╣рдо рдЧреИрд░-рдорд╛рдирдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдпрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рддрд░реАрдХреЗ рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдШрдЯрдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдХрд░)ред рдпрджрд┐ рдПрдХ ViewResolver рдЙрд╕ рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╕рдВрдЧрдд рдмреАрди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ (рдЬреЛ рдХрд┐ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓рд╛ рд╣реИ), рддреЛ рдПрдХ рдирдпрд╛ рджреГрд╢реНрдп рддрджрд░реНрде рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИредрдЕрддреАрдд рд╕реЗ рдПрдХ рд╕реНрдкреНрд░рд┐рдВрдЧ MVC рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ
JSP + JSTL ViewResolver рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рдерд╛:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/jsps/" /> <property name="suffix" value=".jsp" /> <property name="order" value="2" /> <property name="viewNames" value="*jsp" /> </bean>
рдЗрд╕рдХреЗ рдЧреБрдгреЛрдВ рдкрд░ рдПрдХ рддреНрд╡рд░рд┐рдд рдирдЬрд╝рд░ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
- viewClass рд╡реНрдпреВ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХрд╛ рд╡рд░реНрдЧ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдпрд╣ JSP рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рд▓реЗрдХрд┐рди рддрдм рдирд╣реАрдВ рдЬрдм рд╣рдо рдерд╛рдЗрдореЗрд▓рдл рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
- рдЙрдкрд╕рд░реНрдЧ рдФрд░ рдкреНрд░рддреНрдпрдп рд╕рдорд╛рди рд░реВрдк рд╕реЗ Thymeleaf TemplateResolver рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕рдорд╛рди рдирд╛рдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
- рдЖрджреЗрд╢ рд╡рд╣ рдХреНрд░рдо рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ ViewResolver рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
- viewNames рдЖрдкрдХреЛ рдЙрди рджреГрд╢реНрдпреЛрдВ рдХреЗ рдирд╛рдореЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рдиреНрд╣реЗрдВ рдпрд╣ ViewResolver рд╣рд▓ рдХрд░реЗрдЧрд╛ред
3.2 рджреГрд╢реНрдп рдФрд░ рджреГрд╢реНрдп рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рдерд╛рдЗрдореЗрд▓реНрдл рдореЗрдВ
Thymeleaf рдКрдкрд░ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рджреЛ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:
- org.thymeleaf.spring4.view.ThymeleafView
- org.thymeleaf.spring4.view.ThymeleafViewResolver
рдпреЗ рджреЛрдиреЛрдВ рдХрдХреНрд╖рд╛рдПрдВ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдерд┐рдореЗрд▓реНрдлрд╝ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдВрдЧреАред
рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рдерд╛рдЗрдореЗрд▓рдл рд╡реНрдпреВ рдХрд╛ рд╡рд┐рдиреНрдпрд╛рд╕ JSP рд╕реЗ рдмрд╣реБрдд рдорд┐рд▓рддрд╛-рдЬреБрд▓рддрд╛ рд╣реИ:
@Bean public ThymeleafViewResolver viewResolver(){ ThymeleafViewResolver viewResolver = new ThymeleafViewResolver(); viewResolver.setTemplateEngine(templateEngine());
... рдпрд╛ XML рдореЗрдВ:
<bean class="org.thymeleaf.spring4.view.ThymeleafViewResolver"> <property name="templateEngine" ref="templateEngine" /> <property name="order" value="1" /> <property name="viewNames" value="*.html,*.xhtml" /> </bean>
рдЯреЗрдореНрдкреНрд▓реЗрдЯрдЧрд╛рдЗрди рдкреИрд░рд╛рдореАрдЯрд░, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╕реНрдкреНрд░рд┐рдВрдЧрдЯреЗрдореНрдкрдкреНрд▓реЗрдЗрди рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрд┐рдЫрд▓реЗ рдЕрдзреНрдпрд╛рдп рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдерд╛ред рдЕрдиреНрдп рджреЛ (
рдХреНрд░рдо рдФрд░
рджреГрд╢реНрдп рдирд╛рдо ) рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИрдВ рдФрд░ рдЗрд╕рдХрд╛ рд╡рд╣реА рдЕрд░реНрде рд╣реИ рдЬреЛ JSP ViewResolver рдореЗрдВ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрд╣рд▓реЗ рджреЗрдЦрд╛ рдерд╛ред
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдореЗрдВ рдЙрдкрд╕рд░реНрдЧ рдпрд╛ рдкреНрд░рддреНрдпрдп рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЯреЗрдореНрдкрд▓реЗрдЯ рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИрдВ (рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ, рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЬрди рдореЗрдВ рдкрд╛рд░рд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ)ред
рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдо рдПрдХ
рджреГрд╢реНрдп рдмреАрди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░
рдЗрд╕рдореЗрдВ рдХреБрдЫ рд╕реНрдерд┐рд░ рдЪрд░ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ ? рдЖрд╕рд╛рди рд╣реИ, рдмрд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:
@Bean @Scope("prototype") public ThymeleafView mainView() { ThymeleafView view = new ThymeleafView("main");
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдЗрд╕ рдШрдЯрдХ рдХреЛ рдирд╛рдо рд╕реЗ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ mainView)ред
4. рд╕реНрдкреНрд░рд┐рдВрдЧ рдерд╛рдЗрдо рдмреАрдЬ рд╕реНрдЯрд╛рд░реНрдЯрд░ рдореИрдиреЗрдЬрд░
рдЗрд╕ рдЧрд╛рдЗрдб рдореЗрдВ рджрд┐рдЦрд╛рдП рдЧрдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдХреЗ рдЕрдзреНрдпрд╛рдпреЛрдВ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ
GitHub Spring Seyme Seed Starter Manager repository рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рек.рез рд╕рдВрдХрд▓реНрдкрдирд╛
рдерд╛рдЗрдореЗрд▓реНрдл рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рд╣рдо рдерд╛рдЗрдо рдХреЗ рдмрдбрд╝реЗ рдкреНрд░рд╢рдВрд╕рдХ рд╣реИрдВ, рдФрд░ рд╣рд░ рд╡рд╕рдВрдд рдореЗрдВ рд╣рдо рдЕрдкрдиреЗ рд╕реНрдЯрд╛рд░реНрдЯрд░ рдХрд┐рдЯ рдХреЛ рдЕрдЪреНрдЫреА рдорд┐рдЯреНрдЯреА рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╕рдВрджреАрджрд╛ рдмреАрдЬ рдХреЗ рд╕рд╛рде рддреИрдпрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рд╕реНрдкреЗрдирд┐рд╢ рд╕реВрд░рдЬ рдХреЗ рдиреАрдЪреЗ рд▓рдЧрд╛рддреЗ рд╣реИрдВ рдФрд░ рдзреИрд░реНрдпрдкреВрд░реНрд╡рдХ рд╣рдорд╛рд░реЗ рдирдП рдкреМрдзреЛрдВ рдХреЗ рдмрдврд╝рдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдЗрд╕ рд╕рд╛рд▓, рд╣рдо рд╢реБрд░реБрдЖрддреА рдмреАрдЬ рдХрдВрдЯреЗрдирд░реЛрдВ рдкрд░ рд▓реЗрдмрд▓ рдЪрд┐рдкрдХрд╛рдиреЗ рд╕реЗ рдердХ рдЧрдП рдереЗ, рддрд╛рдХрд┐ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ рдХрдВрдЯреЗрдирд░ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд▓ рдореЗрдВ рдХреНрдпрд╛ рдмреАрдЬ рдереЗ, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдЕрдкрдиреЗ рд╢реБрд░реБрдЖрдд рдХреЛ
рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдорд╡реАрд╕реА рдФрд░
рдерд╛рдЗрдореЗрд▓реНрдл рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛:
рд╕реНрдкреНрд░рд┐рдВрдЧ рдерд┐рдПрд╕ рд╕реАрдбрд╕реНрдЯрд╛рд░реНрдЯрд░ рдореИрдиреЗрдЬрд░ ред

рд╣рдо Thymeleaf рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдП рдЧрдП рдЧреБрдб рдерд┐рдПрдореНрд╕ рд╡рд░реНрдЪреБрдЕрд▓ рдХрд┐рд░рд╛рдиреЗ рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рд╕рдорд╛рди, STSM рд╣рдореЗрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ MVC рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЬрди рдХреЗ рд░реВрдк рдореЗрдВ Thymeleaf рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд╣рд▓реБрдУрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рек.реи рд╡реНрдпрд╛рдкрд╛рд░рд┐рдХ рдкрд░рдд
рд╣рдореЗрдВ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд╡реНрдпрд╡рд╕рд╛рдп рдкрд░рдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рд╣рдорд╛рд░реА рдореЙрдбрд▓ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рджреЗрдЦреЗрдВ:

рд╕реЗрд╡рд╛ рдХреЗ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЛ рдЖрд╡рд╢реНрдпрдХ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░реЗрдВрдЧреЗред рдЬреИрд╕реЗ:
@Service public class SeedStarterService { @Autowired private SeedStarterRepository seedstarterRepository; public List<SeedStarter> findAll() { return this.seedstarterRepository.findAll(); } public void add(final SeedStarter seedStarter) { this.seedstarterRepository.add(seedStarter); } }
рдФрд░:
@Service public class VarietyService { @Autowired private VarietyRepository varietyRepository; public List<Variety> findAll() { return this.varietyRepository.findAll(); } public Variety findById(final Integer id) { return this.varietyRepository.findById(id); } }
4.3 рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдорд╡реАрд╕реА рд╡рд┐рдиреНрдпрд╛рд╕
рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП
рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдорд╡реАрд╕реА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛
рд╣реИ , рдЬрд┐рд╕рдореЗрдВ рди рдХреЗрд╡рд▓ рдорд╛рдирдХ рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдорд╡реАрд╕реА рдХрд▓рд╛рдХреГрддрд┐рдпрд╛рдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреА, рдЬреИрд╕реЗ рдХрд┐ рд╕рдВрд╕рд╛рдзрди рд╕рдВрд╕рд╛рдзрди рдпрд╛ рд╕реНрдХреИрдирд┐рдВрдЧ рдПрдиреЛрдЯреЗрд╢рди, рд▓реЗрдХрд┐рди
рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЬрди рдФрд░
рд╡реНрдпреВ рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рднреА рдмрдирд╛рдПрдВред
@Configuration @EnableWebMvc @ComponentScan public class SpringWebConfig extends WebMvcConfigurerAdapter implements ApplicationContextAware { private ApplicationContext applicationContext; public SpringWebConfig() { super(); } public void setApplicationContext(final ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } @Override public void addResourceHandlers(final ResourceHandlerRegistry registry) { super.addResourceHandlers(registry); registry.addResourceHandler("/images/**").addResourceLocations("/images/"); registry.addResourceHandler("/css/**").addResourceLocations("/css/"); registry.addResourceHandler("/js/**").addResourceLocations("/js/"); } @Bean public ResourceBundleMessageSource messageSource() { ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); messageSource.setBasename("Messages"); return messageSource; } @Override public void addFormatters(final FormatterRegistry registry) { super.addFormatters(registry); registry.addFormatter(varietyFormatter()); registry.addFormatter(dateFormatter()); } @Bean public VarietyFormatter varietyFormatter() { return new VarietyFormatter(); } @Bean public DateFormatter dateFormatter() { return new DateFormatter(); } @Bean public SpringResourceTemplateResolver templateResolver(){
4.4 рдирд┐рдпрдВрддреНрд░рдХ
рдмреЗрд╢рдХ, рд╣рдореЗрдВ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдпрдВрддреНрд░рдХ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдПрд╕рдЯреАрдПрд╕рдПрдо рдореЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдпреЛрдВ рдХреА рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдХреЗрд╡рд▓ рдПрдХ рд╡реЗрдм рдкреЗрдЬ рд╣реЛрдЧрд╛ рдФрд░ рдирдП рд▓реЛрдЧреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлреЙрд░реНрдо рд╣реЛрдЧрд╛, рд╣рдо рд╕рднреА рд╕рд░реНрд╡рд░ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдирд┐рдпрдВрддреНрд░рдХ рд╡рд░реНрдЧ рд▓рд┐рдЦреЗрдВрдЧреЗ:
@Controller public class SeedStarterMngController { @Autowired private VarietyService varietyService; @Autowired private SeedStarterService seedStarterService; ... }
рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЗрд╕ рдирд┐рдпрдВрддреНрд░рдХ рд╡рд░реНрдЧ рдореЗрдВ рдХреНрдпрд╛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдореЙрдбрд▓ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБрд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдХреБрдЫ рдореЙрдбрд▓ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВрдЧреЗ, рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдкреГрд╖реНрда рдкрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:
@ModelAttribute("allTypes") public List<Type> populateTypes() { return Arrays.asList(Type.ALL); } @ModelAttribute("allFeatures") public List<Feature> populateFeatures() { return Arrays.asList(Feature.ALL); } @ModelAttribute("allVarieties") public List<Variety> populateVarieties() { return this.varietyService.findAll(); } @ModelAttribute("allSeedStarters") public List<SeedStarter> populateSeedStarters() { return this.seedStarterService.findAll(); }
рдореИрдк рдХрд┐рдП рдЧрдП рддрд░реАрдХреЗрдФрд░ рдЕрдм рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдореИрдк рдХрд┐рдП рдЧрдП рддрд░реАрдХреЗ: рдПрдХ рдлреЙрд░реНрдо рдкреЗрдЬ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рджреВрд╕рд░рд╛ рдирдП
рд╕реАрдбрд╕реНрдЯреНрд░реАрдо рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдПред
@RequestMapping({"/","/seedstartermng"}) public String showSeedstarters(final SeedStarter seedStarter) { seedStarter.setDatePlanted(Calendar.getInstance().getTime()); return "seedstartermng"; } @RequestMapping(value="/seedstartermng", params={"save"}) public String saveSeedstarter( final SeedStarter seedStarter, final BindingResult bindingResult, final ModelMap model) { if (bindingResult.hasErrors()) { return "seedstartermng"; } this.seedStarterService.add(seedStarter); model.clear(); return "redirect:/seedstartermng"; }
4.5 рд░реВрдкрд╛рдВрддрд░рдг рд░реВрдкрд╛рдВрддрд░рдг рд╕реЗрд╡рд╛
рд╣рдорд╛рд░реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реЗрдпрд░ рдореЗрдВ
рджрд┐рдирд╛рдВрдХ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕рд╛рде-рд╕рд╛рде
рд╡реИрд░рд╛рдпрдЯреА рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рд╕реНрд╡рд░реВрдкрдг рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рддрд╛рдХрд┐ рд╕реНрдкреНрд░рд┐рдВрдЧ
рдХрдиреНрд╡рд░реНрд╕реЗрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдФрд░ рд╣рдореЗрдВ рдЬрд┐рди рдлреЙрд░реНрдореЗрдЯрд┐рдВрдЧ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ,
рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ (рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓
WebMvcConfigurerAdapter ) рдмрдирд╛рдпрд╛ рдЧрдпрд╛ред
рдлрд┐рд░ рд╕реЗ рджреЗрдЦреЗрдВ:
@Override public void addFormatters(final FormatterRegistry registry) { super.addFormatters(registry); registry.addFormatter(varietyFormatter()); registry.addFormatter(dateFormatter()); } @Bean public VarietyFormatter varietyFormatter() { return new VarietyFormatter(); } @Bean public DateFormatter dateFormatter() { return new DateFormatter(); }
рд╕реНрдкреНрд░рд┐рдВрдЧ
рдлреЙрд░реНрдореЗрдЯрд░реНрд╕ org.springframework.format.Formatter рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВред рд╕реНрдкреНрд░рд┐рдВрдЧ рд░реВрдкрд╛рдВрддрд░рдг рд╕рдВрд░рдЪрдирд╛ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП,
spring.io рдкрд░ рдбреЙрдХреНрд╕ рджреЗрдЦреЗрдВред
рдЪрд▓рд┐рдП рдПрдХ
DateFormatter рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рдЬреЛ рдлреЙрд░реНрдореЗрдЯреНрд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рддрд╛рд░реАрдЦреЛрдВ рдореЗрдВ рдореМрдЬреВрдж рд╣реИред
public class DateFormatter implements Formatter<Date> { @Autowired private MessageSource messageSource; public DateFormatter() { super(); } public Date parse(final String text, final Locale locale) throws ParseException { final SimpleDateFormat dateFormat = createDateFormat(locale); return dateFormat.parse(text); } public String print(final Date object, final Locale locale) { final SimpleDateFormat dateFormat = createDateFormat(locale); return dateFormat.format(object); } private SimpleDateFormat createDateFormat(final Locale locale) { final String format = this.messageSource.getMessage("date.format", null, locale); final SimpleDateFormat dateFormat = new SimpleDateFormat(format); dateFormat.setLenient(false); return dateFormat; } }
рд╡реИрд░рд╛рдЗрдЯреАрдлрд╛рд░реНрдореЗрдЯрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╣рдорд╛рд░реА
рд╡рд┐рднрд┐рдиреНрди рд╡рд╕реНрддреБрдУрдВ рдФрд░ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рд░реВрдкреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЙрдирдХреЗ
рдЖрдИрдбреА рдлрд╝реАрд▓реНрдб рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░):
public class VarietyFormatter implements Formatter<Variety> { @Autowired private VarietyService varietyService; public VarietyFormatter() { super(); } public Variety parse(final String text, final Locale locale) throws ParseException { final Integer varietyId = Integer.valueOf(text); return this.varietyService.findById(varietyId); } public String print(final Variety object, final Locale locale) { return (object != null ? object.getId().toString() : ""); } }
рд╣рдо рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдо рдФрд░ рдЕрдзрд┐рдХ рдЬрд╛рдиреЗрдВрдЧреЗред