接下来实现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。
|