用JSP+Servlet+JavaBean實現MVC設計模式的流程


MVC是三個單詞的縮寫:M:Model(模型);V:View( 視圖 ),C:Controller(控制器)。

MVC模式的目的就是實現Web系統的職能分工,
Model層:實現系統的業務邏輯,即javaBean部分
View層:負責與用戶交互,即在界面上展示數據對象給用戶,即html,jsp
Controller層:Model與View之間溝通的橋梁,它可以分派用戶的請求並選擇恰當的視圖以用於顯示,同時它也可以解釋用戶的輸入並將它們映射為模型層可執行的操作,當然就是Servlet的職責了

下面用MVC設計模式來實現 簡單的用戶登錄過程
1、控制器Servlet的實現

系統中只有一個servlet即ControlServlet,所有頁面發起的以” *.do “的請求,都被web.xml配置給ControlServlet進行處理,在ControlServlet中根據‘ * ’的字符串(即解析用戶請求的路徑),調用ActionFactory生成的制定Action對象,在將處理后的URL轉發給用戶。

package cn.netjava.servlet;   
import java.io.IOException;  
import javax.servlet.ServletException;  
import javax.servlet.http.HttpServlet;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
 
import cn.netjava.action.Action;  
import cn.netjava.action.ActionFactory;  
 
/** 
 * Servlet implementation class ControlServlet 
 */  
public class ControlServlet extends HttpServlet {  
    private static final long serialVersionUID = 1L;  
 
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
        //得到當前Servlet的請求路徑  
        String pathName =request.getServletPath();  
        // request.getContextPath();得到項目名字  
        System.out.println("pathName:"+pathName);  
        //得到請求的Action名字  
        int index = pathName.indexOf(".");  
        String ActionName = pathName.substring(1, index);  
        System.out.println(ActionName);  
        //獲取運行時參數  
        String ActionClassName = this.getInitParameter(ActionName);  
        //得到Action對象  
        Action action = ActionFactory.getActionFactory().getAction(ActionClassName);  
        //執行Action的execute得到要返回的URL路徑  
        String url = action.execute(request, response);  
        if(url==null){  
            request.getRequestDispatcher("error.jsp").forward(request, response);     
        }else{  
            request.getRequestDispatcher(url).forward(request, response);  
        }  
    }  
 
}

2、Action對象工廠類實現:

ActionFactory是一個單實例類(整個系統只需要使用其一個對象),它只提供一個Action對象,通過getAction(String ActionClassName) 的方法調用創建一個Action對象。這個方法在Control中被調用。代碼如下:

package cn.netjava.action;  
/** 
 * 根據Action名字,創建Action對象 
 * @author Administrator 
 * 
 */  
public class ActionFactory {  
 
    //單例模式:不需要創建對象  
    private ActionFactory(){  
    }  
    //單實例訪問方法,得到ActionFactory對象  
    public static ActionFactory getActionFactory(){  
        if(af == null){  
            af = new ActionFactory();  
        }  
        return af;  
    }  
    /** 
     * 根據具體的Action類名字創建Action對象 
     * @param ActionClassName :具體的Action類全名 
     * @return:Action類型對象 
     */  
    public Action getAction(String ActionClassName){  
        Action action = null;  
        try{  
            action = (Action) Class.forName(ActionClassName).newInstance();  
        }catch(Exception e){  
            e.printStackTrace();  
        }  
        return action;  
    }  
 
    private static ActionFactory af;  
 
 
}

3、Action接口類定義:
所有的事件處理(即Action)類都必須實現這個接口

package cn.netjava.action;  
 
public interface Action {  
    /** 
     * 所有的具體Action實現這個接口 
     * @param request 請求對象 
     * @param response 應答對象 
     * @return :結果頁面 
     */  
    public String execute(javax.servlet.http.HttpServletRequest request,javax.servlet.http.HttpServletResponse response);  
 
}

4、web.xml中配置請求發送給控制器Servlet

最后,只需要在wex.xml中對MVC結構的配置:
視圖頁面中的請求都是以<動作名字>.do結尾,當這個請求到達web服務器后,會被服務器轉向給控制器處理,控制器在根據解析出的動作名,調用對應的Action對象,處理結果,並輸出結果頁面,所以web.xml中必須有如下配置:

<servlet>  
    <servlet-name>controlServlet</servlet-name>  
    <servlet-class>cn.netjava.servlet.ControlServlet</servlet-class>  
    <init-param>  
        <param-name>loginAction</param-name>  
        <param-value>cn.netjava.action.LoginAction</param-value>  
    </init-param>  
  </servlet>  
  <servlet-mapping>  
    <servlet-name>controlServlet</servlet-name>  
    <url-pattern>*.do</url-pattern>  
  </servlet-mapping>

4、具體的Action類實現(即對登錄動作進行處理的類)

package cn.netjava.action;  
 
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
 
public class LoginAction implements Action {  
 
    public String execute(HttpServletRequest request,  
            HttpServletResponse response) {  
        // 得到用戶名和密碼  
        String userName = request.getParameter("userName");  
        String userPwd = request.getParameter("userPwd");  
        if (userName.equals("netjava") && userPwd.equals("netjava")) {  
            request.setAttribute("userName", userName);  
            return "main.jsp";  
        } else {  
            return "login.jsp";  
        }  
    }  
 
}

如果登錄成功,跳轉到 main.jsp頁面,否則,返回login,jsp頁面

以下是main.jsp和login.jsp頁面:
main.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"  
    pageEncoding="utf-8"%>  
<!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>Insert title here</title>  
</head>  
<body>  
<h1 style="color:red"><%=request.getAttribute("userName") %>登錄成功</h1>  
</body>  
</html>

login.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"  
    pageEncoding="utf-8"%>  
<!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>用戶登錄</title>  
</head>  
<body>  
<form action="loginAction.do" method="post">  
    用戶名:<input type="text" name="userName" id="userName"><br>  
    密碼:<input type="password" name="userPwd" id="userPwd"><br>  
    <input type="submit" value="登錄"/>  
</form>  
</body>  
</html>

最后做個總結吧:以前我們與服務器進行交互,可能jsp頁面和servlet中都將html和java代碼參雜在一起,這會導致系統的系統維護困難、分工不清;例如在加有jsp代碼段的網頁中,程序員與美工之間的配合就非常困難!MVC結構的系統會從根本上強制我們將web系統中的數據對象、業務邏輯、用戶界面三者分離,使得程序員(Java開發人員)集中精力於業務邏輯,界面程序員(HTML和JSP開發人員)集中精力於表現形式上。

注:文章非博主原創,僅為學習備用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM