Spring的<spring:transform>標籤必須位於<spring:bind>標籤之中,搭配 PropertyEditor使用的話,您可以將Command的屬性值轉換為您所要的字串格式。
舉個實際的例子來說,假設您的Command中儲存了星期的數字表示,例如星期一使用"1"表示,星期二使用"2"表示…星期日使用"0" 表示,然而您希望在填寫表示時,您可以在表單上顯示的是"MON"、"THU"、"WED"等字樣,您希望使用程式自動幫您完成轉換。
可以先設計一個WeekForm類別,收集請求參數值"0"到"6":
- WeekForm.java
package onlyfun.caterpillar;
public class WeekForm {
private String weekNumber;
public void setWeekNumber(String weekNumber) {
this.weekNumber = weekNumber;
}
public String getWeekNumber() {
return weekNumber;
}
}
weekNumber儲存的是"1"、"2"、"3"之類的請求參數值,接著您可以設計一個WeekPropertyEditor類別來轉換這些參數值為"MON"、"TUE"到"SUN":
- WeekPropertyEditor.java
package onlyfun.caterpillar;
import java.beans.PropertyEditorSupport;
public class WeekPropertyEditor extends PropertyEditorSupport {
public void setAsText(String text) {
if("MON".equals(text)) {
setValue("1");
}
else if("TUE".equals(text)) {
setValue("2");
}
else if("WED".equals(text)) {
setValue("3");
}
else if("THU".equals(text)) {
setValue("4");
}
else if("FRI".equals(text)) {
setValue("5");
}
else if("SAT".equals(text)) {
setValue("6");
}
else if("SUN".equals(text)) {
setValue("0");
}
else {
setValue("");
}
}
public String getAsText() {
if(this.getValue() != null
&& !(this.getValue() instanceof String)) {
return "";
}
String text = (String) this.getValue();
if("1".equals(text)) {
return "MON";
}
else if("2".equals(text)) {
return "TUE";
}
else if("3".equals(text)) {
return "WED";
}
else if("4".equals(text)) {
return "THU";
}
else if("5".equals(text)) {
return "FRI";
}
else if("6".equals(text)) {
return "SAT";
}
else if("0".equals(text)) {
return "SUN";
}
else {
return text;
}
}
}
您在設計Controller時,必須重新定義initBinder()方法以註冊這個自訂的PropertyEditor,例如:
- WeekFormController.java
package onlyfun.caterpillar;
import org.springframework.web.servlet.
mvc.SimpleFormController;
import org.springframework.web.servlet.*;
import java.util.*;
import javax.servlet.http.HttpServletRequest;
import org.springframework.validation.BindException;
import org.springframework.web.
bind.ServletRequestDataBinder;
public class WeekFormController extends SimpleFormController {
private Map refData;
public WeekFormController() {
setCommandClass(WeekForm.class);
refData = new HashMap();
List list = new ArrayList();
for(int i = 0; i < 7; i++) {
list.add(String.valueOf(i));
}
refData.put("weekNumbers", list);
}
protected ModelAndView onSubmit(Object command,
BindException errors) throws Exception {
WeekForm form = (WeekForm) command;
if(form.getWeekNumber() == null) {
return new ModelAndView(this.getFormView());
}
else {
return new ModelAndView(
this.getSuccessView(), errors.getModel());
}
}
protected Map referenceData(
HttpServletRequest request) throws Exception {
return refData;
}
protected void initBinder(HttpServletRequest request,
ServletRequestDataBinder binder) throws Exception {
super.initBinder(request, binder);
binder.registerCustomEditor(
String.class, new WeekPropertyEditor());
}
}
在建構WeekFormController時,會預先準備好"0"到"6"的字串值,referenceData()方法會返回包括這些字串值的Map 物件,以在頁面上加以顯示,由於在initBinder()中註冊了自訂的WeekPropertyEditor,再配合<spring: transform>標籤,就可以在頁面上顯示"SUN"、"MON"等文字,頁面form.jsp的設計如下所示,當中搭配了JSTL來協助頁面 邏輯的撰寫:
- form.jsp
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@taglib prefix="c"
uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="spring"
uri="http://www.springframework.org/tags"%>
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<spring:bind path="command.*">
<font color="red">
<c:out value="\${status.errorMessage}"/>
</font>
</spring:bind>
<form name="weekForm"
action="/TransFormTagDemo/weekForm.do"
method="POST">
<spring:bind path="command.weekNumber">
<select name="weekNumber">
<c:forEach var="weekNumber"
items="\${weekNumbers}" >
<spring:transform value="\${weekNumber}"
var="weekName"/>
<c:choose>
<c:when test="\${status.value == weekName}">
<option value="<c:out value="\${weekName}"/>"
selected>
</c:when>
<c:otherwise>
<option value="<c:out value="\${weekName}"/>">
</c:otherwise>
</c:choose>
<c:out value="\${weekName}"/>
</option>
</c:forEach>
</select>
</spring:bind>
<input type="submit" value="Submit"/>
</form>
</body>
</html>
Bean定義檔如下撰寫,由於使用了JSTL,所以在InternalResourceViewResolver的"viewClass"的設定上可以使用JstlView類別:
- mvc-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="viewResolver"
class="org.springframework.web.servlet.
→ view.InternalResourceViewResolver">
<property name="viewClass">
<value>
org.springframework.web.servlet.view.JstlView
</value>
</property>
<property name="prefix">
<value>/WEB-INF/jsp/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
<bean name="/weekForm.do"
class="onlyfun.caterpillar.WeekFormController">
<property name="formView">
<value>form</value>
</property>
<property name="successView">
<value>success</value>
</property>
</bean>
</beans>