Ajaxspring+thymeleaf实现表单验证数据双向绑定

  在渲染URL往日,th:href和th:src将会调用 RequestDataValueProcessor.processUrl(…) 
  在渲染表单的action属性在此以前,th:action会调用 RequestDataValueProcessor.processAction(…) ,其它她会检查标签,因为一般的话这是行使action的唯一一个地方,并且在的关闭标签往日实施 RequstDataValueProcessor.getExtraHiddenField(Field)s(…) 用来新增再次来到的hidden域。

 

1 <div id="data" th:fragment="hoteldata">

先天给form添加一个动态table

 

Thymeleaf将只回去index模板的content片段。一旦前缀后缀都设置并配合,那么它或许为/WEB-INF/templates/index.html,

大局错误
  Spring表单还有一种错误,全局错误,都是些不与窗体的其它特定字段关联的谬误。
  Thymeleaf提供了一个global的常量来做客这些错误。

 1 <table>
 2   <thead>
 3     <tr>
 4       <th th:text="#{seedstarter.rows.head.rownum}">Row</th>
 5       <th th:text="#{seedstarter.rows.head.variety}">Variety</th>
 6       <th th:text="#{seedstarter.rows.head.seedsPerCell}">Seeds per cell</th>
 7       <th>
 8         <button type="submit" name="addRow" th:text="#{seedstarter.row.add}">Add row</button>
 9 </th>
10     </tr>
11   </thead>
12 <tbody>
13   <tr th:each="row,rowStat : *{rows}">
14     <td th:text="${rowStat.count}">1</td>
15     <td>
16       <select th:field="*{rows[__${rowStat.index}__].variety}">
17       <option th:each="var : ${allVarieties}" 
18             th:value="${var.id}" 
19             th:text="${var.name}">Thymus Thymi</option>
20       </select>
21     </td>
22     <td>
23       <input type="text" th:field="*{rows[__${rowStat.index}__].seedsPerCell}" />
24     </td>
25     <td>
26       <button type="submit" name="removeRow" 
27              th:value="${rowStat.index}" th:text="#{seedstarter.row.remove}">Remove row</button>
28     </td>
29    </tr>
30   </tbody>
31 </table>

  可以见到, #fields.hasErrors(…) 函数接受一个表明式参数(datePlanted),再次回到一个布尔值告诉field该字段是否有认证错误。
俺们得以依据他们各自的field获取具有的失实:

  那多少个有些(即hoteldata)可以是逗号分隔的列表标记在th:fragment标签中。

  这一个科目介绍了Thymeleaf与Spring框架的并轨,特别是SpringMvc框架。
  注意Thymeleaf辅助同Spring框架的3.和4.本子的合一,不过那六个版本的襄助是封装在thymeleaf-spring3和thymeleaf-spring4这五个单身的库中,项目中需要依照实际意况分别引用。
  样例代码针对的是spring4.,但一般情状下,spring3.也可以无缝使用,所需要的单纯是改变一下引用库。

*  *标签,也可以由此DOM采纳器设定

1 <select th:field="*{rows[__${rowStat.index}__].variety}">
2 ...
3 </select>

  那一个th:object与任何的的地点用途是直接的,但是事实上在这种特定情景下,为了与SpringMVC框架的不错结合扩充了有的一定的限制:
  1.在form标签中的th:object的值必须是变量表明式(…),只能指定属性模型属性的名字,而不可能应用性能导航,这意味着,表明式…),只好指定属性模型属性的名字,而不可以采纳性能导航,
这代表,表达式 {seedStarter}是不易的,而${seedStarter.data}则不是。
  2.一个form标签内只好指定一个th:object属性,这与html中form标签不可能嵌套的表征相平等。

绑定地址到Controller
  在Spring4.1之后的版本中,Spring允许通过注明直接从从视图链接到控制器,而不需要通晓那一个控制器映射的URI.

这是一个卓殊管用的组件化工具,比如,它可以用来实践AJAX的Controller的调用,用于在已经加载的浏览器中回到一个有的标签(如用于改进选用,启用禁用按钮等)。

 

