рдЧрд╛рдЗрдб: рдерд╛рдЗрдореЗрд▓рдл + рд╡рд╕рдВрддред рднрд╛рдЧ 1

рдореВрд▓ рджрд╕реНрддрд╛рд╡реЗрдЬ

рджреВрд╕рд░рд╛ рднрд╛рдЧ
рддреАрд╕рд░рд╛ рднрд╛рдЧ

рд╕рд╛рдордЧреНрд░реА рдХреА рддрд╛рд▓рд┐рдХрд╛:

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 рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдпреЗ рдПрдХреАрдХрд░рдг рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВрдЧреЗ:

  1. рдЕрдкрдиреЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдорд╡реАрд╕реА рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рддрд░реАрдХреЛрдВ рдХреА рдореИрдкрд┐рдВрдЧ рдХреЛ рдерд╛рдЗрдореЗрд▓рдл рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдкреИрдЯрд░реНрди рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреА рддрд░рд╣ рдХрд░реЗрдВ, рдЬреИрд╕реЗ рдЖрдк рдЗрд╕реЗ JSP рдХреЗ рд╕рд╛рде рдХрд░рддреЗ рд╣реИрдВред
  2. рдЕрдкрдиреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ OGNL рдХреЗ рдмрдЬрд╛рдп рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рд▓реИрдВрдЧреНрд╡реЗрдЬ (Spring EL) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
  3. рдЕрдкрдиреЗ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдРрд╕реЗ рдлрд╝реЙрд░реНрдо рдмрдирд╛рдПрдБ рдЬреЛ рдЖрдкрдХреЗ рдлрд╝реЙрд░реНрдо рд╕рдорд░реНрдерди рдШрдЯрдХреЛрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдХреАрдХреГрдд рд╣реЛрдВ, рдЬрд┐рд╕рдореЗрдВ рд╕рдВрдкрддреНрддрд┐ рд╕рдВрдкрд╛рджрдХреЛрдВ, рд░реВрдкрд╛рдВрддрд░рдг рд╕реЗрд╡рд╛рдУрдВ рдФрд░ рд╕рддреНрдпрд╛рдкрди рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢рд╛рдорд┐рд▓ рд╣реИред
  4. рд╕реНрдкреНрд░рд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдмрдВрдзрд┐рдд рд╕рдВрджреЗрд╢ рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рдЕрдВрддрд░реНрд░рд╛рд╖реНрдЯреНрд░реАрдпрдХрд░рдг рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ (рдирд┐рдпрдорд┐рдд рд╕рдВрджреЗрд╢ рд╕реНрд░реЛрдд рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ)ред
  5. рджреЗрд╢реА рд╕реНрдкреНрд░рд┐рдВрдЧ рд╕рдВрд╕рд╛рдзрди рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдкреИрдЯрд░реНрди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВред

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ " рдерд┐рдореЗрд▓реНрдлрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ " рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдорд╛рдирдХ рдмреЛрд▓реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛рддрд╛ рд╣реИред

2. рд╕реНрдкреНрд░рд┐рдВрдЧрд╕реНрдЯреИрдВрдбрд░реНрдб рдмреЛрд▓реА


