servlet+bean+jsp綜合案例,希望能給你提示!
發(fā)表時(shí)間:2023-08-02 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]本文討論Java Servlet和Java Server Page這兩種技術(shù),它們可以用于隔離用戶界面與業(yè)務(wù)邏輯,實(shí)現(xiàn)多層次的Web應(yīng)用程序。我們用一個(gè)簡(jiǎn)單的應(yīng)用來(lái)演示如何實(shí)現(xiàn)這種隔離,以及如何實(shí)現(xiàn)...
本文討論Java Servlet和Java Server Page這兩種技術(shù),它們可以用于隔離用戶界面與業(yè)務(wù)邏輯,實(shí)現(xiàn)多層次的Web應(yīng)用程序。我們用一個(gè)簡(jiǎn)單的應(yīng)用來(lái)演示如何實(shí)現(xiàn)這種隔離,以及如何實(shí)現(xiàn)快速的部署和改變Web應(yīng)用程序。
說(shuō)明 本文說(shuō)明如何隔離表現(xiàn)層與業(yè)務(wù)邏輯,實(shí)現(xiàn)多層次的Web應(yīng)用程序
正文 適用操作系統(tǒng):
跨平臺(tái)
隔離表現(xiàn)層與業(yè)務(wù)邏輯,實(shí)現(xiàn)多層次的Web應(yīng)用程序
引言
在建立服務(wù)器端Web應(yīng)用程序時(shí),將表現(xiàn)層與業(yè)務(wù)邏輯分離可以更容易的創(chuàng)建動(dòng)態(tài)的Web頁(yè)面,同時(shí)也可以讓沒(méi)有應(yīng)用開(kāi)發(fā)經(jīng)驗(yàn)的Web頁(yè)面設(shè)計(jì)人員能非常容易的改變Web站點(diǎn)的外觀。對(duì)于一個(gè)內(nèi)容需要頻繁更新的Web站點(diǎn),這就意味著更新周期更短,可以以最快的速度帶給本站點(diǎn)的訪問(wèn)者以最新的內(nèi)容。
早期的Web應(yīng)用程序結(jié)構(gòu)都很簡(jiǎn)單,通常用戶界面與業(yè)務(wù)邏輯都混合在一起。修改這種應(yīng)用的任何一方,都將使維護(hù)整個(gè)應(yīng)用程序變得十分困難。將用戶界面與業(yè)務(wù)邏輯隔離就簡(jiǎn)化了應(yīng)用程序的維護(hù),從而可以更快更容易的改變應(yīng)用程序。本文討論Java Servlet和Java Server Page這兩種技術(shù),它們可以用于隔離用戶界面與業(yè)務(wù)邏輯。我們用一個(gè)簡(jiǎn)單的應(yīng)用來(lái)演示如何實(shí)現(xiàn)這種隔離,以及如何實(shí)現(xiàn)快速的部署和改變應(yīng)用程序。
首先,我們簡(jiǎn)介一下Java Servlet和JSP及它們?nèi)绾卧谝粋(gè)Web應(yīng)用中協(xié)調(diào)工作。
什么是Servlet?
Servlet是平臺(tái)獨(dú)立的Java服務(wù)器端組件。它以多種方式來(lái)擴(kuò)展服務(wù)器端的功能,同時(shí)將維護(hù)和支持的開(kāi)銷也降到最小。Servlet不同于CGI腳本,它被編譯成Java的字節(jié)碼(bytecode),所以它沒(méi)有引入任何與平臺(tái)有關(guān)的因素,從而實(shí)現(xiàn)了真正的“Write Once,Run Anywhere”。
什么是Java Server Page(JSP)?
JSP是建立含有動(dòng)態(tài)內(nèi)容的Web應(yīng)用程序的Java技術(shù)。一個(gè)JSP頁(yè)面是一個(gè)文本文檔,包含了靜態(tài)的HTML內(nèi)容和動(dòng)態(tài)的動(dòng)作標(biāo)記。這些動(dòng)作描述了如何處理返回給客戶的響應(yīng)。在應(yīng)用開(kāi)發(fā)階段,JSP與Servlet差異很大,然而在運(yùn)行時(shí),它被編譯成Servlet,在JSP引擎中執(zhí)行。JSP引擎存在于任何一種Web應(yīng)用服務(wù)器中,如WebSphere V3.x。
Servlet和JSP協(xié)同工作
從理論上講,用戶可以只使用Servlet來(lái)接收從Web瀏覽器發(fā)來(lái)的HTTP請(qǐng)求,Servlet動(dòng)態(tài)的處理請(qǐng)求(可能是查詢后端系統(tǒng)來(lái)完成請(qǐng)求),然后在Servlet中直接發(fā)送HTML或XML文檔的響應(yīng)給瀏覽器。
上述方法在原理上是可行的,但它把Web頁(yè)面的產(chǎn)生也交由Java Servlet來(lái)做。如果Web頁(yè)面的設(shè)計(jì)人員要改變頁(yè)面的外觀就必須編輯、重新編譯Servlet。這將要求動(dòng)態(tài)Web頁(yè)面的設(shè)計(jì)人員需要有應(yīng)用程序開(kāi)發(fā)經(jīng)驗(yàn)。顯然,我們需要將Web頁(yè)面的顯示與Servlet處理請(qǐng)求相隔離。
滿足上述需求的方法是采納Model-View-Controller(MVC)模型來(lái)建立Web應(yīng)用程序。在MVC模型中,后端系統(tǒng)是我們的Model,用來(lái)創(chuàng)建用戶響應(yīng)界面的模板是View,而把這兩者聯(lián)系起來(lái)的紐帶是Controller。JSP完美的對(duì)應(yīng)于MVC模式中的View,Servlet包含了管理如何處理請(qǐng)求的邏輯,實(shí)際上就成為了Controller,而系統(tǒng)已有的業(yè)務(wù)規(guī)則就是Model。
我們來(lái)看一個(gè)例子,它使用了MVC模式實(shí)現(xiàn)表現(xiàn)層和業(yè)務(wù)邏輯的隔離,該例實(shí)現(xiàn)了從瀏覽器訪問(wèn)3270后端系統(tǒng)的一個(gè)應(yīng)用。
示例程序的體系結(jié)構(gòu)如圖1所示。瀏覽器使用HTML和JSP實(shí)現(xiàn)了View,一組在應(yīng)用服務(wù)器中的Java Servlet提供了Controller,后端的CICS等應(yīng)用提供了業(yè)務(wù)規(guī)則或稱作Model。Servlet、HTML、JSP頁(yè)面調(diào)用的流程如圖2所示,并附有詳細(xì)的文字?jǐn)⑹觥?br>
示例應(yīng)用流程詳解
發(fā)起請(qǐng)求
用戶用瀏覽器載入初始HTML頁(yè)面,該頁(yè)面是由Web使能的應(yīng)用服務(wù)器提供的。應(yīng)用服務(wù)器以與Web Server相同的方式來(lái)進(jìn)行Web文件服務(wù)。這個(gè)頁(yè)面是整個(gè)Web應(yīng)用的入口點(diǎn)。它使用了HTML FORM action標(biāo)記來(lái)訪問(wèn)Servlet。在我們的例子中,這個(gè)Servlet是LoginServlet。同樣附加的參數(shù)也隨著FORM的動(dòng)作發(fā)給Servlet。
下面是一段例子:
<FORM action="http://localhost:8080/servlet/LoginServlet" method="POST">
<input type="text" size="30" name="firstname">
<input type="text" size="30" name="surname">
.
.
<input type=hidden name=host value="localhost">
<input type=hidden name=port value="9876">
<input type=submit value=" Submit ">
</FORM>
請(qǐng)求一般是以HTTP或HTTPS來(lái)發(fā)起,然后由Servlet來(lái)處理。它使用HttpServletRequest.getParameter()方法來(lái)訪問(wèn)FORM表單提供的參數(shù)。
Servlet然后測(cè)試用戶是否有Session。Session用來(lái)將從遠(yuǎn)程客戶端來(lái)的一系列請(qǐng)求關(guān)聯(lián)起來(lái),這對(duì)于無(wú)狀態(tài)保持功能的HTTP協(xié)議是必須的。
Session可用如下方法來(lái)創(chuàng)建:
HttpSession session = req.getSession(true)
;
對(duì)象可以被加入到Session中去:
session.putValue(“host”,hostToConnectTo);
session.putValue(“port”,tmpPort);
Controller
Servlet負(fù)責(zé)調(diào)用處理用戶請(qǐng)求的JavaBean。它也負(fù)責(zé)創(chuàng)建對(duì)用戶的響應(yīng)。在我們建議的應(yīng)用結(jié)構(gòu)中,響應(yīng)將被傳遞到JSP。因此,Servlet被叫做Controller。
回到我們的例子。下面的代碼實(shí)例化一個(gè)類型CICSEmulator的新類叫newEmulator。這是一個(gè)由第三方廠商提供的3270終端仿真類,它提供了一組對(duì)仿真終端直接操縱的方法(類似的類也可以用IBM VisualAge for Java企業(yè)版中的Enterprise Access Builder來(lái)生成)。newEmulator可以從Session中傳遞變量,此例中變量為遠(yuǎn)程主機(jī)和端口。
CICSEmulator newEmulator = new CICSEmulator();
newEmulator.setTN3270Port(portToConnectTo);
newEmulator.setTN3270Host(hostToConnectTo);
第二個(gè)實(shí)例化的類是一個(gè)Java Bean叫做AcctDetails。它是一個(gè)數(shù)據(jù)訪問(wèn)Bean,它將向后端的系統(tǒng)查找和獲取數(shù)據(jù)。AcctDetails將newEmulator來(lái)作為它的 3270終端,然后傳遞變量(姓和名)給它的set方法。
AcctDetails getAccountDetails = new AcctDetails();
getAccountDetails.set3270Emulator(newEmulator);
getAccountDetails.setSurname(inputsurname);
getAccountDetails.setFirstName(inputfirstname);
數(shù)據(jù)訪問(wèn)Bean執(zhí)行請(qǐng)求
Bean實(shí)例getAccountDetails的方法performWork(),它連接后端3270系統(tǒng),并基于用戶提供的姓名來(lái)獲取用戶帳戶的細(xì)節(jié)。
try {
getAccountDetails.performWork();
session.putValue("resultsBean", getAccountDetails);
}
catch ( IllegalStateException e ) {
// handle the error
}
如果執(zhí)行成功,Servlet把getAccountDetails Bean放入用戶的session中。這個(gè)Bean的標(biāo)識(shí)符為resultsBean,它包含了用戶查詢的結(jié)果,這些結(jié)果可以用Bean的get方法來(lái)訪問(wèn)。
控制權(quán)傳給JSP
我們已經(jīng)提到,MVC模式的重點(diǎn)就在于它隔離了表現(xiàn)層與業(yè)務(wù)邏輯。Servlet負(fù)責(zé)處理請(qǐng)求,它會(huì)去調(diào)用數(shù)據(jù)訪問(wèn)Bean,數(shù)據(jù)訪問(wèn)Bean getAccountDetails包含了從后端系統(tǒng)訪問(wèn)和獲取數(shù)據(jù)的服務(wù)器端邏輯。后端系統(tǒng)(Model)包含了業(yè)務(wù)規(guī)則。而對(duì)用戶的響應(yīng)(View)是由JSP創(chuàng)建出來(lái)的。
Servlet將request和response對(duì)象傳遞給JSP時(shí)遵循如下的語(yǔ)法:
getServletContext().getRequestDispatcher(“/jspDemo/login.jsp”).forward(req,res);
Forward方法允許Servlet將響應(yīng)的處理傳給第三方。它的參數(shù)request和response必須就是調(diào)用servlet的service方法時(shí)傳遞的對(duì)象。 它使用 getRequestDispatcher對(duì)象來(lái)得到requestDispatcher,從而確定了到目的JSP的路徑。以“/”開(kāi)始的JSP路徑名被解釋成相對(duì)于當(dāng)前應(yīng)用上下文環(huán)境的根路徑。
訪問(wèn)ResultsBean
JSP負(fù)責(zé)創(chuàng)建對(duì)用戶的響應(yīng),它可以訪問(wèn)getAccountDetails Bean的數(shù)據(jù)(使用標(biāo)識(shí)符resultsBean來(lái)引用)。這些在HTML中用如下語(yǔ)法來(lái)完成:
<HTML>
<BODY>
.
.
<jsp:useBean id="resultsBean" scope="session" class="acct.AcctDetails " />
<jsp:getProperty name="resultsBean" property="*"/>
其中<JSP:useBean>是去查找已存在的對(duì)象(本例中是resultsBean)。本例中我們把getAccountDetails bean放入session中并命名為resultsBean。于是上述JSP語(yǔ)句就從session中得到了resultsBean,然后就可以通過(guò)訪問(wèn)resultsBean的get方法來(lái)得到它的數(shù)據(jù)。
也可以通過(guò)如下JSP語(yǔ)句來(lái)實(shí)現(xiàn):
<%= resultsBean.getDetails_Title() %>
<%= resultsBean.getDetails_Initial() %>
上述語(yǔ)句也是JSP表達(dá)式的一個(gè)例子。在<%=和%>之間所有的內(nèi)容被放入JSP引擎中處理,結(jié)果被作為輸出送給JSP文件。上述的兩個(gè)表達(dá)式將執(zhí)行resultsBean的get方法來(lái)顯示用戶的title和Middle_Initial。同任何一種腳本語(yǔ)言(如JavaScript)一樣,JSP代碼可以在HTML頁(yè)面中任意嵌入。JSP的語(yǔ)法也非常簡(jiǎn)單,這意味著JSP可以由Web頁(yè)面設(shè)計(jì)人員來(lái)維護(hù)而不是應(yīng)用開(kāi)發(fā)人員。開(kāi)發(fā)人員負(fù)責(zé)的是servlet和數(shù)據(jù)訪問(wèn)Bean。在JSP中的任何改變不會(huì)影響到servlet,反之亦然。
響應(yīng)
JSP在請(qǐng)求時(shí)被動(dòng)態(tài)翻譯成Java Servlet,并在應(yīng)用服務(wù)器中緩存。后續(xù)JSP請(qǐng)求的響應(yīng)將明顯加速。用戶收到的最終響應(yīng)都是HTML頁(yè)面(以.jsp為擴(kuò)展名),這些頁(yè)面包含了動(dòng)態(tài)產(chǎn)生的內(nèi)容。
總結(jié):
在本文示例的應(yīng)用結(jié)構(gòu)中,客戶端瀏覽器發(fā)起的請(qǐng)求直接到了servlet,然后用數(shù)據(jù)訪問(wèn)Bean來(lái)處理請(qǐng)求,從后端系統(tǒng)獲取數(shù)據(jù)。Servlet將結(jié)果包裝進(jìn)resultsBean,把它放入session中,然后調(diào)用JSP來(lái)處理這個(gè)響應(yīng)。Servlet是初始請(qǐng)求到產(chǎn)生響應(yīng)的總體控制者。
JSP決定產(chǎn)生給用戶響應(yīng)的內(nèi)容。JSP只應(yīng)當(dāng)包含如何格式化表現(xiàn)層的邏輯。這種隔離的優(yōu)點(diǎn)在于它創(chuàng)建了在應(yīng)用中可重用的、可移植的、平臺(tái)獨(dú)立的組件,這些組件可以作為將來(lái)更大的應(yīng)用的一部分。
隔離Servlet開(kāi)發(fā)與JSP顯示為應(yīng)用開(kāi)發(fā)人員和Web頁(yè)面設(shè)計(jì)人員彼此獨(dú)立的工作帶來(lái)了極大的方便。同樣,這種方法也完美的符合了本文所介紹的MVC設(shè)計(jì)模型。