使用Controller或是AbstractController,當遇到使用者提供請求參數時,您必須要自行從HttpServletRequest物件中取得請求參數,如果您打算將這些請求參數設定至某個物件,您必須自行撰寫相關邏輯或進行型態轉換等動作。
您可以繼承org.springframework.web.servlet.mvc.AbstractCommandController來實作
Controller類別,並提供一個Command物件,當使用者請求來到時,AbstractCommandController會試著比對請求參數
名稱與您的Command上的Setter方法名稱(也就是setXXX方法名稱),並呼叫對應的Setter方法以設定請求參數值,如果是Setter
上的參數是基本型態的話,也會自動轉換請求參數值為對應的型態。
舉個例子來說,假設您設計了一個User類別作為Command類別:
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()方法,例如:
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網頁設計如
下:
<%@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資訊,如下所示:
<?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>
|