【菜鳥學Java】15:JSP技術中的Model1和Model2開發模式

連江偉發表於2016-03-03

        JavaWeb應用的結構經歷了Model1和Model2兩個時代,從Model1發展到Model2既是技術發展的必然,也是無數程式設計師的心血結晶。

        Model1的原理及程式碼示例

        在Model1模式下,整個Web應用幾乎全部由JSP頁面組成,JSP頁面接收處理客戶端請求,對請求處理後直接作出響應。用少量的JavaBean來處理資料庫連線、資料庫訪問等操作。其流程圖如下所示

        Model1模式的實現比較簡單,適用於快速開發小規模專案。但從工程化的角度看,它的侷限性非常明顯:JSP頁面身兼View和Controller兩種角色,將控制邏輯和表現邏輯混雜在一起,從而導致程式碼的重用性非常低,增加了應用的擴充套件性和維護性的難度。我們來看一個用Model1模式編寫的登入Demo:

JSP頁面程式碼

<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>
  <%@ page import="com.ljw.user.bean.*" %>
  <%
  	User user=new User();
  user.setUsername(request.getParameter("username"));
  user.setPassword(request.getParameter("password"));
  UserBean userBean=new UserBean();
  boolean result=userBean.login(user);
  if(result==true){
	  response.sendRedirect(request.getContextPath() + "/login_success.jsp");
  }else{
	  out.println("登入失敗,請檢查登入資訊是否正確!");
  }
  %>
<!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=GB18030">
<title>登入</title>
</head>
<body>
	<form action="login.jsp" method="post">
		使用者名稱:<input type="text" name="username"><br>
		密    碼:<input type="text" name="password"><br>
		<input type="submit" value="登入">
	</form>
</body>
</html>

         UserBean程式碼

public class UserBean {

	public boolean login(User user){
		if("admin".equals(user.getUsername())&&"admin".equals(user.getPassword())){
			return true;
		}
		return false;
	}
}

        早期由大量JSP頁面所開發出來的Web應用,大都採用了Model1架構。實際上,早期絕大部分ASP應用也屬於這種Model1的架構。

        Model2的原理及程式碼示例

        Model2已經是基於MVC架構的設計模式。在Model2架構中,Servlet作為前端控制器,負責接收客戶端傳送的請求,在Servlet中只包含控制器邏輯和簡單的前端處理;然後,呼叫後端JavaBean來完成實際的邏輯處理;最後,轉發到相應的JSP頁面處理顯示邏輯。其具體的實現方式如下圖所示:

        從上圖中我們可以看到,Model2模式下的JSP不再承擔控制器的責任,它僅僅是表現層的角色,僅僅用於將結果呈獻給使用者,JSP頁面的請求與Servlet(控制器)互動,而Servlet負責與後臺的JavaBean通訊。在Model2模式下,模型(Model)由JavaBean充當,檢視(View)由JSP頁面充當,而控制器(Controller)則由Servlet充當。下面我們將上面的例子改成Model2模式的結構,增加了一個Servlet和配置檔案web.xml,其他的不變。

        LoginServlet程式碼

public class LoginServlet extends HttpServlet {

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		  User user=new User();
		  user.setUsername(req.getParameter("username"));
		  user.setPassword(req.getParameter("password"));
		  UserBean userBean=new UserBean();
		  boolean result=userBean.login(user);
		  if(result==true){
			  resp.sendRedirect(req.getContextPath() + "/login_success.jsp");
		  }else{
			  resp.sendRedirect(req.getContextPath()+"/login_error.jsp");
		  }
	}

}
        配置檔案web.xml

<?xml version="1.0" encoding="UTF-8"?>  
  
<web-app xmlns="http://java.sun.com/xml/ns/javaee"  
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  
                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"  
  version="3.0"  
  metadata-complete="true">  
  
    <servlet>  
        <servlet-name>LoginServlet</servlet-name>  
        <servlet-class>com.ljw.user.servlet.LoginServlet</servlet-class>  
    </servlet>  
    <servlet-mapping>  
        <servlet-name>LoginServlet</servlet-name>  
        <url-pattern>/loginServlet</url-pattern>  
    </servlet-mapping>  
</web-app>

        由於引入了MVC模式,使得Model2具有了元件化的特點,更加適合大規模應用的開發,但也增加了應用開發的複雜程度。原本需要一個簡單的JSP頁面就能實現的應用,在Model2中被分解成多個協同工作的部分,需要更多時間才能真正掌握其設計思路和實現的過程。

        小結一下:

        對於非常小型的Web站點,如果後期的更新,維護工作不是特別大,可以使用Model1的模式進行開發,而不是使用Model2去做,因為雖然Model2提供了更好的可擴充套件性和可維護性,但是增加了前期開發的成本。從某種程度上來講,Model2為了降低系統後期的維護的複雜度,卻導致前期開發的更高複雜度。

相關文章