学院首页 软件应用 编程开发 创意设计 认证培训 软件论坛
ASP ASP.NET PHP JSP SQL MYSQL Java VB

您的位置:学院 >> 编程开发 >> JSP >> 在JSP开发中模拟.NET WebForm(二)


在JSP开发中模拟.NET WebForm(二)


天极IT资讯短信服务 电脑小技巧
资费:包月5元
手机:
介绍:细处着手,巧处用功。高手和菜鸟之间的差别就是:高手什么都知道,菜鸟知道一些。电脑小技巧收集最新奇招高招,让你轻松踏上高手之路。

  WebForm这样的机制使得web开发如此地接近于桌面应用的开发,使开发变得更简单。而且我相信,asp.net这样作并没有什么性能上的损失,我们可以将asp.net生成的webForm的cs源文件和Jsp容器生成的jsp文件的java源文件,不难得到这一结论。

  可惜,如果我们在现有Jsp容器规范的约束下实现我们的想法,则不免要损失一些性能。前面我们在实现PageHandler的事件机制时,已经运用了java的反射机制,下面要实现服务器端控件,恐怕不免又要作一些额外的工作。

  观察由tomcat生成的带有tag的jsp页面的java源文件,会发现每一个tag都会根据其在jsp文件中出现的位置而在java源文件中的对应位置被实例化(resin生成的源码还与tomcat不一样,tomcat会对每一个出现的标签实例化,而resin则对同类的tag只实例化一次),犹如如下的格式:

ButtonTag _button1 = new ButtonTag();
_button1.setPageContext(pageContext);
_button1.setParent(null);
_button1.setCaption("我的按钮");
_button1.setId("button1");
_button1.setOnclick("clickme()");
try
{
int ret=_button1.doStartTag();
if (ret!=Tag.SKIP_BODY)
{
try
{
if (ret!=Tag.EVAL_BODY_INCLUDE)
{
out = pageContext.pushBody();
_button1.setBodyContent((BodyContent) out);
_button1.doInitBody();
}
do
{
...处理tag的body
}while(_button1.doAfterBody()==BodyTag.EVAL_BODY_AGAIN)
}
finally
{
if (ret!=Tag.EVAL_BODY_INCLUDE)
{
out = pageContext.popBody();
}
}
}
if (_button1.doEndTag()==Tag.SKIP_PAGE) return;
}
finally
{
_button1.release();
}

  当然,随着tag是BodyTagSupport还是TagSupport,生成的代码会有些不同。
  
  假设以上调用页面上所有tag的代码称为A,则我们希望最终生成的代码有类似如下的结构:

  1:PageHandler handler=new MyPageHandler();

  2:handler.prepareProcess(pageContext);//作处理前的初始化工作

  3:handler.onInit();

  4:A;//在A 执行过程中,我们希望能将tag的实例按顺

  //序添加到PageHandler的一个集合中

  5:handler.onLoad();//此时,所有控件已经初始化完毕

  6:handler.onEvent();//如果有请求的事件,则处理

  7:handler.render();//向页面输出html代码,pageHandler会调用每个控件

  //的写出html的方法,同时,摧毁每个控件

  8:handler.onUnload();

  在以上步骤中,1、2、6、7由PageHandler基类完成,6会自动调用MyPageHandler的适当方法。4由PageHandler和各个tag协同完成,主要是按照tag的出现顺序将其添加入MyPageHandler中,甚至能同MyPageHandler中声明的同名控件对象引用向联系。3、6、8由MyPageHandler负责重写,MyPageHandler还要负责事件处理的逻辑实现。

  这样,在第四步以后,MyPageHandler都可访问到页面中的tag实例,并可在4、5步骤中控制这些tag,在7中,tag会依据其自身最新的状态向客户端写出html文本。

  现在,在第4步还存在困扰我们的问题。


作者:Fancimage 出处:论坛责任编辑: 方舟 [ 2004-04-05 15:23 ]
WebForm这样的机制使得web开发如此地接近于桌面应用的开发,使开发变得更简单

  在第4步还存在困扰我们的问题。按照JSP规范对Tag的定义,tag的doStartTag和doEndTag应该向JspWrite对象实例out输出html文本,如果我们真的这么作了,5、6步骤对Tag进行操作还有何意义?tag已经输出到out对象中,生米成了熟饭,即使你在5、6两步中调用了_button.setCaption("不是我的按钮"),客户端也不会看到了。更重要的是4中调用了tag的release方法,tag的属性在5、6两步中已经面目全非了。

  办法只有一个,那就是在doStartTag、和doEndTag中不输出html文本,在release也不 释放tag的资源,而在另外的方法中实现本应这3个方法实现的功能,并在第7步中被pageHandler所调用。

  还有另外一个问题,jsp页面中存在大量非动态的文本,它们在生成的java文件中是被out.print输出的,如

<br>静态文本
<br><myjsp:button id="button1" caption="我的按钮">
<br>按钮之后

  如果按照以上的想法,则最终输出的会是:

<br>静态文本
<br>按钮之后
<br><myjsp:button id="button1" caption="我的按钮">

  这是因为我们并没如期在doStartTag和doEndTag中输出html,而在页面的最后才输出,因此,所有tag的输出就会落在所有静态内容之后。那岂不是乱了套。

  还记得我们先前写的PageTag吗(见本文二)?他的父类是BodyTagSupport,这样,对他的执行也会如对_button1(见本文四)那般。如果PageTag.doStartTag的返回值不是Tag.EVAL_BODY_INCLUDE,也不是Tag.SKIP_BODY,则会执行如下代码:

out = pageContext.pushBody();
_PageTag.setBodyContent((BodyContent) out);
_PageTag.doInitBody();

  这样,实际上就是把jsp的输出重定向了。pushBody的输出为BodyContent类的实类,同时也是JspWriter的子类,此后,out.print的任何输出都不会真正被写出,而被缓存在BodyContent中。想办法取出BodyContent中的这些字符串,让它们与tag依照jsp页面上一样的顺序出现在pageHandler的render方法中,我们就会得到正确的页面输出结果。

  我们前面说过,页面中的任何内容都置于<myjsp:page pageHandler="MyPageHandler"> 和</myjsp:page>之间,这样,页面中的所有内容都不会在PageTag.doEndTag之前被输出。

  我们写一个继承自BodyTagSupport的类WebControl,让其他的自定义标签均继承自这个类。则WebControl的实现大致如下:

public class WebControl extends BodyTagSupport
{
//阻止子类重写此方法
final public int doStartTag() throws JspException
{
if(本控件有父控件,且父控件不是PageTag也不是FormTag)
{
//从BodyContent中取出本tag开始之前的静态html文本,
//..置于pageHandler的render序列中
//将自身添加到pageHandler的控件集合中
}
else
{
//从BodyContent中取出本tag开始之前的静态html文本,
//..置于父控件的render序列中
//将自身添加到父控件的控件集合中
}
//清空BodyContent中的内容
}
//阻止子类重写此方法
final public int doEndTag() throws JspException
{
if(本控件有父控件,且父控件不是PageTag也不是FormTag)
{
//从BodyContent中取出本tag结束之前的静态html文本,
//..置于pageHandler的render序列中
}
else
{
//从BodyContent中取出本tag结束之前的静态html文本,
//..置于父控件的render序列中
}
//清空BodyContent中的内容
}
final void render() throws JspException
{
startRender();
//调用本控件子控件的render()方法(按render序列执行)
endRender();
dispose();
}
//以下3个方法应由子类重写
//输出控件的开始标记(原本应由doStartTag做的事情)
protected void startRender() throws JspException
{

}
//输出控件的闭合标记(原本应由doEndTag做的事情)
protected void endRender() throws JspException
{

}
//释放控件的资源(原本应由release做的事情)
protected void dispose()
{

}
}

  至此,按照上面的思路,在Jsp中模拟WebForm中可以实现的。在resin中运行还有些问题,因为resin为同类的tag只实例化一次,因此要在resin中运行必须修改WebControl的doStartTag方法,在此方法中,将this实例复制一分,再添加入pageHandler或其父控件中去。
技术文章快速查找

栏目导航
软件应用
·操作系统 ·杀毒防黑 ·应用软件
·聊天软件 ·网络软件  
Web开发
·ASP ·JavaScript ·CGI
·JSP ·VbScript ·Web服务器
·PHP ·XML  
开发语言
·VB ·VC ·ASP.NET
·Java ·C/C++ ·Delphi
数据库开发
·MySQL ·SQL/Access ·PowerBuilder
·Oracle ·DB2  
网站设计
·Flash ·Dreamweaver ·HTML/CSS
·Fireworks ·FrontPage  
平面设计
·Photoshop ·CorelDraw ·AutoCAD
·FreeHand ·Illustrator ·3DsMAX
媒体动画
·Director ·Authorware ·Maya
·视频处理    


相关软件 产品库推荐
·笔记本 ·台式机 ·服务器
·数码相机 ·手机 ·GPS
·DV摄像机 ·MP3 ·MP4
·CPU ·硬盘 ·内存
·主板 ·显卡 ·显示器
·打印机 ·投影机 ·路由器

还没人留言,抢个先,哈哈!
对"在JSP开发中模拟.NET WebForm(二)"的评论 - 快速回贴
内容:
  [完成后可按Ctrl+Enter发布]

百度中 在JSP开发中模拟.NET WebForm(二) 相关内容
Google搜索中 在JSP开发中模拟.NET WebForm(二) 相关内容
雅虎中 在JSP开发中模拟.NET WebForm(二) 相关内容
Sogou搜索中 在JSP开发中模拟.NET WebForm(二) 相关内容

相关软件 最新回复帖子:

·AutoCAD打造精致三维鸟笼实例详解
·Photoshop自定义水晶字特效样式
·AutoCAD三维基础实例教程
·PS为黑背景长发美女照片抠图换背
·用Photoshop自制个性摩托车贴花小经验
·轻松几步将美女照片处理为手工素描
·巧用Photoshop画笔轻松绘制创意特效
·用Photoshop通道将模糊肖像照片清晰化
·照片处理:Photoshop修复残破照片
·PS CS2新增形状模糊滤镜绘制花布图案


  相关软件 在JSP开发中模拟.NET WebForm(二)相关文章
在JSP开发中模拟.NET WebForm(一) Windows下JSP开发环境的配置
JSP/Servlet构建三层管理信息系统 JSP显示内容缓存技巧
Servlet/JSP配置详解 JSP的九种基本内置组件简介
在JSP中使用JavaMail 利用iText在JSP中生成PDF报表
一个用JSP实现的分页的类及调用方法 JSP实现论坛树型结构的具体算法
在JSP页面中轻松实现数据饼图 Servlets和JSP开发原则
Jsp结合XML+XSLT将输出转换为Html格式 在JSP中访问数据库大全
JSP技巧:发送动态图像 JSP调用JavaBean在网页上动态生成柱状图
JSP如何连接DB2数据库 JSP设计模式
关于JSP中文问题的解决方法 利用RamdonAccessFile来实现文件的追加