Grails视图开发:标签、表单简化、验证与分页全解析
立即解锁
发布时间: 2025-08-16 01:06:23 阅读量: 18 订阅数: 42 AIGC 


Grails 2权威指南:从入门到精通
### Grails视图开发:标签、表单简化、验证与分页全解析
#### 1. Grails实用标签
Grails除了通用的 `<g:select>` 标签外,还提供了一些其他实用标签:
- `<g:currencySelect>`、`<g:localeSelect>` 和 `<g:timeZoneSelect>` 分别用于处理 `java.util.Currency`、`java.util.Locale` 和 `java.util.TimeZone` 实例。这些标签只需要两个属性:`name` 用于指定选择框的名称,`value` 则接受上述类的一个实例。示例代码如下:
```groovy
<%-- Sets the currency to the currency of the Locale within the request --%>
<g:currencySelect
name="myCurrency"
value="${ Currency.getInstance(request.locale) }" />
<%-- Sets the locale to the locale of the request --%>
<g:localeSelect name="myLocale" value="${ request.locale }" />
<%-- Sets value to default time zone --%>
<g:timeZoneSelect name="myTimeZone" value="${ TimeZone.getDefault() }" />
```
- `<g:datePicker>` 标签用于创建日期选择器,它会自动将选择的内容转换为日期实例。基本使用时,需要 `name` 和 `value`(`java.util.Date` 实例)属性。例如:
```groovy
<g:datePicker name="myDate" value="${new Date()}" />
```
还可以使用 `precision` 属性来控制显示的精度,如只显示年、月、日:
```groovy
<g:datePicker name="myDate" value="${new Date()}" precision="day" />
```
#### 2. 表单简化:Fields插件
创建和维护包含大量输入字段的复杂表单可能很繁琐,通常需要大量的复制粘贴代码。例如,创建一个 `Person` 对象的表单和创建一个 `Account` 对象的表单可能大部分代码相似,只是输入字段的名称不同。
`Person` 对象表单示例:
```groovy
<div class="fieldcontain">
<label for="age">
<g:message code="person.age.label"
default="Age" />
<span class="required-indicator">*</span>
</label>
<g:field type="number"
name="age"
required=""
value="${personInstance.age}"/>
</div>
<div class="fieldcontain">
<label for="firstName">
<g:message code="person.firstName.label"
default="First Name" />
</label>
<g:textField name="firstName"
value="${personInstance?.firstName}"/>
</div>
<div class="fieldcontain">
<label for="lastName">
<g:message code="person.lastName.label"
default="Last Name" />
</label>
<g:textField name="lastName"
value="${personInstance?.lastName}"/>
</div>
```
而Fields插件提供了 `<f:all>` 标签,可以为一个bean的每个属性渲染输入字段,上述代码可以简化为:
```groovy
<f:all bean="personInstance"/>
```
#### 3. 验证与错误处理
##### 3.1 验证流程
验证流程可以用以下mermaid流程图表示:
```mermaid
graph TD;
A[Create new Album] --> B{Constraints?};
B -- No --> C[Persist Instance];
B -- Yes --> D{Errors?};
D -- No --> C;
D -- Yes --> E[validate()];
E --> F[save()];
```
##### 3.2 `<g:hasErrors>` 标签
Grails提供了 `<g:hasErrors>` 标签,用于条件性地显示信息,支持以下属性:
- `bean`:要检查错误的bean实例。
- `field`:要检查错误的字段名称。
- `model`:指定整个模型(map)来检查错误。
如果不指定任何属性,该标签将扫描整个请求范围的bean并检查每个对象的错误。
##### 3.3 `<g:eachError>` 标签
如果bean实例有错误,可以使用 `<g:eachError>` 标签遍历并显示每个错误。该标签接受与 `<g:hasErrors>` 标签相同的属性。示例代码如下:
```groovy
<g:hasErrors bean="${album}">
<ul class="errors">
<g:eachError bean="${album}">
<li>${it.defaultMessage}</li>
</g:eachError>
</ul>
</g:hasErrors>
```
##### 3.4 `<g:renderErrors>` 标签
如果只需要显示错误列表,Grails提供了 `<g:renderErrors>` 标签,它封装了上述功能。示例代码如下:
```groovy
<g:renderErrors bean="${album}" as="list" />
```
#### 4. 分页视图
在Web应用中,渲染大量数据列表时,为了提供更好的用户体验,通常需要进行分页处理。Grails提供了 `<g:paginate>` 标签来简化分页控制的生成。
##### 4.1 分页需求
当数据库中包含大量数据时,一次性显示所有数据会让用户难以处理。例如,一个音乐应用可能包含数千个艺术家、专辑和歌曲,显示所有专辑的页面可能会让用户感到不知所措。因此,应用需要提供机制让用户能够管理和浏览所有数据。
##### 4.2 `<g:paginate>` 标签使用
以下是一个使用 `<g:paginate>` 标签的示例,在 `genre.gsp` 页面中:
```groovy
<h1>Online Store</h1>
<h2>Genre: ${genre.encodeAsHTML()}</h2>
<table border="0" class="albumsTable">
<tr>
<th>Artist</th>
<th>Album</th>
<th>Year</th>
</tr>
<g:each var="album" in="${albums}">
<tr>
<td>${album.artist.name}</td>
<td><g:link action="show"
controller="album"
id="${album.id}">${album.title}</g:link>
</td>
<td>${album.year}</td>
</tr>
</g:each>
</table>
<div class="paginateButtons">
<g:paginate controller="store"
action="genre"
params="[name:genre]"
total="${totalAlbums}" />
</div>
```
##### 4.3 控制器代码
控制器中的 `genre` 方法如下:
```groovy
def genre() {
def max = Math.min(params.int('max') ?: 10, 100)
```
0
0
复制全文
相关推荐









