Spring Framework 筆記 (四)
在 Web Application 裡面,Form 是一個非常重要的元素,透過 Form,使用者可以 submit 資料到後端的程式。另外 Form 的資料要如何的對應到後端的資料庫 Table 資料、Form 上面資料的資料驗證等等都是在 Form 的處理上需要考慮到的 issues。Spring 已經內建了不少實用的 Controller,其中有一個是 SimpleFormController。
底下是 Spring 一部份的 class diagram,從裡面可以看到 Controller 端,最上層是 Controller Interface,包含單一的 method - handleRequest。首先先看一下 SimpleFormController 的部分 Source Code:
public class SimpleFormController extends AbstractFormController {
private String formView;
private String successView;
protected ModelAndView onSubmit(
HttpServletRequest request, HttpServletResponse response, Object command, BindException errors)
throws Exception {
return onSubmit(command, errors);
}
...
}
上面的 Source Code 可以看出來,SimpleFormController 繼承自 AbstractFormController,而且它需要formView、successView 以及 command object。formView 可以視為呈現該 form 的頁面,successView 可以視為是 form submit 成功之後,會導向過去的成功頁。至於 Command object 可以視為是把 form 上面的欄位包裝起來的一個 object。而 onSubmit method 是當 form 點了 submit button 之後會 fire 的 method,也是我們需要覆寫的部分。
假設現在我們需要設計一個 login form,裡面只有兩個欄位,一個是 login name 另外一個是 password 欄位,我們需要做 login 以及 password 的檢查,若是檢查成功,則將使用者導到 success.jsp,若是失敗則秀出錯誤訊息。這個簡單的 form HTML soruce 如下:
<html>
<head><title>Spring Login Test</title></head>
<body>
<form name="loginForm" method="POST" action="login.do">
Login: <input name="login" type="text" > <br/>
Password: <input name="passwd" type="password"> <br/>
<input type="submit" value="login">
</form>
</body>
</html>
上面是一個非常典型的 Form 程式,包含了一個 login 欄位,以及 password 欄位,而 submit action 是 login.do,而我們現在要使用 spring SimpleFormController 來處理這個 Form。
因為我們設定的 form action 是 login.do,因此我們需要在 web.xml 上面設定 *.do 類型的檔案由 spring 處理:
<servlet-mapping>
<servlet-name>springapp</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
除此之外,我們得要設定 URL mapping,將 login.do mapping 到處理該 submition 的 spring controller。
<!-- URL Mapping Defination -->
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/hello.htm">springappController</prop>
<prop key="/login.do">springappSimpleFormController</prop>
</props>
</property>
</bean>
就如同上面 SimpleFormController source code 所示,我們需要一個 command object 來包含 form 上面的 element,因此我們先產生一個 JavaBean 包括兩個欄位,login 以及 passwd:
package com.esolution.Model;
public class Member {
private String login;
private String passwd;
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
}
接著設定 Spring 設定檔,將 Controller 的 property 填入:
<bean id="springappSimpleFormController" class="com.esolution.Controller.SpringappSimpleFormController">
<property name="formView">
<value>login</value>
</property>
<property name="commandClass">
<value>com.esolution.Model.Member</value>
</property>
<property name="successView">
<value>success</value>
</property>
</bean>
首先我們需要一個繼承自 SimpleFormController 的 Controller,也就是上面的 springappSimpleFormController,接著我們需要設定它的 formView、commandClass、以及 successView 。formView 代表我們的 form 頁面為 login.jsp、command class 為 Member JavaBean,成功之後會導向 success.jsp。 接著讓我們撰寫 com.esolution.Controller.SpringappSimpleFormController:
package com.esolution.Controller;
import org.springframework.web.servlet.mvc.SimpleFormController;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.validation.*;
import javax.servlet.http.*;
import java.util.*;
import com.esolution.Model.*;
public class SpringappSimpleFormController extends SimpleFormController {
public ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object Command, BindException errors) throws Exception
{
Member memberForm = (Member)Command;
Map model = errors.getModel();
model.put("login", memberForm.getLogin());
model.put("passwd", memberForm.getPasswd());
return new ModelAndView(this.getSuccessView(),model);
}
}
當使用者在 login.jsp 輸入帳號密碼之後,按下 submit 之後,會進入 SpringappSimpleFormController 的 onSubmit method,而根據 JSP 上面的 spring binding,以及 spring 設定檔設定該 command class 為 Member JavaBean,因此我們只要把 Command 轉型為 Member JavaBean,我們就可以直接取出使用者輸入的值了。在這邊我們只是把值取出之後,傳送到 sucessView 頁面。
沒有留言:
張貼留言