Fork me on GitHub

Programming Design Notes

最簡單的方式實現 MVC (Servlet + JSP)

| Comments

Model-View-Controller 是現時流行的系統架構,Model 代表模型(資料),View 代表視圖,Controller 代表控制器,使用 Servlet 和 JSP 實現 MVC 系統架構是非常簡單的,可以在完全不使用仕何 Framework 的情況下實現 MVC。

下圖顯示出 Model, View 和 Controller 的關係,以 Controller 為中心,控制整個流程。


大部份的開發者也會將 HTML 和 其他程式碼混合到一個檔案內,雖然這樣的做發可能令開發時間減少,但以後要修改或維護時便非常困難,要實現 MVC 時不能令視圖被使用者直接用到,如果能被直接用1到便失去了 MVC 的價值,所以私們要將視圖(JSP) 放到使用者不能進入的位置。

在 WEB-INF 資料夾下新增一個 pages 的資料夾,在 WEB-INF/pages 資料夾下新增一個 index.jsp 的檔案並貼上以下程式碼。WEB-INF 是使用者不能夠進入的位置,這樣便不姅擔心 JSP 僧被直接看到。

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Index</title>
</head>
<body>
<c:out value="${ model['message'] }" />
</body>
</html>

現在新增 Package 為 com.blogspot.lawpronotes.servlet ,在 Package 內新增一個 Servlet 命名為 IndexServlet.java 並貼上以下程式碼。

package com.blogspot.lawpronotes.servlet;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class IndexServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

public IndexServlet() {
super();
}

protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
Map<String, Object> model = new HashMap<String, Object>();
model.put("message", "Hello World");
request.setAttribute("model", model);
// Forward to JSP file to display message
RequestDispatcher dispatcher = request
.getRequestDispatcher("/WEB-INF/pages/index.jsp");
dispatcher.forward(request, response);
}
}

web.xml 設定如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>MVC</display-name>
<welcome-file-list>
<welcome-file>index</welcome-file>
</welcome-file-list>
<servlet>
<description></description>
<display-name>IndexServlet</display-name>
<servlet-name>IndexServlet</servlet-name>
<servlet-class>com.blogspot.lawpronotes.servlet.IndexServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>IndexServlet</servlet-name>
<url-pattern>/index</url-pattern>
</servlet-mapping>
</web-app>

Map<String, Object> model = new HashMap<String, Object>();
model.put("message", "Hello World");

這就是最簡單的做法,使了 Map 去將所有資料放進去,再交由視圖去顯示出來,JSP 將會顯示 Hello World。

request.setAttribute("model", model);

這句是要將 Model 放到 JSP 可以拿得到的地方。

RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/pages/index.jsp");
dispatcher.forward(request, response);

RequestDispatcher 作用是將使用者轉發到 JSP 的位置,但使用者是不會知道的,因為這只是 Server 內部的轉發,和 Redirect 不同。

相關書籍: Murach's Java Servlets and JSP, 2nd EditionHead First Servlets and JSP: Passing the Sun Certified Web Component Developer ExamJavaServer Pages, 3rd Edition