ITEEDU

AbstractCommandController

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