大可制作:QQ群:31564239(asp|jsp|php|mysql)

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。