閱讀488 返回首頁    go 阿裏雲 go 技術社區[雲棲]


MVC架構探究及其源碼實現(6)-簡單示例

博學,切問,近思--詹子知 (https://jameszhan.github.io)


在前一係列的文章中,我們已經完成了MVC架構模式的簡單實現,盡管有些粗糙,有些功能還不完善,但是,麻雀雖小,五髒俱全。我們現在就用這個小小的框架,來實現我們的幾個簡單的應用。
限於篇幅,我們不可能把應用的所有代碼都貼上來,我們先來演示一個Hello World的簡單應用。
實現控製器HelloController.javapackage com.google.mvc.web.sample; import java.util.Date; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; import com.google.mvc.web.servlet.ModelAndView; import com.google.mvc.web.servlet.mvc.Controller; public class HelloController implements Controller { private static final Logger LOGGER = Logger.getLogger(HelloController.class); @Override public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { String now = (new Date()).toString(); LOGGER.info("Returning hello view with " + now); return new ModelAndView("hello", "now", now); } } 我們再來看看具體的配置(mvc.config.xml)<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="https://www.springframework.org/schema/beans" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean /> <bean /> <bean > <property name="viewClass" value="com.google.mvc.web.servlet.mvc.InternalResourceView"/> <property name="prefix" value="/WEB-INF/"/> <property name="suffix" value=".jsp"/> </bean> <bean /> <bean /> </beans> 相應的View文件hello.jsp的實現<html> <head> <title>Hello World</title> </head> <body> <strong>Current time is ${now}</strong> </body> </html> 根據我們之前的配置,我們應把此文件放到WEB-INF目錄下 。

到現在為止,我們簡單的HelloWorld的應用就已經完成了。部署完成後,我們訪問application下的hello.do便可以訪問此頁麵,並且可以看到當前時間的顯示。是不是很簡單呀。

這個應用確實是太簡單了,以至於我們無法看出MVC的任何強大之處。下麵我們再看一個稍微複雜一點的例子,用戶登錄的驗證。
首先,我們來實現我們的控製器LoginController.java package com.google.mvc.web.sample; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; import com.google.mvc.web.servlet.ModelAndView; import com.google.mvc.web.servlet.mvc.Controller; public class LoginController implements Controller { private static final Logger LOGGER = Logger.getLogger(LoginController.class); private static final Map<String, String> MAP = new HashMap<String, String>(); static{ MAP.put("james", "123456"); MAP.put("andy", "123456"); MAP.put("link", "123456"); MAP.put("sample", "123456"); } @Override public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { String username = request.getParameter("username"); String password = request.getParameter("password"); if(LOGGER.isDebugEnabled()){ LOGGER.debug("username = " + username); LOGGER.debug("password = " + password); } if(username == null || password == null){ return new ModelAndView("login"); } username = username.trim(); password = password.trim(); String errMessage = null; if(username.equals("") || password.equals("")){ errMessage = "User name or password can't be empty!"; }else{ String pass = MAP.get(username); if(pass == null){ errMessage = "User doesn't exist!"; }else if(!password.equals(pass)){ errMessage = "Wrong password!"; } } if(errMessage == null){ return new ModelAndView("success", "username", username); }else{ return new ModelAndView("failure", "errMessage", errMessage); } } } 為了簡單起見,我們使用Map來維護用戶的基本信息。同樣,我們需要把我們的控製器配置到我們的係統當中,參照前一個示例的配置,我們隻需要在mvc.config.xml中加入下麵的一行代碼即可。<bean /> 因為登陸過程中,可能會遇到不同的情況,我們需要為不同的狀態準備不同的視圖。

1.默認登錄頁麵實現(login.jsp):<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="https://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>Login Page</title> </head> <body> <table width="400" border="1" align="center"> <form action="login.do" method="post" enctype="application/x-www-form-urlencoded"> <tr> <td>User Name:</td> <td><input name="username" type="text" /></td> </tr> <tr> <td>Password:</td> <td><input name="password" type="password" /></td> </tr> <tr> <td colspan="2"><button type="submit">Submit</button></td> </tr> </form> </table> </body> </html> 2.登陸成功頁麵實現(success.jsp):<b>Welcome, ${username}</b> 3.登陸失敗頁麵的實現(failure.jsp):<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="https://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>Login Page</title> </head> <body> <form action="login.do" method="post" enctype="application/x-www-form-urlencoded"> <table width="400" border="1" align="center"> <tr> <td>User Name:</td> <td><input name="username" type="text" /></td> </tr> <tr> <td>Password:</td> <td><input name="password" type="password" /></td> </tr> <tr> <td colspan="2"><button type="submit">Submit</button></td> </tr> <tr> <td colspan="2" mce_>${errMessage}</td> </tr> </table> </form> </body> </html> 到這裏,我們的登陸功能已經基本完成了。部署好應用後,你就可以通過訪問login.do來測試我們這個應用的功能了。

盡管我們的MVC框架功能比較簡單,但是擴展能力還是很強的,因為我們的目地是為了通過源碼實現去更好地掌握MVC框架的實現原理,所以我們將不對此框架進行優化,畢竟,現在成熟而優秀的MVC框架已經有很多了。

相關文章:

  1. MVC架構探究及其源碼實現(1)-理論基礎
  2. MVC架構探究及其源碼實現(2)-核心組件定義
  3. MVC架構探究及其源碼實現(3)-WebApplicationContext
  4. MVC架構探究及其源碼實現(4)-前端控製器
  5. MVC架構探究及其源碼實現(5)-相關組件實現

最後更新:2017-04-02 04:01:42

  上一篇:go 你忙吧 不打擾你了
  下一篇:go 張亞勤:解讀“雲計算”&amp;amp;amp; 微軟藍天的優勢。