MVC模式分析與實(shí)現(xiàn)_第1頁
MVC模式分析與實(shí)現(xiàn)_第2頁
MVC模式分析與實(shí)現(xiàn)_第3頁
MVC模式分析與實(shí)現(xiàn)_第4頁
MVC模式分析與實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

對MVC的認(rèn)識MVC是一種流行的程序架構(gòu),包含三個部分:模型(Model)、視圖(View)、控制器(Control)。M模型主要由Entity(數(shù)據(jù)載體),Dao(修改數(shù)據(jù)),Biz/Service(復(fù)雜業(yè)務(wù)模型)等組成。Dao和Biz負(fù)責(zé)將數(shù)據(jù)加載到Entity中,以及將傳遞過來的Entity(數(shù)據(jù)載體)更新到數(shù)據(jù)庫(當(dāng)然也可能是文件)中C控制器主要由一些類組成,負(fù)責(zé)接收和判斷用戶輸入,調(diào)用相應(yīng)的模型,加載和更新數(shù)據(jù),將Entity傳遞到相應(yīng)的V視圖V視圖,可能是特定的窗體或網(wǎng)頁,只負(fù)責(zé)將C傳遞過來的Entity數(shù)據(jù)展現(xiàn)給用戶3個部分各施其職,互不干擾,低耦合,任何部分發(fā)生改動,都不會影響另外部分

MVC模式的優(yōu)點(diǎn):(1)同一模型的多個視圖。

將模型和用戶界面分離。多視圖可以在單一的模型中實(shí)現(xiàn)(2)同步化視圖。

變更-傳播機(jī)制確保了所有加入的觀察者可以在正確的時間被告知應(yīng)用程序的數(shù)據(jù)變化(3)可插入的視圖和控制器。

允許動態(tài)/靜態(tài)地交換模型的視圖和控制器對象。(4)式樣和感覺的可交換性。

模型不依賴于具體的用戶界面平臺,因此系統(tǒng)的可移植性好。(5)框架潛力。

可以開發(fā)這個模式的應(yīng)用程序框架。

MVC模式的缺點(diǎn):(1)增加了復(fù)雜性。

有時獲得的靈活性并不大,但是缺增加了復(fù)雜性(2)潛在的過多的更新因素。

有時一個用戶動作就導(dǎo)致很多更新。有些更新并不是所有視圖都關(guān)系(3)視圖和控制器之間的緊密聯(lián)系。(4)視圖和控制器與模型的緊密耦合。

視圖和控制器直接調(diào)用模型。模型接口的改變會使得視圖和控制器的代碼過時(5)視圖中的數(shù)據(jù)訪問的低效率。

數(shù)據(jù)訪問依賴于模型接口??赡苓^多的訪問不必要的數(shù)據(jù)。(6)移植時對視圖和控制器的修改是不可避免的。

視圖和控制器中的軟件包含了平臺相關(guān)的東西。(7)現(xiàn)代的用戶接口工具使用MVC的困難性?,F(xiàn)代的用戶接口工具中提供了預(yù)制的控制流管理,內(nèi)部事件的處理等。

自定義WEB-MVC框架的實(shí)現(xiàn)M-javaBean(pojo和dao)負(fù)責(zé)業(yè)務(wù)數(shù)據(jù)模型存?。帧狫SP+Html負(fù)責(zé)生成動態(tài)網(wǎng)頁C—Servlet負(fù)責(zé)生成動態(tài)網(wǎng)頁

1)該MVC框架主要由五部分組成:

<1>、ControllerServlet.java:請求分發(fā)控制器,解析請求中的動作名字,調(diào)用動作工廠對象生成的動作對象處理請求,處理后返回的結(jié)果為目的URL,控制器再將請求和應(yīng)答對象轉(zhuǎn)向目標(biāo)URL

<2>、ActionFactory.java:該工廠類將請求中的動作名轉(zhuǎn)換成servlet可以用來完成其工作的動作類