等效于:

  最后,注意 #field.hasErrors(“”) 等效的属性 #fields.hasAnyErrors() 和 #fields.errors() 的均等的 #fields.allErrors() ,能够行使喜欢的其余语法。

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans ...>
 3     ... 
 4     <mvc:annotation-driven conversion-service="conversionService" />
 5 ...
 6 <!-- **************************************************************** -->
 7 <!-- CONVERSION SERVICE -->
 8 <!-- Standard Spring formatting-enabled implementation -->
 9 <!-- **************************************************************** -->
10   <bean id="conversionService"
11 class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
12   <property name="formatters">
13   <set>
14      <bean class="thymeleafexamples.stsm.web.conversion.VarietyFormatter" />
15      <bean class="thymeleafexamples.stsm.web.conversion.DateFormatter" />
16      </set>
17     </property>
18   </bean>
19 ...
20 </beans>

一样统筹兼顾的适用:

1 <div id="data">
2     This is a content to be changed
3 </div>

建立一个以<Enter>分隔的列表:

1 Thymeleaf同Spring的整合
  Thymeleaf与Spring举办整合后,可以在SpringMVC应用中完全代替JSP文件。
集成后你将:
  *就像控制JSP一样,使用SpringMvc的@Controller表明来映射Thymeleaf的模板文件。
  *在模板中利用SpringEL表明式来替换OGNL
  *在模板中创设的表单,完全襄助Beans和结果的绑定,包括使用PropertyEditor,转换,和认证等。
  *可以经过Spring来保管国际化文件显示国际化信息。
  *小心,在运用本学科以前,您应该尽量了解Thymeleaf的正统方言。

  在上方的事例中,我们获取所有的不当并迭代他们:

1 <bean id="thymeleafViewResolver" class="org.thymeleaf.spring4.view.AjaxThymeleafViewResolver">
2   <property name="viewClass" value="org.thymeleaf.spring4.view.FlowAjaxThymeleafView" />
3   <property name="templateEngine" ref="templateEngine" />
4 </bean>

  其他thymeleaf基础运用方法有些不在叙述。

  在Thymeleaf中可以通过 #mvc.url(…) 表达式方法调用Controller中符合驼峰命名规则的法门(get,set),调用的章程为形式的名字,即一定于jsp的spring:mvcUrl(…)自定义方法。

1 <div th:if="${#fields.hasAnyErrors()}">
2     <p th:each="err : ${#fields.allErrors()}" th:text="${err}">...</p>
3 </div>

 

  其它应该小心到,因为Thymeleaf可以使用DOM接纳器,所有我们可以不用别样 th:fragment 属性,而只用id属性来采纳一个局部,如:

与RequestDataValueProcessor集成
  现在Thymeleaf无缝的与Spring的RequestDataValueProcessor接口集成,那个接口允许拦截链接URLS,表达URLS和表明域的值,以及为了启用安全,如抵御CSRF而机关透明的增长一些隐藏域。

在利用的上下文中可以概括的布局RequestDataValueProcessor:

 1 <tbody>
 2   <tr>
 3     <td>1</td>
 4     <td>
 5       <select id="rows0.variety" name="rows[0].variety">
 6         <option selected="selected" value="1">Thymus vulgaris</option>
 7         <option value="2">Thymus x citriodorus</option>
 8         <option value="3">Thymus herba-barona</option>
 9         <option value="4">Thymus pseudolaginosus</option>
