如果你经常去Servlet或JSP的新闻组或者邮件列表那么一定会看到不少关于Model I 和Model II 方法的讨论究竟采用哪一种这取决于你的个人喜好团队工作策略以及是否采用正统的OOP
简单地说Model I将事务逻辑(business logic)和表示代码(presentation code)融合在一起(如在HTML中)Model II则提倡最大限度地将所有的代码放到内容表示之外
Model I 简单的单层次应用
如果是在一个人人都精通Java和HTML的环境中或者你独自做着所有的工作假如每个人都有清晰的编程结构和思路那么这种方法会很有效不过这样的假设不在本文讨论范围之内这种方法的第一个优点是如果你的应用改变了你只需维护一个文件而最大的缺陷是可读性!除非十分小心否则你的HTML和Java代码会相互混杂从而难以维护
在下面这个例子中我们将增加一个 TimeZone 元素从而使它变成JSP文件它会返回基于时间的所期待的TimeZone如果没有提交 TimeZone那么缺省的是服务器的缺省时间
======================================================================
﹤xmlversion=?﹥
﹤H﹥TimeJSP﹤/H﹥
﹤jsp:scriptlet﹥
//theparameterzoneshallbeequaltoanumberbetweenand(inclusive)
TimeZonetimeZone=TimeZonegetDefault();//returnsthedefaultTimeZonefortheserver
if(requestgetParameterValues(zone)!=null)
{
StringtimeZoneArg=requestgetParameterValues(zone)[];
timeZone=TimeZonegetTimeZone(GMT++timeZoneArg+:);
//getsaTimeZoneForthisexamplewe´rejustgoingtoassume
//itsapositiveargumentnotanegativeone
}
//sincewe´rebasingourtimefromGMTwe´llsetourLocaletoBrittaniaandgetaCalendar
CalendarmyCalendar=CalendargetInstance(timeZoneLocaleUK);
﹤/jsp:scriptlet﹥
﹤%=myCalendarget(CalendarHOUR_OF_DAY)%﹥:
﹤%=myCalendarget(CalendarMINUTE)%﹥:
﹤%=myCalendarget(CalendarSECOND)%﹥
======================================================================
相应地数据也可以从JavaBean取得并加以显示在下一个例子中我们就可以看到
Model II: 重定向请求(Redirecting Requests)
在一个团队开发环境中有些是HTML设计者另一些则是Java程序员这时这一方法显得非常重要Java程序员可以集中精力创建可重用代码而HTML设计师可以集中精力于内容表示彼此相对对立可以分别动态地修改自己的内容只要总体的输入输出不变
现在我们可以使用Model II来表示Model I的那个例子这一方法遵循了ModelViewController (MVC) 范例 (cite Design Patterns book) 在这个例子中我们只有一个类(页或者servlet) 处理请求(Controller)取得TimeZone设置所有用于表示的变量并将控制传递到表示页(View)作为如此简单的应用可以没有 Model
Controller: timeByZonejsp
controller可以是一个servlet或一个JSP页我推荐使用JSP因为这样我不必担心每当我做修改时要对类重新编译但是你将因此失去granularity(颗粒性)以后要扩展该类也比较困难
======================================================================
﹤xmlversion=?﹥
﹤!WorkerClassnobodyshouldseeme﹥
﹤jsp:scriptlet﹥
//theparameterzoneshallbeequaltoanumberbetweenand(inclusive)
TimeZonetimeZone=TimeZonegetDefault();//returnsthedefaultTimeZonefortheserver
if(requestgetParameterValues(zone)!=null)
{
StringtimeZoneArg=requestgetParameterValues(zone)[];
timeZone=TimeZonegetTimeZone(GMT++timeZoneArg+:);
//getsaTimeZoneForthisexamplewe´rejustgoingtoassume
//itsapositiveargumentnotanegativeone
}
TimeBeantimeBean=newTimeBean();
timeBeansetHours=myCalendarget(CalendarHOUR_OF_DAY);
timeBeansetMinutes=myCalendarget(CalendarMINUTE);
timeBeansetSeconds=myCalendarget(CalendarSECOND);
HttpSessionmySession=requestgetSession();
mySessionputValue(tempTimeBeantimeBean);
﹤/jsp:scriptlet﹥
﹤jsp:forwardpage=displayTimejsp/﹥
======================================================================
View: displayTimejsp
同样地这个view既可以是一个servlet也可以是一个jsp文件这里我们从Session中取得并显示它的值实际上我们会将这做两次来示范Bean是如何被使用的
======================================================================
﹤xmlversion=?﹥
﹤H﹥TimeJSP﹤/H﹥
﹤jsp:useBeanclass=TimeBeanid=tempTimeBeanscope=session/﹥
﹤jsp:getPropertyname=tempTimeBeanproperty=hours﹥:
﹤jsp:getPropertyname=tempTimeBeanproperty=minutes﹥:
﹤jsp:getPropertyname=tempTimeBeanproperty=seconds﹥
﹤!thesewouldhaveprintednulliftempTimeBeanwasnotinstantiatedbytimeByZonejsp﹥
﹤jsp:scriptlet﹥
HttpSessionmySession=requestgetSession();
TimeBeantimeBean=mySessiongetValue(tempTimeBean);
if(timeBean!=null)
{//checktomakesureitsnotnulltoavoidNullPointerExceptions
outprint(timeBeangetHours());
outprint(:);
outprint(timeBeangetMinutes());
outprint(:);
outprint(timeBeangetSeconds());
}
else
{
outprintln(PressyourBackbuttonandselectaTimeZone);
}
﹤/jsp:scriptlet﹥
======================================================================