рдЖрд╕рд╛рди рдФрд░ рдмреЗрд╣рддрд░ рдПрдХреАрдХрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдерд╛рдЗрдореЗрд▓реНрдл рдПрдХ рдмреЛрд▓реА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡рд╕рдВрдд рдХреЗ рд╕рд╛рде рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рд╡рд┐рд╢реЗрд╖ рдмреЛрд▓реА рдорд╛рдирдХ Thymeleaf рдмреЛрд▓реА рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдФрд░ рдЗрд╕реЗ рдХреНрд▓рд╛рд╕ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдорд╛рдирдХ рдмреЛрд▓реА рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА, рд╕реНрдкреНрд░рд┐рдВрдЧрд╕реНрдЯреИрдВрдбрд░реНрдб рдмреЛрд▓реА рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ:

  1. рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рд▓реИрдВрдЧреНрд╡реЗрдЬ (рд╕реНрдкреНрд░рд┐рдВрдЧ рдИрдПрд▓ рдпрд╛ рд╕реНрдкреЗрд▓) рдХреЛ рдПрдХ рдЪрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдУрдЬреАрдПрдирдПрд▓ рдирд╣реАрдВред рдЗрд╕рд▓рд┐рдП, рд╕рднреА $ {...} рдФрд░ * {...} рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рднрд╛рд╖рд╛ рдЗрдВрдЬрди рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реНрдкреНрд░рд┐рдВрдЧ рдИрдПрд▓ рд╕рдВрдХрд▓рдХ рд╕рдорд░реНрдерди (рд╕реНрдкреНрд░рд┐рдВрдЧ 4.2.4+) рдЙрдкрд▓рдмреНрдз рд╣реИред
  2. рд╕реНрдкреНрд░рд┐рдВрдЧрд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХрд┐рд╕реА рднреА рдШрдЯрдХ рддрдХ рдкрд╣реБрдВрдЪ: $ {@ myBean.doSomething ()}
  3. рдкреНрд░рдкрддреНрд░ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ: th: рдлрд╝реАрд▓реНрдб , th: рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдФрд░ th: errorclass , рдирдП th: рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬреЛ рдЖрдкрдХреЛ рдлрд╝реЙрд░реНрдо рдЖрджреЗрд╢ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
  4. рдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рд╡рд┐рдзрд┐ # themes.code (...) рд╣реИ , рдЬреЛ JSP рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ : рдереАрдо рдХрд╕реНрдЯрдо рдЯреИрдЧред
  5. рдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╡рд┐рдзрд┐, # mvc.uri (...) , рдЬреЛ JSP рд╕реНрдкреНрд░рд┐рдВрдЧ рдХрд╕реНрдЯрдо рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ : mvcUrl (...) (рдХреЗрд╡рд▓ рд╕реНрдкреНрд░рд┐рдВрдЧ 4.1+ рдореЗрдВ)ред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдкрдХреЛ рдЗрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рд╕реАрдзреЗ рдЕрдкрдиреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдирд┐рдпрдорд┐рдд рдЯреЗрдореНрдкреНрд▓реЗрдЯрдЧрд╛рдЗрди рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реЗрд╖ рдПрдХреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдирдП рдЯреЗрдореНрдкрд▓реЗрдЯ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЪрд░рдгреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ: org.thymeleaf.spring4.SpringTemplateEngine ред

рдмреАрди рд╡рд┐рдиреНрдпрд╛рд╕ рдЙрджрд╛рд╣рд░рдг:

@Bean public SpringResourceTemplateResolver templateResolver(){ // SpringResourceTemplateResolver automatically integrates with Spring's own // resource resolution infrastructure, which is highly recommended. SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver(); templateResolver.setApplicationContext(this.applicationContext); templateResolver.setPrefix("/WEB-INF/templates/"); templateResolver.setSuffix(".html"); // HTML is the default value, added here for the sake of clarity. templateResolver.setTemplateMode(TemplateMode.HTML); // Template cache is true by default. Set to false if you want // templates to be automatically updated when modified. templateResolver.setCacheable(true); return templateResolver; } @Bean public SpringTemplateEngine templateEngine(){ // SpringTemplateEngine automatically applies SpringStandardDialect and // enables Spring's own MessageSource message resolution mechanisms. SpringTemplateEngine templateEngine = new SpringTemplateEngine(); templateEngine.setTemplateResolver(templateResolver()); // Enabling the SpringEL compiler with Spring 4.2.4 or newer can // speed up execution in most scenarios, but might be incompatible // with specific cases when expressions in one template are reused // across different data types, so this flag is "false" by default // for safer backwards compatibility. templateEngine.setEnableSpringELCompiler(true); return templateEngine; } 

рдпрд╛ XML- рдЖрдзрд╛рд░рд┐рдд рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛:

 <!-- SpringResourceTemplateResolver automatically integrates with Spring's own --> <!-- resource resolution infrastructure, which is highly recommended. --> <bean id="templateResolver" class="org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver"> <property name="prefix" value="/WEB-INF/templates/" /> <property name="suffix" value=".html" /> <!-- HTML is the default value, added here for the sake of clarity. --> <property name="templateMode" value="HTML" /> <!-- Template cache is true by default. Set to false if you want --> <!-- templates to be automatically updated when modified. --> <property name="cacheable" value="true" /> </bean> <!-- SpringTemplateEngine automatically applies SpringStandardDialect and --> <!-- enables Spring's own MessageSource message resolution mechanisms. --> <bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine"> <property name="templateResolver" ref="templateResolver" /> <!-- Enabling the SpringEL compiler with Spring 4.2.4 or newer can speed up --> <!-- execution in most scenarios, but might be incompatible with specific --> <!-- cases when expressions in one template are reused across different data --> <!-- ypes, so this flag is "false" by default for safer backwards --> <!-- compatibility. --> <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> 

рдЗрд╕рдХреЗ рдЧреБрдгреЛрдВ рдкрд░ рдПрдХ рддреНрд╡рд░рд┐рдд рдирдЬрд╝рд░ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:

  1. viewClass рд╡реНрдпреВ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХрд╛ рд╡рд░реНрдЧ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдпрд╣ JSP рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рд▓реЗрдХрд┐рди рддрдм рдирд╣реАрдВ рдЬрдм рд╣рдо рдерд╛рдЗрдореЗрд▓рдл рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
  2. рдЙрдкрд╕рд░реНрдЧ рдФрд░ рдкреНрд░рддреНрдпрдп рд╕рдорд╛рди рд░реВрдк рд╕реЗ Thymeleaf TemplateResolver рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕рдорд╛рди рдирд╛рдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
  3. рдЖрджреЗрд╢ рд╡рд╣ рдХреНрд░рдо рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ ViewResolver рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
  4. viewNames рдЖрдкрдХреЛ рдЙрди рджреГрд╢реНрдпреЛрдВ рдХреЗ рдирд╛рдореЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рдиреНрд╣реЗрдВ рдпрд╣ ViewResolver рд╣рд▓ рдХрд░реЗрдЧрд╛ред

3.2 рджреГрд╢реНрдп рдФрд░ рджреГрд╢реНрдп рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рдерд╛рдЗрдореЗрд▓реНрдл рдореЗрдВ


Thymeleaf рдКрдкрд░ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рджреЛ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:

  1. org.thymeleaf.spring4.view.ThymeleafView
  2. org.thymeleaf.spring4.view.ThymeleafViewResolver

рдпреЗ рджреЛрдиреЛрдВ рдХрдХреНрд╖рд╛рдПрдВ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдерд┐рдореЗрд▓реНрдлрд╝ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдВрдЧреАред

рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рдерд╛рдЗрдореЗрд▓рдл рд╡реНрдпреВ рдХрд╛ рд╡рд┐рдиреНрдпрд╛рд╕ JSP рд╕реЗ рдмрд╣реБрдд рдорд┐рд▓рддрд╛-рдЬреБрд▓рддрд╛ рд╣реИ:

 @Bean public ThymeleafViewResolver viewResolver(){ ThymeleafViewResolver viewResolver = new ThymeleafViewResolver(); viewResolver.setTemplateEngine(templateEngine()); // NOTE 'order' and 'viewNames' are optional viewResolver.setOrder(1); viewResolver.setViewNames(new String[] {".html", ".xhtml"}); return viewResolver; } 

... рдпрд╛ XML рдореЗрдВ:

 <bean class="org.thymeleaf.spring4.view.ThymeleafViewResolver"> <property name="templateEngine" ref="templateEngine" /> <!-- NOTE 'order' and 'viewNames' are optional --> <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"); // templateName = 'main' view.setStaticVariables( Collections.singletonMap("footer", "The ACME Fruit Company")); return view; } 

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдЗрд╕ рдШрдЯрдХ рдХреЛ рдирд╛рдо рд╕реЗ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ 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; } /* ******************************************************************* */ /* GENERAL CONFIGURATION ARTIFACTS */ /* Static Resources, i18n Messages, Formatters (Conversion Service) */ /* ******************************************************************* */ @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(); } /* **************************************************************** */ /* THYMELEAF-SPECIFIC ARTIFACTS */ /* TemplateResolver <- TemplateEngine <- ViewResolver */ /* **************************************************************** */ @Bean public SpringResourceTemplateResolver templateResolver(){ // SpringResourceTemplateResolver automatically integrates with Spring's own // resource resolution infrastructure, which is highly recommended. SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver(); templateResolver.setApplicationContext(this.applicationContext); templateResolver.setPrefix("/WEB-INF/templates/"); templateResolver.setSuffix(".html"); // HTML is the default value, added here for the sake of clarity. templateResolver.setTemplateMode(TemplateMode.HTML); // Template cache is true by default. Set to false if you want // templates to be automatically updated when modified. templateResolver.setCacheable(true); return templateResolver; } @Bean public SpringTemplateEngine templateEngine(){ // SpringTemplateEngine automatically applies SpringStandardDialect and // enables Spring's own MessageSource message resolution mechanisms. SpringTemplateEngine templateEngine = new SpringTemplateEngine(); templateEngine.setTemplateResolver(templateResolver()); // Enabling the SpringEL compiler with Spring 4.2.4 or newer can // speed up execution in most scenarios, but might be incompatible // with specific cases when expressions in one template are reused // across different data types, so this flag is "false" by default // for safer backwards compatibility. templateEngine.setEnableSpringELCompiler(true); return templateEngine; } @Bean public ThymeleafViewResolver viewResolver(){ ThymeleafViewResolver viewResolver = new ThymeleafViewResolver(); viewResolver.setTemplateEngine(templateEngine()); return viewResolver; } } 

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() : ""); } } 

рд╣рдо рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдо рдФрд░ рдЕрдзрд┐рдХ рдЬрд╛рдиреЗрдВрдЧреЗред

Source: https://habr.com/ru/post/hi435062/


All Articles