javaweb(二十一)——JavaWeb的兩種開發模式

一、JSP+JavaBean開發模式

1.1、jsp+javabean開發模式架構

  jsp+javabean開發模式的架構圖如下圖(圖1-1)所示

圖1-1

  在jsp+javabean架構中,JSP負責控制邏輯、表現邏輯、業務對象(javabean)的調用。

  JSP+JavaBean模式適合開發業務邏輯不太復雜的web應用程序,這種模式下,JavaBean用于封裝業務數據,JSP即負責處理用戶請求,又顯示數據。

1.2、JSP+JavaBean開發模式編寫計算器

  首先分析一下jsp和javabean各自的職責,jsp負責顯示計算器(calculator)頁面,供用戶輸入計算數據,并顯示計算后的結 果,javaBean負責接收用戶輸入的計算數據并且進行計算,JavaBean具有firstNum、secondNum、result、 operator屬性,并提供一個calculate方法。

  1、編寫CalculatorBean,負責接收用戶輸入的計算數據并且進行計算

  CalculatorBean代碼如下:

復制代碼
 1 package me.gacl.domain;
 2 
 3 import java.math.BigDecimal;  4  5 /**  6  * @author gacl  7  * CalculatorBean用于接收輸入參數和計算  8 */  9 public class CalculatorBean { 10 11 //用戶輸入的第一個數 12 private double firstNum; 13 //用戶輸入的第二個數 14 private double secondNum; 15 //用戶選擇的操作運算符 16 private char operator = '+'; 17 //運算結果 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  * 用于計算 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("被除數不能為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("對不起,傳入的運算符非法!!"); 82 } 83 } 84 }
復制代碼

  2、編寫calculator.jsp,負責顯示計算器(calculator)頁面,供用戶輸入計算數據,并顯示計算后的結果

  calculator.jsp頁面代碼如下:

復制代碼
 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 <%--接收用戶輸入的參數 --%>  5 <jsp:setProperty name="calcBean" property="*"/>  6 <%  7 //使用CalculatorBean進行計算  8  calcBean.calculate();  9 %> 10 <!DOCTYPE HTML> 11 <html> 12 <head> 13 <title>使用【jsp+javabean開發模式】開發的簡單計算器</title> 14 </head> 15 16 <body> 17 <br/> 18  計算結果是: 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">簡單的計算器</td> 30 </tr> 31 <tr> 32 <td>第一個參數</td> 33 <td><input type="text" name="firstNum"></td> 34 </tr> 35 <tr> 36 <td>運算符</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>第二個參數</td> 46 <td><input type="text" name="secondNum"></td> 47 </tr> 48 <tr> 49 <td colspan="2"><input type="submit" value="計算"></td> 50 </tr> 51 </table> 52 </form> 53 </body> 54 </html>
復制代碼

運行結果如下:

  

二、Servlet+JSP+JavaBean開發模式

  在平時的JavaWeb項目開發中,在不使用第三方mvc開發框架的情況下,通常會選擇Servlet+JSP+JavaBean開發模式來開發JavaWeb項目,Servlet+JSP+JavaBean組合開發就是一種MVC開發模式了,控制器(Controller)采用Servlet、模型(Model)采用JavaBean、視圖(View)采用JSP。在講解Servlet+JSP+JavaBean開發模式之前,先簡單了解一下MVC開發模式。

2.1、Web開發中的請求-響應模型

圖2-1

  在Web世界里,具體步驟如下:

  1、Web瀏覽器(如IE)發起請求,如訪問http://www.iteye.com/

  2、Web服務器(如Tomcat)接收請求,處理請求(比如用戶新增,則將把用戶保存一下),最后產生響應(一般為html)。

  3、web服務器處理完成后,返回內容給web客戶端(一般就是我們的瀏覽器),客戶端對接收的內容進行處理(如web瀏覽器將會對接收到的html內容進行渲染以展示給客戶)。

  因此,在Web世界里:都是Web客戶端發起請求,Web服務器接收、處理并產生響應。

  一般Web服務器是不能主動通知Web客戶端更新內容。雖然現在有些技術如服務器推(如Comet)、還有現在的HTML5 websocket可以實現Web服務器主動通知Web客戶端。

  到此我們了解了在web開發時的請求/響應模型,接下來我們看一下標準的MVC模型是什么。

2.2、標準MVC模型概述

  MVC模型:是一種架構型的模式,本身不引入新功能,只是幫助我們將開發的結構組織的更加合理,使展示與模型分離、流程控制邏輯、業務邏輯調用與展示邏輯分離。如下圖(圖2-2)所示:

圖2-2

2.3、MVC(Model-View-Controller)的概念

  首先讓我們了解下MVC(Model-View-Controller的概念:

  Model(模型):數據模型,提供要展示的數據,因此包含數據和行為,可以認為是領域模型(domain)或JavaBean組件(包含數據和行為),不過現在一般都分離開來:Value Object(數據) 和 服務層(行為)。也就是模型提供了模型數據查詢和模型數據的狀態更新等功能,包括數據和業務。

  View(視圖):負責進行模型的展示,一般就是我們見到的用戶界面,客戶想看到的東西。

  Controller(控制器):接收用戶請求,委托給模型進行處理(狀態改變),處理完畢后把返回的模型數據返回給視圖,由視圖負責展示。 也就是說控制器做了個調度員的工作。

  從圖2-1我們還看到,在標準的MVC中模型能主動推數據給視圖進行更新(觀察者設計模式,在模型上注冊視圖,當模型更新時自動更新視圖),但在Web開發中模型是無法主動推給視圖(無法主動更新用戶界面),因為在Web開發是請求-響應模型。

  那接下來我們看一下在Web里MVC是什么樣子,我們稱其為 Web MVC 來區別標準的MVC。

2.4.、Web MVC概述

  Web MVC中的M(模型)-V(視圖)-C(控制器)概念和標準MVC概念一樣,我們再看一下Web MVC標準架構,如下圖(圖2-3)所示:

圖2-3

  在Web MVC模式下,模型無法主動推數據給視圖,如果用戶想要視圖更新,需要再發送一次請求(即請求-響應模型)。

2.5、Servlet+JSP+JavaBean開發模式介紹

    Servlet+JSP+JavaBean架構其實可以認為就是我們所說的Web MVC模型,只是控制器采用Servlet、模型采用JavaBean、視圖采用JSP,如圖2-3

圖2-4

具體示例代碼:

1、模型(model)

  

2、視圖(View)

  

3、控制器(controller)

  

  從Servlet+JSP+JavaBean(Web MVC)架構可以看出,視圖和模型分離了,控制邏輯和展示邏輯分離了。

三、Servlet+JSP+JavaBean開發模式的缺點

  Servlet+JSP+JavaBean(Web MVC)架構雖然實現了視圖和模型分離以及控制邏輯和展示邏輯分離,但也有一些比較嚴重的缺點

3.1、Servlet作為控制器的缺點

  此處的控制器使用Servlet,使用Servlet作為控制器有以下幾個缺點:

  1、控制邏輯可能比較復雜,其實我們可以按照規約,如請求參數submitFlag=toLogin,我們其實可以直接調用toLogin方法,來簡化控制邏輯;而且每個模塊基本需要一個控制器,造成控制邏輯可能很復雜。現在流行的Web MVC框架(如Struts2)都支持"請求參數submitFlag=toAdd,就可以直接調用toAdd方法"這樣的處理機制,在Struts2中類似這樣的處理機制就稱為"動態方法調用"

  2、請求參數到模型的封裝比較麻煩,如果能交給框架來做這件事情,我們可以從中得到解放。

  請求參數到模型的封裝代碼:

復制代碼
1 // 1收集參數
2 String username = req.getParameter("username");
3 String password = req.getParameter("password"); 4 // 2封裝參數 5 UserBean user = new UserBean(); 6 user.setUsername(username); 7 user.setPassword(password);
復制代碼

  當有幾十個甚至上百個參數需要封裝到模型中時,這樣寫恐怕就痛苦萬分了,要寫幾十次甚至上百次這樣的代碼,估計寫到吐了,所以現在流行的Web MVC框架(如Struts2)都提供了非常方便的獲取參數,封裝參數到模型的機制,減少這些繁瑣的工作。

  3、選擇下一個視圖,嚴重依賴Servlet API,這樣很難或基本不可能更換視圖。

例如:使用Servlet API提供的request對象的getRequestDispatcher方法選擇要展示給用戶看的視圖

復制代碼
1  private void toLogin(HttpServletRequest req, HttpServletResponse resp)
2             throws ServletException, IOException { 3 //使用Servlet API提供的request對象的getRequestDispatcher方法選擇視圖 4 // 此處和JSP視圖技術緊密耦合,更換其他視圖技術幾乎不可能 5 request.getRequestDispatcher("/mvc/login.jsp").forward(request, response); 6 }
復制代碼

  4、給視圖傳輸要展示的模型數據,也需要使用Servlet API,更換視圖技術也要一起更換,很麻煩。

例如:使用Servlet API提供的request對象給視圖傳輸要展示的模型數據

//使用Servlet API提供的request對象給視圖login.jsp傳輸要展示的模型數據(user)
request.setAttribute("user", user);
request.getRequestDispatcher("/mvc/login.jsp").forward(request, response)

3.2、JavaBean作為模型的缺點

  此處模型使用JavaBean,JavaBean組件類既負責收集封裝數據,又要進行業務邏輯處理,這樣可能造成JavaBean組件類很龐大,所以一般現在項目都是采用三層架構,而不直接采用JavaBean

3.3、視圖的缺點

  現在被綁定在JSP,很難更換視圖,比如Velocity、FreeMarker;比如我要支持Excel、PDF視圖等等。

  關于JavaWeb的兩種開發模式的講解就介紹到這里,下一篇將使用servlet+jsp+javabean來開發一個用戶登錄注冊功能,以此來加深servlet+jsp+javabean開發模式的理解。

轉載于:https://www.cnblogs.com/zy-jiayou/p/7373192.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454916.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454916.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454916.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Redis基于客戶端分片的集群案例(待實踐)

說明&#xff1a; 下面的示例基本都是基于Linux去實現&#xff0c;目的是為了環境的統一&#xff0c;以便于把性能調整到最優。且基于Java。建議生產環境不要使用Windows/Mac OS這些。 在Java領域&#xff0c;基于客戶端進行分片最常用的庫應該是Jedis&#xff0c;下面基本是基…

mysql select 效能_MYSQL的聯合查詢最好是少用,效能差異巨大

同樣的功能,不同的寫法,時間和內存占用差了幾千倍,不廢話,直接上代碼第一種寫法:代碼如下:$RsDB::get($_ENV[DB],3,"SELECT * FROM _xiazhu WHERE uid IN(SELECT id FROM _user WHERE id<5000)");var_dump($Rs);內存和時間:內存使用:96514.53Kb 運行時間:1272.73m…

高效程序員應該養成的七個習慣

對于軟件工程師來說&#xff0c;工作也許意味著許多東西 -- 穩定的收入、做自己感興趣的項目、找一份更好工作的跳板&#xff0c;或者你只是喜歡與其他程序員共事。但說到“效率”&#xff0c;強調的是在一定時間內按質完成項目的能力。Phil Chu根據自己的經驗提出了高效程序員…

概率論與數理統計思維導圖知識框架_考研概率論與數理統計 綜合題型秘籍思維導圖① 隨機變量1~3章 [21考研上岸之旅]...

Hello World&#xff0c;我的朋友&#xff0c;這里是一顆小白蛋&#xff0c;大千世界&#xff0c;很高興以這樣的方式與你相遇前言在復習過程中發現概率論知識點很少且集中 所以沒有分開章節去整理王安式概率論輔導講義張宇概率論9講方浩強化班1800題 綜合題型秘籍在學習過程中…

關于軟件的架構設計

好的開始相當于成功一半 開始之初的架構設計決定著軟件產品的生死存亡。“好的開始相當于成功一半”。 開始的架構設計也是最難的&#xff0c;需要調研同類產品的情況以及技術特征&#xff0c;了解當前世界上對這種產品所能提供的理論支持和技術平臺支持。再結合自己項目的特…

[Oracle]快速構造大量數據的方法

[Oracle]快速構造大量數據的方法&#xff1a;create table tab001(id integer primary key, val varchar2(100));insert into tab001 select ij,rpad(to_char(ij),100,A) from ( with DATA2(j) as ( select 0 j from DUAL …

mysql用supervisor管理_Supervisor使用詳解

一、supervisor簡介Supervisor是用Python開發的一套通用的進程管理程序&#xff0c;能將一個普通的命令行進程變為后臺daemon&#xff0c;并監控進程狀態&#xff0c;異常退出時能自動重啟。它是通過fork/exec的方式把這些被管理的進程當作supervisor的子進程來啟動&#xff0c…

Handle/Body pattern(Wrapper pattern)

Handle Body Pattern 一些設計模式&#xff0c;通過一系列非直接的間接的方式&#xff08;這種間接的方式&#xff0c;可稱其為 handle&#xff08;把手&#xff09;&#xff09;&#xff0c;完成接口與實現&#xff08;實現可稱為 body&#xff08;主體&#xff09;&#xff0…

架構設計貴在務實

(本文是我給溫昱先生新書寫的讀后感節選。&#xff09; 我最早聽說“軟件架構”這個概念以及UML的名字&#xff0c;是在1999年的水木清華BBS上。當時有一篇文章介紹了軟件架構作為一個相對獨立的領域的發展情況&#xff0c;順便提到在此前一年被接納為OMG標準的UML。該文作者…

php mysql刪除失敗_php+MySQL實戰案例【七】數據編輯、刪除

?本節內容中講解用戶管理模塊中的修改用戶信息和刪除用戶。修改用戶信息&#xff1a;可對選擇的用戶記錄進行編輯&#xff0c;可修改用戶名、密碼、性別、手機、郵箱和地址信息。刪除用戶信息&#xff1a;將列表中指定的用戶進行刪除操作。二、編輯用戶信息編輯用戶信息&#…

前端每周清單第 34 期:Vue 現狀盤點與 3.0 展望,React 代碼遷移與優化,圖片優化詳論...

作者&#xff1a;王下邀月熊 編輯&#xff1a;徐川 前端每周清單專注前端領域內容&#xff0c;以對外文資料的搜集為主&#xff0c;幫助開發者了解一周前端熱點&#xff1b;分為新聞熱點、開發教程、工程實踐、深度閱讀、開源項目、巔峰人生等欄目。歡迎關注【前端之巔】微信公…

1.three.js世界的4大要素

一、三大組件 在Three.js中&#xff0c;要渲染物體到網頁中&#xff0c;我們需要3個組建&#xff1a;場景&#xff08;scene&#xff09;、相機&#xff08;camera&#xff09;和渲染器&#xff08;renderer&#xff09;。有了這三樣東西&#xff0c;才能將物體渲染到網頁中去。…

架構設計 例子和實踐

系統設計說明書(架構、概要、詳細)目錄結構 雖然這些文檔一般來說公司都是有模板的&#xff0c;但我寫這些文檔以來基本上是每寫一次就把目錄結構給改一次&#xff0c;應該說這是因為自己對這些文檔的理解開始加深&#xff0c;慢慢的越來越明白這些文檔的作用和其中需要闡述的東…

activiti 批量 mysql_Activiti6系列(3)- 快速體驗

一、部署啟動activiti####1、部署&#xff0c;將兩個war包拷貝到Tomcat下即可。![](https://img2018.cnblogs.com/blog/1755845/201908/1755845-20190802010532367-2002399291.png)2、啟動tomcat&#xff0c;訪問http://127.0.0.1:8080/activiti-app默認賬號密碼&#xff1a;ad…

【啟動】Windows上啟動圖形化軟件,報錯: 無法啟動此程序,因為計算機中丟失api-ms-win-crt-runtime-1-1-0.dll...

今天在安裝了jetbrains官網上的ToolBox軟件后&#xff0c;沒有辦法啟動起來&#xff0c;報錯如下&#xff1a; 無法啟動此程序&#xff0c;因為計算機中丟失api-ms-win-crt-runtime-1-1-0.dll 嘗試重新安裝了并沒有什么用&#xff0c;現在來解決方法&#xff1a; 直接找到官方的…

論文: YOLO9000-Better,Faster,Stronger

論文閱讀&#xff1a; YOLO9000-Better,Faster,Stronger YOLOv2 是經過改造之后的YOLO Batch Normalization&#xff1a;在所有的conv layer后加了BN之后提高了2% mAP&#xff0c;BN可以幫助regularize模型&#xff0c;這樣的話就可以放棄 dropout。 High Resolution Classifi…

怎么ie取消要打開或保存來自_取消認證后,發票抵扣就這么簡單!

點擊標題下「中財訊集團」可快速關注3月1日起&#xff0c;取消增值稅發票認證的納稅人范圍擴大至全部一般納稅人。一般納稅人可以自愿使用增值稅發票選擇確認平臺查詢、選擇用于申報抵扣、出口退稅或者代辦退稅的增值稅發票信息。具體如何操作呢&#xff1f;掌握以下步驟&#…

Google發布文檔數據庫Firestore

Google發布了Cloud Firestore&#xff0c;它是用于移動、網絡和服務器應用程序的文檔數據庫。\\去年我們曾報道過Google Firebase&#xff0c;它是一種用于移動和網絡開發的數據庫&#xff0c;提供實時的和離線的數據訪問&#xff0c;與許多Google服務相集成。他們現在推出了一…

好的軟件架構設計

什么是架構 前言&#xff1a;軟體設計師中有一些技術水平較高、經驗較為豐富的人&#xff0c;他們需要承擔軟件系統的架構設計&#xff0c;也就是需要設計系統的元件如何劃分、元件之間如何發生相互作用&#xff0c;以及系統中邏輯的、物理的、系統的重要決定的作出。在很多公…

HihoCoder 1323 回文字符串

回文字符串 思路 動態規劃&#xff1a; 可以有三種修改決策 將開頭和結尾字符改成一樣在開頭加一個和末尾相同的字符在末尾加一個和開頭形同的字符代碼&#xff1a; #include <stdio.h> #include <iostream> #include <string.h> using namespace std; char …