From Gossip@caterpillar

JSP/Servlet: 使用 Model 收集值

 

 


接下來實作WelcomeAction與LoginAction,它們是這個例子中實際處理客戶端請求的類別,算是控制器設計的一部份,先看看WelcomeAction,它要實作IAction介面:
  • WelcomeAction.java
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作了什麼事:

  • LoginAction.java
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。