📄 0192.htm
字号:
out.println("Press your Back button and select a TimeZone");<br>
}<br>
</jsp:scriptlet><br>
======================================================================<br>
第二种方法(在内部使用了代码)可能有些笨重,但允许开发者确保输出不至于很糟糕(例如"null:null:null null"),假定Session bean还没有被实例化以及没有进行值的设置。 这种情况发生在客户端直接调用了View页。问题是使用脚本scriptlets可以允许更强的控制。如果你确信你可以控制url存取,那么bean方法当然更适合于开发,并使 View页更方便于HTML设计者的协同工作。<br>
<br>
<br>
上面的是"传统的" Model II设计。所有的变量都包装了并放在Session对象中。这有2个不足:<br>
<br>
1) 如果客户端拒绝参与的话,Session是不可得到的。<br>
<br>
2) 除非Session变量被显式地移走,否则它回一直存在,直到Session被破坏或过期。 <br>
<br>
第一种案例很可能发生在这样的场合,即使用了cookies作为声明的结构(mechanism)而开发者没有能够提供声明的结构的替代表单(form),即URL改写。 <br>
<br>
第二个案例甚至更为严重,因为它可能引起很大的内存消耗,如果Sessions被定义为保存比标准存留时间更长的话((标准存留时间是30分钟)。即使是30分钟的Session,这种Model也可能在大的应用中引起灾难性的内存泄露。为什么呢?在Session对象内部设置的对象被实例化了,并且在Session终止以前一直没有被移去。因为它们仍然有关联references(Session对象) 指向它们,所以无法被垃圾收集(garbage-collected)。在Model II 模型中,很多对象被放到Session中(要么直接地,要么通过JavaBean)。随着Session的进行,更多的页被存取,内存使用会增加并持续下去直到客户端终止了Session或者Session过期。要一直等到Session变得非法,放在那的对象才能被垃圾收集,而那些损失的内存本可以用于任何其它的用途。. <br>
<br>
改进的方法之一是将Beans或者其它变量放到Request对象中去,并使用RequestDispatcher.include()而不是RequestDispatcher.forward()。这样做以后,View 页具有和Controller一样的存取请求的对象。传统的Model II设计的不足可以被排除。<br>
<br>
一个最后的评注:尽管有如上所述,我个人仍有些不喜欢Model II 的范例,如果它用通常方法开发的话。 客户端被引送到某一个地址,然后又被转向到另一个不同的类,我不喜欢创建这样的系统。基于这样的原因,我修改了设计,使它变成了以下的样子: <br>
<br>
Controller: timeByZone2.jsp<br>
<br>
<br>
和前面一样,controller使用Request值来取得必要的数据,并且将数据放到请求的对象中去。这回的区别是View页将使用RequestDispatcher.include()来调用Controller。在这种方法中,客户端再也不做重定向,请求不是“链接chained”的。相当于class/jsp请求了另一方来为它做一些工作,然后继续。<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>
request.setAttribute("tempTimeBean", timeBean);<br>
</jsp:scriptlet><br>
======================================================================<br>
<br>
<br>
View: displayTime2.jsp<br>
<br>
<br>
和displayTime.jsp非常相似,但timeByZone2.jsp在也的顶部被调用。请注意 <jsp:useBean /> 中的"scope"已经被换成了"request"。<br>
<br>
======================================================================<br>
<xml version="1.0" ?><br>
<H1>Time JSP</H1><br>
<br>
<jsp:include page="timeByZone2.jsp" /><br>
<br>
<jsp:useBean class="TimeBean" id="tempTimeBean" scope="request" /> <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 timeByZone2.jsp --><br>
<br>
======================================================================<br>
<br>
<br>
在一个在建系统中,我们已经使用这种方法来创建类的链,每一个都只对它所处理的工作负责。通过辨别公用的表示格式,我们创建了一个View对象,即使在很高层次的JSP中它也可以重复使用。我们的目标就是建立一些可重用的页,同时减少用于表示的类的数量。 <br>
<br>
单个的Servlet Model (A Model II Design)<br>
<br>
<br>
什么时候我有足够时间来研究这个课题,我会在这里发表更多的东西。 <br>
<br>
附原文:<br>
<br>
JSP Architectures<br>
An explanation and comparison of the methodologies<br>
commonly known as "Model I" and "Model II".<br>
Lance Lavandowska To Outline <br>
<br>
If you spend any time reading through Servlet or JSP related newsgroups or mailing lists, you're likely to encounter a discussion of Model I versus Model II methodologies . Which one you use depends on personal taste, team work strategies and OOP orthodoxy. <br>
<br>
Loosely described, Model I is an approach where business logic and presentation code can be intermixed with the presentation itself (HTML in our arena). Model II proscribes that all code, to the extent this is possible, be excluded from the presentation. <br>
<br>
Model I: Simple 2 1/2 Tier Application<br>
In a team environment where everyone knows Java and HTML, or if you're doing it all yourself, this approach can work well, provided everyone maintains a clear coding structure (that discussion is outside the bounds of this article). The primary advantage of this approach is that there is only one file to maintain for changes to your application. The major disadvantage is readability! Unless great care is taken, your HTML and Java code can become so intermingled that it becomes difficult to debug and maintain your application. <br>
<br>
For this example, we are going to revisit the "Sample Page" from the JSP Quick Start chapter. I'm going to add a TimeZone element, so we'll have a JSP that returns the time based on the desired timezone. If no TimeZone is submitted, we'll default to that of the server.<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>
Similarly, the data to be displayed could have been gotten from a JavaBean. We'll see a little of that in the next example. <br>
Model II: Redirecting Requests<br>
In a team environment where some members are HTML designers and others are Java programmers, this approach can be particularly strong. The Java programmers can focus on creating (re)usable code, while the HTML designers can focus on presentation. While the two remain dependant on each other, one or the other can change dramatically so long as the principle inputs and outputs (respectively) remain the same. <br>
<br>
Now we'll take the same desired behaviour from the Model I example, and present it using the Model II methodology. This methodology follows the Model-View-Controller (MVC) paradigm (cite Design Patterns book). For this example, we'll have one class (or page or servlet) process the request (Controller), get the TimeZone, set all the required variables for presentation, and pass control off to a presentation page (View). For simple apps like this, there is no "Model". <br>
<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -