我們在做程序的過程中,常常會遇到這樣一種情況,就是在一個項目中,會發現有很多頁面的框架基本相同的,只是具體顯示的內容不同,而按常規的做法,我們可能會用include語句來提出框架內容,然後在每個頁面中引用這些框架,但這樣就會產生一個問題,如果我的框架發生變化了,那應該怎麼辦呢?舉個例子,一個index.jsp(SUN企業級應用的首選)可能包含有head.jsp(SUN企業級應用的首選)和foot.jsp(SUN企業級應用的首選)。而其它頁面也同樣包含這兩個jsp(SUN企業級應用的首選)。但如果我在index.jsp(SUN企業級應用的首選)裡有一段導航條的代碼,我現在想在每個頁面裡引用,而不想加到head.jsp(SUN企業級應用的首選)中,難道我們要在每個頁面裡都增加這個導航條的代碼嗎?我想我是不會這樣做的。因為有一種更好的辦法來解決這種問題。那就是采用模板頁面。
template頁面的原理,其實就是寫一個servlet來實現頁面的跳轉,然後在web.xml(標准化越來越近了)裡面配置這個servlet,使要使用模板的這一類jsp(SUN企業級應用的首選)文件,都通過這個servlet來處理,使它們都轉到模板頁面即可。然後在模板頁面中include這些頁面的內容頁即可。
具體的做法,只要寫一個template.jsp(SUN企業級應用的首選)做為模板頁面、一個TemplateDispatch.java做為跳轉的類就可以了。然後在調用時,直接指向這個SERVLET,加一個參數,說明要用到哪個內容頁就行了。寫個簡單的例子如下:
template.jsp(SUN企業級應用的首選)
=====================================
<% page contentType="text/html; charset=gb2312"%>
<%@ include file=“head.jsp(SUN企業級應用的首選)“%>
<%=(String)request.getAttribute(“body“)%>
<%@ include file=“foot.jsp(SUN企業級應用的首選)“%>
TemplateDispatch
=====================================
public class TemplateDispatchextends HttpServlet{
public void doGet(HttpServletRequest request,HttpServletResponse response){
doPost(request,response);
}
public void doPost(HttpServletRequest request,HttpServletResponse response){
HttpSession session = request.getSession(true);
session.setAttribute(“body“,“index.jsp(SUN企業級應用的首選)“);
RequestDispatcher rd = session.getServletContext().getRequestDispatcher("template.jsp(SUN企業級應用的首選)");
rd.forward(request,response);
}
}
web.xml(標准化越來越近了)
=====================================
<servlet>
<servlet-name>dispatch</servlet-name>
<servlet-class>TemplateDispatchextends </servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dispatch</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
代碼是即興寫的,沒有做過測試,只是表達一下意思。
===========================================
如果覺得簡單的話,還可以擴展一下。通過配置文件配置內容頁,以及taglib來定義兩個標簽insert用來增加內容頁、value用來在模板裡直接顯示內容。
現在在回頭想想前面提到的問題,是不是會比較容易解決了呢?如果頁面有什麼變動的話,只要修改一下模板頁就可以了。這樣還不會犯漏掉哪個頁面的錯誤。