<3>、Action.java:接口類,該接口定義所有動作的公共接口

<4>、具體Action的實(shí)現(xiàn):指實(shí)現(xiàn)了Action接口的類,會被ActionFactory工廠根據(jù)請求中的名字創(chuàng)建,從而調(diào)用其具體實(shí)現(xiàn)的方法處理Reques\Response對象后,返回一個URL,由主控servlet轉(zhuǎn)發(fā)給用戶??梢岳斫鉃橐粋€具體的Action實(shí)現(xiàn)類用于處理頁面上每一種用戶點(diǎn)擊(請求)

<5>、系統(tǒng)視圖View層實(shí)現(xiàn):*.JSP、*.HTML

2)實(shí)現(xiàn)源碼:

<1>控制器Servlet實(shí)現(xiàn)Java代碼

package

wxy.MVCDemo.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

wxy.MVCDemo.action.Action;

import

wxy.MVCDemo.action.ActionFactory;

/**

*

系統(tǒng)控制器實(shí)現(xiàn)

*

功能:

*

1、解析請求中的命令名

*

2、根據(jù)請求的命令調(diào)用工廠對象創(chuàng)建命令處理對象

*

3、調(diào)用命令對象處理請求和應(yīng)答對象,返回目標(biāo)路徑名

*

4、本控制器將請求和應(yīng)答轉(zhuǎn)發(fā)至目標(biāo)路徑名

*

Servlet

implementation

class

ControllerServlet

*/

public

class

ControllerServlet

extends

HttpServlet