10         <option value="5">Thymus serpyllum</option>
11       </select>
12     </td>
13     <td>
14       <input id="rows0.seedsPerCell" name="rows[0].seedsPerCell" type="text" value="" />
15     </td>
16     <td>
17       <button name="removeRow" type="submit" value="0">Remove row</button>
18     </td>
19   </tr>
20   <tr>
21     <td>2</td>
22     <td>
23       <select id="rows1.variety" name="rows[1].variety">
24         <option selected="selected" value="1">Thymus vulgaris</option>
25         <option value="2">Thymus x citriodorus</option>
26         <option value="3">Thymus herba-barona</option>
27         <option value="4">Thymus pseudolaginosus</option>
28         <option value="5">Thymus serpyllum</option>
29       </select>
30     </td>
31     <td>
32        <input id="rows1.seedsPerCell" name="rows[1].seedsPerCell" type="text" value="" />
33     </td>
34     <td>
35       <button name="removeRow" type="submit" value="1">Remove row</button>
36     </td>
37   </tr>
38 </tbody>

  永久铭记在心,指定的一部分必须有一个id属性,这样浏览器运行的SpringJavaScript库才能对标签举行轮换。

 

 

 

经过控制权的重返值指定片段
  不表明一个视图bean,可以从控制器自己就足以行使与一些相同的语法,类似于th:insert,th:rplace属性等,如:

<input type="text" th:field="*{datePlanted}" />

Incorrect date以及同样的 #field.hasGlobalErrors() 和 #field.globalErrors() 方法。

简短错误基础css样式,th:errorclass
  在上边的例子中,借使字段有不当,将为表单的input域设置一个css类,因为这种措施很宽泛,Thymeleaf提供了一个一定的属性为  th:errorclass 
  应用于form域的价签(input,select,textarea等),它将从现有的name属性或th:field属性字段的名词相同的属性,假设暴发错误,则将制定的css类追加到标签中。

 1 @RequestMapping(value="/seedstartermng", params={"addRow"})
 2 public String addRow(final SeedStarter seedStarter, final BindingResult bindingResult) {
 3     seedStarter.getRows().add(new Row());
 4     return "seedstartermng";
 5 }
 6 
 7 @RequestMapping(value="/seedstartermng", params={"removeRow"})
 8 public String removeRow(
 9     final SeedStarter seedStarter, final BindingResult bindingResult, 
10     final HttpServletRequest req) {
11     final Integer rowId = Integer.valueOf(req.getParameter("removeRow"));
12     seedStarter.getRows().remove(rowId.intValue());
13     return "seedstartermng";
14 }
1 <p th:text="${val}">...</p>
2 <p th:text="${{val}}">...</p>
1 <input type="text" th:field="*{datePlanted}" 
2            th:class="${#fields.hasErrors('datePlanted')}? fieldError" />
1 <div th:if="${#fields.hasGlobalErrors()}">
2     <p th:each="err : ${#fields.globalErrors()}" th:text="${err}">...</p>
3 </div>
1 <ul th:if="${#fields.hasErrors('*')}">
2     <li th:each="err : ${#fields.errors('*')}" th:text="${err}">Input is incorrect</li>
3 </ul>

 

1 <view-state id="detail" view="bookingDetail">
2   <transition on="updateData">
3     <render fragments="hoteldata"/>
4   </transition>
5 </view-state>
 1 <script type="text/javascript" th:src="@{/resources/dojo/dojo.js}"></script>
 2 <script type="text/javascript" th:src="@{/resources/spring/Spring.js}"></script>
 3 <script type="text/javascript" th:src="@{/resources/spring/Spring-Dojo.js}"></script>
 4 
 5 ...
 6 
 7   <form id="triggerform" method="post" action="">
 8     <input type="submit" id="doUpdate" name="_eventId_updateData" value="Update now!" />
 9   </form>
10 
11 <script type="text/javascript">
12      Spring.addDecoration(
13          new Spring.AjaxEventDecoration({
14               formId:'triggerform',
15               elementId:'doUpdate',
16               event:'onclick'
17         }));
18 </script>

局部渲染可以应用Thymeleaf的有些规范:一个贯彻了 org.thymeleaf.fragment.IFragmentSpec 接口的靶子。

 

 

<input type="text" id="datePlanted" name="datePlanted" th:value="*{datePlanted}" />

也可以运用参数:

  嗯事实上,是特此外,他的题目是SpringEL表明式不实施数值中括号里边的表明式变量,索引执行下面的话语时,会拿到一个谬误的结果,就是字面情势的 row[rowStat.index]  (而不是 row[0],row[1] )而不是行集合中的正确地方,这就是怎么在此处需要预处理。
  让大家看看暴发的html后按”添加行”按钮几回:

