?? 0192.htm
字號:
<html>
<head>
<title>新時代軟件教程:操作系統 主頁制作 服務器 設計軟件 網絡技術 編程語言 文字編輯</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<style>
<!--
body, table {font-size: 9pt; font-family: 宋體}
a {text-decoration:none}
a:hover {color: red;text-decoration:underline}
.1 {background-color: rgb(245,245,245)}
-->
</style>
</head>
<p align="center"><script src="../../1.js"></script></a>
<p align="center"><big><strong>JSP 構 架 --2種方式:Model I和Model II</strong></big></p>
<div align="right">--- (文/blueski)</div>
<br>如果你經常去Servlet或JSP的新聞組或者郵件列表,那么一定會看到不少關于Model I 和Model II 方法的討論。究竟采用哪一種,這取決于你的個人喜好、團隊工作策略以及是否采用正統的OOP。 <br>
<br>
簡單地說,Model I將事務邏輯(business logic)和表示代碼(presentation code)融合在一起(如在HTML中);Model II則提倡最大限度地將所有的代碼放到內容表示之外。<br>
<br>
<br>
Model I: 簡單的單層次應用<br>
<br>
如果是在一個人人都精通Java和HTML的環境中,或者你獨自做著所有的工作,假如每個人都有清晰的編程結構和思路,那么這種方法會很有效,不過這樣的假設不在本文討論范圍之內。這種方法的第一個優點是如果你的應用改變了,你只需維護一個文件。而最大的缺陷是可讀性!除非十分小心,否則你的HTML和Java代碼會相互混雜,從而難以維護。 <br>
<br>
在下面這個例子中,我們將增加一個 TimeZone 元素,從而使它變成JSP文件,它會返回基于時間的所期待的TimeZone。如果沒有提交 TimeZone,那么缺省的是服務器的缺省時間。<br>
<br>
======================================================================<br>
<xml version="1.0" ?><br>
<H1>Time JSP</H1><br>
<jsp:scriptlet><br>
//the parameter "zone" shall be equal to a number between 0 and 24 (inclusive)<br>
TimeZone timeZone = TimeZone.getDefault(); //returns the default TimeZone for the server<br>
if (request.getParameterValues("zone") != null)<br>
{<br>
String timeZoneArg = request.getParameterValues("zone")[0];<br>
timeZone = TimeZone.getTimeZone("GMT+" + timeZoneArg + ":00"); <br>
// gets a TimeZone. For this example we're just going to assume <br>
// its a positive argument, not a negative one.<br>
}<br>
//since we're basing our time from GMT, we'll set our Locale to Brittania, and get a Calendar.<br>
Calendar myCalendar = Calendar.getInstance(timeZone, Locale.UK);<br>
</jsp:scriptlet><br>
<%= myCalendar.get(Calendar.HOUR_OF_DAY) %>:<br>
<%= myCalendar.get(Calendar.MINUTE) %>:<br>
<%= myCalendar.get(Calendar.SECOND) %><br>
======================================================================<br>
相應地,數據也可以從JavaBean取得并加以顯示。在下一個例子中我們就可以看到。 <br>
<br>
<br>
Model II: 重定向請求(Redirecting Requests)<br>
<br>
<br>
在一個團隊開發環境中,有些是HTML設計者,另一些則是Java程序員,這時這一方法顯得非常重要。Java程序員可以集中精力創建可重用代碼,而HTML設計師可以集中精力于內容表示,彼此相對對立,可以分別動態地修改自己的內容,只要總體的輸入輸出不變。 <br>
<br>
現在我們可以使用Model II來表示Model I的那個例子。這一方法遵循了Model-View-Controller (MVC) 范例 (cite Design Patterns book)。 在這個例子中,我們只有一個類(頁或者servlet) 處理請求(Controller),取得TimeZone,設置所有用于表示的變量,并將控制傳遞到表示頁(View)。作為如此簡單的應用,可以沒有 "Model"。 <br>
<br>
Controller: timeByZone.jsp<br>
<br>
<br>
controller可以是一個servlet或一個JSP頁。我推薦使用JSP,因為這樣我不必擔心每當我做修改時要對類重新編譯,但是,你將因此失去granularity(顆粒性),以后要擴展該類也比較困難。<br>
<br>
<br>
======================================================================<br>
<xml version="1.0" ?><br>
<!--Worker Class, nobody should see me--><br>
<jsp:scriptlet><br>
//the parameter "zone" shall be equal to a number between 0 and 24 (inclusive)<br>
TimeZone timeZone = TimeZone.getDefault(); //returns the default TimeZone for the server<br>
if (request.getParameterValues("zone") != null)<br>
{<br>
String timeZoneArg = request.getParameterValues("zone")[0];<br>
timeZone = TimeZone.getTimeZone("GMT+" + timeZoneArg + ":00"); <br>
// gets a TimeZone. For this example we're just going to assume <br>
// its a positive argument, not a negative one.<br>
}<br>
TimeBean timeBean = new TimeBean();<br>
timeBean.setHours = myCalendar.get(Calendar.HOUR_OF_DAY);<br>
timeBean.setMinutes = myCalendar.get(Calendar.MINUTE);<br>
timeBean.setSeconds = myCalendar.get(Calendar.SECOND);<br>
HttpSession mySession = request.getSession();<br>
mySession.putValue("tempTimeBean", timeBean);<br>
<br>
</jsp:scriptlet><br>
<jsp:forward page="displayTime.jsp" /><br>
======================================================================<br>
<br>
<br>
View: displayTime.jsp<br>
<br>
<br>
同樣地,這個view既可以是一個servlet也可以是一個jsp文件。這里我們從Session中取得并顯示它的值。實際上我們會將這做兩次,來示范Bean是如何被使用的。 <br>
<br>
======================================================================<br>
<xml version="1.0" ?><br>
<H1>Time JSP</H1><br>
<jsp:useBean class="TimeBean" id="tempTimeBean" scope="session" /> <br>
<jsp:getProperty name="tempTimeBean" property="hours">:<br>
<jsp:getProperty name="tempTimeBean" property="minutes">:<br>
<jsp:getProperty name="tempTimeBean" property="seconds"><br>
<!-- these would have printed "null" if tempTimeBean was not instantiated by timeByZone.jsp --><br>
<br>
<jsp:scriptlet><br>
HttpSession mySession = request.getSession();<br>
TimeBean timeBean = mySession.getValue("tempTimeBean");<br>
if (timeBean != null)<br>
{ // check to make sure its not null, to avoid NullPointerExceptions<br>
out.print(timeBean.getHours());<br>
out.print(":");<br>
out.print(timeBean.getMinutes());<br>
out.print(":");<br>
out.print(timeBean.getSeconds());<br>
}<br>
else<br>
{<br>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -