javaweb学习总结(二十一)——JavaWeb的两种开发模式
SUN公司推出JSP技術(shù)后,同時(shí)也推薦了兩種web應(yīng)用程序的開發(fā)模式,一種是JSP+JavaBean模式,一種是Servlet+JSP+JavaBean模式。
一、JSP+JavaBean開發(fā)模式
1.1、jsp+javabean開發(fā)模式架構(gòu)
jsp+javabean開發(fā)模式的架構(gòu)圖如下圖(圖1-1)所示
圖1-1
在jsp+javabean架構(gòu)中,JSP負(fù)責(zé)控制邏輯、表現(xiàn)邏輯、業(yè)務(wù)對(duì)象(javabean)的調(diào)用。
JSP+JavaBean模式適合開發(fā)業(yè)務(wù)邏輯不太復(fù)雜的web應(yīng)用程序,這種模式下,JavaBean用于封裝業(yè)務(wù)數(shù)據(jù),JSP即負(fù)責(zé)處理用戶請(qǐng)求,又顯示數(shù)據(jù)。
1.2、JSP+JavaBean開發(fā)模式編寫計(jì)算器
首先分析一下jsp和javabean各自的職責(zé),jsp負(fù)責(zé)顯示計(jì)算器(calculator)頁(yè)面,供用戶輸入計(jì)算數(shù)據(jù),并顯示計(jì)算后的結(jié) 果,javaBean負(fù)責(zé)接收用戶輸入的計(jì)算數(shù)據(jù)并且進(jìn)行計(jì)算,JavaBean具有firstNum、secondNum、result、 operator屬性,并提供一個(gè)calculate方法。
1、編寫CalculatorBean,負(fù)責(zé)接收用戶輸入的計(jì)算數(shù)據(jù)并且進(jìn)行計(jì)算
CalculatorBean代碼如下:
1 package me.gacl.domain;2 3 import java.math.BigDecimal;4 5 /**6 * @author gacl7 * CalculatorBean用于接收輸入?yún)?shù)和計(jì)算8 */9 public class CalculatorBean { 10 11 //用戶輸入的第一個(gè)數(shù) 12 private double firstNum; 13 //用戶輸入的第二個(gè)數(shù) 14 private double secondNum; 15 //用戶選擇的操作運(yùn)算符 16 private char operator = '+'; 17 //運(yùn)算結(jié)果 18 private double result; 19 20 public double getFirstNum() { 21 return firstNum; 22 } 23 24 public void setFirstNum(double firstNum) { 25 this.firstNum = firstNum; 26 } 27 28 public double getSecondNum() { 29 return secondNum; 30 } 31 32 public void setSecondNum(double secondNum) { 33 this.secondNum = secondNum; 34 } 35 36 public char getOperator() { 37 return operator; 38 } 39 40 public void setOperator(char operator) { 41 this.operator = operator; 42 } 43 44 public double getResult() { 45 return result; 46 } 47 48 public void setResult(double result) { 49 this.result = result; 50 } 51 52 /** 53 * 用于計(jì)算 54 */ 55 public void calculate() { 56 57 switch (this.operator) { 58 case '+': { 59 this.result = this.firstNum + this.secondNum; 60 break; 61 } 62 case '-': { 63 this.result = this.firstNum - this.secondNum; 64 break; 65 } 66 case '*': { 67 this.result = this.firstNum * this.secondNum; 68 break; 69 } 70 case '/': { 71 if (this.secondNum == 0) { 72 throw new RuntimeException("被除數(shù)不能為0!!!"); 73 } 74 this.result = this.firstNum / this.secondNum; 75 // 四舍五入 76 this.result = new BigDecimal(this.result).setScale(2, 77 BigDecimal.ROUND_HALF_UP).doubleValue(); 78 break; 79 } 80 default: 81 throw new RuntimeException("對(duì)不起,傳入的運(yùn)算符非法!!"); 82 } 83 } 84 }2、編寫calculator.jsp,負(fù)責(zé)顯示計(jì)算器(calculator)頁(yè)面,供用戶輸入計(jì)算數(shù)據(jù),并顯示計(jì)算后的結(jié)果
calculator.jsp頁(yè)面代碼如下:
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>2 <%--使用me.gacl.domain.CalculatorBean --%>3 <jsp:useBean id="calcBean" class="me.gacl.domain.CalculatorBean"/>4 <%--接收用戶輸入的參數(shù) --%>5 <jsp:setProperty name="calcBean" property="*"/>6 <% 7 //使用CalculatorBean進(jìn)行計(jì)算8 calcBean.calculate();9 %> 10 <!DOCTYPE HTML> 11 <html> 12 <head> 13 <title>使用【jsp+javabean開發(fā)模式】開發(fā)的簡(jiǎn)單計(jì)算器</title> 14 </head> 15 16 <body> 17 <br/> 18 計(jì)算結(jié)果是: 19 <jsp:getProperty name="calcBean" property="firstNum"/> 20 <jsp:getProperty name="calcBean" property="operator"/> 21 <jsp:getProperty name="calcBean" property="secondNum"/> 22 = 23 <jsp:getProperty name="calcBean" property="result"/> 24 25 <br/><hr> <br/> 26 <form action="${pageContext.request.contextPath}/calculator.jsp" method="post"> 27 <table border="1px"> 28 <tr> 29 <td colspan="2">簡(jiǎn)單的計(jì)算器</td> 30 </tr> 31 <tr> 32 <td>第一個(gè)參數(shù)</td> 33 <td><input type="text" name="firstNum"></td> 34 </tr> 35 <tr> 36 <td>運(yùn)算符</td> 37 <td><select name="operator"> 38 <option value="+">+</option> 39 <option value="-">-</option> 40 <option value="*">*</option> 41 <option value="/">/</option> 42 </select></td> 43 </tr> 44 <tr> 45 <td>第二個(gè)參數(shù)</td> 46 <td><input type="text" name="secondNum"></td> 47 </tr> 48 <tr> 49 <td colspan="2"><input type="submit" value="計(jì)算"></td> 50 </tr> 51 </table> 52 </form> 53 </body> 54 </html>運(yùn)行結(jié)果如下:
二、Servlet+JSP+JavaBean開發(fā)模式
在平時(shí)的JavaWeb項(xiàng)目開發(fā)中,在不使用第三方mvc開發(fā)框架的情況下,通常會(huì)選擇Servlet+JSP+JavaBean開發(fā)模式來(lái)開發(fā)JavaWeb項(xiàng)目,Servlet+JSP+JavaBean組合開發(fā)就是一種MVC開發(fā)模式了,控制器(Controller)采用Servlet、模型(Model)采用JavaBean、視圖(View)采用JSP。在講解Servlet+JSP+JavaBean開發(fā)模式之前,先簡(jiǎn)單了解一下MVC開發(fā)模式。
2.1、Web開發(fā)中的請(qǐng)求-響應(yīng)模型
圖2-1
在Web世界里,具體步驟如下:
1、Web瀏覽器(如IE)發(fā)起請(qǐng)求,如訪問(wèn)http://www.iteye.com/
2、Web服務(wù)器(如Tomcat)接收請(qǐng)求,處理請(qǐng)求(比如用戶新增,則將把用戶保存一下),最后產(chǎn)生響應(yīng)(一般為html)。
3、web服務(wù)器處理完成后,返回內(nèi)容給web客戶端(一般就是我們的瀏覽器),客戶端對(duì)接收的內(nèi)容進(jìn)行處理(如web瀏覽器將會(huì)對(duì)接收到的html內(nèi)容進(jìn)行渲染以展示給客戶)。
因此,在Web世界里:都是Web客戶端發(fā)起請(qǐng)求,Web服務(wù)器接收、處理并產(chǎn)生響應(yīng)。
一般Web服務(wù)器是不能主動(dòng)通知Web客戶端更新內(nèi)容。雖然現(xiàn)在有些技術(shù)如服務(wù)器推(如Comet)、還有現(xiàn)在的HTML5 websocket可以實(shí)現(xiàn)Web服務(wù)器主動(dòng)通知Web客戶端。
到此我們了解了在web開發(fā)時(shí)的請(qǐng)求/響應(yīng)模型,接下來(lái)我們看一下標(biāo)準(zhǔn)的MVC模型是什么。
2.2、標(biāo)準(zhǔn)MVC模型概述
MVC模型:是一種架構(gòu)型的模式,本身不引入新功能,只是幫助我們將開發(fā)的結(jié)構(gòu)組織的更加合理,使展示與模型分離、流程控制邏輯、業(yè)務(wù)邏輯調(diào)用與展示邏輯分離。如下圖(圖2-2)所示:
圖2-2
2.3、MVC(Model-View-Controller)的概念
首先讓我們了解下MVC(Model-View-Controller)的概念:
Model(模型):數(shù)據(jù)模型,提供要展示的數(shù)據(jù),因此包含數(shù)據(jù)和行為,可以認(rèn)為是領(lǐng)域模型(domain)或JavaBean組件(包含數(shù)據(jù)和行為),不過(guò)現(xiàn)在一般都分離開來(lái):Value Object(數(shù)據(jù)) 和 服務(wù)層(行為)。也就是模型提供了模型數(shù)據(jù)查詢和模型數(shù)據(jù)的狀態(tài)更新等功能,包括數(shù)據(jù)和業(yè)務(wù)。
View(視圖):負(fù)責(zé)進(jìn)行模型的展示,一般就是我們見到的用戶界面,客戶想看到的東西。
Controller(控制器):接收用戶請(qǐng)求,委托給模型進(jìn)行處理(狀態(tài)改變),處理完畢后把返回的模型數(shù)據(jù)返回給視圖,由視圖負(fù)責(zé)展示。?也就是說(shuō)控制器做了個(gè)調(diào)度員的工作。
從圖2-1我們還看到,在標(biāo)準(zhǔn)的MVC中模型能主動(dòng)推數(shù)據(jù)給視圖進(jìn)行更新(觀察者設(shè)計(jì)模式,在模型上注冊(cè)視圖,當(dāng)模型更新時(shí)自動(dòng)更新視圖),但在Web開發(fā)中模型是無(wú)法主動(dòng)推給視圖(無(wú)法主動(dòng)更新用戶界面),因?yàn)樵赪eb開發(fā)是請(qǐng)求-響應(yīng)模型。
那接下來(lái)我們看一下在Web里MVC是什么樣子,我們稱其為 Web MVC 來(lái)區(qū)別標(biāo)準(zhǔn)的MVC。
2.4.、Web MVC概述
Web MVC中的M(模型)-V(視圖)-C(控制器)概念和標(biāo)準(zhǔn)MVC概念一樣,我們?cè)倏匆幌耊eb MVC標(biāo)準(zhǔn)架構(gòu),如下圖(圖2-3)所示:
圖2-3
在Web MVC模式下,模型無(wú)法主動(dòng)推數(shù)據(jù)給視圖,如果用戶想要視圖更新,需要再發(fā)送一次請(qǐng)求(即請(qǐng)求-響應(yīng)模型)。
2.5、Servlet+JSP+JavaBean開發(fā)模式介紹
Servlet+JSP+JavaBean架構(gòu)其實(shí)可以認(rèn)為就是我們所說(shuō)的Web MVC模型,只是控制器采用Servlet、模型采用JavaBean、視圖采用JSP,如圖2-3
圖2-4
具體示例代碼:
1、模型(model)
2、視圖(View)
3、控制器(controller)
從Servlet+JSP+JavaBean(Web MVC)架構(gòu)可以看出,視圖和模型分離了,控制邏輯和展示邏輯分離了。
三、Servlet+JSP+JavaBean開發(fā)模式的缺點(diǎn)
Servlet+JSP+JavaBean(Web MVC)架構(gòu)雖然實(shí)現(xiàn)了視圖和模型分離以及控制邏輯和展示邏輯分離,但也有一些比較嚴(yán)重的缺點(diǎn)
3.1、Servlet作為控制器的缺點(diǎn)
此處的控制器使用Servlet,使用Servlet作為控制器有以下幾個(gè)缺點(diǎn):
1、控制邏輯可能比較復(fù)雜,其實(shí)我們可以按照規(guī)約,如請(qǐng)求參數(shù)submitFlag=toLogin,我們其實(shí)可以直接調(diào)用toLogin方法,來(lái)簡(jiǎn)化控制邏輯;而且每個(gè)模塊基本需要一個(gè)控制器,造成控制邏輯可能很復(fù)雜。現(xiàn)在流行的Web MVC框架(如Struts2)都支持"請(qǐng)求參數(shù)submitFlag=toAdd,就可以直接調(diào)用toAdd方法"這樣的處理機(jī)制,在Struts2中類似這樣的處理機(jī)制就稱為"動(dòng)態(tài)方法調(diào)用"
2、請(qǐng)求參數(shù)到模型的封裝比較麻煩,如果能交給框架來(lái)做這件事情,我們可以從中得到解放。
請(qǐng)求參數(shù)到模型的封裝代碼:
1 // 1收集參數(shù) 2 String username = req.getParameter("username"); 3 String password = req.getParameter("password"); 4 // 2封裝參數(shù) 5 UserBean user = new UserBean(); 6 user.setUsername(username); 7 user.setPassword(password);當(dāng)有幾十個(gè)甚至上百個(gè)參數(shù)需要封裝到模型中時(shí),這樣寫恐怕就痛苦萬(wàn)分了,要寫幾十次甚至上百次這樣的代碼,估計(jì)寫到吐了,所以現(xiàn)在流行的Web MVC框架(如Struts2)都提供了非常方便的獲取參數(shù),封裝參數(shù)到模型的機(jī)制,減少這些繁瑣的工作。
3、選擇下一個(gè)視圖,嚴(yán)重依賴Servlet API,這樣很難或基本不可能更換視圖。
例如:使用Servlet API提供的request對(duì)象的getRequestDispatcher方法選擇要展示給用戶看的視圖
1 private void toLogin(HttpServletRequest req, HttpServletResponse resp) 2 throws ServletException, IOException { 3 //使用Servlet API提供的request對(duì)象的getRequestDispatcher方法選擇視圖 4 // 此處和JSP視圖技術(shù)緊密耦合,更換其他視圖技術(shù)幾乎不可能 5 request.getRequestDispatcher("/mvc/login.jsp").forward(request, response); 6 }4、給視圖傳輸要展示的模型數(shù)據(jù),也需要使用Servlet API,更換視圖技術(shù)也要一起更換,很麻煩。
例如:使用Servlet API提供的request對(duì)象給視圖傳輸要展示的模型數(shù)據(jù)
//使用Servlet API提供的request對(duì)象給視圖login.jsp傳輸要展示的模型數(shù)據(jù)(user) request.setAttribute("user", user); request.getRequestDispatcher("/mvc/login.jsp").forward(request, response)3.2、JavaBean作為模型的缺點(diǎn)
此處模型使用JavaBean,JavaBean組件類既負(fù)責(zé)收集封裝數(shù)據(jù),又要進(jìn)行業(yè)務(wù)邏輯處理,這樣可能造成JavaBean組件類很龐大,所以一般現(xiàn)在項(xiàng)目都是采用三層架構(gòu),而不直接采用JavaBean。
3.3、視圖的缺點(diǎn)
現(xiàn)在被綁定在JSP,很難更換視圖,比如Velocity、FreeMarker;比如我要支持Excel、PDF視圖等等。
關(guān)于JavaWeb的兩種開發(fā)模式的講解就介紹到這里,下一篇將使用servlet+jsp+javabean來(lái)開發(fā)一個(gè)用戶登錄注冊(cè)功能,以此來(lái)加深servlet+jsp+javabean開發(fā)模式的理解。
http://www.cnblogs.com/xdp-gacl/p/3908610.html
總結(jié)
以上是生活随笔為你收集整理的javaweb学习总结(二十一)——JavaWeb的两种开发模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 六级残疾军人有护理护理费要带证件在哪里办
- 下一篇: 一句名言给我的启示500字优秀作文(一句