Java协作开发,Java开发学习笔记之八:servlet之间的协作
servlet與servlet,servlet與JSP(其本質(zhì)也是servlet)之間需要合作。主要因?yàn)橐韵聨讉€(gè)原因:
1.當(dāng)Web程序比較復(fù)雜時(shí),使用一個(gè)servlet來完成所有的功能顯然是不合理的。
2.Web構(gòu)件之間分工不同。比如servlet比較適合對(duì)于請(qǐng)求和響應(yīng)的控制,而JSP更適合在程序中充當(dāng)界面。
3.不同的Web應(yīng)用之間常常需要相互調(diào)用,這種相互調(diào)用僅僅通過HTML超鏈接的形式是不夠的。
servlet和其他Web構(gòu)件(如servlet,JSP,HTML)的合作主要有三類,分別是servlet鏈接(chaining)、包含響應(yīng)內(nèi)容(include)、轉(zhuǎn)遞請(qǐng)求(forward)。
較新的Web應(yīng)用服務(wù)器不支持servlet鏈接,取而代之的是過濾器(filter)鏈接機(jī)制。下面分別說明后兩種機(jī)制:包含響應(yīng)內(nèi)容和轉(zhuǎn)遞請(qǐng)求。
一、包含響應(yīng)內(nèi)容
顧名思義,包含響應(yīng)內(nèi)容這種合作機(jī)制的原理,就是在一個(gè)servlet內(nèi)容把另一個(gè)servlet的響應(yīng)內(nèi)容包含進(jìn)來。具體是這樣的:當(dāng)Servlet需要嵌入另一個(gè)Web資源時(shí),首先它建立一個(gè)請(qǐng)求分派對(duì)象(RequestDispatcher),然后使用RequestDispatcher對(duì)象的include方法在響應(yīng)中包括其他Web資源,最后將原servlet及被包含進(jìn)來的Web構(gòu)件的內(nèi)容合成為原Servlet的響應(yīng)輸出一并發(fā)送給客戶端。需要注意的是被包含的Web構(gòu)件(sevlet或JSP)不能改變從原Servlet傳遞進(jìn)來的ServletResponse對(duì)象的狀態(tài)編碼或頭信息,否則將觸發(fā)異常。參考如下幾段代碼:
1.
public class includeServlet extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse resp)
{
RequestDispatcher dispatcher = req.getRequestDispatcher("/servletBeIncluded");
if (dispatcher != null)
dispatcher.include(req,resp);
...
}
...
}
2.
public class includeServlet extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse resp)
{
RequestDispatcher dispatcher = getServetConfig().getServletContext().getRequestDispatcher("/servletBeIncluded");
if (dispatcher != null)
dispatcher.include(req,resp);
...
}
...
}
3.
public class includeServlet extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse resp)
{
RequestDispatcher dispatcher = getServetConfig().getServletContext().getContext("/webApp2").getRequestDispatcher("/servletBeIncluded");
if (dispatcher != null)
dispatcher.include(req,resp);
...
}
...
}
以上三段代碼分別說明了三種取得RequestDispatcher的方式,其中,第一段代碼是由當(dāng)前的ServletRequest對(duì)象直接獲得當(dāng)前Web應(yīng)用下的另一個(gè)要被包含到當(dāng)前servlet中的servlet的dispatcher,即這一行代碼:req.getRequestDispatcher("/servletBeIncluded");第二段代碼是由當(dāng)Web應(yīng)用的Context對(duì)象獲得dispatcher;第三段代碼是由另一個(gè)Web應(yīng)用的Context對(duì)象獲得另一個(gè)Web應(yīng)用的servlet的dispatcher。這三段代碼說明了以下幾點(diǎn):
1.由當(dāng)前ServletRequest對(duì)象的getRequestDispatcher()方法只能獲得當(dāng)前Web應(yīng)用的Web構(gòu)件的dispatcher,達(dá)到了在同一個(gè)Web應(yīng)用,不同的Web構(gòu)件之間的協(xié)作。
2.可以由ServletContext獲得當(dāng)前或其它Web應(yīng)用的Web構(gòu)件的dispatcher,這樣就可以在不同的Web應(yīng)用之間進(jìn)行協(xié)作。
二、向其它Web資源轉(zhuǎn)遞請(qǐng)求? 這種協(xié)作機(jī)制和上述include機(jī)制類似,也是需要先獲得待協(xié)作Web資源(servlet或jsp)的ResquestDispatcher。與include機(jī)制不同的是,前者是包含,而后者是轉(zhuǎn)遞,也就是說直接將響應(yīng)轉(zhuǎn)向到另一個(gè)Web構(gòu)件中去,由另一個(gè)Web構(gòu)件去處理。也就是說當(dāng)轉(zhuǎn)遞執(zhí)行之后,ServletRequest對(duì)象的URL名稱路徑會(huì)變?yōu)槟繕?biāo)Web構(gòu)件的URL。參考如下代碼:
public class includeServlet extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse resp)
{
RequestDispatcher dispatcher = req.getRequestDispatcher("/servletWillBeForward");
if (dispatcher != null)
dispatcher.forward(req,resp);
...
}
...
}
還有一種轉(zhuǎn)遞請(qǐng)求的形式:HttpServletRespnse.sendRedirect(String location)。這種方法與forward不同的地方是:sendRedirect是向客戶端發(fā)送一個(gè)HTTP的URL重定向響應(yīng),讓客戶瀏覽器將當(dāng)前Web請(qǐng)求發(fā)磅到另一個(gè)URL。因此,sendRedirect方法的參數(shù)的相對(duì)路徑不是相對(duì)于當(dāng)前Web應(yīng)用的當(dāng)前路徑,而是相對(duì)于Web應(yīng)用服務(wù)器的根路徑;或者可以直接在參數(shù)中指明絕對(duì)路徑,如:
resp.setRedirect("http://xiya.com.cn/xyoa/")。
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的Java协作开发,Java开发学习笔记之八:servlet之间的协作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 高级特性,PHP对象、模式与实
- 下一篇: select选择后生成html,Java