上一篇文章中我們講過了處理器的映射,接下來我們來一起學習下springmvc的控制器吧。
首先咱們先創建一個咱們用來測試的實體(model)類:

package cn.cfs.springmvc.domain; public class User { //主鍵 private Integer id; //用戶名 private String username; //密碼 private String password; /** * 獲取 主鍵 * * @return 主鍵 */ public Integer getId() { return id; } /** * 設置 主鍵 * * @param id 主鍵 */ public void setId(Integer id) { this.id = id; } /** * 獲取 用戶名 * * @return 用戶名 */ public String getUsername() { return username; } /** * 設置 用戶名 * * @param username 用戶名 */ public void setUsername(String username) { this.username = username; } /** * 獲取 密碼 * * @return 密碼 */ public String getPassword() { return password; } /** * 設置 密碼 * * @param password 密碼 */ public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User [id=" + id + ", username=" + username + ", password=" + password + "]"; } }
springmvc的控制器有很多種,這里只講最常用的三種:
一、CommandController命令控制器
package cn.cfs.springmvc.controller; 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; import cn.cfs.springmvc.domain.User; public class UserCommandController extends AbstractCommandController { //綁定數據 public UserCommandController() { this.setCommandClass(User.class); this.setCommandName("user"); }
@Override protected ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) throws Exception { User user =(User)command; System.out.println(user.toString()); return new ModelAndView("index"); } }
action-servlet.xml配置文件中的代碼:
<!-- 采用className的方式去訪問 --> <bean id="userCommandController" class="cn.cfs.springmvc.controller.UserCommandController"></bean>
前台通過訪問url:http://192.168.1.253:8082/springmvc_01/usercommandcontroller.action?id=99&username=aaa&password=ssss 來測試
控制台打印語句:User [id=99, username=aaa, password=ssss]
二、SimpleFormController簡單表單控制器
package cn.cfs.springmvc.controller; import org.springframework.web.servlet.mvc.SimpleFormController; import cn.cfs.springmvc.domain.User; public class UserFormController extends SimpleFormController { //在構造方法里去綁定 public UserFormController() { this.setCommandClass(User.class); this.setCommandName("user"); } @Override protected void doSubmitAction(Object command) throws Exception { User user=(User)command; System.out.println(user.toString()); } }
action-servlet.xml配置文件中的代碼:
<!-- 采用className的方式去訪問 --> <bean id="userFormController" class="cn.cfs.springmvc.controller.UserFormController"> <property name="formView" value="login" /> <property name="successView" value="index" /> </bean>
ps:formView 是通過get方法訪問這個請求處理后跳轉的頁面,successView是通過post方法訪問這個請求處理后跳轉的頁面。舉個例子,例如添加用戶,肯定先要跳轉到添加用戶的頁面上,然后在表單中填寫一些用戶信息,點擊保存提交按鈕跳轉到控制器中,處理完自己的業務代碼再跳到指定頁面,這種簡單表單方式就是為了解決這種需求。
訪問路徑:http://192.168.1.253:8082/springmvc_01/userformcontroller.action 跳轉到添加頁面的地址,因為是直接在瀏覽器敲的所以是get方式訪問的,會跳轉到login.jsp頁面上

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>登錄</title> </head> <body> <form action="${pageContext.request.contextPath}/userformcontroller.action" method="post"> <table> <tr> <td>用戶名:</td> <td><input type="text" name="username" /></td> </tr> <tr> <td>密碼:</td> <td><input type="password" name="password" /></td> </tr> <tr> <td colspan="2"><input type="submit" value="保存提交" /></td> </tr> </table> </form> </body> </html>
根據上面login.jsp中代碼所示,輸入完用戶名和密碼后,點擊保存提交按鈕,通過form中post的方式將表單內容提交到userformcontroller.action這個請求上,回通過控制器找到doSubmitAction這個方法,在這個方法中處理自己業務邏輯,最后跳轉到index.jsp頁面上,最后總結一下,這種方式是通過get和post提交方式來區分跳轉的頁面的,只有post提交方式才會跳轉到帶有處理自己業務邏輯的后台方法中。
控制台打印語句:User [id=null, username=aaaa, password=123456]
三、WizardFormController向導控制器
package cn.cfs.springmvc.controller; 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.AbstractWizardFormController; import cn.cfs.springmvc.domain.User; public class UserWizardController extends AbstractWizardFormController { //綁定數據 public UserWizardController() { this.setCommandClass(User.class); this.setCommandName("user"); } /** * 完成提交的函數 */ @Override protected ModelAndView processFinish(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) throws Exception { User user=(User)command; System.out.println(user.toString()); return new ModelAndView("index"); } /** * 取消方法,配置點擊取消后要跳轉的頁面 */ @Override protected ModelAndView processCancel(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) throws Exception { return new ModelAndView("index"); } }
action-servlet.xml配置文件中的代碼:
<!-- 采用className的方式去訪問 --> <bean id="userwizardcontroller" class="cn.cfs.springmvc.controller.UserWizardController"> <property name="pages"> <list> <value>/wizard/1</value> <value>/wizard/2</value> <value>/wizard/3</value> </list> </property> </bean>
ps: list下的value為跳轉的頁面,對應的上下文中會創建一個叫wizard的文件夾,以及對應的3個頁面文件
訪問路徑:http://192.168.1.253:8082/springmvc_01/userwizardcontroller.action 會按照list中value的先后順序去加載頁面

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>向導表單控制器</title> </head> <body> <form action="${pageContext.request.contextPath}/userwizardcontroller.action" method="post"> <table> <tr> <td> 第一個頁面,id <input type="text" name="id" value="${user.id}" /> </td> </tr> <tr> <td> <input type="submit" name="_target1" value="下一步" /> <input type="submit" name="_cancel" value="取消" /> </td> </tr> </table> </form> </body> </html>

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>向導表單控制器</title> </head> <body> <form action="${pageContext.request.contextPath}/userwizardcontroller.action" method="post"> <table> <tr> <td> 第二個頁面,用戶名 <input type="text" name="username" value="${user.username}"/> </td> </tr> <tr> <td> <input type="submit" name="_target0" value="上一步" /> <input type="submit" name="_cancel" value="取消" /> <input type="submit" name="_target2" value="下一步" /> </td> </tr> </table> </form> </body> </html>

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>向導表單控制器</title> </head> <body> <form action="${pageContext.request.contextPath}/userwizardcontroller.action" method="post"> <table> <tr> <td> 第三個頁面,密碼 <input type="text" name="password" value="${user.password}" /> </td> </tr> <tr> <td> <input type="submit" name="_target1" value="上一步" /> <input type="submit" name="_finish" value="完成" /> <input type="submit" name="_cancel" value="取消" /> </td> </tr> </table> </form> </body> </html>
ps:上面的jsp文件中主要是通過 提交按鈕的 name名稱去控制上下頁,取消,完成操作的,詳細請看下面的表格(1-1);
屬性 | 具體的的含義 |
_targetN | N是可變化的,指具體的頁碼,從0開始,例如當前為第二頁,上一頁則為_target0,下一頁則為_target1 |
_cancel | 取消,點擊后請求發送到后台的取消方法中,根據具體的配置跳轉到指定的取消頁面 |
_finish | 完成,點擊后請求發送到后台的完成方法中,會自動將向導頁的表單數據做拼接,根據具體的配置跳轉到指定的完成請求處理后的頁面 |
上述為當前springmvc比較常用的控制器,當然還有很多,例如默認的AbstractController這是最簡單控制器,很多參數都需要通過原始的方法去獲取,后續還待完善。