<input type="text" th:field="*{{datePlanted}}" />

  在此处可以指定模板的视图状态

上面是一个链接到它的法门:

表单中行使
  大家前边看来的每一个th:field属性都将平素使用转换服务:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4 xsi:schemaLocation="http://www.springframework.org/schema/beans
 5 http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
 6 
 7 ...
 8 
 9 <bean name="requestDataValueProcessor"
10 class="net.example.requestdata.processor.MyRequestDataValueProcessor" />
11 
12 </beans>

复选框
 th:field 也足以用在 checkbox 中,比如如下代码:

<input type="text" th:field="*{datePlanted}" class="small" th:errorclass="fieldError" />

比如

  WebFlow包括当特定的事件(过渡)被触发时渲染页面片段的一些Ajax的功力,将来让Thymeleaf参与这些Ajax请求,我们将拔取一个不经过的视图解析器的兑现,它这样安排:

  当然,同样可以运用基于DOM采取器的意义,所有我们也得以是采用使用基于专业的HTML属性,如id=”content”

  在上面的实例中,bookingDetail是Thymeleaf模板平常使用的一个方法,是模板引擎内其他模板解析器都得以懂的

 

Thymeleaf将通过那种办法利用它:

1 <view-state id="detail" view="bookingDetail">
2   <transition on="updateData">
3     <render fragments="[//div[@id='data']]"/>
4   </transition>
5 </view-state>
1 <input type="text" th:field="*{datePlanted}" />
2 <p th:if="${#fields.hasErrors('datePlanted')}" th:errors="*{datePlanted}">Incorrect date</p>

*  *

 1 <ul>
 2   <li>
 3     <input id="features1" name="features" type="checkbox" 
 4          value="SEEDSTARTER_SPECIFIC_SUBSTRATE" />
 5     <input name="_features" type="hidden" value="on" />
 6     <label for="features1">Seed starter-specific substrate</label>
 7   </li>
 8   <li>
 9     <input id="features2" name="features" type="checkbox" 
10         value="FERTILIZER" />
11     <input name="_features" type="hidden" value="on" />
12     <label for="features2">Fertilizer used</label>
13   </li>
14   <li>
15     <input id="features3" name="features" type="checkbox" 
16         value="PH_CORRECTOR" />
17     <input name="_features" type="hidden" value="on" />
18     <label for="features3">PH Corrector used</label>
19   </li>
20 </ul>

  大家得以观望一个连串后缀扩充在每一个id的性能中, #ids.prev(….) 函数允许我们把检索最终一个行列值,生成的一个一定的id。
用不着担心那一个隐藏域的名目为”_features”:这是为着避免浏览器将未入选的复选框的值在表单提交是从未自动发送而故意抬高的。
还应留神到,假诺我们的表单bean中的feature属性已经包含了部分特定的值,那么th:field还将会自行在对应的竹签中加进checked=”checked”属性。

1 <div>
2    <label th:for="${#ids.next('covered')}" th:text="#{seedstarter.covered}">已种植</label>
3    <input type="checkbox" th:field="*{covered}" />
4 </div>
1 <select th:field="*{type}">
2     <option th:each="type : ${allTypes}" 
3         th:value="${type}" 
4         th:text="#{${'seedstarter.type.' + type}}">Wireframe</option>
5 </select>

  这段代码精晓起来很容易,只是专注属性优先级让我们得以在option标签内采取th:each属性。

单选框
  单选框的用法和一个非布尔值的多选框使用方法接近,只是他不是多选:

  而出发updateData后转移的代码:

1 <ul>
2   <li th:each="ty : ${allTypes}">
3     <input type="radio" th:field="*{type}" th:value="${ty}" />
4     <label th:for="${#ids.prev('type')}" th:text="#{${'seedstarter.type.' + ty}}">Wireframe</label>
5   </li>
6 </ul>

 

转载: 

 

证实和错误音讯
  让大家看看当有错误的时候什么给一个表单域一个CSS类:

1 <view-state id="detail" view="bookingDetail">
2     ...
3 </view-state>

在表单外部展现错误
表单验证错误也足以在表单外部呈现,方法是通过变量(即${…})的中间甄选变量(*{…})扩展表单bean的名字作为前缀的措施。

1 <bean id="mvcViewFactoryCreator" 
2 class="org.springframework.webflow.mvc.builder.MvcViewFactoryCreator">
3   <property name="viewResolvers" ref="thymeleafViewResolver"/>
4 </bean>

渲染片段模板
  Thymeleaf提供了将一个模板只渲染一部分,并视作一个有的重返的能力。

全副谬误
  如果我们想要在form中体现所有的错误吗?我们只需要通过’*’或’all'(等价)来查询 #field.hasErrors(…) 方法和 #field.errors(…) 方法:

 1 <form>
 2     <div th:errors="${myForm}">...</div>
 3     <div th:errors="${myForm.date}">...</div>
 4     <div th:errors="${myForm.*}">...</div>
 5     <div th:if="${#fields.hasErrors('${myForm}')}">...</div>
 6     <div th:if="${#fields.hasErrors('${myForm.date}')}">...</div>
 7     <div th:if="${#fields.hasErrors('${myForm.*}')}">...</div>
 8     <form th:object="${myForm}">
 9     ...
10 </form>
1 <form action="#" th:action="@{/seedstartermng}" th:object="${seedStarter}" method="post">
2 ...
3 </form>
1 <ul>
2       <li th:each="err : ${#fields.errors('datePlanted')}" th:text="${err}" />
3 </ul>

前言

1 <ul>
2   <li th:each="e : ${#fields.detailedErrors()}" th:class="${e.global}? globalerr : fielderr">
3     The field name |
4     The error message
5   </li>
6 </ul>

2 Spring标准方言
  为了更加便民,更便捷的三合一,Thymeleaf提供了一套可以与Spring正确工作的蓄意方言。
  这套方言基于Thymeleaf标准方言实现,它在类 org.thymeleaf.spring.dialect.SpringStandardDialect 中,事实上,他继承于 org.thymeleaf.standard.StandardDialect 中。

下拉列表
  下拉列表包含六个部分:<select>标签和它涵盖的<option>标签。在创制这种表单域的时候,只有<select>标签需要导入th:field属性,但 th:value 属性却在 <option> 标签中十分紧要,因为她们提供了当下选选用框的拔取(使用和非布尔复选框和单选框类似的一手)

1 @RequestMapping("/showContentPart")
2 public String showContentPart() {
3     ...
4     return "index :: #content ('myvalue')";
5 }
1 @RequestMapping("/showContentPart")
2 public String showContentPart() {
3     ...
4     return "index :: content";
5 }    

使用项目作为下拉列表:

  在视图bean中指定片段
视图bean是在应用程序上下文中宣称的 org.thymeleaf.spring4.view.ThymeleafView 的bean,它同意这样定义一个有的:

1 public class ExampleController {
2   @RequestMapping("/data")
3   public String getData(Model model) { ... return "template" }
4       @RequestMapping("/data")
5       public String getDataParam(@RequestParam String type) {
6            ...
7           return "template" }
8 }

 

1 <ul th:if="${#fields.hasErrors('global')}">
2     <li th:each="err : ${#fields.errors('global')}" th:text="${err}">Input is incorrect</li>
3 </ul>

最常用的一个实现是 org.thymeleaf.standard.fragment.StandardDOMSelectorFragmentSpec 类,它同意一个部分规范包括往日说过的th:insert,th:replace使用DOM采取器。

  Thymeleaf需要您来得的在form标签内经过th:object属性指定命令对象:

 1 <!DOCTYPE html>
 2 <html>
 3   ...
 4  <body>
 5   ...
 6     <div id="content">
 7       只有这里渲染!!
 8     </div>
 9   ...
10   </body>
11 </html>

通过下边的bean的定义,如若controller再次回到一个content-part(bean的名字),

 

