Spring提供了两个JSP标签库,用来帮助定义Spring MVC Web的视图。其中一个标签库会用来渲染HTML表单标签,定义在spring-form.tld中,这些标签可以绑定model中的某个属性。另外一个标签库包含了一些工具类标签,定义在spring.tld中。
在这篇文章中,我将对平时用到的spring标签进行较详细的记录,以便最终将其掌握。
spring表单标签
此节均采用以下引入方式:
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
form:form
Attribute | Required? | Runtime Expression? | Description |
---|---|---|---|
commandName | False | True | Name of the model attribute under which the form object is exposed. Defaults to 'command'. |
htmlEscape | False | True | Enable/disable HTML escaping of rendered values. |
modelAttribute | False | True | Name of the model attribute under which the form object is exposed. Defaults to 'command'. |
使用Spring的form标签主要有两个作用:
1、绑定来自Model中的一个属性值到当前form对应的实体对象,这样我们就可以在form表单体内使用该对象的属性了;
2、它支持我们在提交表单的时候使用除GET
和POST
之外的其他方法进行提交,包括DELETE
和PUT
等。
用法如下:
<form:form id="formid" name="formname" modelAttribute="DummyForm" >
当Model中存在一个属性名为DummyForm
的javaBean时,在渲染form时就会将DummyForm的对应属性值赋给对应标签的值。
<form:form id="formid" name="formname" modelAttribute="DummyForm" >
<form:hidden path="field"/><!--自动绑定DummyForm.field的值-->
</form:form>
form:checkbox
checkbox
标签会被渲染为一个type为checkbox
的普通HTML input标签。若制定了其label属性,则同时生成其对应的label(紧随input后面)checkbox
标签支持多种绑定数据的方式。
1.绑定boolean
数据
当checkbox绑定的是一个boolean数据的时候,那么checkbox的状态跟该boolean数据的状态是一样的,即true对应选中,false对应不选中。
<form:form action="formTag/form.do" method="post" commandName="user">
<table>
<tr>
<td>Male:</td><td><form:checkbox path="male"/></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="提交"/></td>
</tr>
</table>
</form:form>
看上面这段代码,这个时候假设我们在渲染该视图之前往Model中添加了一个user属性,并且该user对象有一个类型为boolean的属性male,那么这个时候如果male属性为true则Male那一栏的复选框将会被选中。
2.绑定列表数据
这里的列表数据包括数组、List和Set。下面将以List为例讲一下checkbox是如何根据绑定的列表数据来设定选中状态的。现在假设有一个类User,其有一个类型为List的属性roles,如下所示:
public class User {
private List<String> roles;
public List<String> getRoles() {
return roles;
}
public void setRoles(List<String> roles) {
this.roles = roles;
}
}
那么当我们需要展现该User是否拥有某一个Role的时候,我们可以使用checkbox标签来绑定roles数据进行展现。当checkbox标签的value在我们绑定的列表数据中存在的时候该checkbox将为选中状态。来看下面一段代码:
<form:form action="formTag/form.do" method="post" commandName="user">
<table>
<tr>
<td>Roles:</td>
<td>
<form:checkbox path="roles" value="role1"/>Role1<br/>
<form:checkbox path="roles" value="role2"/>Role2<br/>
<form:checkbox path="roles" value="role3"/>Role3
</td>
</tr>
</table>
</form:form>
就上面代码而言就是当User拥有role1
的时候对应的<form:checkbox path="roles" value="role1"/>
就会为选中状态,也就是说roles列表中包含role1的时候该checkbox就会为选中状态。
3.绑定一个Object数据
checkbox还支持绑定数据类型为Object的数据,这种情况下Spring会拿所绑定对象数据的toString结果跟当前checkbox的value进行比较,如果能够进行匹配则该checkbox将为选中状态。看这样一个例子,有一个User类代码如下:
public class User {
private Blog blog;
public Blog getBlog() {
return blog;
}
public void setBlog(Blog blog) {
this.blog = blog;
}
}
Blog类的代码如下:
public class Blog {
public String toString() {
return "HelloWorld";
}
}
我们可以看到Blog类的toString
方法已经被写死为“HelloWorld”
了。这个时候假设我们往ModelMap中放了一个user对象,而且给该user对象设定了一个blog属性,那么当我们使用该ModelMap对象渲染如下视图代码时,checkbox标签的选中状态是怎样的呢?根据前面描述的当checkbox标签绑定的是一个Object对象的时候我们会拿该Object对象的toString和checkbox的value值进行比较,如果匹配则当前checkbox为选中状态,我们知道这里的checkbox将为选中状态。
<form:form action="formTag/form.do" method="post" commandName="user">
<table>
<tr>
<td>HelloWorld:</td>
<td>
<form:checkbox path="blog" value="HelloWorld"/>
</td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="提交"/></td>
</tr>
</table>
</form:form>
spring工具标签
此节均采用以下引入方式:
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>
spring:url
Attribute | Required? | Runtime Expression? | Description |
---|---|---|---|
value | True | True | The URL to build. This value can include template {placeholders} that are replaced with the URL encoded value of the named parameter. Parameters must be defined using the param tag inside the body of this tag. |
context | False | True | Specifies a remote application context path. The default is the current application context path. |
var | False | True | The name of the variable to export the URL value to. If not specified the URL is written as output. |
scope | False | True | The scope for the var. 'application', 'session', 'request' and 'page' scopes are supported. Defaults to page scope. This attribute has no effect unless the var attribute is also defined. |
htmlEscape | False | True | Set HTML escaping for this tag, as a boolean value. Overrides the default HTML escaping setting for the current page. |
javaScriptEscape | False | True | Set JavaScript escaping for this tag, as a boolean value. Default is false. |
<spring:url value="/path/index" />
spring:url
标签的value有三种格式:
1,含有://
则认为value指定了一个绝对路径
2,非绝对路径,以/
开头,则在其前面拼接当前web上下文路径
3,非绝对路径,且不以/
开头,先拼接/
之后同2
spring:url和c:url的区别
spring:url
和c:url
最大的区别是,spring:url
可以帮你解决htmlEscape的问题,当spring:url
标签的htmlEscape属性设置为ture时,它会把查询参数连接符 &
符号化为&
因此使用c:url
时往往需要通过c:out
进行符号化处理(c:out
的escapeXml属性默认为true):
<c:url value="/something" var="url"/>
<a href="<c:out value='${url}'/>">...</a>
而使用spring:url
则只需要将htmlEscape属性设置为ture(默认为false
):
<spring:url value="/something" var="url" htmlEscape="true"/>
<a href="${url}">...</a>
而不需担心something中含所有&
的问题。
什么情况下使用spring:url
1、正如上面提到的那样,当你需要为你的url进行符号化的时候。
2、当你的url需要由动态参数构成的时候(e.g. /app/resources/{name}
) ,spring:url
支持使用占位符的方式动态作成url。
写法如下:api
<spring:url value="/url/path/{variableName}">
<spring:param name="variableName" value="more than JSTL c:url" />
</spring:url>
网友评论