13 рдорд╛рд░реНрдЪ рдХреЛ, рд╕реНрдХреЗрд▓рд╛ / рдЬрд╛рд╡рд╛ рдлреНрд░реЗрдорд╡рд░реНрдХ рдкреНрд▓реЗ рдХрд╛ рджреВрд╕рд░рд╛ рд╕рдВрд╕реНрдХрд░рдг рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдПрдХ рд╣рд╛рдмрд░рд╛ рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА
рдкреНрд▓реЗ 2.0 рдХреА рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЕрд╡рд▓реЛрдХрди рдерд╛ред рдЙрд╕реА рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдЗрд╕ рджрд┐рд▓рдЪрд╕реНрдк рдврд╛рдВрдЪреЗ рдХреЗ рд▓рд┐рдП рд░реВрд╕реА рдореЗрдВ рдореИрдиреБрдЕрд▓ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдЕрдВрддрд░рд╛рд▓ рдХреЛ рднрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рдореЗрдВ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдФрд░ рдЙрдирд╕реЗ рдЬреБрдбрд╝реА рд░рд┐рдХреНрддрд┐рдпреЛрдВ рд╕реЗ рдорд┐рд▓рдХрд░ рдПрдХ рд╕рд░рд▓ рдЬрд╛рд╡рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИред
рдпрд╣ рд▓реЗрдЦ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬреЛ рдкреНрд▓реЗ рд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рдмрд╣реБрдд рд╕рдордп рд╡реНрдпрддреАрдд рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕реЗ "рдорд╣рд╕реВрд╕" рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред
Play 2.0 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ
JDK 6 рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рдж рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛
рд╣реИ ред рдореЗрд░реЗ ubuntu 11.10 рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ
JDK 7 рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ред
рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ
1.
рдкреНрд▓реЗ 2.0 рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд▓рд┐рдЦрдиреЗ рдФрд░ рдкрдврд╝рдиреЗ рдХреЗ рдЕрдзрд┐рдХрд╛рд░ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдореЗрд░реЗ рдкрд╛рд╕
/var/www/play20
ред
2. рдЙрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдкрд░ рдЬрд╛рдПрдВ рдЬрд╣рд╛рдВ рдЖрдк рд╕рд╛рдЗрдЯ рд░рдЦрддреЗ рд╣реИрдВ рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
/var/www/play20/play new jobs
рд╣рдо рдкрд╣рд▓реЗ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ, рджреВрд╕рд░реЗ рдореЗрдВ рд╣рдо "2 - рдПрдХ рд╕рд░рд▓ рдЬрд╛рд╡рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдБ" рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВред рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП, рд╕рдм рдХреБрдЫ рд╕рдорд╛рди рд╣реИ, рдХреЗрд╡рд▓ рдЖрдк рдПрдХ рд╢реЗрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди .batред
3. рдмрдирд╛рдП рдЧрдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдЬрд╛рдПрдВ, рдкреНрд▓реЗ рдХрдВрд╕реЛрд▓ рдбрд╛рд▓реЗрдВ рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ:
cd jobs /var/www/play20/play run
4. рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рд╣рдо рд╕рдлрд▓ рд╣реБрдП рд╣реИрдВ:
http: // localhost: 9000 ред рдХрд┐рд╕реА рдЕрдиреНрдп рдкреЛрд░реНрдЯ рдкрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
"рд░рди рдкреЛрд░реНрдЯ_рдирдВрдмрд░" (рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
5. рдЕрдм рдкреНрд▓реЗ 2.0 рдкрд░ рд╡рд┐рдХрд╛рд╕ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрдИрдбреАрдИ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред рд╣рдо рд╕рд░реНрд╡рд░ рдХреЛ рд░реЛрдХрддреЗ рд╣реИрдВ рдФрд░ CTRL + D рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдХрдВрд╕реЛрд▓ рдкрд░
рд▓реМрдЯрддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░
рдЧреНрд░рд╣рдг рдпрд╛
рд╡рд┐рдЪрд╛рд░ рдЪрд▓рд╛рддреЗ рд╣реИрдВред Netbeans рдХреЗ рд▓рд┐рдП, рдЕрднреА рддрдХ рдХреЛрдИ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВ рд╣реИред
рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдпрд╣ рдЦреБрд▓реЗ рдШреЛрд╖рдгрд╛ рд╕реНрд░реЛрддреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ) рдФрд░
рдЬрд╛рд╡рджреЙрдХ рд╣рдо
"рд╕реНрд░реЛрдд рдХреЗ рд╕рд╛рде рдЧреНрд░рд╣рдг рдХрд░рддреЗ рд╣реИрдВ = рд╕рд╣реА" (рдЙрджреНрдзрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛)ред
6. рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЦреЛрд▓реЗрдВ, рдореИрдВ
рдЧреНрд░рд╣рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:
рдлрд╝рд╛рдЗрд▓> рдЖрдпрд╛рдд> рд╕рд╛рдорд╛рдиреНрдп> рдореМрдЬреВрджрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ рдореЗрдВ ред
рд╢реНрд░реЗрдгреА рд╕реВрдЪреА
рдПрдХ
рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рдореЙрдбрд▓ / рд╢реНрд░реЗрдгреА рдмрдирд╛рдПрдБред
рд╢реНрд░реЗрдгреА рд╢реНрд░реЗрдгреА рдореЙрдбрд▓:
package models; import java.util.List; import javax.persistence.Entity; import javax.persistence.Id; import play.data.validation.*; import play.db.ebean.Model; @Entity public class Category extends Model { @Id public Long id; @Constraints.Required public String title; public static Finder<Long,Category> find = new Finder ( Long.class, Category.class ); public static List<Category> all() { return find.all(); } }
рдореБрдЦреНрдп рдкреГрд╖реНрда
рджреГрд╢реНрдп / index.scala.html рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ
, рд╣рдо рд╕рднреА рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
@(categories: List[Category]) @main("Jobs") { <ul> @for(category <- categories) { <li>@category.title</li> } </ul> }
рдкреНрд▓реЗ 2.0 рдореЗрдВ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╕реНрдХрд╛рд▓рд╛ рдХреЛрдб рдХреЗ html + рдмреНрд▓реЙрдХ рд╣реИрдВ рдЬреЛ '@' рдЕрдХреНрд╖рд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд╕рдорд╛рди рд╣реИрдВ рдФрд░ рдРрд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ рдЬреЛ рдлрд╝рд╛рдЗрд▓ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИрдВред
рдирд╡ рдирд┐рд░реНрдорд┐рдд рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рд▓рд┐рдП рдЧреНрд░рд╣рдг рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдд: рдкреВрд░реНрдгрддрд╛ рдХреЗ рд▓рд┐рдП, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдЯрд┐рд▓реНрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
"~ рд░рди" ,
рд╡рд┐рдВрдбреЛрдЬ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рднреА
- рд╡рд░реАрдпрддрд╛рдПрдБ - рд╕рд╛рдорд╛рдиреНрдп / рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ рдмреЙрдХреНрд╕ "рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмрдирд╛рдПрдБ" рдХреЛ рдЕрдирдЪреЗрдХ рдХрд░реЗрдВ, рдмрдХреНрд╕реЗ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ "рджреЗрд╢реА рд╣реБрдХ рдпрд╛ рдорддрджрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддрд╛рдЬрд╝рд╛ рдХрд░реЗрдВ", "рддрд╛рдЬрд╝рд╛ рдХрд░реЗрдВ"ред рдкрд╣реБрдБрдЪ рдкрд░ред "
рд╣рдо рдКрдкрд░ рджрд┐рдП рдЧрдП рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрдВрдЯреНрд░реЛрд▓рд░
рдРрдк / рдХрдВрдЯреНрд░реЛрд▓рд░ / рдПрдкреНрд▓рд┐рдХреЗрд╢рди.рдЬрд╛рд╡рд╛ рд╕реЗ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
import models.Category; ... public class Application extends Controller { public static Result index() { return ok(index.render( Category.all())); } }
рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рд╣рдо рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдХреЛ рд╕рд┐рд░реНрдл рдореЗрдореЛрд░реА рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рд▓рд╛рдЗрдиреЛрдВ рдХреЛ
рдХреЙрдиреНрдлрд┐рдбреЗрдВрд╕ рдХреЛ
рдХреЙрдиреНрдлрд┐рдбреЗрдВрд╕ / рдПрдкреНрд▓реАрдХреЗрд╢рди рдореЗрдВ рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВ ред
db.default.driver=org.h2.Driver db.default.url="jdbc:h2:mem:play" ... ebean.default="models.*"
рд╣рдо рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ F5 рджрдмрд╛рддреЗ рд╣реИрдВ, рд╣рдореЗрдВ SQL рдХреНрд╡реЗрд░реА рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдХреА рдЬрд╛рдПрдЧреАред "рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЕрднреА рд▓рд╛рдЧреВ рдХрд░реЗрдВ!" рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдФрд░ рд╣рдореЗрдВ рдПрдХ рдЦрд╛рд▓реА рдЙрд▓ рд╕реВрдЪреА рджреЗрдЦрдиреА рдЪрд╛рд╣рд┐рдП: рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рддрдХ рдХреЛрдИ рд╢реНрд░реЗрдгрд┐рдпрд╛рдВ рдирд╣реАрдВ рд╣реИрдВред
рд╢реНрд░реЗрдгрд┐рдпрд╛рдБ рдЬреЛрдбрд╝рдирд╛
рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рджреГрд╢реНрдп / index.scala.html рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рд╢реНрд░реЗрдгреА рдЬреЛрдбрд╝рдиреЗ рд╡рд╛рд▓рд╛ рдлрд╝реЙрд░реНрдо рдЬреЛрдбрд╝реЗрдВ:
@(categories: List[Category], categoryForm: Form[Category]) @import helper._ @main("Jobs") { <ul> @for(category <- categories) { <li>@category.title</li> } </ul> @form(routes.Application.add()) { @inputText(categoryForm("title")) <input type="submit" value=""> } }
рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ, рд╣рдо
рд╣реЗрд▓реНрдкрд░ рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ
ред_ :
рдлреЙрд░реНрдо рдлрд╝рдВрдХреНрд╢рди рдПрдХреНрд╢рди рдФрд░ рдореЗрдердб рдлрд┐рд▓реНрдб рдХреЗ рд╕рд╛рде HTML рдлреЙрд░реНрдо рдмрдирд╛рддрд╛ рд╣реИред рдЗрдирдкреБрдЯ рдЯреЗрдХреНрд╕реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдЯреЗрдХреНрд╕реНрдЯ рдЗрдирдкреБрдЯ рдЬреЗрдирд░реЗрдЯ рдХрд░рддрд╛ рд╣реИред
рд╣рдо рдорд╛рд░реНрдЧ рдХреЛ
conf / рдорд╛рд░реНрдЧреЛрдВ рдореЗрдВ рд▓рд┐рдЦрддреЗ
рд╣реИрдВ :
POST /add controllers.Application.add()
рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рдирд┐рдпрдВрддреНрд░рдХреЛрдВ / Application.java рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд░рд┐рдпрд╛ рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рдлрд╝реЙрд░реНрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдирдИ рд╢реНрд░реЗрдгреА рдмрдирд╛рдПрдЧрд╛ рдФрд░ рдПрдХ рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ (рдлрд╝реЙрд░реНрдо) рдХреЛ рдЬреЛрдбрд╝рдХрд░ рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЙрд▓ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдЧрд╛:
import play.data.Form; ... public static Result index() { return ok(index.render(Category.all(), form(Category.class))); } public static Result add() { Form<Category> filledForm = form(Category.class).bindFromRequest(); if (filledForm.hasErrors()) { return badRequest(index.render(Category.find.all(), filledForm)); } Category category = filledForm.get(); category.save(); return redirect(routes.Application.index()); }
рд╣рдо
http: // localhost: 9000 рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╢реНрд░реЗрдгрд┐рдпрд╛рдВ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЯреВрдЯ рдЧрдИред рд╕рдм рдХреБрдЫ рдХреЗ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП, рдХрдВрд╕реЛрд▓ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВ, рдХреЙрд▓
/ var / www / play20 / play-clean-all рдФрд░ рдЗрд╕реЗ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░реЗрдВред
рдиреМрдХрд░рд┐рдпрд╛рдВ
рдиреМрдХрд░реА рдореЙрдбрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рдореЙрдбрд▓ / Job.java, рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реЗ рдХрдИ рд╕рдВрдмрдВрдзрд┐рдд:
package models; import java.util.List; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.ManyToOne; import play.data.validation.*; import play.db.ebean.Model; import play.db.ebean.Model.Finder; @Entity public class Job extends Model { @Id public Long id; @Constraints.Required public String title; @ManyToOne public Category category; public static Finder<Long,Job> find = new Finder(Long.class, Job.class); }
рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рдореЙрдбрд▓ / рд╢реНрд░реЗрдгреА.рдЬрд╛рд╡рд╛ рд╢реНрд░реЗрдгреА рдореЙрдбрд▓ рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЬреЛрдбрд╝реЗрдВ:
import javax.persistence.OneToMany; ... @OneToMany(mappedBy="category") public List<Job> jobs;
F5 рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ, рдирдпрд╛ SQL рд▓рд╛рдЧреВ рдХрд░реЗрдВред
рдЕрдм рд╣рдо рдЕрдкрдиреЗ рд╕рднреА рд░рд┐рдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рдЪрд╛рд░ / show.scala.html рд╢реНрд░реЗрдгреА рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдЙрдЯрдкреБрдЯ рдЯреЗрдореНрдкрд▓реЗрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:
@(category: Category, jobForm: Form[Job]) @import helper._ @main("Jobs") { <h1>@category.title</h1> <h2>:</h2> <ul> @for(job <- category.jobs) { <li>@job.title</li> } </ul> <h2> </h2> @form(routes.Jobs.dd(category.id)) { @inputText(jobForm("title")) <input type="submit" value=""> } }
рдПрдХ рдЬреЙрдм рдХрдВрдЯреНрд░реЛрд▓рд░
рдРрдк / рдХрдВрдЯреНрд░реЛрд▓рд░ / рдЬреЙрдмреНрд╕ рдЬреЛрдбрд╝реЗрдВред
рдЬрд╛рд╡рд╛ , рдЬреЛ рдЖрдкрдХреЛ рдПрдХ рдирдпрд╛ рд░рд┐рдХреНрддрд┐ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдмрд╛рдж рдХреЗ рд▓рд┐рдП рд░рд┐рдХреНрддрд┐ рдЖрдЙрдЯрдкреБрдЯ рдЫреЛрдбрд╝ рджреЗрдВ:
package controllers; import java.util.List; import play.*; import play.data.Form; import play.mvc.*; import views.html.*; import models.*; public class Jobs extends Controller { public static Result add(Long categoryId) { Form<Job> filledForm = form(Job.class).bindFromRequest(); if (filledForm.hasErrors()) { Category category = Category.find.byId(categoryId); return badRequest(show.render(category, filledForm)); } Job job = filledForm.get(); job.category = Category.find.ref(categoryId); job.save(); return redirect(routes.Categories.show(categoryId)); } public static Result show(Long id) { return TODO; } }
рд░рд┐рдлреИрдХреНрдЯрд░ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ
рдпрд╣ рд╢реНрд░реЗрдгреА рдФрд░ рдЙрд╕рдХреА рд╕рднреА рд░рд┐рдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреГрд╖реНрда рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ, рдЙрд╕реА рд╕рдордп рд╣рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдирд┐рдпрдВрддреНрд░рдХ рд╕реЗ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЗ рдЬреЛрдбрд╝ рдХреЛ рд╣рдЯрд╛ рджреЗрдВрдЧреЗред
рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рдирд┐рдпрдВрддреНрд░рдХреЛрдВ / рд╢реНрд░реЗрдгрд┐рдпрд╛рдБ.рдЬрд╛рд╡рд╛ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдирд┐рдпрдВрддреНрд░рдХ рдмрдирд╛рдПрдБ:
package controllers; import java.util.List; import play.*; import play.data.Form; import play.mvc.*; import views.html.*; import models.*; public class Categories extends Controller { public static Result add() { Form<Category> filledForm = form(Category.class).bindFromRequest(); if (filledForm.hasErrors()) { return badRequest(index.render(Category.find.all(), filledForm)); } Category category = filledForm.get(); category.save(); return redirect(routes.Application.index()); } public static Result show(Long id) { Category category = Category.find.byId(id); return ok(show.render(category, form(Job.class))); } }
рд░рд┐рдХреНрддрд┐рдпрд╛рдВ рдЬреЛрдбрд╝рдиреЗ, рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдФрд░ рдирдИ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рд░реНрдЧреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛ред
GET /category/:id controllers.Categories.show(id: Long) POST /category/add controllers.Categories.add() POST /job/add controllers.Jobs.add(categoryId: Long)
рдореБрдЦреНрдп рдкреГрд╖реНрда рдЯреЗрдореНрдкрд▓реЗрдЯ
рджреГрд╢реНрдпреЛрдВ / index.scala.html рдореЗрдВ рд╣рдо рдлреЙрд░реНрдо рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ, рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдВрдХ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
@(categories: List[Category], categoryForm: Form[Category]) @import helper._ @main("Jobs") { <ul> @for(category <- categories) { <li><a href="@routes.Categories.show(category.id)">@category.title</a></li> } </ul> @form(routes.Categories.add()) { @inputText(categoryForm("title")) <input type="submit" value=""> } }
рдЗрд╕ рдЪрд░рдг рдореЗрдВ, рдореИрдВрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдПрдХ рдмрд╛рд░ рдлрд┐рд░
рдкреНрд▓реЗ рдХреНрд▓реАрди-рдСрд▓ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдпрд╛ред
рдкреНрд▓реЗ 2.0 рдХреА рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рд╕рдВрд╕рд╛рдзрди: