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