今天来介绍一下Spring的AbstractCommandController。Spring的Controller有很多选择,在你的应用中选择最合适的一个将会让你事半功倍。Spring Controller有一个自上而下的等级分类,基本上是从简单到复杂:
Controller, AbstractController-->ThrowawayController-->MultiActionController-->BaseCommandController, AbstractCommandController-->AbstractFormController, SimpleFormController-->AbstractWizardFormController
如果Controller中不需要处理逻辑事务,或者只需要少量的功能,大都可以继承AbstractController。如果需要处理请求中的输入,那么可以继承AbstractCommandController。这就是今天要介绍的内容。注意,环境参照Spring的简单例子。
首先,我们编写一个index.jsp:
<%@
page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%><!
DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><
html><
head><
meta. http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><
title>Index Page</title></
head><
body><
center><
form. action="user.do" method="post">Username:
<input type="text" name="username" /><br/>Password:
<input type="password" name="password" /><br/><
input type="submit" value="Submit" /></
form></
center></
body></
html>这里我们要接收username和password两个参数。
然后配置web.xml:
<?
xml version="1.0" encoding="UTF-8"?><
web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <servlet> <servlet-name>test</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>test</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <display-name>SpringTest
</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list></
web-app>test-servlet.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 name="/user.do" class="src.UserCommandController"> <property name="page"> <value>user</value> </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></
beans>我们先写一个User类,可以看成User Bean(User.java):
package
src;public
class User { private String username; private String password; public User(){}
public String getPassword() { return password;}
public void setPassword(String password) { this.password = password;}
public String getUsername() { return username;}
public void setUsername(String username) { this.username = username;}
}
这里也就两个属性即username和password,同时还有相应的get和set方法。
然后就是UserCommandController.java:
package
src;import
java.util.ArrayList;import
java.util.List;import
javax.servlet.http.HttpServletRequest;import
javax.servlet.http.HttpServletResponse;import
org.springframework.validation.BindException;import
org.springframework.web.servlet.ModelAndView;import
org.springframework.web.servlet.mvc.AbstractCommandController;public
class UserCommandController extends AbstractCommandController{ private String page; public UserCommandController(){setCommandClass(User.
class);}
public ModelAndView handle(HttpServletRequest request,HttpServletResponse response,
Object command,
BindException errors)
throws Exception{User user = (User)command;
String username = user.getUsername();
String password = user.getPassword();
List list =
new ArrayList();list.add(0, username);
list.add(1, password);
return new ModelAndView(getPage(), "info", list);}
public String getPage() { return page;}
public void setPage(String page) { this.page = page;}
}
这个控制器要处理输入的username和password(很简单),不像在Struts中必须要继承ActionForm。该类有一个要覆盖的handle()方法。在handle()方法中,command就是输入的一个对象,这里需要先转化为User类,并调用相应的方法得到username和password两个参数。然后放到一个list里面,再调用getPage()方法传回到指定的视图去。这个视图名则在test-servlet.xml中指明了为user。这里我们可以看出Spring框架的灵活性。要修改映射或者指定视图等的话只要在配置文件里面修改就可以了,而不用修改源程序。
那么接下来就是user.jsp:
<%@
page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%><!
DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><
html><
head><
meta. http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><
title>User Information Page</title></
head><
body><
center><
h1>Your username is:${info[0] }</h1><br/><
h1>Your password is:${info[1] }</h1></
center></
body></
html>这里就把刚刚的username和password显示了出来。
处理简单的输入可以采用AbstractCommandController,就像这个例子一样。可以根据实际情况增加相应的代码来满足不同的需求。
当然,处理表单还有SimpleFormController和AbstractFormController,以后会讲这类控制器的例子。