{

private

static

final

long

serialVersionUID

=

1L;

public

ControllerServlet()

{

super();

}

/**

*

主控servlet分發(fā)用戶請求的入口

*/

public

void

service(HttpServletRequest

request,HttpServletResponse

response)throws

ServletException,IOException{

try{

//得到請求的命令名字:解析出*.do請求中*所指代的字符串,即動作名字

String

ActionName=getActionName(request);

System.out.println("request

Action

is:"+ActionName);

//根據(jù)請求的動作名,得到控制器servlet中配置的Action實(shí)現(xiàn)類名字

String

ActionClassName=this.getInitParameter(ActionName);

System.out.println("ActionClassName

is:"+ActionClassName);

//通過工廠類創(chuàng)建命令對象

Action

action=ActionFactory.getIns().getAction(ActionClassName);

//使用動作對象處理動作,返回結(jié)果為處理后要輸出的目標(biāo)頁面

String

URL=action.execute(request,response);

if(URL!=null){

//輸出目標(biāo)頁面

System.out.println("dest

URL

is

:"+URL);

getServletContext().getRequestDispatcher(URL).forward(request,

response);

}

}catch(Exception

e){

e.printStackTrace();

getServletContext().getRequestDispatcher("/error.jsp").forward(request,

response);

}

}

/**

*

解析到請求中的“命令”字

*

@param

request

*

@return

*/

protected

String

getActionName(HttpServletRequest

request)

{

String

path=request.getServletPath();

return

path.substring(1,path.lastIndexOf("."));

}

}

<2>Action對象工廠類實(shí)現(xiàn)Java代碼

package

wxy.MVCDemo.action;

/**

*

命令對象工廠類實(shí)現(xiàn)

*

根據(jù)命令名字,創(chuàng)建命令對象

*

ActionFactory是一個單實(shí)例類(整個系統(tǒng)只需要使用其一個對象)

*

@author

wxy

*

*/

public

class

ActionFactory

{

/**

*

單實(shí)例訪問方法

*

@return

單實(shí)例對象

*/

public

static

ActionFactory

getIns(){

if(null==ac){

ac=new

ActionFactory();

}

return

ac;

}

/**

*

根據(jù)具體的action類名字創(chuàng)建Action對象

*

@param

actionClass

具體的Action類全名

*

@return

Action類型對象

*/

public

Action

getAction(String

actionClass){

Action

actionInstance=null;

try{

Class

c=Class.forName(actionClass);

actionInstance=(Action)c.newInstance();

}catch(Exception

e){

e.printStackTrace();

}

return

actionInstance;

}

//不需要創(chuàng)建對象

private

ActionFactory(){}

private

static

ActionFactory

ac=null;

}

<3>Action接口類定義Java代碼

package

wxy.MVCDemo.action;

import

javax.servlet.http.HttpServletRequest;

import

javax.servlet.http.HttpServletResponse;

/**

*

系統(tǒng)中的命令處理器接口

*

@author

wxy

*

*/

public

interface

Action

{

/**

*

所有的具體Action實(shí)現(xiàn)這個接口

*

@param

request

請求對象

*

@param

reponse

應(yīng)答對象

*

@return

結(jié)果頁面

*/

public

String

execute(HttpServletRequest

request,HttpServletResponse

reponse);

}

web.xml配置Java代碼

<?xml

version="1.0"

encoding="UTF-8"?>

<web-app

xmlns:xsi="/2001/XMLSchema-instance"

xmlns="/xml/ns/javaee"

xmlns:web="/xml/ns/javaee/web-app_2_5.xsd"

xsi:schemaLocation="/xml/ns/javaee

/xml/ns/javaee/web-app_2_5.xsd"

id="WebApp_ID"

version="2.5">

<servlet>

<description></description>

<display-name>控制器ControllerServlet</display-name>

<servlet-name>ControllerServlet</servlet-name>

<servlet-class>wxy.MVCDemo.Servlet.ControllerServlet</servlet-class>

<init-param>

<!--

將具體Action名字和全類配置到servlet參數(shù)中

-->

<param-name>loginAction</param-name>

<param-value>java.action.LoginAction</param-value>

</init-param>

</servlet>

<display-name>MVCWeb</display-name>

<welcome-file-list>

<welcome-file>login.jsp</welcome-file>

</welcome-file-list>

<!--

將所有以.do路徑結(jié)尾的請求發(fā)送到主控servlet處理

-->

<servlet-mapping>

<servlet-name>ControllerServlet</servlet-name>

<url-pattern>*.do</url-pattern>

</servlet-mapping>

</web-app>

<4>具體的Action實(shí)現(xiàn)類Java代碼

package

wxy.MVCDemo.action;

import

javax.servlet.http.HttpServletRequest;

import

javax.servlet.http.HttpServletResponse;

/**

*

由login.jsp輸出賬戶密碼,如果賬號正確,則在Session中放入用戶對象,轉(zhuǎn)向主頁;如果錯誤,轉(zhuǎn)向登錄頁面

*

@author

wxy

*

*/

public

class

LoginAction

implements

Action{

public

String

execute(HttpServletRequest

request,

HttpServletResponse

reponse)

{

String

UserName=request.getParameter("UserName");

String

pwd=request.getParameter("pwd");

//數(shù)據(jù)庫操作

//

if(UserName.equals("wxy")&&pwd.equals("wxy")){

//將用戶對象放入session

request.getSession().setAttribute("UserName",

UserName);

return

"/mainPage.jsp";

}

request.getSession().setAttribute("ERROR_MSG",

"賬號或者密碼輸入有誤!");

return

"/login.jsp";

}

}

RegUserAction.do

DisplayMainPageAction.do

。。。。。。

(記著在web.xml中配置)

<5>系統(tǒng)view層實(shí)現(xiàn)

login.jspJava代碼

<%@

page

language="java"

contentType="text/html;

charset=utf-8"

pageEncoding="utf-8"%>

<!DOCTYPE

html

PUBLIC

"-//W3C//DTD

HTML

4.01

Transitional//EN"

"/TR/html4/loose.dtd">

<html>

<head>

<meta

ht

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論