{"id":262529,"date":"2015-07-29T15:01:02","date_gmt":"2015-07-29T11:01:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=262529"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=262529","title":{"rendered":"\u0418\u0437\u043e\u0431\u0440\u0435\u0442\u0430\u0435\u043c \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434 \u043d\u0430 Scala \u2014 \u0441\u0432\u043e\u0439 Framework ORM, WebServer (RESTful \u0438 MVC)"},"content":{"rendered":"<p>     \t\u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u043c\u043e\u0435\u0433\u043e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u0441\u0442\u0430 <a href=\"http:\/\/habrahabr.ru\/post\/259005\/\">\u0418\u0437\u043e\u0431\u0440\u0435\u0442\u0430\u0435\u043c \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434 \u043d\u0430 Java \u2014 \u043f\u0438\u0448\u0435\u043c \u0441\u0432\u043e\u0439 Framework (DI, ORM, MVC and etc)<\/a>. \u041f\u0440\u043e\u0448\u043b\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0441\u044f\u0446\u0435\u0432 \u043a\u0430\u043a \u0431\u044b\u043b \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d \u043c\u043e\u0439 \u043f\u0435\u0440\u0432\u044b\u0439 Framework \u043d\u0430 Java. \u041c\u043d\u0435 \u043f\u043e\u0432\u0435\u0437\u043b\u043e \u0438 \u044f \u0441\u0432\u043e\u044e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b \u0432 \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043c\u043e\u0438 \u043c\u043d\u043e\u0433\u0438\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u044d\u0442\u0438\u043c \u0443\u0434\u043e\u0431\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u043d\u0435 \u0432\u0435\u0440\u043d\u044b. \u041d\u043e \u044f \u043d\u0435 \u0444\u0438\u043b\u043e\u043d\u0438\u043b \u0438 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u043b \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u043b \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443. \u0415\u0441\u043b\u0438 \u0432\u044b \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435 API \u0432 \u043c\u043e\u0435\u0439 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435, \u0442\u043e \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441. <\/p>\n<p>  \u041d\u043e \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a Scala. \u042f \u0441\u043c\u043e\u0442\u0440\u0435\u043b \u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u044b Framework-\u0438 Play \u0438 Spray. \u0417\u0430\u043c\u0435\u0442\u0438\u043b \u0442\u0430\u043a\u043e\u0439 \u0442\u0440\u0435\u043d\u0434, \u0447\u0442\u043e \u043e\u043d\u0438 \u0432\u0441\u0435 \u0437\u0430\u0442\u043e\u0447\u0435\u043d\u044b \u043d\u0430 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u0432 \u0441\u0442\u0438\u043b\u0435 \u0410\u043a\u0442\u043e\u0440\u043e\u0432(\u0430\u043a\u0442\u0435\u0440\u043e\u0432) \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f Highload. \u042d\u0442\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0432\u0441\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0438 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u043d\u043e. \u041d\u043e \u043f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e \u043f\u043e\u0433\u043e\u043d\u044f \u0437\u0430 \u044d\u0442\u0438\u043c \u0441\u0434\u0435\u043b\u0430\u043b \u043a\u043e\u0434\u0438\u043d\u0433 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u043c. \u041f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0443 \u0442\u0435\u0431\u044f \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043d\u0435 Highload-\u043f\u0440\u043e\u0435\u043a\u0442, \u0442\u043e \u0442\u0435\u0431\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u0443\u043f\u0430\u043b\u0438 Play \u0438 Spray \u0438 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432 \u043d\u0435\u0442 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432 Scala, \u043f\u0438\u0441\u0430\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0435 \u0431\u0443\u043a\u0432 \u0447\u0435\u043c \u0432 Java. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0441\u043c\u043e\u0442\u0440\u0438\u0448\u044c \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 Spring boot, Spring Data \u0438 \u0442\u0434. \u0422\u0430\u043c \u0432\u0441\u0435 \u043c\u0438\u043b\u043e, \u043a\u043e\u0440\u043e\u0442\u043a\u043e \u0438 \u043a\u0440\u0430\u0441\u0438\u0432\u043e. \u0410 \u0432 Scala \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0432 \u0430\u043a\u0442\u043e\u0440-\u0441\u0442\u0438\u043b\u0435 \u043f\u043e\u0445\u043e\u0436\u0438 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 J2EE \u043f\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0443 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/d15\/17d\/43f\/d1517d43f7e22f24b06af75ee220e698.png\" alt=\"image\"\/><br \/>  <a name=\"habracut\"><\/a><\/p>\n<p>  \u041d\u0430\u0447\u0430\u043b \u044f \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0435 Scala \u0441 \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u044f \u043a\u043d\u0438\u0433\u0438 \u0425\u043e\u0440\u0441\u0442\u043c\u0430\u043d \u041a. \u2014 Scala \u0434\u043b\u044f \u043d\u0435\u0442\u0435\u0440\u043f\u0435\u043b\u0438\u0432\u044b\u0445 (\u0435\u0441\u0442\u044c \u0440\u0443\u0441\u0441\u043a\u043e\u0435 \u0438\u0437\u0434\u0430\u043d\u0438\u0435). \u041f\u043e\u0442\u043e\u043c \u0431\u044b\u043b \u043f\u0435\u0440\u0435\u0440\u044b\u0432 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0441\u044f\u0446\u0435\u0432 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u043e\u0431\u0442\u0430\u0447\u0438\u0432\u0430\u043b \u0441\u0432\u043e\u0439 Framework \u043d\u0430 Java \u0438 \u0441 \u0441\u043e\u043c\u043d\u0435\u043d\u0438\u0435\u043c \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u043b \u043e \u043f\u043b\u044e\u0448\u043a\u0430\u0445 \u0438\u0437 Scala. \u041d\u043e \u0432 \u0438\u0442\u043e\u0433\u0435 \u044f \u0432\u0441\u0435-\u0442\u0430\u043a\u0438 \u0440\u0435\u0448\u0438\u043b\u0441\u044f \u0438 \u043d\u0430\u0447\u0430\u043b \u043f\u0438\u0441\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u043d\u0430 Scala. \u042f \u0437\u0430\u043c\u0435\u0442\u0438\u043b \u0434\u0432\u0430 \u043d\u044e\u0430\u043d\u0441\u0430:   <\/p>\n<ul>\n<li>\u041a\u043e\u0433\u0434\u0430 \u043f\u0438\u0448\u0435\u0448\u044c \u043d\u0430 Scala \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043d\u0435\u0439 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432\u0435\u0441\u044c Weekend), \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044f\u0441\u044c \u0432 \u0441\u0432\u043e\u0439 \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 Java \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0448\u044c \u0432\u044b\u0442\u044c, \u043a\u0430\u043a \u043c\u043d\u043e\u0433\u043e \u0431\u0443\u043a\u0432 \u043d\u0430\u0434\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0438 \u043a\u0430\u043a \u043d\u0435 \u0443\u0434\u043e\u0431\u043d\u043e, \u0430 \u0432\u043e\u0442 \u043d\u0430 Scala \u044d\u0442\u043e \u043a\u0443\u0434\u0430 \u043f\u0440\u043e\u0449\u0435.<\/li>\n<li>\u0412\u044b\u0437\u044b\u0432\u0430\u044f API \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u0432 Java \u0438\u0437 Scala \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u00ab\u043f\u0440\u0438\u0441\u0435\u0434\u0430\u0442\u044c\u00bb \u0438 \u043c\u043d\u043e\u0433\u0438\u0435 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 Scala \u0441\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u043d\u0430 \u043d\u0435\u0442 (\u043d\u0443 \u043d\u0435 \u0432\u0441\u0435, \u043d\u043e \u0432\u0441\u0451 \u0447\u0442\u043e \u043d\u043e\u0432\u043e\u0433\u043e \u0441 Java 6-7: \u043b\u044f\u043c\u0434\u044b, \u043c\u0443\u043b\u044c\u0442\u0438-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0438 \u0442\u0434). \u041f\u043e \u044d\u0442\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0438 \u043d\u0430\u0434\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 Scala \u043e\u0431\u0432\u0435\u0440\u0442\u043a\u0438 \u0432\u043e\u043a\u0440\u0443\u0433 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438\u043b\u0438 Framework-\u043e\u0432 \u043d\u0430 Java, \u0447\u0442\u043e \u0431\u044b \u0438\u043c\u0438 \u0431\u044b\u043b\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u043e\u043c\u0444\u043e\u0440\u0442\u043d\u043e \u0438 \u0443\u0434\u043e\u0431\u043d\u043e<\/li>\n<\/ul>\n<p>  \u0421\u043d\u0430\u0447\u0430\u043b\u0430, \u044f \u0441\u0432\u043e\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u043d\u0430 Java \u043e\u0431\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043b \u043d\u0430 Scala (\u0440\u0430\u0431\u043e\u0442\u0430 \u0441 Json). \u041f\u043e\u0442\u043e\u043c \u0433\u0434\u0435 \u044f\u0432\u043d\u043e \u0443\u043f\u0435\u0440\u0441\u044f \u0432 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0435 \u0441\u0432\u043e\u0439 Java-\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441 Jetty, \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u043b \u044d\u0442\u043e\u0442 \u0443\u0447\u0430\u0441\u0442\u043e\u043a \u0441 Java \u043d\u0430 Scala. \u0418 \u0442\u0430\u043c \u0438 \u0442\u0430\u043c \u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043a\u043e\u043b\u043e\u0441\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u043f\u044b\u0442. \u042f \u043b\u0438\u0447\u043d\u043e \u0443\u0431\u0435\u0434\u0438\u043b\u0441\u044f, \u0447\u0442\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434 \u043d\u0430 Scala \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u043e\u0440\u043e\u0447\u0435 \u0438 \u0431\u044b\u0441\u0442\u0440\u0435\u0439 (\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043a\u043e\u0433\u0434\u0430 \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0448\u044c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u044f\u0437\u044b\u043a\u0430). \u0418 \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0432\u0435\u0441\u044c \u043d\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 \u0431\u0430\u0433\u0430\u0436 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 Java \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438 Framework-\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0441\u0432\u043e\u0435\u043c Scala-\u043f\u0440\u043e\u0435\u043a\u0442\u0435. \u042f \u0443\u0436 \u043c\u043e\u043b\u0447\u0443 \u043e \u043c\u0430\u0433\u0438\u0438 Scala, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c DSL (\u041f\u0440\u0435\u0434\u043c\u0435\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u044f\u0437\u044b\u043a). \u0412\u0441\u043f\u043e\u043c\u043d\u0438\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0443 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u041e\u041e\u041f (\u041e\u0431\u044a\u0435\u0301\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0301\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0301\u0440\u043e\u0432\u0430\u043d\u0438\u0435), \u044d\u0442\u043e \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043a\u043e\u0434 \u0447\u0438\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u044b\u043c \u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u0431\u0435\u043b\u044c\u043d\u044b\u043c \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e-\u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439. Scala \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0449\u0435 \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043f\u043e\u0445\u043e\u0436\u0438\u0435 \u043d\u0430 if, for, switch \u0438 \u0442\u0434 (\u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b \u044d\u0442\u043e \u0432 ORM \u0434\u043b\u044f \u0442\u0430\u0440\u043d\u0437\u0430\u043a\u0446\u0438\u0439).<\/p>\n<p>  \u0412 \u0438\u0442\u043e\u0433\u0435 \u043a\u043e\u0434 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u043d\u0430 \u0433\u0438\u0442\u0445\u0430\u0431\u0435 <a href=\"https:\/\/github.com\/evgenyigumnov\/scala-common\">github.com\/evgenyigumnov\/scala-common<\/a><\/p>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0435\u0433\u043e \u044d\u0442\u043e\u0442 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u043d\u0430 \u0433\u0438\u0442\u0445\u0430\u0431\u0435 <a href=\"https:\/\/github.com\/evgenyigumnov\/example-scala\">github.com\/evgenyigumnov\/example-scala<\/a><\/p>\n<p>  \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0430:  <\/p>\n<pre><code class=\"bash\">.\/: build.sbt .\/javascript: user.js .\/pages: index.html layout.html login.html .\/sql: 1.sql .\/locale: messages_en.properties .\/src\/main\/scala\/com\/igumnov\/scala-2.11\/example: ExampleUser.scala SiteServer.scala <\/code><\/pre>\n<p>  build.sbt  <\/p>\n<pre><code class=\"scala\">name := &quot;example-scala&quot;  version := &quot;1.0&quot;  scalaVersion := &quot;2.11.7&quot;  libraryDependencies += &quot;com.igumnov.scala&quot; % &quot;scala-common_2.11&quot; % &quot;0.5&quot; \/\/ \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043d\u0430\u0448 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a libraryDependencies += &quot;com.h2database&quot; % &quot;h2&quot; % &quot;1.4.187&quot; \/\/ \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0411\u0414 \/\/ \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c Bootstrap, AnglularJS \u0438 \u0442\u0434 \u0438\u0437 webjars \u043f\u0440\u043e\u0435\u043a\u0442\u0430 libraryDependencies += &quot;org.webjars&quot; % &quot;angular-ui-bootstrap&quot; % &quot;0.12.0&quot; libraryDependencies += &quot;org.webjars&quot; % &quot;angularjs&quot; % &quot;1.3.8&quot; libraryDependencies += &quot;org.webjars&quot; % &quot;bootstrap&quot; % &quot;3.3.1&quot;   <\/code><\/pre>\n<p>  SiteServer.scala  <\/p>\n<pre><code class=\"scala\">package com.igumnov.scala.example  import java.util.Calendar import com.igumnov.scala._ import com.igumnov.scala.webserver.User  object SiteServer {   def main(args: Array[String]) { \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0443\u043b \u043a\u043e\u043d\u043d\u0435\u043a\u0446\u0438\u0439 \u043a \u0411\u0414 (\u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c 3 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u0430)     ORM.connectionPool(&quot;org.h2.Driver&quot;, &quot;jdbc:h2:mem:test&quot;, &quot;SA&quot;, &quot;&quot;, 1, 3) \/\/ \u041d\u0430\u043a\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043d\u0430 \u0431\u0430\u0437\u0443 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446 \u0438\u043b\u0438 \u043e\u043d\u043e \u044d\u0442\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0435\u0441\u043b\u0438 \u0443\u0436\u0435 \u0434\u0435\u043b\u0430\u043b\u043e     ORM.applyDDL(&quot;sql&quot;) \/\/ \u0420\u0430\u0437\u043c\u0435\u0440 \u043f\u0443\u043b\u0430 \u043d\u0438\u0442\u0435\u0439 \u0434\u043b\u044f \u0432\u0435\u0431\u0441\u0435\u0440\u0432\u0435\u0440\u0430     WebServer.setPoolSize(5,10) \/\/ \u0417\u0430\u0434\u0430\u0435\u043c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440\u0430     WebServer.init(&quot;localhost&quot;, 8989) \/\/ \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u043c \u043e\u0442\u043a\u0443\u0434\u0430 \u0431\u0440\u0430\u0442\u044c \u043e\u0431\u044c\u0435\u043a\u0442\u044b \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438     WebServer.loginService((name) =&gt; {       val user = ORM.findOne[ExampleUser](name)       if (user.isDefined) {         Option(new User(user.get.userName, user.get.userPassword, Array[String](&quot;user_role&quot;)))       } else {         Option(null)       }     })  \/\/ \u0413\u043e\u0432\u043e\u0440\u0438\u043c \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u043e URL-\u0430\u043c     WebServer.securityPages(&quot;\/login&quot;, &quot;\/login?error=1&quot;, &quot;\/logout&quot;)  \/\/ \u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0434\u043e\u0441\u0442\u0443\u043f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u0441 \u0440\u043e\u043b\u044c\u044e user_role     WebServer.addRestrictRule(&quot;\/*&quot;, Array(&quot;user_role&quot;))  \/\/ \u0414\u0430\u0435\u043c \u0434\u043e\u0441\u0442\u0443\u043f \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043a \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0443     WebServer.addAllowRule(&quot;\/static\/*&quot;) \/\/ \u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043e\u0442\u043a\u0443\u0434\u0430 \u0431\u0440\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u0438\u0437 classpath \u043e\u0442 webjars     WebServer.addClassPathHandler(&quot;\/static&quot;, &quot;META-INF\/resources\/webjars&quot;) \/\/ \u0414\u0430\u0435\u043c \u0434\u043e\u0441\u0442\u0443\u043f \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043a \u043d\u0430\u0448\u0438\u043c Java Script-\u0430\u043c     WebServer.addAllowRule(&quot;\/js\/*&quot;) \/\/ \u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0432 \u043a\u0430\u043a\u043e\u0439 \u043f\u0430\u043f\u043a\u0435 \u043d\u0430 \u0432\u0438\u043d\u0442\u0435 \u043b\u0435\u0436\u0430\u0442 \u043d\u0430\u0448\u0438 Java Script     WebServer.addStaticContentHandler(&quot;\/js&quot;, &quot;javascript&quot;)   \/\/ \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043a\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u043a\u0430\u043a\u043e\u0439 \u044f\u0437\u044b\u043a (\u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0437\u0430\u0445\u0430\u0440\u0434\u043a\u043e\u0436\u0435\u043d \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u0438\u043d \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u044f\u0437\u044b\u043a) \/\/ \u0418 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0432 \u043a\u0430\u043a\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u043b\u0435\u0436\u0430\u0442 \u043a\u043b\u044e\u0447\u0438 - \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f     WebServer.locale(Map(&quot;en&quot; -&gt; &quot;locale\/messages_en.properties&quot;),  (rq,rs)=&gt;{       &quot;en&quot;     })  \/\/ \u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0432 \u043a\u0430\u043a\u043e\u0439 \u043f\u0430\u043f\u043a\u0435 \u043d\u0430 \u0432\u0438\u043d\u0442\u0435 \u043b\u0435\u0436\u0430\u0442 \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0441\u0442\u0440\u0430\u043d\u0438\u0446     WebServer.templates(&quot;pages&quot;,0)  \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u043f\u043e \u0443\u0440\u043b &quot;\/&quot;, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0432 \u043c\u043e\u0434\u0435\u043b\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c index.html     WebServer.addController(&quot;\/&quot;, (rq, rs,model) =&gt; {       model += &quot;time&quot; -&gt; Calendar.getInstance.getTime       &quot;index&quot;     })  \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u043f\u043e \u0443\u0440\u043b &quot;\/login&quot;, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c login.html     WebServer.addController(&quot;\/login&quot;, (rq, rs,model) =&gt; {       &quot;login&quot;     })   \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c REST-\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u043f\u043e \u0443\u0440\u043b &quot;\/rest\/user&quot; \u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0447\u0442\u043e \u043c\u043e\u0433\u0443\u0442 \u043c\u0435\u0442\u043e\u0434\u043e\u043c POST\/PUT \u043f\u0440\u0438\u0441\u043b\u0430\u0442\u044c JSON-\u043e\u0431\u044a\u0435\u043a\u0442 \u0442\u0438\u043f\u0430 ExampleUser     WebServer.addRestController[ExampleUser](&quot;\/rest\/user&quot;, (rq, rs, obj) =&gt; {       rq.getMethod match {         case &quot;GET&quot; =&gt; { \/\/ \u041f\u0440\u0438\u043b\u0435\u0442\u0435\u043b GET \u0437\u0430\u043f\u0440\u043e\u0441           ORM.findAll[ExampleUser]() \/\/ \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439         }         case &quot;POST&quot; =&gt; { \/\/ \u041f\u0440\u0438\u043b\u0435\u0442\u0435\u043b POST \u0437\u0430\u043f\u0440\u043e\u0441           val user = obj.get           user.userPassword = WebServer.crypthPassword(user.userName, user.userPassword)           ORM.insert(obj.get) \/\/ \u0412\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0433\u043e \u0432 \u0411\u0414         }         case &quot;DELETE&quot; =&gt; {  \/\/ \u041f\u0440\u0438\u043b\u0435\u0442\u0435\u043b DELETE \u0437\u0430\u043f\u0440\u043e\u0441           val user = ORM.findOne[ExampleUser](rq.getParameter(&quot;userName&quot;)) \/\/ \u0415\u0441\u043b\u0438 \u044e\u0437\u0435\u0440 demo \u043d\u0435 \u0434\u0430\u0435\u043c \u0443\u0434\u0430\u043b\u044f\u0442\u044c           if(user.get.userName == &quot;demo&quot;) throw new Exception(&quot;You cant delete demo user&quot;)           ORM.delete(user.get)            user.get         }        }     })  \/\/ \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e \u0431\u044b \u044d\u043a\u0441\u0435\u043f\u0448\u0435\u043d\u044b \u0432 \u0440\u0435\u0441\u0442 \u0441\u0435\u0440\u0432\u0438\u0441\u0435 \u0432\u044b\u0434\u0430\u0432\u0430\u043b\u0438\u0441\u044c \u0432 \u0432\u0438\u0434\u0435 JSON \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0443 \u0432 \u0432\u0438\u0434\u0435 \u043e\u0431\u044c\u0435\u043a\u0442\u0430 Error     WebServer.addRestErrorHandler((rq, rs, e) =&gt; {       object Error{         var message:String =_       }       Error.message = e.getMessage       Error     })       val users = ORM.findAll[ExampleUser] \/\/ \u0411\u0435\u0440\u0435\u043c \u0438\u0437 \u0411\u0414 \u0432\u0441\u0435\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439      if(users.size==0) {  \/\/ \u0412 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438 \u043f\u0443\u0441\u0442\u043e       val user = new ExampleUser       user.userName=&quot;demo&quot;       user.userPassword=WebServer.crypthPassword(user.userName, &quot;demo&quot;)       ORM.insert(user) \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c demo\/demo \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0411\u0414     }  \/\/ \u0415\u0441\u043b\u0438 \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430 \u043a\u043e\u0434\u0430 \u0434\u043e\u0448\u043b\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0432\u044b\u0432\u0430\u043b\u0438\u043b\u043e\u0441\u044c \u043f\u043e Exception, \u0442\u043e \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u043c \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440 :)     WebServer.start      } } <\/code><\/pre>\n<p>  ExampleUser.scala  <\/p>\n<pre><code class=\"java\">\/\/ \u0414\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f JSON \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0442\u0430\u043a\u0436\u0435 \u0434\u043b\u044f \u043c\u0435\u043f\u043f\u0438\u043d\u0433\u0430 \u0432 \u0411\u0414 package com.igumnov.scala.example  import com.igumnov.scala.orm.Id  class ExampleUser {   @Id(autoIncremental = false)   var userName: String = _   var userPassword: String = _  }  <\/code><\/pre>\n<p>  1.sql  <\/p>\n<pre><code class=\"sql\"># \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0432 \u0411\u0414 \u0433\u0434\u0435 \u0431\u0443\u0434\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 ORM \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0442\u0438\u043f\u0430 ExampleUser.class CREATE TABLE ExampleUser (userName VARCHAR(255) PRIMARY KEY, userPassword VARCHAR(255)) <\/code><\/pre>\n<p>  login.html  <\/p>\n<pre><code class=\"html\">&lt;!DOCTYPE html SYSTEM &quot;http:\/\/www.thymeleaf.org\/dtd\/xhtml1-strict-thymeleaf-spring4-4.dtd&quot;&gt; &lt;!-- \u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440 layout \u0438\u0437 layout.html --&gt; &lt;html xmlns:th=&quot;http:\/\/www.thymeleaf.org&quot; xmlns:layout=&quot;http:\/\/www.ultraq.net.nz\/thymeleaf\/layout&quot;       layout:decorator=&quot;layout&quot;&gt; &lt;body&gt; &lt;!-- \u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043d\u0430\u0448 \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u0431\u043b\u043e\u043a \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0432 layout.html --&gt; &lt;div layout:fragment=&quot;content&quot;&gt;     &lt;form name=&quot;form&quot; action=&quot;\/j_security_check&quot; method=&quot;POST&quot;&gt;         &lt;div class=&quot;modal-header&quot;&gt;             &lt;h3 class=&quot;modal-title&quot; th:text=&quot;#{login.title}&quot;&gt;&lt;\/h3&gt; &lt;!-- \u0411\u0435\u0440\u0435\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043e\u043a\u043d\u0430 \u0438\u0437 \u043b\u0435\u043d\u0433 \u0444\u0430\u0439\u043b\u0430 --&gt;         &lt;\/div&gt;         &lt;div class=&quot;modal-body&quot;&gt;             &lt;div class=&quot;form-group&quot;&gt;                 &lt;input type=&quot;text&quot; name=&quot;j_username&quot; class=&quot;form-control&quot; value=&quot;&quot; placeholder=&quot;Login&quot;\/&gt;             &lt;\/div&gt;             &lt;div class=&quot;form-group&quot;&gt;                 &lt;input type=&quot;password&quot; name=&quot;j_password&quot; class=&quot;form-control&quot; placeholder=&quot;Password&quot;\/&gt;             &lt;\/div&gt;             &lt;div class=&quot;form-group&quot;&gt;                 &lt;button type=&quot;submit&quot; id=&quot;login&quot; class=&quot;btn btn-primary&quot;&gt;OK&lt;\/button&gt;             &lt;\/div&gt;         &lt;\/div&gt;     &lt;\/form&gt;  &lt;\/div&gt; &lt;\/body&gt; &lt;\/html&gt; <\/code><\/pre>\n<p>  index.html  <\/p>\n<pre><code class=\"html\">&lt;!DOCTYPE html SYSTEM &quot;http:\/\/www.thymeleaf.org\/dtd\/xhtml1-strict-thymeleaf-spring4-4.dtd&quot;&gt; &lt;!-- \u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440 layout \u0438\u0437 layout.html --&gt; &lt;html xmlns:th=&quot;http:\/\/www.thymeleaf.org&quot; xmlns:layout=&quot;http:\/\/www.ultraq.net.nz\/thymeleaf\/layout&quot;       layout:decorator=&quot;layout&quot;&gt; &lt;body&gt; &lt;!-- \u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043d\u0430\u0448 \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u0431\u043b\u043e\u043a \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0432 layout.html --&gt; &lt;div layout:fragment=&quot;content&quot;&gt;     &lt;!-- \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043d\u0430\u0448 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u043d\u0430 AngularJS--&gt;     &lt;script src=&quot;\/js\/user.js&quot;&gt;&lt;\/script&gt;     &lt;h1 th:text=&quot;${time}&quot;&gt;&lt;\/h1&gt; \/\/ \u0412\u044b\u0432\u043e\u0434\u0438\u043c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0435 \u0432 \u043c\u043e\u0434\u0435\u043b\u044c     &lt;!-- \u041e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u043c \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 UserCtrl --&gt;     &lt;div ng-controller=&quot;UserCtrl&quot;&gt;         &lt;table class=&quot;table&quot;&gt;             &lt;thead&gt;             &lt;tr&gt;                 &lt;th&gt;Name&lt;\/th&gt;                 &lt;th&gt;Password&lt;\/th&gt;                 &lt;th&gt;&lt;\/th&gt;             &lt;\/tr&gt;             &lt;\/thead&gt;             &lt;tbody&gt;            &lt;!-- \u0412 \u0446\u0438\u043a\u043b\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438 --&gt;             &lt;tr ng-repeat=&quot;user in users&quot;&gt;                 &lt;td&gt;{{user.userName}}&lt;\/td&gt;                 &lt;td&gt;{{user.userPassword}}&lt;\/td&gt;                &lt;!-- \u041f\u043e \u043a\u043b\u0438\u043a\u0443 \u043d\u0430 \u043a\u0440\u0435\u0441\u0442\u0438\u043a \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043d\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0435 \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f --&gt;                 &lt;td&gt;&lt;a href=&quot;#&quot;&gt;&lt;span class=&quot;glyphicon glyphicon-remove&quot; tooltip=&quot;Delete&quot; ng-click=&quot;deleteUser(user)&quot;\/&gt;&lt;\/a&gt;&lt;\/td&gt;             &lt;\/tr&gt;             &lt;\/tbody&gt;         &lt;\/table&gt;         &lt;div ng-model=&quot;user&quot;&gt;         &lt;!-- \u0424\u043e\u0440\u043c\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f --&gt;             &lt;div class=&quot;form-group&quot;&gt;                 &lt;input type=&quot;text&quot; class=&quot;form-control&quot; ng-model=&quot;user.userName&quot; placeholder=&quot;Login&quot;\/&gt;             &lt;\/div&gt;             &lt;div class=&quot;form-group&quot;&gt;                 &lt;input type=&quot;password&quot; class=&quot;form-control&quot; ng-model=&quot;user.userPassword&quot; placeholder=&quot;Password&quot;\/&gt;             &lt;\/div&gt;             &lt;div class=&quot;form-group&quot;&gt;                 &lt;!-- \u041f\u043e \u043a\u043b\u0438\u043a\u0443 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0449\u0443\u044e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f --&gt;                 &lt;button class=&quot;btn btn-primary&quot; ng-click=&quot;addUser(user)&quot;&gt;Add&lt;\/button&gt;             &lt;\/div&gt;         &lt;\/div&gt;     &lt;\/div&gt; &lt;\/div&gt; &lt;\/body&gt; &lt;\/html&gt; <\/code><\/pre>\n<p>  layout.html  <\/p>\n<pre><code class=\"html\">&lt;!DOCTYPE html SYSTEM &quot;http:\/\/www.thymeleaf.org\/dtd\/xhtml1-strict-thymeleaf-spring4-4.dtd&quot;&gt; &lt;!-- \u041e\u0431\u043b\u0430\u0441\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 AngularJS --&gt; &lt;html ng-app=&quot;com.igumnov.common.example&quot;&gt; &lt;head&gt;     &lt;title&gt;Title&lt;\/title&gt;     &lt;link rel=&quot;stylesheet&quot; href=&quot;\/static\/bootstrap\/3.3.1\/css\/bootstrap.min.css&quot; \/&gt;     &lt;meta charset=&quot;utf-8&quot; \/&gt;     &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot; \/&gt;     &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot; \/&gt; &lt;\/head&gt; &lt;body&gt; &lt;script src=&quot;\/static\/angularjs\/1.3.8\/angular.min.js&quot;&gt;&lt;\/script&gt; &lt;script src=&quot;\/static\/angularjs\/1.3.8\/angular-resource.min.js&quot;&gt;&lt;\/script&gt; &lt;script src=&quot;\/static\/angular-ui-bootstrap\/0.12.0\/ui-bootstrap-tpls.min.js&quot;&gt;&lt;\/script&gt; &lt;div class=&quot;container&quot;&gt; &lt;!-- \u0421\u044e\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u043d\u044b\u0439 \u0431\u043b\u043e\u043a --&gt;     &lt;div layout:fragment=&quot;content&quot;&gt;&lt;\/div&gt; &lt;\/div&gt; &lt;\/body&gt; &lt;\/html&gt; <\/code><\/pre>\n<p>  user.js  <\/p>\n<pre><code class=\"javascript\">angular.module('com.igumnov.common.example', ['ui.bootstrap', 'ngResource'])     .factory('User', ['$resource', function ($resource) { \/\/ \u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c REST-\u0440\u0435\u0441\u0443\u0440\u0441 User         return $resource('\/rest\/user', {}, {             list: { \/\/ \u0421\u043f\u0438\u0441\u043e\u043a \u044e\u0437\u0435\u0440\u043e\u0432                 method: 'GET',                 cache: false,                 isArray: true \/\/ \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u0437\u043e\u0432\u0430 \u043c\u0430\u0441\u0441\u0438\u0432             },             add: { \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u044e\u0437\u0435\u0440\u0430                 method: 'POST',                 cache: false,                 isArray: false \/\/ \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u0437\u043e\u0432\u0430 \u043e\u0434\u0438\u043d \u043e\u0431\u044a\u0435\u043a\u0442             },             delete: { \/\/ \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u044e\u0437\u0435\u0440\u0430                 method: 'DELETE',                 cache: false,                 isArray: false \/\/ \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u0437\u043e\u0432\u0430 \u043e\u0434\u0438\u043d \u043e\u0431\u044a\u0435\u043a\u0442             }         });     }])     .controller('UserCtrl', function ($scope, User) { \/\/ \u041e\u0431\u044c\u044f\u0432\u043b\u044f\u0435\u043c \u043d\u0430\u0448 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 UserCtrl         $scope.users = User.list({}); \/\/ \u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430         $scope.addUser = function (user) { \/\/ \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f             User.add({},user,function (data) { \/\/ \u0414\u0435\u0440\u0433\u0430\u0435\u043c REST-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441                 $scope.users = User.list({});   \/\/ \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u0441\u043f\u0435\u0445\u0430, \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439             }, function (err) {                 alert(err.data.message); \/\/ \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0448\u0438\u0431\u043a\u0438, \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0443             });         }         $scope.deleteUser = function (user) { \/\/ \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f             User.delete({&quot;userName&quot; : user.userName},user,function (data) { \/\/ \u0414\u0435\u0440\u0433\u0430\u0435\u043c REST-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441                 $scope.users = User.list({}); \/\/ \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u0441\u043f\u0435\u0445\u0430, \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439             }, function (err) {                 alert(err.data.message); \/\/ \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0448\u0438\u0431\u043a\u0438, \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0443             });         }      }); <\/code><\/pre>\n<p>  messages_en.properties  <\/p>\n<pre><code>login.title=Login <\/code><\/pre>\n<p>  \u0412 \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043c\u043e\u0433\u0443 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e Scala \u0431\u0443\u0434\u0443 \u0432\u043d\u0435\u0434\u0440\u044f\u0442\u044c \u0432 \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 Java. \u041d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0441\u044c \u0442\u0430\u043c \u043d\u0438\u0447\u0435\u0433\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0438\u0437 \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430 Java, \u043d\u043e \u043d\u043e\u0432\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438, \u0442\u043e\u0447\u043d\u043e \u0431\u0443\u0434\u0443 \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 Scala. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u0442\u0430\u043a\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f: \u043d\u0430 Scala \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0443\u0434\u043e\u0431\u043d\u0435\u0435, \u0447\u0438\u0449\u0435 \u043a\u043e\u0434. \u0412 \u043e\u0431\u0449\u0435\u043c \u044d\u0442\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e.<\/p>\n<p>  PS \u0422\u0430\u043a \u043a\u0430\u043a \u044f \u043d\u043e\u0432\u0438\u0447\u043e\u043a \u0432 Scala, \u0441 \u0440\u0430\u0434\u043e\u0441\u0442\u044c\u044e \u0433\u043e\u0442\u043e\u0432\u044b \u0432\u044b\u0441\u043b\u0443\u0448\u0430\u0442\u044c \u043a\u0440\u0438\u0442\u0438\u043a\u0443 \u043f\u043e \u0441\u0432\u043e\u0435\u043c\u0443 \u043a\u043e\u0434\u0443. \u041d\u0443\u0436\u0435\u043d \u0444\u0438\u0434\u0431\u0435\u043a \u0447\u0442\u043e \u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u044e \u043d\u0435 \u0442\u0430\u043a.     \t<\/p>\n<div class=\"clear\"><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/263749\/\"> http:\/\/habrahabr.ru\/post\/263749\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>     \t\u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u043c\u043e\u0435\u0433\u043e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u0441\u0442\u0430 <a href=\"http:\/\/habrahabr.ru\/post\/259005\/\">\u0418\u0437\u043e\u0431\u0440\u0435\u0442\u0430\u0435\u043c \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434 \u043d\u0430 Java \u2014 \u043f\u0438\u0448\u0435\u043c \u0441\u0432\u043e\u0439 Framework (DI, ORM, MVC and etc)<\/a>. \u041f\u0440\u043e\u0448\u043b\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0441\u044f\u0446\u0435\u0432 \u043a\u0430\u043a \u0431\u044b\u043b \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d \u043c\u043e\u0439 \u043f\u0435\u0440\u0432\u044b\u0439 Framework \u043d\u0430 Java. \u041c\u043d\u0435 \u043f\u043e\u0432\u0435\u0437\u043b\u043e \u0438 \u044f \u0441\u0432\u043e\u044e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b \u0432 \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043c\u043e\u0438 \u043c\u043d\u043e\u0433\u0438\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u044d\u0442\u0438\u043c \u0443\u0434\u043e\u0431\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u043d\u0435 \u0432\u0435\u0440\u043d\u044b. \u041d\u043e \u044f \u043d\u0435 \u0444\u0438\u043b\u043e\u043d\u0438\u043b \u0438 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u043b \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u043b \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443. \u0415\u0441\u043b\u0438 \u0432\u044b \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435 API \u0432 \u043c\u043e\u0435\u0439 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435, \u0442\u043e \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441. <\/p>\n<p>  \u041d\u043e \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a Scala. \u042f \u0441\u043c\u043e\u0442\u0440\u0435\u043b \u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u044b Framework-\u0438 Play \u0438 Spray. \u0417\u0430\u043c\u0435\u0442\u0438\u043b \u0442\u0430\u043a\u043e\u0439 \u0442\u0440\u0435\u043d\u0434, \u0447\u0442\u043e \u043e\u043d\u0438 \u0432\u0441\u0435 \u0437\u0430\u0442\u043e\u0447\u0435\u043d\u044b \u043d\u0430 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u0432 \u0441\u0442\u0438\u043b\u0435 \u0410\u043a\u0442\u043e\u0440\u043e\u0432(\u0430\u043a\u0442\u0435\u0440\u043e\u0432) \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f Highload. \u042d\u0442\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0432\u0441\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0438 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u043d\u043e. \u041d\u043e \u043f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e \u043f\u043e\u0433\u043e\u043d\u044f \u0437\u0430 \u044d\u0442\u0438\u043c \u0441\u0434\u0435\u043b\u0430\u043b \u043a\u043e\u0434\u0438\u043d\u0433 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u043c. \u041f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0443 \u0442\u0435\u0431\u044f \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043d\u0435 Highload-\u043f\u0440\u043e\u0435\u043a\u0442, \u0442\u043e \u0442\u0435\u0431\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u0443\u043f\u0430\u043b\u0438 Play \u0438 Spray \u0438 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432 \u043d\u0435\u0442 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432 Scala, \u043f\u0438\u0441\u0430\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0435 \u0431\u0443\u043a\u0432 \u0447\u0435\u043c \u0432 Java. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0441\u043c\u043e\u0442\u0440\u0438\u0448\u044c \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 Spring boot, Spring Data \u0438 \u0442\u0434. \u0422\u0430\u043c \u0432\u0441\u0435 \u043c\u0438\u043b\u043e, \u043a\u043e\u0440\u043e\u0442\u043a\u043e \u0438 \u043a\u0440\u0430\u0441\u0438\u0432\u043e. \u0410 \u0432 Scala \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0432 \u0430\u043a\u0442\u043e\u0440-\u0441\u0442\u0438\u043b\u0435 \u043f\u043e\u0445\u043e\u0436\u0438 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 J2EE \u043f\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0443 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/d15\/17d\/43f\/d1517d43f7e22f24b06af75ee220e698.png\" alt=\"image\"\/>  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-262529","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/262529","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=262529"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/262529\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=262529"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=262529"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=262529"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}