1.ServletForwardingController
將接受到的請求轉發到一個命名的Servlet
package cn.javass.chapter4.web.servlet;
public class ForwardingServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.getWriter().write("Controller forward to Servlet");
}
}
<servlet>
<servlet-name>forwarding</servlet-name>
<servlet-class>cn.javass.chapter4.web.servlet.ForwardingServlet</servlet-class>
</servlet>
<!— 在chapter4-servlet.xml配置處理器 -->
<bean name="/forwardToServlet"
class="org.springframework.web.servlet.mvc.ServletForwardingController">
<property name="servletName" value="forwarding"></property>
</bean>
當我們請求/forwardToServlet時,會被轉發到名字爲“forwarding”的servlet處理,該sevlet的servlet-mapping標籤配置是可選的。
2.BaseCommandController
命令控制器通用類,提供了以下功能:
- 數據綁定:請求參數綁定到一個command object(命令對象,非GoF裏的命令設計模式),這裏的命令對象是指綁定請求參數的任何POJO對象;
commandClass:表示命令對象實現類,如UserModel;
commandName:表示放入請求的命令對象名字(默認command),reuqest.setAttribute(commandName,commandObject); - 驗證功能:提供Validator註冊功能,註冊的驗證器會驗證命令對像屬性是否合法;
3.AbstractCommandController
命令控制器之一,可以實現該控制器來創建命令控制器,該控制器能把自動封裝請求參數到一個命令對象,而且提供了驗證功能。
- 創建POJO
package cn.javass.chapter4.model;
public class UserModel {
private String username;
private String password;
//省略setter/getter
}
2.實現控制器
package cn.javass.chapter4.web.controller;
//省略import
public class MyAbstractCommandController extends AbstractCommandController {
public MyAbstractCommandController() {
//設置命令對象實現類
setCommandClass(UserModel.class);
}
@Override
protected ModelAndView handle(HttpServletRequest req, HttpServletResponse resp, Object command, BindException errors) throws Exception {
//將命令對象轉換爲實際類型
UserModel user = (UserModel) command;
ModelAndView mv = new ModelAndView();
mv.setViewName("abstractCommand");
mv.addObject("user", user);
return mv;
}
}
<!— 在chapter4-servlet.xml配置處理器 -->
<bean name="/abstractCommand"
class="cn.javass.chapter4.web.controller.MyAbstractCommandController">
<!-- 也可以通過依賴注入 注入命令實現類 -->
<!-- property name="commandClass" value="cn.javass.chapter4.model.UserModel"/-->
</bean>
<!— WEB-INF/jsp/abstractCommand.jsp視圖下的主要內容 -->
${user.username }-${user.password }
在瀏覽器中輸入““http://localhost:8080/springmvc-chapter4/abstractCommand?username=123&password=123””,會自動請求參數username賀password綁定到對象 ;綁定時按照JAVABean命名規範綁定;
4.AbstractFormController
用於支持帶步驟的表單提交的命令控制器基類,使用該控制器可以完成:
- 定義表單處理(表單的渲染),並從控制器獲取命令對象構建表單;
- 提交表單處理,當用戶提交表單內容後,AbstractFormController可以將用戶請求的數據綁定到命令對象,並可以驗證表單內容、對命令對象進行處理
@Override
rotected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)
throws Exception {
//1、是否是表單提交? 該方法實現爲("POST".equals(request.getMethod())),即POST表示表單提交
if (isFormSubmission(request)) {
try {
Object command = getCommand(request);
ServletRequestDataBinder binder = bindAndValidate(request, command);
BindException errors = new BindException(binder.getBindingResult());
//表單提交應該放到該方法實現
return processFormSubmission(request, response, command, errors);
}
catch (HttpSessionRequiredException ex) {
//省略部分代碼
return handleInvalidSubmit(request, response);
}
}
else {
//2、表示是表單展示,該方法又轉調showForm方法,因此我們需要覆蓋showForm來完成表單展示
return showNewForm(request, response);
}
bindOnNewForm:是否在進行表單展示時綁定請求參數到表單對象,默認false,不綁定;
sessionForm: session表單模式,如果開啓(true)則會將表單對象放置到session中,從而可以跨越多次請求保證數據不丟失(多步驟表單常使用該方式,詳解AbstractWizardFormController),默認false;
Object formBackingObject(HttpServletRequest request) :提供給表單展示時使用的表單對象(form object表單要展示的默認數據),默認通過commandName暴露到請求給展示表單;
Map referenceData(HttpServletRequest request, Object command, Errors errors):展示表單時需要的一些引用數據(比如用戶註冊,可能需要選擇工作地點,這些數據可以通過該方法提供)。
protected Map referenceData(HttpServletRequest request) throws Exception {
Map model = new HashMap();
model.put("cityList", cityList);
return model;
}
5.SimpleFormController
提供了更好的的表單支持
- 準備要展示的數據,併到表單展示頁面;
- 提交數據進行處理。
第一步:展示
第二步:提交表單
①控制器
package cn.javass.chapter4.web.controller;
//省略import
public class RegisterSimpleFormController extends SimpleFormController {
public RegisterSimpleFormController() {
setCommandClass(UserModel.class); //設置命令對象實現類
setCommandName("user");//設置命令對象的名字
}
//form object 表單對象,提供展示表單時的表單數據(使用commandName放入請求)
protected Object formBackingObject(HttpServletRequest request) throws Exception {
UserModel user = new UserModel();
user.setUsername("請輸入用戶名");
return user;
}
//提供展示表單時需要的一些其他數據
protected Map referenceData(HttpServletRequest request) throws Exception {
Map map = new HashMap();
map.put("cityList", Arrays.asList("山東", "北京", "上海"));
return map;
}
protected void doSubmitAction(Object command) throws Exception {
UserModel user = (UserModel) command;
//TODO 調用業務對象處理
System.out.println(user);
}
}
setCommandClass和setCommandName:分別設置了命令對象的實現類和名字;
formBackingObject和referenceData:提供了表單展示需要的視圖;
doSubmitAction:用於執行表單提交動作,由onSubmit方法調用,如果不需要請求/響應對象或進行數據驗證,可以直接使用doSubmitAction方法進行功能處理。
②spring配置
<bean name="/simpleForm"
class="cn.javass.chapter4.web.controller.RegisterSimpleFormController">
<property name="formView" value="register"/>
<property name="successView" value="redirect:/success"/>
</bean>
<bean name="/success" class="cn.javass.chapter4.web.controller.SuccessController"/>
formView:表示展示表單時顯示的頁面;
successView:表示處理成功時顯示的頁面;“redirect:/success”表示成功處理後重定向到/success控制器;防止表單重複提交;
③視圖
<!-- register.jsp 註冊展示頁面-->
<form method="post">
username:<input type="text" name="username" value="${user.username}"><br/>
password:<input type="password" name="username"><br/>
city:<select>
<c:forEach items="${cityList }" var="city">
<option>${city}</option>
</c:forEach>
</select><br/>
<input type="submit" value="註冊"/>
</form>
此處可以使用${user.username}
獲取到formBackingObject設置的表單對象、使用${cityList}
獲取referenceData設置的表單支持數據;
6.CancellableFormController
一個可以取消的表單控制器,集成SimpleFormController,額外提供獲取表單功能。
①控制器
@Override
protected ModelAndView onCancel(Object command) throws Exception {
UserModel user = (UserModel) command;
//TODO 調用業務對象處理
System.out.println(user);
return super.onCancel(command);
}
onCancel:在該功能方法內實現取消邏輯,父類的onCancel方法默認返回cancelView屬性指定的邏輯視圖名。
②spring配置
<bean name="/canCancelForm"
class="cn.javass.chapter4.web.controller.CanCancelRegisterSimpleFormController">
<property name="formView" value="register"/>
<property name="successView" value="redirect:/success"/>
<property name="cancelView" value="redirect:/cancel"/>
</bean>
<bean name="/cancel" class="cn.javass.chapter4.web.controller.CancelController"/>
cancelParamKey:用於判斷是否是取消的請求參數名,默認是_cancel,即如果請求參數數據中含有名字_cancel則表示是取消,將調用onCancel功能處理方法;
cancelView:表示取消時時顯示的頁面;“redirect:/cancel”表示成功處理後重定向到/cancel控制器;防止表單重複提交;
③視圖
<input type="submit" name="_cancel" value="取消"/>
該提交按鈕的作用是取消,因爲name=”_cancel”,即請求後會有一個名字爲_cancel的參數,因此會執行onCancel功能處理方法。
④測試
在瀏覽器輸入“http://localhost:8080/springmvc-chapter4/canCancelForm”,則首先到展示視圖頁面,點擊“取消按鈕”將重定向到“http://localhost:8080/springmvc-chapter4/cancel”,說明取消成功了。