javascript
Java-Web JSTL标签库、自定义标签库和MVC设计模式
目錄
一、JSTL標(biāo)簽庫(kù)
1.什么是JSTL
2.JSTL標(biāo)簽庫(kù)
?3.使用taglib指令導(dǎo)入標(biāo)簽庫(kù)
4.core標(biāo)簽庫(kù)常用標(biāo)簽
(1)out和set
(2)remove
(3)url
(4)if
(5)choose
(6)forEach
? ? 5.fmt標(biāo)簽庫(kù)常用標(biāo)簽
? ? ????(1)格式化時(shí)間
????? ? (2)格式化數(shù)字
二、自定義標(biāo)簽庫(kù)
? ? 1.自定義標(biāo)簽庫(kù)概述
????? ? (1)自定義標(biāo)簽的步驟
????? ? (2)SimpleTag接口
????????(3)標(biāo)簽的生命周期
????????(4)標(biāo)簽庫(kù)描述文件(TLD)
????? ? (5)使用標(biāo)簽
? ? 2.自定義標(biāo)簽進(jìn)階
????? ? (1)繼承SimpleTagSupport
????? ? (2)有標(biāo)簽體的標(biāo)簽
????? ? (3)不執(zhí)行標(biāo)簽下面的頁(yè)面內(nèi)容
????? ? (4)帶有屬性的標(biāo)簽
三、MVC
? ? 1.MVC設(shè)計(jì)模式
? ? 2.Java-Web與MVC
? ? 3.Java-Web經(jīng)典三層框架
一、JSTL標(biāo)簽庫(kù)
1.什么是JSTL
????????JSTL是apache對(duì)EL表達(dá)式的擴(kuò)展(也就是說(shuō)JSTL依賴EL),JSTL是標(biāo)簽語(yǔ)言!JSTL標(biāo)簽使用以來(lái)非常方便,它與JSP動(dòng)作標(biāo)簽一定,只不過(guò)它不是JSP內(nèi)置的標(biāo)簽,需要我們自己導(dǎo)包,以及指定標(biāo)簽庫(kù)而已!
2.JSTL標(biāo)簽庫(kù)
????????JSTL一共包含四大標(biāo)簽庫(kù):
????????????core:核心標(biāo)簽庫(kù),學(xué)習(xí)的重點(diǎn);
????????????fmt:格式化標(biāo)簽庫(kù),只需要學(xué)習(xí)兩個(gè)標(biāo)簽即可;
????????????sql:數(shù)據(jù)庫(kù)標(biāo)簽庫(kù),已經(jīng)過(guò)時(shí)了;
????????????xml:xml標(biāo)簽庫(kù),已經(jīng)過(guò)時(shí)了。
?3.使用taglib指令導(dǎo)入標(biāo)簽庫(kù)
????????下面是導(dǎo)入JSTL的core標(biāo)簽庫(kù):
????????????<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
????????????????prefix="c":指定標(biāo)簽庫(kù)的前綴,這個(gè)前綴可以隨便給值,但大家在使用core標(biāo)簽庫(kù)時(shí)指定前綴為c;
????????????????uri="http://java.sun.com/jstl/core":指定標(biāo)簽庫(kù)的uri,它不一定是真實(shí)存在的網(wǎng)址,但它可以讓JSP找到標(biāo)簽庫(kù)的描述文件;
4.core標(biāo)簽庫(kù)常用標(biāo)簽
(1)out和set
????????????? * <c:out>:輸出
? ????????????????? > value:可以是字符串常量,也可以是EL表達(dá)式
? ????????????????? > default:當(dāng)要輸出的內(nèi)容為null時(shí),會(huì)輸出default指定的值
? ????????????????? > escapeXml:默認(rèn)值為true,表示轉(zhuǎn)義!
?
<c:out value="${requestScope.book}></c:out>? ? ?和? ? ? ? ${requestScope.book}的區(qū)別
如果book為 <<內(nèi)容 >>${requestScope.book}則會(huì)認(rèn)為這是一個(gè)標(biāo)簽,則不會(huì)輸出任何內(nèi)容,<c:out 則可以,c<:out>還可以使用默認(rèn)值,功能更加強(qiáng)大。
?
? ????????????* <c:set>:設(shè)置(創(chuàng)建域的屬性)
? ????????????????? > var:變量名
????????????????? ? > value:變量值,可以是EL表達(dá)式
? ????????????????? > scope:域,默認(rèn)為page,可選值:page、request、session、application
? ? ? ? ? ? ? ? ? ? >target:指定域?qū)ο笾械膉avabean
? ? ? ? ? ? ? ? ? ? >property:javabean的成員變量
<%Customer cust=new Customer();cust.setId(1001);request.setAttribute("cust",cust); %> //為request域中的cust的id屬性賦值 <c:set targer="${requestScope.cust}" property="id" value="${param.id"}"></c:set> <body><!--在request域中添加name為a,值為A的數(shù)據(jù) --><c:set var="a" value="A" scope="request"/><!--全域查找a屬性和b屬性的值,找不到b,輸出lala--> <c:out value="${a}" default="haha" /><c:out value="${b}" default="lala"/><!--輸出hello字符串常量--><c:out value="hello"/><!--escapeXml為false,不會(huì)對(duì)"<" ">"進(jìn)行轉(zhuǎn)義,客戶端會(huì)彈框 hello --><%request.setAttribute("c","<script>alert('hello');</script>");%> <c:out value="${c}" escapeXml="false" /></body>(2)remove
????????????? * <remove>:刪除域變量
? ? ????????????????> var:變量名
????????????????? ? > scope:如果不給出scope,表示刪除所有域中的該名稱的變量;如果指定了域,那么只刪除該域的變量。
<body><%pageContext.setAttribute("a", "pageContext");request.setAttribute("a", "session");session.setAttribute("a", "session");application.setAttribute("a", "application");%> <!-- 刪除pageContext中name為a的數(shù)據(jù)! --><c:remove var="a" scope=”page”/><!-- 刪除所有域中name為a的數(shù)據(jù)! --><c:remove var="a"/></body>(3)url
? ????????????* value:指定一個(gè)路徑!它會(huì)在路徑前面自動(dòng)添加項(xiàng)目名。
????????????????????<c:url value="/index.jsp"/>,它會(huì)輸出/5.5/index.jsp
? ????????????* 子標(biāo)簽:<c:param>,用來(lái)給url后面添加參數(shù),例如:
? ????????????????? <c:url value="/">
? ? ? ??????????????<c:param name="username" value="張三"/> ?<!--可以對(duì)參數(shù)進(jìn)行url編碼!!-->
? ? ????????????????</c:url>
? ? ????????????????????結(jié)果為:/5.5/?username=%e5%bc%a0%e4%b8%89
????????? * var:指定變量名,添加了這個(gè)屬性,url標(biāo)簽就不會(huì)再輸出到頁(yè)面,而是把生成url保存到域中。
????????? * scope:它與var一起使用,用來(lái)保存url。
(4)if
?????????????* <c:if test="布爾類(lèi)型">...</c:if>,當(dāng)test為true時(shí),執(zhí)行標(biāo)簽體內(nèi)容!
<body><!-- 給request域中添加一個(gè)名為a的變量 --> <c:set var="a" value="hello" scope="request"/><!-- 判斷request域中的a是否為null --> <c:if test="${not empty requestScope.a }"><c:out value="${a }"/> </c:if></body>(5)choose
????????choose標(biāo)簽對(duì)應(yīng)Java中的if/else if/else結(jié)構(gòu)。when標(biāo)簽的test為true時(shí),會(huì)執(zhí)行這個(gè)when的內(nèi)容。當(dāng)所有when標(biāo)簽的test都為false時(shí),才會(huì)執(zhí)行otherwise標(biāo)簽的內(nèi)容。
請(qǐng)求頁(yè)面:http://localhost:8080/5.5/EL/EL5.jsp?score=80
<!-- 獲取請(qǐng)求參數(shù)score --> <c:set var="score" value="${param.score }"/> <c:choose><c:when test="${score > 100 || score < 0}">錯(cuò)誤的分?jǐn)?shù):${score }</c:when><c:when test="${score >= 90 }">A級(jí)</c:when><c:when test="${score >= 80 }">B級(jí)</c:when><c:when test="${score >= 70 }">C級(jí)</c:when><c:when test="${score >= 60 }">D級(jí)</c:when><c:otherwise>E級(jí)</c:otherwise> </c:choose></body>(6)forEach
????????????forEach當(dāng)前就是循環(huán)標(biāo)簽了,forEach標(biāo)簽有多種兩種使用方式:
????????????????使用循環(huán)變量,指定開(kāi)始和結(jié)束值,類(lèi)似for(int i = 1; i <= 10; i++) {};
????????????????循環(huán)遍歷集合,類(lèi)似for(Object o : 集合);
循環(huán)變量方式:
? ????屬性:
? ????????? * var:循環(huán)變量
? ????????? * begin:設(shè)置循環(huán)變量從幾開(kāi)始。
? ? ????????* end:設(shè)置循環(huán)變量到幾結(jié)束。
? ????????? * step:設(shè)置步長(zhǎng)!等同與java中的i++,或i+=2。step默認(rèn)為1
<body> <!-- 創(chuàng)建page域?qū)傩詓um --> <c:set var="sum" value="0" /> <!-- 設(shè)置循環(huán)變量i,初始化為1,每一次循環(huán)為i=i+2 --> <c:forEach var="i" begin="1" end="10" step="2"><c:set var="sum" value="${sum + i}" /> </c:forEach> <!-- 循環(huán)結(jié)束,輸出sum --> <c:out value="sum = ${sum }"/></body>遍歷集合或數(shù)組方式:
????????屬性:
????????????????items:指定要循環(huán)誰(shuí),它可以是一個(gè)數(shù)組或一個(gè)集合
????????????????var:把數(shù)組或集合中的每個(gè)元素賦值給var指定的變量。
<%List<String> names = new ArrayList<String>();names.add("zhangSan");names.add("liSi");names.add("wangWu");names.add("zhaoLiu");pageContext.setAttribute("ns", names); %> <c:forEach var="item" items="${ns }"><c:out value="name: ${item }"/><br/> </c:forEach>????????forEach標(biāo)簽還有一個(gè)屬性:varStatus,這個(gè)屬性用來(lái)指定接收“循環(huán)狀態(tài)”的變量名,例如:<forEach varStatus=”vs” …/>,這時(shí)就可以使用vs這個(gè)變量來(lái)獲取循環(huán)的狀態(tài)了。
????????????????count:int類(lèi)型,當(dāng)前以遍歷元素的個(gè)數(shù);
????????????????index:int類(lèi)型,當(dāng)前元素的下標(biāo);
????????????????first:boolean類(lèi)型,是否為第一個(gè)元素;
????????????????last:boolean類(lèi)型,是否為最后一個(gè)元素;
????????????????current:Object類(lèi)型,表示當(dāng)前項(xiàng)目。與${item}相同。
<%List<String> names = new ArrayList<String>();names.add("zhangSan");names.add("liSi");names.add("wangWu");names.add("zhaoLiu");pageContext.setAttribute("ns", names); %> <c:forEach var="item" items="${ns }" varStatus="vs"><c:if test="${vs.first }">hello123<br/></c:if><c:out value="第${vs.count }行: "/><c:out value="[${vs.index }]: "/><c:out value="name: ${vs.current }"/><br/> </c:forEach>瀏覽器輸出結(jié)果為:
? ? ? ? hello123
? ? ? ? 第1行: [0]: name: zhangSan
? ? ? ? 第2行: [1]: name: liSi
? ? ? ? 第3行: [2]: name: wangWu
? ? ? ? 第4行: [3]: name: zhaoLiu
遍歷Map集合:
<%Map<Integer,Student> map=new HashMap<Integer,Student>();map.put(1,new Student("張三",1001));map.put(2,new Student("李四",1002));map.put(3,new Student("王五",1003));request.setAttribute("StudentMap",map); %> <c:forEach items="${StudentMap}" var="items"><c:out value="${items.key}"/>---<c:out value="${items.value.name}"/>---<c:out value="${items.value.age}"/><br/> </c:forEach>? ? 5.fmt標(biāo)簽庫(kù)常用標(biāo)簽
? ? ????(1)格式化時(shí)間
<body><%Date d=new Date();request.setAttribute("date", d); %><fmt:formatDate value="${date }" pattern="yyyy-MM-dd HH:mm:ss"/></body>????? ? (2)格式化數(shù)字
<%double d1 = 3.1;double d2 = 4.4; pageContext.setAttribute("d1", d1);pageContext.setAttribute("d2", d2); %> <!-- 必須且僅能保留兩位小數(shù),如果大于兩位,那么只保留兩位,并四舍五入,如果小于兩位,那么使用0補(bǔ)足兩位。 --> <fmt:formatNumber value="${d1 }" pattern="0.00"/><br/> <!-- 最多顯示兩位,如果小于兩位,那么有幾位保留幾位,不會(huì)用0補(bǔ)足。大于兩位,只保留兩位,并四舍五入! --> <fmt:formatNumber value="${d2 }" pattern="#.##"/>二、自定義標(biāo)簽庫(kù)
? ? 1.自定義標(biāo)簽庫(kù)概述
????? ? (1)自定義標(biāo)簽的步驟
????????其實(shí)我們?cè)贘SP頁(yè)面中使用標(biāo)簽就等于調(diào)用某個(gè)對(duì)象的某個(gè)方法一樣,例如:<c:if test=””>,這就是在調(diào)用對(duì)象的方法一樣。自定義標(biāo)簽其實(shí)就是自定義類(lèi)一樣!
????????定義標(biāo)簽處理類(lèi):必須是Tag或SimpleTag的實(shí)現(xiàn)類(lèi)
????????編寫(xiě)標(biāo)簽庫(kù)描述符文件(TLD);
????????SimpleTag接口是JSP2.0中新給出的接口,用來(lái)簡(jiǎn)化自定義標(biāo)簽,現(xiàn)在我們基本上都是使用SimpleTag。
????????Tag是老的,傳統(tǒng)的自定義標(biāo)簽時(shí)使用的接口,現(xiàn)在不建議使用它了。
????? ? (2)SimpleTag接口
????????????????SimpleTag接口內(nèi)容如下:
????????????????????????void doTag():標(biāo)簽執(zhí)行方法;
????????????????????????JspTag getParent():獲取父標(biāo)簽;
????????????????????????void setParent(JspTag parent):設(shè)置父標(biāo)簽
????????????????????????void setJspContext(JspContext context):設(shè)置PageContext
????????????????????????void setJspBody(JspFragment jspBody):設(shè)置標(biāo)簽體對(duì)象;
????????(3)標(biāo)簽的生命周期
????????????1.當(dāng)容器(Tomcat)第一次執(zhí)行到某個(gè)標(biāo)簽時(shí),會(huì)創(chuàng)建標(biāo)簽處理類(lèi)的實(shí)例;
????????????2.然后調(diào)用setJspContext(JspContext)方法,把當(dāng)前JSP頁(yè)面的pageContext對(duì)象傳遞給這個(gè)方法;
????????????3.如果當(dāng)前標(biāo)簽有父標(biāo)簽,那么使用父標(biāo)簽的標(biāo)簽處理類(lèi)對(duì)象調(diào)用setParent(JspTag)方法;
????????????4.如果標(biāo)簽有標(biāo)簽體,那么把標(biāo)簽體轉(zhuǎn)換成JspFragment對(duì)象,然后調(diào)用setJspBody()方法;
????????????5.每次執(zhí)行標(biāo)簽時(shí),都調(diào)用doTag()方法,它是標(biāo)簽處理方法。
package cn.yfy.tag;import java.io.IOException;import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.SimpleTagSupport;public class MyTag1 extends SimpleTagSupport {@Overridepublic void doTag() throws JspException, IOException {this.getJspContext().getOut().print("hello,我是Tag1");} }????????(4)標(biāo)簽庫(kù)描述文件(TLD)
????????標(biāo)簽庫(kù)描述文件是用來(lái)描述當(dāng)前標(biāo)簽庫(kù)中的標(biāo)簽的!標(biāo)簽庫(kù)描述文件的擴(kuò)展名為tld,你可以把它放到WEB-INF下,這樣就不會(huì)被客戶端直接訪問(wèn)到了。
<?xml version="1.0" encoding="UTF-8"?><taglib xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"version="2.1"><tlib-version>1.0</tlib-version><short-name>yfy</short-name><uri>http://www.yfy.com/mytld</uri><tag><!-- 指定當(dāng)前標(biāo)簽的名稱 --><name>Mytag1</name><!-- 指定當(dāng)前標(biāo)簽的標(biāo)簽處理類(lèi) --><tag-class>cn.yfy.tag.MyTag1</tag-class><!-- 指定標(biāo)簽體的類(lèi)型 --><body-content>empty</body-content></tag> </taglib>????? ? (5)使用標(biāo)簽
????????????????在頁(yè)面中使用標(biāo)簽分為兩步:
????????????????????使用taglib導(dǎo)入標(biāo)簽庫(kù);
????????????????????使用標(biāo)簽;
<%@ taglib prefix="it" uri="http://www.yfy.com/mytld" %><body><h1><it:Mytag1/></h1></body>? ? 2.自定義標(biāo)簽進(jìn)階
????? ? (1)繼承SimpleTagSupport
????????繼承SimpleTagSuppport要比實(shí)現(xiàn)SimpleTag接口方便太多了,只需要重寫(xiě)doTag()方法,其他方法都已經(jīng)被SimpleTagSuppport完成了。
public class MyTag1 extends SimpleTagSupport {@Overridepublic void doTag() throws JspException, IOException {this.getJspContext().getOut().print("hello,我是Tag1");} }????? ? (2)有標(biāo)簽體的標(biāo)簽
????? ? 上面tld配置文件中有一個(gè)<body-context>標(biāo)簽。該標(biāo)簽元素的可選值為:
????????????empty:無(wú)標(biāo)簽體。
????????????JSP:傳統(tǒng)標(biāo)簽支持它,SimpleTag已經(jīng)不再支持使用<body-content>JSP</body-content>。標(biāo)簽體內(nèi)容可以是任何東西:EL、JSTL、<%=%>、<%%>,以及html;?
????????????scriptless:標(biāo)簽體內(nèi)容不能是Java腳本,但可以是EL、JSTL等。在SimpleTag中,如果需要有標(biāo)簽體,那么就使用該選項(xiàng);
????????????tagdependent:標(biāo)簽體內(nèi)容不做運(yùn)算,由標(biāo)簽處理類(lèi)自行處理,無(wú)論標(biāo)簽體內(nèi)容是EL、JSP、JSTL,都不會(huì)做運(yùn)算。這個(gè)選項(xiàng)幾乎沒(méi)有人會(huì)使用!
????自定義有標(biāo)簽體的標(biāo)簽需要:
????????????獲取標(biāo)簽體對(duì)象:JspFragment jspBody = getJspBody();;
????????????把標(biāo)簽體內(nèi)容輸出到頁(yè)面:jspBody.invoke(null);
????????????????? ? 傳遞的輸出流為null,表示使用的就是當(dāng)前頁(yè)面的out。
????????????tld中指定標(biāo)簽內(nèi)容類(lèi)型:scriptless。
創(chuàng)建標(biāo)簽處理類(lèi)
public class MyTag2 extends SimpleTagSupport {public void doTag() throws JspException, IOException {Writer writer=this.getJspContext().getOut();JspFragment jspbody=this.getJspBody();jspbody.invoke(writer);} }配置tld
<tag><name>Mytag2</name><tag-class>cn.yfy.tag.MyTag2</tag-class><!-- 指定標(biāo)簽體的類(lèi)型為scriptless --><body-content>scriptless</body-content></tag>調(diào)用該標(biāo)簽
<%@ taglib prefix="it" uri="http://www.yfy.com/mytld" %><h1><it:Mytag2>helloworld${name }</it:Mytag2></h1>????? ? (3)不執(zhí)行標(biāo)簽下面的頁(yè)面內(nèi)容
????????如果希望在執(zhí)行了自定義標(biāo)簽后,不再執(zhí)行JSP頁(yè)面下面的東西,那么就需要在doTag()方法中使用SkipPageException。
public class MyTag3 extends SimpleTagSupport {public void doTag() throws JspException, IOException {this.getJspContext().getOut().print("<h1>只能看到我!</h1>");throw new SkipPageException();} } <tag><name>Mytag3</name><tag-class>cn.yfy.tag.MyTag3</tag-class><body-content>empty</body-content></tag> <%@ taglib prefix="it" uri="http://www.yfy.com/mytld" %><it:Mytag3/><h1>看不見(jiàn)我</h1>????? ? (4)帶有屬性的標(biāo)簽
????????一般標(biāo)簽都會(huì)帶有屬性,例如<c:if test=””>,其中test就是一個(gè)boolean類(lèi)型的屬性。完成帶有屬性的標(biāo)簽需要:
????????在處理類(lèi)中給出JavaBean屬性(提供get/set方法);
????????在tld中配置相關(guān)屬性。
創(chuàng)建標(biāo)簽處理類(lèi)
public class MyTag4 extends SimpleTagSupport {private boolean test;public boolean isTest() {return test;}public void setTest(boolean test) {this.test = test;}@Overridepublic void doTag() throws JspException, IOException {if(test){this.getJspContext().getOut().print("騎士總冠軍");} } }配置tld
<tag><name>Mytag4</name><tag-class>cn.yfy.tag.MyTag4</tag-class><body-content>empty</body-content><attribute><!-- 指定屬性名 --><name>test</name><!-- 指定屬性是否為必須的 --><required>true</required><!-- 指定屬性是否可以使用EL --><rtexprvalue>true</rtexprvalue></attribute></tag>調(diào)用該標(biāo)簽
<%@ taglib prefix="it" uri="http://www.yfy.com/mytld" %><it:Mytag4 test="true"/>三、MVC
? ? 1.MVC設(shè)計(jì)模式
?
????????MVC模式(Model-View-Controller)是軟件工程中的一種軟件架構(gòu)模式,把軟件系統(tǒng)分為三個(gè)基本部分:模型(Model)、視圖(View)和控制器(Controller)。
????????MVC模式最早為T(mén)rygve Reenskaug提出,為施樂(lè)帕羅奧多研究中心(Xerox PARC)的Smalltalk語(yǔ)言發(fā)明的一種軟件設(shè)計(jì)模式。
????????MVC可對(duì)程序的后期維護(hù)和擴(kuò)展提供了方便,并且使程序某些部分的重用提供了方便。而且MVC也使程序簡(jiǎn)化,更加直觀。
????????????????控制器Controller:對(duì)請(qǐng)求進(jìn)行處理,負(fù)責(zé)請(qǐng)求轉(zhuǎn)發(fā);
????????????????視圖View:界面設(shè)計(jì)人員進(jìn)行圖形界面設(shè)計(jì);
????????????????模型Model:程序編寫(xiě)程序應(yīng)用的功能(實(shí)現(xiàn)算法等等)、數(shù)據(jù)庫(kù)管理;
????????注意,MVC不是Java的東西,幾乎現(xiàn)在所有B/S結(jié)構(gòu)的軟件都采用了MVC設(shè)計(jì)模式。但是要注意,MVC在B/S結(jié)構(gòu)軟件并沒(méi)有完全實(shí)現(xiàn),例如在我們今后的B/S軟件中并不會(huì)有事件驅(qū)動(dòng)!
? ? 2.Java-Web與MVC
????????JSP:視圖層,用來(lái)與用戶打交道。負(fù)責(zé)接收用來(lái)的數(shù)據(jù),以及顯示數(shù)據(jù)給用戶;
????????Servlet:控制層,負(fù)責(zé)找到合適的模型對(duì)象來(lái)處理業(yè)務(wù)邏輯,轉(zhuǎn)發(fā)到合適的視圖;
????????JavaBean:模型層,完成具體的業(yè)務(wù)工作,例如:開(kāi)啟、轉(zhuǎn)賬等。
? ? 3.Java-Web經(jīng)典三層框架
????????我們常說(shuō)的三層框架是由JavaWeb提出的,也就是說(shuō)這是JavaWeb獨(dú)有的!
????????所謂三層是表述層(WEB層)、業(yè)務(wù)邏輯層(Business Logic),以及數(shù)據(jù)訪問(wèn)層(Data Access)。
????????????????WEB層:包含JSP和Servlet等與WEB相關(guān)的內(nèi)容;
????????????????業(yè)務(wù)層:業(yè)務(wù)層中不包含JavaWeb API,它只關(guān)心業(yè)務(wù)邏輯;
????????????????數(shù)據(jù)層:封裝了對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)細(xì)節(jié); 注意,在業(yè)務(wù)層中不能出現(xiàn)JavaWeb API,例如request、response等。也就是說(shuō),業(yè)務(wù)層代碼是可重用的,甚至可以應(yīng)用到非Web環(huán)境中。業(yè)務(wù)層的每個(gè)方法可以理解成一個(gè)萬(wàn)能,例如轉(zhuǎn)賬業(yè)務(wù)方法。業(yè)務(wù)層依賴數(shù)據(jù)層,而Web層依賴業(yè)務(wù)層!
總結(jié)
以上是生活随笔為你收集整理的Java-Web JSTL标签库、自定义标签库和MVC设计模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java-Web JSP、Cookie
- 下一篇: Spring之Bean的配置(一)