转换服务
 配置
  就像前文所说,Thymeleaf能够在上下文中注册一个变换服务,再度看一下她的配备信息

除却已经冒出在正规方言中的所有机能,Spring中还有以下特征:
  *不适用OGNL,而是SpringEL做完变量表明式,因而,所有的${…}和*{…}表明式将用Spring的表明式引擎举行拍卖。
  *走访应用context中的beans可以利用SpringEL语法:${@myBean.doSomething()}
  *遵照表格处理的新属性:th:field,th:errors和th:errorclass,除此还有一个th:object的新实现,允许它使用表单命令采用器(??)。
  *一个新的表明式:#themes.code(…),相当于jsp自定义标签中的spring:theme。
  *在spring4.0集成中的一个新的表达式:#mvc.uri(…),相当于jsp自定义标签中的spring:mvcUrl(…)
留意,上述那个方言特性是无法再平凡的TemplateEngine对象中拔取的,应该安排一个org.thymeleaf.spring4.SpringTemplateEngine来执行。

 

 

Ajax片段
  WebFlow的一部分规范允许一部分通过标签展现,就像这么:

  事实上,可能比下边的代码还要多一些东西,因为 th:field 还可能会登记一个Spring的变换服务,包括在此以前我们来看的 DateFormatter (甚至这么些表达式中没利用双大括号),因而,这多少个日子也将被科学的格式化。
   th:field 的值必须运用拔取表明式,这样将在那多少个环境中运用表单bean,而不是上下文变量或SpringMVC的模子属性。
  相反对于 th:object 这类,它的表明式可以应用性能导航(事实上在JSP的 <form:input 标签中,可以利用此外的门径属性表明式)
专注th:field属性也可以在HTML5的的新增品种中接纳,如 <input type=”datetime”> , <input type=”color”> 等,有效的扩展了对SpringMVC对HTML5支撑的完整性。

input
  下边是什么样将一个input插入到表单中

1 <ul>
2   <li th:each="feat : ${allFeatures}">
3     <input type="checkbox" th:field="*{features}" th:value="${feat}" />
4     <label th:for="${#ids.prev('features')}" 
5         th:text="#{${'seedstarter.feature.' + feat}}">Heating</label>
6   </li>
7 </ul>

 

 

  假设datePlanted暴发错误,则: 

 

 

 

富错误对象
  Thymeleaf提供了以bean的形式(代替单纯的String)提供错误音讯的力量,包括fieldName(String),message(String),和global(String)属性的谬误。这多少个错误可以经过工具方法#fields.datailedErrors()来实现:

始建表单
处理命令对象
  SpringMVC的表单辅助bean就是命令对象,这多少个目标通过对象领域模型的艺术提供get和set方法,在浏览器建立获取用户输入值的输入框架。

  这里现身了众多事物,但都不难精通,除了这一句:

貌似情状下,它的出口为:

  通过迭代,大家可以使用 th:errors ,一个专程用来成立一个经过制定选取器筛选的荒谬列表的性质,通过    分隔。

  为了成功这点,我们需要在控制器中提供部分新的炫耀方法,它将基于我们的特定请求的参数来支配添加或删除一行咱们定义的.

 

1 <a th:href="${(#mvc.url('EC#getData')).build()}">获取Data参数</a>
2 <a th:href="${(#mvc.url('EC#getDataParam').arg(0,'internal')).build()}">获取Data参数</a>

  注意本次我们增添了一个 th:value 属性,因为这一次的特性属性不是一个布尔值,而是一个数组。

<p th:text="${'Val: ' + #conversions.convert(val,'String')}">...</p>
1 <ul>
2     <li th:each="err : ${#fields.errors('*')}" th:text="${err}" />
3 </ul>
1 <bean name="content-part" class="org.thymeleaf.spring4.view.ThymeleafView">
2     <property name="templateName" value="index" />
3     <property name="fragmentSpec">
4 <bean 
5  class="org.thymeleaf.standard.fragment.StandardDOMSelectorFragmentSpec"
6 c:selectorExpression="content" />
7 </property>
8 </bean>

