JSP设计模式中的两种常见模式(1)(2)
第二种方法在内部使用了代码)可能有些笨重,但允许开发者确保输出不至于很糟糕例如“null:null:null null“),假定Session bean还没有被实例化以及没有进行值的设置。 这种情况发生在客户端直接调用了View页。问题是使用脚本scriptlets可以允许更强的控制。如果你确信你可以控制url存取,那么bean方法当然更适合于开发,并使 View页更方便于HTML设计者的协同工作。
上面的是“传统的“ Model II设计。所有的变量都包装了并放在Session对象中。这有2个不足:
1) 如果客户端拒绝参与的话,Session是不可得到的。
2) 除非Session变量被显式地移走,否则它回一直存在,直到Session被破坏或过期。
第一种案例很可能发生在这样的场合,即使用了cookies作为声明的结构mechanism)而开发者没有能够提供声明的结构的替代表单form),即URL改写。
第二个案例甚至更为严重,因为它可能引起很大的内存消耗,如果Sessions被定义为保存比标准存留时间更长的话(标准存留时间是30分钟)。即使是30分钟的Session,这种Model也可能在大的应用中引起灾难性的内存泄露。为什么呢?在Session对象内部设置的对象被实例化了,并且在Session终止以前一直没有被移去。因为它们仍然有关联referencesSession对象) 指向它们,所以无法被垃圾收集garbage-collected)。
在Model II 模型中,很多对象被放到Session中要么直接地,要么通过JavaBean)。随着Session的进行,更多的页被存取,内存使用会增加并持续下去直到客户端终止了Session或者Session过期。要一直等到Session变得非法,放在那的对象才能被垃圾收集,而那些损失的内存本可以用于任何其它的用途。.
改进的方法之一是将Beans或者其它变量放到Request对象中去,并使用RequestDispatcher.include()而不是RequestDispatcher.forward()。这样做以后,View 页具有和Controller一样的存取请求的对象。传统的Model II设计的不足可以被排除。
一个最后的评注:尽管有如上所述,我个人仍有些不喜欢Model II 的范例,如果它用通常方法开发的话。 客户端被引送到某一个地址,然后又被转向到另一个不同的类,我不喜欢创建这样的系统。基于这样的原因,我修改了设计,使它变成了以下的样子:
Controller: timeByZone2.jsp
和前面一样,controller使用Request值来取得必要的数据,并且将数据放到请求的对象中去。这回的区别是View页将使用RequestDispatcher.include()来调用Controller。在这种方法中,客户端再也不做重定向,请求不是“链接chained”的。相当于class/jsp请求了另一方来为它做一些工作,然后继续。
- ======================================================================
- ﹤xml version=“1.0“ ?﹥
- ﹤!--Worker Class, nobody should see me--﹥
- ﹤jsp:scriptlet﹥
- //the parameter “zone“ shall be equal to a number between 0 and 24 (inclusive)
- TimeZone timeZone = TimeZone.getDefault(); //returns the default TimeZone for the server
- if (request.getParameterValues(“zone“) != null)
- {
- String timeZoneArg = request.getParameterValues(“zone“)[0];
- timeZone = TimeZone.getTimeZone(“GMT+“ + timeZoneArg + “:00“);
- // gets a TimeZone. For this example we´re just going to assume
- // its a positive argument, not a negative one.
- }
- TimeBean timeBean = new TimeBean();
- timeBean.setHours = myCalendar.get(Calendar.HOUR_OF_DAY);
- timeBean.setMinutes = myCalendar.get(Calendar.MINUTE);
- timeBean.setSeconds = myCalendar.get(Calendar.SECOND);
- request.setAttribute(“tempTimeBean“, timeBean);
- ﹤/jsp:scriptlet﹥
- ======================================================================
View: displayTime2.jsp
和displayTime.jsp非常相似,但timeByZone2.jsp在也的顶部被调用。请注意
在一个在建系统中,我们已经使用这种方法来创建类的链,每一个都只对它所处理的工作负责。通过辨别公用的表示格式,我们创建了一个View对象,即使在很高层次的JSP中它也可以重复使用。我们的目标就是建立一些可重用的页,同时减少用于表示的类的数量
- ======================================================================
- ﹤xml version=“1.0“ ?﹥
- ﹤H1﹥Time JSP﹤/H1﹥
- ﹤jsp:include page=“timeByZone2.jsp“ /﹥
- ﹤jsp:useBean class=“TimeBean“ id=“tempTimeBean“ scope=“request“ /﹥
- ﹤jsp:getProperty name=“tempTimeBean“ property=“hours“﹥:
- ﹤jsp:getProperty name=“tempTimeBean“ property=“minutes“﹥:
- ﹤jsp:getProperty name=“tempTimeBean“ property=“seconds“﹥
- ﹤!-- these would have printed “null“ if tempTimeBean was not instantiated by timeByZone2.jsp --﹥
- ======================================================================
- 对JSP中的内置对象简单概述
- JSP和Servlet中的几个编码的作用及原理
- JSP标签库解析
- JSP设计模式浅析
- 什么是JSP以及其强弱势
相关文章
- 暂无相关文章
用户点评