知識(shí)
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們?cè)谧非笃湟曈X(jué)表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營(yíng)銷的便利,運(yùn)營(yíng)的高效,讓網(wǎng)站成為營(yíng)銷工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏?jí)提供便捷的支持!
您當(dāng)前位置>首頁(yè) » 新聞資訊 » 網(wǎng)站建設(shè) >
Java Web基礎(chǔ)入門第二十八講 JavaWeb開(kāi)發(fā)的兩種模式
發(fā)表時(shí)間:2016-7-31
發(fā)布人:葵宇科技
瀏覽次數(shù):67
SUN公司推出JSP技術(shù)后,同時(shí)也推出了兩種Web應(yīng)用程序的開(kāi)發(fā)模式,一種是JSP+JavaBean模式,一種是Servlet+JSP+JavaBean模式。
JSP+JavaBean開(kāi)發(fā)模式
JSP+JavaBean開(kāi)發(fā)模式架構(gòu)
JSP+JavaBean開(kāi)發(fā)模式的架構(gòu)圖如下圖所示:
在JSP+JavaBean架構(gòu)中,JSP負(fù)責(zé)控制邏輯、表現(xiàn)邏輯、業(yè)務(wù)對(duì)象(JavaBean)的調(diào)用。JSP+JavaBean模式適合開(kāi)發(fā)業(yè)務(wù)邏輯不太復(fù)雜的Web應(yīng)用程序,在這種模式下,JavaBean用于封裝業(yè)務(wù)數(shù)據(jù),JSP既負(fù)責(zé)處理用戶請(qǐng)求,又負(fù)責(zé)顯示數(shù)據(jù)。
JSP+JavaBean開(kāi)發(fā)模式開(kāi)發(fā)Web版簡(jiǎn)易計(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方法。
現(xiàn)在來(lái)思考一個(gè)問(wèn)題,firstNum和secondNum的數(shù)據(jù)類型應(yīng)該使用什么?使用double類型嗎?答案是不可以,若firstNum和secondNum的數(shù)據(jù)類型為double,那么它們計(jì)算的結(jié)果是不精確的。例如,有程序如下:
package cn.liayun.domain;
public class Demo1 {
public static void main(String[] args) {
// 浮點(diǎn)數(shù)運(yùn)算只適合科學(xué)運(yùn)算,計(jì)算的結(jié)果是不精確的
double a = 0.1;
double b = 0.006;
System.out.println(a + b);
}
}
運(yùn)行以上程序,Eclipse控制臺(tái)輸出結(jié)果如下:
可見(jiàn)兩數(shù)相加結(jié)果并不精確。由此得出結(jié)論,浮點(diǎn)數(shù)運(yùn)算只適合科學(xué)運(yùn)算,計(jì)算的結(jié)果是不精確的。
那么到底firstNum和secondNum的數(shù)據(jù)類型應(yīng)該使用什么呢?使用BigDecimal這個(gè)類。例如,有程序如下:
package cn.liayun.domain;
import java.math.BigDecimal;
public class Demo1 {
public static void main(String[] args) {
// 記住以后要用程序計(jì)算精確的貨幣運(yùn)算,就一定要用BigDecimal這個(gè)類
BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.006");
System.out.println(a.add(b).toString());
System.out.println(a.multiply(b).toString());
System.out.println(a.divide(b, 10, BigDecimal.ROUND_HALF_UP));
}
}
運(yùn)行以上程序,Eclipse控制臺(tái)輸出結(jié)果如下:
由此得出結(jié)論,以后要用程序計(jì)算精確的貨幣運(yùn)算,就一定要用BigDecimal這個(gè)類。
不只如此,如果兩個(gè)數(shù)無(wú)比復(fù)雜,也能進(jìn)行精確的計(jì)算,如下例:
package cn.liayun.domain;
import java.math.BigDecimal;
public class Demo1 {
public static void main(String[] args) {
// 記住以后要用程序計(jì)算精確的貨幣運(yùn)算,就一定要用BigDecimal這個(gè)類
BigDecimal a = new BigDecimal("0.134589021832190483290483258423154366546546754743654364326543");
BigDecimal b = new BigDecimal("0.00612313143243254354645654758768679721342431555555555555555543351");
System.out.println(a.add(b).toString());// 兩數(shù)相加
System.out.println(a.multiply(b).toString());// 兩數(shù)相乘
System.out.println(a.divide(b, 10, BigDecimal.ROUND_HALF_UP));// 兩數(shù)相除,結(jié)果為四舍五入后,小數(shù)點(diǎn)后保留10個(gè)有效數(shù)字
}
}
運(yùn)行以上程序,Eclipse控制臺(tái)輸出結(jié)果如下:
編寫CalculatorBean,負(fù)責(zé)接收用戶輸入的計(jì)算數(shù)據(jù)并且進(jìn)行計(jì)算
CalculatorBean類的代碼如下:
package cn.liayun.domain;
import java.math.BigDecimal;
//封裝計(jì)算器數(shù)據(jù)的bean
public class CalculatorBean {
private String firstNum = "0";// 字段最好擁有顯示值
private char operator = '+';
private String secondNum = "0";
private String result;
public String getFirstNum() {
return firstNum;
}
public void setFirstNum(String firstNum) {
this.firstNum = firstNum;
}
public char getOperator() {
return operator;
}
public void setOperator(char operator) {
this.operator = operator;
}
public String getSecondNum() {
return secondNum;
}
public void setSecondNum(String secondNum) {
this.secondNum = secondNum;
}
public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result;
}
public void calculate() {
BigDecimal first = new BigDecimal(firstNum);
BigDecimal second = new BigDecimal(secondNum);
switch (this.operator) {
case '+': {
this.result = first.add(second).toString();
break;
}
case '-': {
this.result = first.subtract(second).toString();
break;
}
case '*': {
this.result = first.multiply(second).toString();
break;
}
case '/': {
if (second.doubleValue() == 0) {
throw new RuntimeException("被除數(shù)不能為0");
}
this.result = first.divide(second, 20, BigDecimal.ROUND_HALF_UP).toString();
break;
}
default:
throw new RuntimeException("運(yùn)算符只能是:+-*/");
}
}
}
編寫calculator.jsp,負(fù)責(zé)顯示計(jì)算器(calculator)頁(yè)面,供用戶輸入計(jì)算數(shù)據(jù),并顯示計(jì)算后的結(jié)果
calculator.jsp頁(yè)面的內(nèi)容如下:
<%@ 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>計(jì)算器</title>
</head>
<body style="text-align: center;">
<jsp:useBean id="calculatorBean" class="cn.liayun.domain.CalculatorBean"></jsp:useBean>
<jsp:setProperty property="*" name="calculatorBean"/>
<%
try {
calculatorBean.calculate();
} catch(Exception e) {
out.write(e.getMessage());
}
%>
<br/>----------------------------------------------------------------------<br/>
計(jì)算結(jié)果是:
<jsp:getProperty property="firstNum" name="calculatorBean"/>
<jsp:getProperty property="operator" name="calculatorBean"/>
<jsp:getProperty property="secondNum" name="calculatorBean"/>
=
<jsp:getProperty property="result" name="calculatorBean"/>
<br/>----------------------------------------------------------------------<br/>
<br/>
<form action="/day09/calculator.jsp" method="post">
<table width="40%" border="1px" align="center">
<tr>
<td colspan="2">簡(jiǎn)單的計(jì)算器</td>
</tr>
<tr>
<td>第一個(gè)參數(shù)</td>
<td><input type="text" name="firstNum"/></td>
</tr>
<tr>
<td>操作符</td>
<td>
<select name="operator">
<option value="+">+</option>
<option value="-">-</option>
<option value="*">*</option>
<option value="/">/</option>
</select>
</td>
</tr>
<tr>
<td>第二個(gè)參數(shù)</td>
<td><input type="text" name="secondNum"/></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="計(jì)算"/></td>
</tr>
</table>
</form>
</body>
</html>
在Google Chrome瀏覽器上訪問(wèn)以上頁(yè)面,運(yùn)行效果如下:
Servlet+JSP+JavaBean開(kāi)發(fā)模式
在平時(shí)的JavaWeb項(xiàng)目開(kāi)發(fā)中,在不使用第三方MVC開(kāi)發(fā)框架的情況下,通常會(huì)選擇Servlet+JSP+JavaBean開(kāi)發(fā)模式來(lái)開(kāi)發(fā)JavaWeb項(xiàng)目,Servlet+JSP+JavaBean組合開(kāi)發(fā)就是一種MVC開(kāi)發(fā)模式,控制器(Controller)采用Servlet、模型(Model)采用JavaBean、視圖(View)采用JSP。在講解Servlet+JSP+JavaBean開(kāi)發(fā)模式之前,先簡(jiǎn)單了解一下MVC開(kāi)發(fā)模式。
Web開(kāi)發(fā)中的請(qǐng)求-響應(yīng)模型
在Web世界里,具體步驟如下:
- Web瀏覽器(如IE)發(fā)起請(qǐng)求,如訪問(wèn)http://www.iteye.com/;
- Web服務(wù)器(如Tomcat)接收請(qǐng)求,處理請(qǐng)求(比如用戶新增,則將把用戶保存一下),最后產(chǎn)生響應(yīng)(一般為html);
- 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開(kāi)發(fā)時(shí)的請(qǐng)求/響應(yīng)模型,接下來(lái)我們看一下標(biāo)準(zhǔn)的MVC模型是什么。
標(biāo)準(zhǔn)MVC模型概述
MVC模型是一種架構(gòu)型的模式,本身不引入新功能,只是幫助我們將開(kāi)發(fā)的結(jié)構(gòu)組織的更加合理,使展示與模型分離、流程控制邏輯、業(yè)務(wù)邏輯調(diào)用與展示邏輯分離。如下圖所示:
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)在一般都分離開(kāi)來(lái):Value Object(數(shù)據(jù))和服務(wù)層(行為)。也就是模型提供了模型數(shù)據(jù)查詢和模型數(shù)據(jù)的狀態(tài)更新等功能,包括數(shù)據(jù)和業(yè)務(wù)。 - View(視圖)
負(fù)責(zé)進(jìn)行模型的展示,一般就是我們見(jiàn)到的用戶界面,客戶想看到的東西。 - Controller(控制器)
接收用戶請(qǐng)求,委托給模型進(jìn)行處理(狀態(tài)改變),處理完畢后把返回的模型數(shù)據(jù)返回給視圖,由視圖負(fù)責(zé)展示。也就是說(shuō)控制器做了個(gè)調(diào)度員的工作。
從上圖我們還看到,在標(biāo)準(zhǔn)的MVC中模型能主動(dòng)推數(shù)據(jù)給視圖進(jìn)行更新(觀察者設(shè)計(jì)模式,在模型上注冊(cè)視圖,當(dāng)模型更新時(shí)自動(dòng)更新視圖),但在Web開(kāi)發(fā)中模型是無(wú)法主動(dòng)推給視圖(無(wú)法主動(dòng)更新用戶界面)的,因?yàn)閃eb開(kāi)發(fā)是請(qǐng)求-響應(yīng)模型。
那接下來(lái)我們看一下在Web開(kāi)發(fā)里MVC是什么樣子,我們稱其為Web MVC來(lái)區(qū)別標(biāo)準(zhǔn)的MVC。
Web MVC概述
Web MVC中的M(模型)-V(視圖)-C(控制器)概念和標(biāo)準(zhǔn)MVC概念一樣,我們?cè)倏匆幌耊eb MVC標(biāo)準(zhǔn)架構(gòu),如下圖所示:
在Web MVC模式下,模型無(wú)法主動(dòng)推數(shù)據(jù)給視圖,如果用戶想要視圖更新,需要再發(fā)送一次請(qǐng)求(即請(qǐng)求-響應(yīng)模型)。
Servlet+JSP+JavaBean開(kāi)發(fā)模式介紹
Servlet+JSP+JavaBean架構(gòu)其實(shí)可以認(rèn)為就是我們所說(shuō)的Web MVC模型,只是控制器采用Servlet、模型采用JavaBean、視圖采用JSP,如下圖:
Servlet+JSP+JavaBean開(kāi)發(fā)模式與三層結(jié)構(gòu)
Servlet+JSP+JavaBean開(kāi)發(fā)模式通常會(huì)結(jié)合三層結(jié)構(gòu),如下圖:
相關(guān)案例查看更多
相關(guān)閱讀
- 生成海報(bào)
- 跳轉(zhuǎn)小程序
- 前端技術(shù)
- 云南網(wǎng)站建設(shè)首選公司
- 昆明網(wǎng)站建設(shè)公司
- 云南小程序開(kāi)發(fā)推薦
- 江蘇小程序開(kāi)發(fā)
- python開(kāi)發(fā)小程序
- 小程序設(shè)計(jì)
- 電商網(wǎng)站建設(shè)
- 云南網(wǎng)絡(luò)公司
- 做小程序被騙
- 云南etc小程序
- 云南小程序開(kāi)發(fā)費(fèi)用
- 云南網(wǎng)站建設(shè)首選
- 云南網(wǎng)站建設(shè)外包
- 紅河小程序開(kāi)發(fā)
- 人人商城
- 云南做網(wǎng)站
- 大理小程序開(kāi)發(fā)
- 網(wǎng)站開(kāi)發(fā)公司哪家好
- web開(kāi)發(fā)技術(shù)
- web教程
- 表單
- 人口普查小程序
- 小程序商城
- 微信小程序
- 云南建站公司
- 昆明網(wǎng)絡(luò)公司
- 汽車拆解系統(tǒng)