|
接下來實作WelcomeAction與LoginAction,它們是這個例子中實際處理客戶端請求的類別,算是控制器設計的一部份,先看看WelcomeAction,它要實作IAction介面:
package onlyfun.caterpillar; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class WelcomeAction implements IAction { public void execute(HttpServletRequest req, HttpServletResponse res) { RequestDispatcher dispatcher = req.getRequestDispatcher( "WEB-INF/pages/welcome.jsp"); try { dispatcher.forward(req, res); } catch (ServletException e) { } catch (IOException e) { } } }
如您所見的,當使用者請求/welcome.action時,會由WelcomeAction的實例來處理請求,而它所作的,就是將使用者送至WEB-
INF/pages/welcome.jsp,放置在WEB-INF目錄下的資源除了透過伺服器內部的轉發之外,沒有辦法由客戶端直接讀取,所以透過控制
器是唯一訪問的方式,從而保證了前端控制器的作用。上面的程式中為了簡化,沒有實作例外處理。
再來看使用者請求/login.action時,LoginAction作了什麼事:
package onlyfun.caterpillar; import java.io.IOException; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.util.HashMap; import java.util.Map; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class LoginAction implements IAction { public void execute(HttpServletRequest req, HttpServletResponse res) { try { req.setCharacterEncoding("Big5"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } String username = req.getParameter("username"); String password = req.getParameter("password"); RequestDispatcher dispatcher = null; if(username != null && password != null && username.equals("caterpillar") && password.equals("123456")) { // 取得資料 // .... // 使用Map物件收集值,以供View讀取 Map model = new HashMap(); model.put("username", username); model.put("secret", "秘密資料!!"); // 簡單的透過request物件傳送值 req.setAttribute("model", model); dispatcher = req.getRequestDispatcher( "WEB-INF/pages/success.jsp"); } else { req.setAttribute("fail", "名稱、密碼不符"); dispatcher = req.getRequestDispatcher( "WEB-INF/pages/fail.jsp"); } try { dispatcher.forward(req, res); } catch (ServletException e) { } catch (IOException e) { } } }
如上所示的,當使用者的資料驗證成功時,將會被轉發至WEB-INF/pages/success.jsp頁面,以顯示它的秘密資料,這邊簡單的使用
Map來收集要於View上顯示的資料,實際上您可以設計自己的值物件,在更複雜的應用中,還會用到下一層的Model物件,像是往底層的資料庫索取資
料。
如果使用者資料驗證失敗,則送往WEB-INF/pages/fail.jsp。
|