动态域
  由于SpringMVC的高级表单绑定成效,使得大家得以拔取复杂的SpringEL表明式来绑定动态表单域到表单bean中。这将允许我们在 SeedStarter
bean 中开创一个新的Row对象,并将以此row的域添加到用户请求的form中。

1 @RequestMapping("/showContentPart")
2 public String showContentPart() {
3     ...
4     return "content-part";
5 }

注意这是唯一一种在表明式中应用单大括号的变换服务。

俺们得以看看多值的复选框:

  正象上面的代码所示,新增了一个 th:field 的性能,这是SpringMVC集成的一个首要特征,它帮你完了了表单bean和输入框之间的繁重的绑定工作。可以看出她在from中的路径属性和SpringMVC的jsp标签库一样。
   th:field 属性的不比行为取决于它所附加的不等标签,包括 <input> , <select> 或 <textarea> (还包括标签的不同type属性类型),在这种状态下,时间上地点哪行代码会是这样的:

回去结果为:

1 <bean name="content-part" class="org.thymeleaf.spring4.view.ThymeleafView">
2   <property name="fragmentSpec">
3 <bean class="org.thymeleaf.standard.fragment.StandardDOMSelectorFragmentSpec"
4 c:selectorExpression="#content" />
5   </property>
6   <property name="templateName" value="index" />
7 </bean>
1 <p>1234567890</p>
2 <p>1,234,567,890</p>

  这将意味着th:fragment不在需要:

 

<input type="text" id="datePlanted" name="datePlanted" value="2013-01-01" class="small fieldError" />
<input type="text" th:field="*{datePlanted}" />
1 <select th:field="*{rows[rowStat.index].variety}">
2     ...
3 </select>

  假使您记念Thymeleaf教程,那么相应了解 __${…}__ 是一种预处理表明式的语法。这是一个在处理任何表明式以前的里边表达式,但为啥用这种措施指定行的目录呢,下面这种艺术不行么:

 1 <!DOCTYPE html>
 2 <html>
 3   ...
 4   <body>
 5     ...
 6     <div th:fragment="content">
 7        只有这里渲染!!
 8     </div>
 9   ...
10   </body>
11 </html>

  在渲染value属性此前,th:value会调用 RequestDataProcessor.processFormField(Field)Value(…) ,除非在这么些标签中存在了th:field(这时候th:field属性起功效)
  当存在th:field的时候,在渲染value属性从前会调用 RequestDataValueProcessor.processFormField(Field)Value(…) 处理这一个属性值(<textarea>处理内容值)
  此效率唯有Spring3.x未来选取

1 <p th:if="${#fields.hasErrors('all')}" th:errors="*{all}">Incorrect date</p>

  注意这里有一部分除了复选框之外的好东西,比如外表label和它采用的 #ids.next(“covered”) 方法,用于当该id的复选框执行的时候取得它的id值。
那就是说为何大家需要以此字段的id属性动态变化呢?因为复选框可能是多值的,因而它会给id值添加一个系列号后缀(内部使用 #ids.seq(…) 函数)来确保同一属性的复选框有例外的id值。

  这里内容替换</div>

${{…}}语法
  转换服务可以因而 ${{…}} 语法很轻松的实现目标到字符串的变换或格式化:
变量语法 ${{…}} 
挑选变量语法 *{{…}} 
  例如,将一个Integer型转换为字符串类型,并由此逗号来分隔:

  然后在ViewResolver中配置WebFlow的 ViewFactoryCreator .

工具对象表明式的语法为:
 conversions.convert(Object,Class) :将目的转换为指定的类
 conversions.convert(Object,String) :和下面相同,但是指定的靶子为String类(java.lang包名能够省略)

1 @RequestMapping("/showContentPart")
2 public String showContentPart() {
3     ...
4     return "index :: #content";
5 }

Spring WebFlow的集成
  基础配置
  Thymeleaf-spring4集成包包括与Spring WebFlow 2.3.x的融会

#conversions工具对象
conversions工具对象表明式允许手动执行转换服务:

相关文章