Spring的<spring:transform>標籤必須位於<spring:bind>標籤之中,搭配 PropertyEditor使用的話,您可以將Command的屬性值轉換為您所要的字串格式。
舉個實際的例子來說,假設您的Command中儲存了星期的數字表示,例如星期一使用"1"表示,星期二使用"2"表示…星期日使用"0"
表示,然而您希望在填寫表示時,您可以在表單上顯示的是"MON"、"THU"、"WED"等字樣,您希望使用程式自動幫您完成轉換。
可以先設計一個WeekForm類別,收集請求參數值"0"到"6":
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":
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,例如:
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來協助頁面
邏輯的撰寫:
<%@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類別:
<?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>
|