对 于 BaseCommandController 及其子类别来说,它的 Command 物件并不一定要接受基本型态或 是 String 型态,您可以撰写一个实作 java.beans.PropertyEditor 的类别,在当中进行转换, 例如将接收到的字串转换为 User 类别的实例。
举个实例来说,假设您的 Command 物件如下设计:
package onlyfun.caterpillar;
public class SomeForm {
private User user;
public void setUser(User user) {
this.user = user;
}
public User getUser() {
return user;
}
}
SomeForm 为网页表单的物件代表,而其中出现的 User 类别如下设计:
package onlyfun.caterpillar;
public class User {
private String firstName;
private String lastName;
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
}
您的 Command 物件将接收一个自订型态的 User 实例,然而从 HTTP 接收到的参数值是 String 型 态,您可以撰写一个 UserPropertyEditor 类别做转换,通常直接继承 java.beans.PropertyEditorSupport 并重新定义它的 getAsText()及 setAsText()方法,例如:
package onlyfun.caterpillar;
import java.beans.PropertyEditorSupport;
public class UserPropertyEditor extends PropertyEditorSupport {
public String getAsText() {
Object o = this.getValue();
if(o == null || !(o instanceof User)) {
return null;
}
User user = (User) o;
String name = user.getFirstName()+ "," + user.getLastName();
return name;
}
public void setAsText(String text) {
String[] tokens = text.split(",");
User user = new User();
user.setFirstName(tokens[0]);
user.setLastName(tokens[1]);
setValue(user);
}
}
当必须从指定的物件转换为字串时,会呼叫 getAsText()方法,而接收到参数要将之转换为指定 的物件时,会呼叫 setAsText()方法,接着来撰写一个测试的 Controller:
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.web. bind.ServletRequestDataBinder;
public class SomeFormController extends SimpleFormController {
public SomeFormController() {
setCommandClass(SomeForm.class);
}
protected ModelAndView onSubmit( Object command)
throws Exception {
SomeForm form = (SomeForm) command;
Map model = new HashMap();
model.put("firstName", form.getUser().getFirstName());
model.put("lastName", form.getUser().getLastName());
return new ModelAndView(this.getSuccessView(), model);
}
protected void initBinder(HttpServletRequest request,
ServletRequestDataBinder binder)
throws Exception {
super.initBinder(request, binder);
binder.registerCustomEditor(User.class, new UserPropertyEditor());
}
}
注意到这边重新定义了 initBinder()方法,并在当中使用 ServletRequestDataBinder 的 registerCustomEditor()方法注册了自订的 PropertyEditor,来看看定义档的内容:
<?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="urlMapping" class="org.springframework.web.servlet. → handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/index.do"> indexController </prop> <prop key="/someForm.do"> someFormController </prop> </props> </property> </bean> <bean id="viewResolver" class="org.springframework.web.servlet. → view.InternalResourceViewResolver"> <property name="prefix"> <value>/WEB-INF/jsp/</value> </property> <property name="suffix"> <value>.jsp</value> </property> </bean> <bean id="indexController" class="org.springframework.web.servlet. → mvc.ParameterizableViewController"> <property name="viewName"> <value>index</value> </property> </bean> <bean id="someFormController" class="onlyfun.caterpillar.SomeFormController"> <property name="successView"> <value>hello</value> </property> </bean> </beans>
现在假设撰写有一个测试网页:
<%@page contentType="text/html"%> <%@page?pageEncoding="UTF-8"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Form</title> </head> <body> <form name="someForm" action="/PropertyEditorDemo/someForm.do" method="POST"> 问题一 <input type="text" name="user"/><br> <input type="submit" value="Submit"/> </form> </body> </html>
在输入栏位中,指定由 user 属性来接受输入,当资料送出后,会经由 PropertyEditor 的转换, 假设呈现处理结果的 hello.jsp 网页是如下撰写的:
<%@page contentType="text/html"%>
<%@page?pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>User Info</title>
</head>
<body>
<h1>${firstName} - ${lastName}</h1>
</body>
</html>
如果您在 index.jsp 填入"Justin,Lin",则结果会显示"Justin-Lin"。