{"id":1147,"date":"2025-02-09T12:35:46","date_gmt":"2025-02-09T03:35:46","guid":{"rendered":"https:\/\/route-zero.com\/recruit\/route\/1147\/"},"modified":"2025-04-09T12:46:26","modified_gmt":"2025-04-09T03:46:26","slug":"1147","status":"publish","type":"route","link":"https:\/\/route-zero.com\/recruit\/route\/1147\/","title":{"rendered":"\u30d5\u30a9\u30fc\u30e0\u5024\u304c\u6d88\u3048\u308b\uff1fThymeleaf th:object\u3068th:field\u306e\u6b63\u3057\u3044\u4f7f\u3044\u65b9\u3092\u5fb9\u5e95\u89e3\u8aac"},"content":{"rendered":"<div>\n<h2>Thymeleaf\u306e\u30d5\u30a9\u30fc\u30e0\u30d0\u30a4\u30f3\u30c7\u30a3\u30f3\u30b0\u3001\u56f0\u3063\u3066\u3044\u307e\u305b\u3093\u304b\uff1f<\/h2>\n<p>Spring Boot\u3067Web\u30a2\u30d7\u30ea\u3092\u4f5c\u3063\u3066\u3044\u308b\u3068\u3001\u5fc5\u305a\u76f4\u9762\u3059\u308b\u306e\u304c\u300c\u30d5\u30a9\u30fc\u30e0\u5165\u529b\u3092\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306b\u30d0\u30a4\u30f3\u30c9\u3059\u308b\u65b9\u6cd5\u300d\u3067\u3059\u3002<\/p>\n<p>\u300cinput\u8981\u7d20\u306b\u4f55\u3092\u8a2d\u5b9a\u3059\u308c\u3070\u5024\u304c\u5165\u308b\u306e\uff1f\u300d \u300c\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u30a8\u30e9\u30fc\u6642\u306b\u3001\u5024\u304c\u6d88\u3048\u3066\u3057\u307e\u3046\u2026\u300d \u300cth:field\u3063\u3066\u3088\u304f\u898b\u308b\u3051\u3069\u3001\u3069\u3046\u52d5\u3044\u3066\u3044\u308b\u306e\uff1f\u300d<\/p>\n<p>\u305d\u3093\u306a\u7591\u554f\u3092\u6301\u3063\u305f\u3053\u3068\u306f\u3042\u308a\u307e\u305b\u3093\u304b\uff1f\u3053\u306e\u8a18\u4e8b\u3067\u306f\u3001Thymeleaf\u306e\u30d5\u30a9\u30fc\u30e0\u30d0\u30a4\u30f3\u30c7\u30a3\u30f3\u30b0\u306b\u6b20\u304b\u305b\u306a\u3044\u300cth:object\u300d\u306e\u4f7f\u3044\u65b9\u3092\u3001\u521d\u5fc3\u8005\u306b\u3082\u308f\u304b\u308a\u3084\u3059\u304f\u4e01\u5be7\u306b\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n<hr>\n<h2>th:object\u306e\u57fa\u672c\u3068\u5b9f\u8df5<\/h2>\n<h3>th:object\u3068\u306f\uff1f<\/h3>\n<p>th:object\u306f\u3001\u30d5\u30a9\u30fc\u30e0\u5168\u4f53\u306b\u30d0\u30a4\u30f3\u30c9\u3059\u308b\u30e2\u30c7\u30eb\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u6307\u5b9a\u3059\u308b\u305f\u3081\u306e\u5c5e\u6027\u3067\u3059\u3002\u3053\u308c\u3092\u4f7f\u3046\u3068\u3001\u30d5\u30a9\u30fc\u30e0\u5185\u306e\u5404\u30d5\u30a3\u30fc\u30eb\u30c9\u306b\u81ea\u52d5\u7684\u306b\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u30d7\u30ed\u30d1\u30c6\u30a3\u304c\u30de\u30c3\u30d4\u30f3\u30b0\u3055\u308c\u307e\u3059\u3002<\/p>\n<p>\u5b9f\u306f\u3001th:object\u306f&lt;form&gt;\u30bf\u30b0\u306b\u9650\u3089\u305a\u3001&lt;main&gt;\u3084&lt;div&gt;\u306a\u3069\u306e\u4efb\u610f\u306e\u89aa\u8981\u7d20\u306b\u3082\u6307\u5b9a\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u305f\u3068\u3048\u3070\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u3057\u3066\u304a\u3051\u3070\u3001\u30d5\u30a9\u30fc\u30e0\u4ee5\u5916\u306e\u8907\u6570\u306e\u8981\u7d20\u304b\u3089\u540c\u3058\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u53c2\u7167\u3059\u308b\u3053\u3068\u304c\u53ef\u80fd\u3067\u3059\u3002<\/p>\n<pre><code>&lt;main th:<span>object<\/span>=<span>\"${user}\"<\/span>&gt;\r\n  &lt;form method=<span>\"post\"<\/span>&gt;\r\n    &lt;input type=<span>\"text\"<\/span> th:field=<span>\"*{name}\"<\/span> \/&gt;\r\n    &lt;input type=<span>\"email\"<\/span> th:field=<span>\"*{email}\"<\/span> \/&gt;\r\n  &lt;\/form&gt;\r\n&lt;\/main&gt;<\/code><\/pre>\n<p>\u3053\u306e\u3088\u3046\u306b\u3001\u4e0a\u4f4d\u306e\u8981\u7d20\u306bth:object\u3092\u8a2d\u5b9a\u3059\u308b\u3053\u3068\u3067\u3001\u30cd\u30b9\u30c8\u3055\u308c\u305f\u30d5\u30a9\u30fc\u30e0\u3084\u5165\u529b\u30a8\u30ea\u30a2\u3067\u3082\u4e00\u8cab\u3057\u3066\u540c\u3058\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u30d0\u30a4\u30f3\u30c9\u3067\u304d\u308b\u67d4\u8edf\u306a\u8a2d\u8a08\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<p>&#x25fe;&#xfe0f;\u57fa\u672c\u69cb\u6587<\/p>\n<pre><code>&lt;form th:<span>object<\/span>=<span>\"${user}\"<\/span> method=<span>\"post\"<\/span>&gt;\r\n  &lt;input type=<span>\"text\"<\/span> th:field=<span>\"*{name}\"<\/span> \/&gt;\r\n  &lt;input type=<span>\"email\"<\/span> th:field=<span>\"*{email}\"<\/span> \/&gt;\r\n  &lt;button type=<span>\"submit\"<\/span>&gt;\u9001\u4fe1&lt;\/button&gt;\r\n&lt;\/form&gt;<\/code><\/pre>\n<p>\u3053\u306e\u3088\u3046\u306b\u3001th:object\u306b${user}\u3092\u6307\u5b9a\u3059\u308b\u3068\u3001user\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306ename\u3084email\u30d7\u30ed\u30d1\u30c6\u30a3\u304c\u305d\u308c\u305e\u308c\u306e\u30d5\u30a9\u30fc\u30e0\u30d5\u30a3\u30fc\u30eb\u30c9\u3068\u30d0\u30a4\u30f3\u30c9\u3055\u308c\u307e\u3059\u3002<\/p>\n<p>\u3053\u308c\u306f\u5b9b\u540d\uff08th:object\uff09\u3092\u5c01\u7b52\u306b\u66f8\u304f\u3053\u3068\u3067\u3001\u4e2d\u306b\u5165\u308c\u308b\u624b\u7d19\uff08th:field\uff09\u304c\u3069\u3053\u3078\u5c4a\u304f\u304b\u660e\u78ba\u306b\u306a\u308b\u3088\u3046\u306a\u3082\u306e\u3067\u3059\u3002\u5b9b\u540d\u304c\u306a\u3051\u308c\u3070\u3001\u624b\u7d19\u304c\u8ab0\u5b9b\u304b\u5206\u304b\u3089\u305a\u6df7\u4e71\u3057\u3066\u3057\u307e\u3044\u307e\u3059\u3088\u306d\u3002th:object\u306f\u30d5\u30a9\u30fc\u30e0\u5168\u4f53\u306e\u300c\u5b9b\u540d\u300d\u3092\u6307\u5b9a\u3059\u308b\u3053\u3068\u3067\u3001\u500b\u3005\u306eth:field\u304c\u6b63\u3057\u304f\u30d7\u30ed\u30d1\u30c6\u30a3\u3068\u3064\u306a\u304c\u308b\u3088\u3046\u306b\u3057\u3066\u304f\u308c\u308b\u306e\u3067\u3059\u3002<\/p>\n<p>&#x25fe;&#xfe0f;Java\u5074\u306e\u30af\u30e9\u30b9<\/p>\n<pre><code><span>public<\/span> <span>class<\/span> User {\r\n  <span>private<\/span> <span>String<\/span> name;\r\n  <span>private<\/span> <span>String<\/span> email;\r\n  <span>\/\/ getter\u3068setter\u306f\u7701\u7565<\/span>\r\n}<\/code><\/pre>\n<p>&#x25fe;&#xfe0f;\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u4f8b<\/p>\n<pre><code><span>@GetMapping<\/span>(<span>\"\/form\"<\/span>)\r\n<span>public<\/span> <span>String<\/span> showForm(Model model) {\r\n  model.addAttribute(<span>\"user\"<\/span>, <span>new<\/span> User());\r\n  <span>return<\/span> <span>\"form\"<\/span>;\r\n}\r\n\r\n<span>@PostMapping<\/span>(<span>\"\/form\"<\/span>)\r\n<span>public<\/span> <span>String<\/span> submitForm(<span>@ModelAttribute<\/span> User user, Model model) {\r\n  <span>\/\/ \u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u3084\u4fdd\u5b58\u51e6\u7406\u306a\u3069<\/span>\r\n  model.addAttribute(<span>\"user\"<\/span>, user);\r\n  <span>return<\/span> <span>\"result\"<\/span>;\r\n}<\/code><\/pre>\n<h3>th:field\u3068\u7d44\u307f\u5408\u308f\u305b\u308b\u610f\u5473<\/h3>\n<p>th:field=&#8221;*{\u30d7\u30ed\u30d1\u30c6\u30a3\u540d}&#8221;\u3068\u3044\u3046\u8a18\u6cd5\u306f\u3001th:object\u3067\u6307\u5b9a\u3055\u308c\u305f\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u53c2\u7167\u3057\u3066\u304f\u308c\u307e\u3059\u3002*{}\u3068\u3044\u3046\u69cb\u6587\u304c\u30dd\u30a4\u30f3\u30c8\u3067\u3059\u3002<\/p>\n<ul>\n<li>\n<p>th:object\uff1a\u30d0\u30a4\u30f3\u30c9\u3059\u308b\u30e2\u30c7\u30eb\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u6307\u5b9a\u3057\u307e\u3059\u3002<\/p>\n<\/li>\n<li>\n<p>th:field\uff1a\u6307\u5b9a\u3055\u308c\u305f\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u30d7\u30ed\u30d1\u30c6\u30a3\u3068\u81ea\u52d5\u7684\u306b\u9023\u643a\u3057\u307e\u3059\u3002<\/p>\n<\/li>\n<\/ul>\n<hr>\n<h2>\u3088\u304f\u3042\u308b\u3064\u307e\u305a\u304d\u30dd\u30a4\u30f3\u30c8\u3068\u6539\u5584\u4f8b<\/h2>\n<h3>\u3010\u3064\u307e\u305a\u304d\u2460\u3011th:object\u304c\u6307\u5b9a\u3055\u308c\u3066\u3044\u306a\u3044<\/h3>\n<pre><code>&lt;!-- NG\u4f8b --&gt;\r\n&lt;form method=<span>\"post\"<\/span>&gt;\r\n  &lt;input <span>type<\/span>=<span>\"text\"<\/span> th:field=<span>\"*{name}\"<\/span> \/&gt;\r\n&lt;<span>\/form&gt;<\/span><\/code><\/pre>\n<p>\u3053\u308c\u306fth:object\u304c\u6307\u5b9a\u3055\u308c\u3066\u3044\u306a\u3044\u305f\u3081\u3001*{}\u306e\u53c2\u7167\u5148\u304c\u308f\u304b\u3089\u305a\u30a8\u30e9\u30fc\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<p>&#x25fe;&#xfe0f;\u4fee\u6b63\u4f8b<\/p>\n<pre><code>&lt;form th:<span>object<\/span>=<span>\"${user}\"<\/span> method=<span>\"post\"<\/span>&gt;\r\n  &lt;input type=<span>\"text\"<\/span> th:field=<span>\"*{name}\"<\/span> \/&gt;\r\n&lt;\/form&gt;<\/code><\/pre>\n<h3>\u3010\u3064\u307e\u305a\u304d\u2461\u3011\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u8868\u793a\u304c\u3067\u304d\u306a\u3044<\/h3>\n<p>\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u30a8\u30e9\u30fc\u6642\u306e\u30e1\u30c3\u30bb\u30fc\u30b8\u8868\u793a\u306b\u306f\u3001Spring\u306eBindingResult\u3068Thymeleaf\u306e\u30a8\u30e9\u30fc\u8868\u793a\u3092\u7d44\u307f\u5408\u308f\u305b\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n<p>&#x25fe;&#xfe0f;Java\u5074<\/p>\n<pre><code><span>@PostMapping<\/span>(<span>\"\/form\"<\/span>)\r\n<span>public<\/span> <span>String<\/span> submitForm(<span>@Valid<\/span> <span>@ModelAttribute<\/span> User user, BindingResult result, Model model) {\r\n  <span>if<\/span> (result.hasErrors()) {\r\n    <span>return<\/span> <span>\"form\"<\/span>;\r\n  }\r\n  <span>return<\/span> <span>\"result\"<\/span>;\r\n}<\/code><\/pre>\n<p>&#x25fe;&#xfe0f;HTML\u5074<\/p>\n<pre><code>&lt;div th:<span>if<\/span>=<span>\"${#fields.hasErrors('name')}\"<\/span> th:errors=<span>\"*{name}\"<\/span>&gt;&lt;\/div&gt;<\/code><\/pre>\n<h3>\u3010before \/ after\u306e\u6539\u5584\u4f8b\u3011<\/h3>\n<p><strong>Before:<\/strong><\/p>\n<pre><code>&lt;form method=<span>\"post\"<\/span>&gt;\r\n  &lt;input <span>type<\/span>=<span>\"text\"<\/span> name=<span>\"name\"<\/span> \/&gt;\r\n&lt;<span>\/form&gt;<\/span><\/code><\/pre>\n<p><strong>After:<\/strong><\/p>\n<pre><code>&lt;form th:<span>object<\/span>=<span>\"${user}\"<\/span> method=<span>\"post\"<\/span>&gt;\r\n  &lt;input type=<span>\"text\"<\/span> th:field=<span>\"*{name}\"<\/span> \/&gt;\r\n&lt;\/form&gt;<\/code><\/pre>\n<p>Thymeleaf\u306e\u6a5f\u80fd\u3092\u4f7f\u3046\u3053\u3068\u3067\u3001\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u3084\u521d\u671f\u5024\u306e\u81ea\u52d5\u53cd\u6620\u304c\u7c21\u5358\u306b\u884c\u3048\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<hr>\n<h2>th:object\u3092\u4f7f\u3044\u3053\u306a\u3057\u3066\u3001\u5805\u7262\u306a\u30d5\u30a9\u30fc\u30e0\u958b\u767a\u3092\uff01<\/h2>\n<p>th:object\u306f\u3001\u30d5\u30a9\u30fc\u30e0\u3068\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u9023\u643a\u3055\u305b\u308b\u8981\u306e\u6a5f\u80fd\u3067\u3059\u3002<\/p>\n<ul>\n<li>\n<p>\u30e2\u30c7\u30eb\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3068\u306e\u30de\u30c3\u30d4\u30f3\u30b0\u304c\u7c21\u5358\u306b\u306a\u308b<\/p>\n<\/li>\n<li>\n<p>\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u3084\u30a8\u30e9\u30fc\u8868\u793a\u3082\u30b9\u30e0\u30fc\u30ba\u306b\u5b9f\u88c5\u3067\u304d\u308b<\/p>\n<\/li>\n<li>\n<p>\u30b3\u30fc\u30c9\u306e\u53ef\u8aad\u6027\u30fb\u4fdd\u5b88\u6027\u304c\u5411\u4e0a\u3059\u308b<\/p>\n<\/li>\n<\/ul>\n<p>\u5b9f\u52d9\u3067Thymeleaf\u3092\u4f7f\u3046\u306a\u3089\u3001\u5fc5\u305a\u7fd2\u5f97\u3057\u3066\u304a\u304d\u305f\u3044\u30dd\u30a4\u30f3\u30c8\u3067\u3059\u3002<\/p>\n<hr>\n<h3>\u3010\u5916\u90e8\u30ea\u30f3\u30af\u3011<\/h3>\n<p><a href=\"https:\/\/spring.io\/projects\/spring-boot\" target=\"_blank\" rel=\"noopener\">Spring Boot\u516c\u5f0f\u30b5\u30a4\u30c8<\/a><\/p>\n<p><a href=\"https:\/\/spring.io\/guides\/gs\/serving-web-content\/\" target=\"_blank\" rel=\"noopener\">Spring Framework\u516c\u5f0f\u30ac\u30a4\u30c9 \u2013 Spring MVC<\/a><\/p>\n<p>\n  <a href=\"https:\/\/docs.spring.io\/spring-framework\/reference\/web\/webmvc\/mvc-controller\/ann-methods\/modelattrib-method-args.html#page-title\" target=\"_blank\" rel=\"noopener\">Spring\u516c\u5f0f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\uff1a@ModelAttribute\u306e\u4f7f\u3044\u65b9<\/a\n  >\n<\/p>\n<h3>\u3010\u5185\u90e8\u30ea\u30f3\u30af\u3011<\/h3>\n<p><a href=\"https:\/\/route-zero.com\/recruit\/route\/1132\/\">Thymeleaf\u3067\u300c$\u300d\u300c@\u300d\u300c*\u300d\u306f\u3069\u3046\u9055\u3046\uff1f\u521d\u5fc3\u8005\u3067\u3082\u308f\u304b\u308b\u4f7f\u3044\u5206\u3051\u5b8c\u5168\u30ac\u30a4\u30c9<\/a><\/p>\n<p><a href=\"https:\/\/route-zero.com\/recruit\/route\/1071\/\">Thymeleaf\u306e\u300cth:field\u300d\u3068\u306f\u4f55\u304b<\/a><\/p>\n<p><a href=\"https:\/\/route-zero.com\/recruit\/route\/1068\/\">Thymeleaf\u3068JavaScript\u3067\u30bf\u30b0\u3092\u4f7f\u3063\u305f\u30d5\u30a9\u30fc\u30e0\u4f5c\u6210\u6cd5\u3068\u30c7\u30fc\u30bf\u9001\u4fe1\u306e\u65b9\u6cd5<\/a><\/p>\n<\/div>\n","protected":false},"featured_media":1148,"template":"","_links":{"self":[{"href":"https:\/\/route-zero.com\/recruit\/wp-json\/wp\/v2\/route\/1147"}],"collection":[{"href":"https:\/\/route-zero.com\/recruit\/wp-json\/wp\/v2\/route"}],"about":[{"href":"https:\/\/route-zero.com\/recruit\/wp-json\/wp\/v2\/types\/route"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/route-zero.com\/recruit\/wp-json\/wp\/v2\/media\/1148"}],"wp:attachment":[{"href":"https:\/\/route-zero.com\/recruit\/wp-json\/wp\/v2\/media?parent=1147"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}