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框架已經有很多了。
相關文章:
- MVC架構探究及其源碼實現(1)-理論基礎
- MVC架構探究及其源碼實現(2)-核心組件定義
- MVC架構探究及其源碼實現(3)-WebApplicationContext
- MVC架構探究及其源碼實現(4)-前端控製器
- MVC架構探究及其源碼實現(5)-相關組件實現
最後更新:2017-04-02 04:01:42