ITEEDU

<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>