ITEEDU

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。