使用Controller或是AbstractController,當遇到使用者提供請求參數時,您必須要自行從HttpServletRequest物件中取得請求參數,如果您打算將這些請求參數設定至某個物件,您必須自行撰寫相關邏輯或進行型態轉換等動作。
您可以繼承org.springframework.web.servlet.mvc.AbstractCommandController來實作 Controller類別,並提供一個Command物件,當使用者請求來到時,AbstractCommandController會試著比對請求參數 名稱與您的Command上的Setter方法名稱(也就是setXXX方法名稱),並呼叫對應的Setter方法以設定請求參數值,如果是Setter 上的參數是基本型態的話,也會自動轉換請求參數值為對應的型態。
舉個例子來說,假設您設計了一個User類別作為Command類別:
- User.java
package onlyfun.caterpillar;
public class User {
private String name;
private String password;
public void setName(String name) {
this.name = name;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public String getPassword() {
return password;
}
}
如果請求中包括了"name"與"password"參數,則這些參數您想要自動封裝為User實例的資訊的話,您繼承 AbstractCommandController實作Controller時,可以使用setCommandClass()來指定Command類 別,並重新定義它的handle()方法,例如:
- UserController.java
package onlyfun.caterpillar;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.*;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.
mvc.AbstractCommandController;
import org.springframework.validation.BindException;
public class UserController extends AbstractCommandController {
private String userPage;
public UserController() {
setCommandClass(User.class);
}
protected ModelAndView handle(HttpServletRequest request,
HttpServletResponse response,
Object command,
BindException exception) throws Exception {
User user = (User) command;
Map model = new HashMap();
model.put("name", user.getName());
model.put("password", user.getPassword());
return new ModelAndView(getUserPage(), "userInfo", model);
}
public void setUserPage(String userPage) {
this.userPage = userPage;
}
public String getUserPage() {
return userPage;
}
}
UserController的handle()方法中,直接取得了Command的實例,並在轉換操作介面為User之後,直接操作getName() 與getPassword()方法來取得請求參數,在以上您使用了一個Map物件來收集資訊,以在JSP網頁中呈現這些資訊,假設您的JSP網頁設計如 下:
- userinfo.jsp
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=UTF-8">
<title>AbstractCommandController Demo</title>
</head>
<body>
<h1>名稱:\${userInfo['name']}</h1>
<h1>密碼:\${userInfo['password']}</h1>
</body>
</html>
接著可以在Bean定義檔中設定相關的Bean資訊,如下所示:
- 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="urlMapping"
class="org.springframework.web.servlet.
→ handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/user.do">userController</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="userController"
class="onlyfun.caterpillar.UserController">
<property name="userPage">
<value>userInfo</value>
</property>
</bean>
</beans>