<spring:transform> 標籤


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>