版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度現(xiàn)澆樓板施工質(zhì)量檢測與評估合同
- 2025年度水井租賃與水質(zhì)凈化服務(wù)合同
- 二零二五年度自建房建筑廢棄物分類處理承包協(xié)議合同
- 二零二五年度知乎租賃公寓租賃期限靈活合同
- 二零二五年度車牌借用與共享出行服務(wù)合同
- 2025年度工業(yè)自動化計(jì)件勞務(wù)合同
- 2025年度電梯維保與電梯安全應(yīng)急演練合同
- 2025年度門衛(wèi)用工安全保障合同
- 黑龍江省牡丹江市協(xié)同發(fā)展共同體第三子共同體2024-2025學(xué)年高一上學(xué)期期末考試 歷史 含答案
- 公共安全立體化防控
- 2022版義務(wù)教育(地理)課程標(biāo)準(zhǔn)(附課標(biāo)解讀)
- 2024年滑雪用品行業(yè)分析報告及未來發(fā)展趨勢
- 經(jīng)方治療腦梗塞的體會
- 新版DFMEA基礎(chǔ)知識解析與運(yùn)用-培訓(xùn)教材
- 制氮機(jī)操作安全規(guī)程
- 衡水市出租車駕駛員從業(yè)資格區(qū)域科目考試題庫(全真題庫)
- 護(hù)理安全用氧培訓(xùn)課件
- 《三國演義》中人物性格探析研究性課題報告
- 注冊電氣工程師公共基礎(chǔ)高數(shù)輔導(dǎo)課件
- 土方勞務(wù)分包合同中鐵十一局
- 冷庫管道應(yīng)急預(yù)案
評論
0/150
提交評論