在Jsp中模拟WebForm(五)

来源:互联网 发布:顽固软件卸载工具 编辑:程序博客网 时间:2024/05/01 02:34
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>

                                           在Jsp中模拟WebForm(五)

    在第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或其父控件中去。

(待续...)

相关文章:

Jsp中模拟WebForm(一)
Jsp中模拟WebForm(二)
Jsp中模拟WebForm(三)
Jsp中模拟WebForm(四)
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小野鸡不吃东西怎么办 宝宝发烧一天一夜不退怎么办 跟老公八字不合怎么办 做俯卧撑胸肌疼怎么办 健身完肌肉酸痛怎么办 不小心杀生了怎么办 名字取得太大了怎么办 麻将馆没客人怎么办 顺丰快递着急怎么办 孕妇吃菠萝过敏怎么办 燕窝炖稀了怎么办 玻尿酸隆鼻变宽怎么办? 三无燕窝被打假 怎么办 喜用神为土应该怎么办 喜用神互相克害怎么办? 姓名总格不好怎么办 姓名学里人格不好怎么办 买家订单下不了怎么办 公积金不够月供怎么办 房贷担保费没交怎么办 营业执照过期1年怎么办 营业执照和公章丢失怎么办 个体户怎么办对公账户 公章法人章丢失怎么办 广州买房没有社保怎么办 辞职后计生关系怎么办 广州换工作社保怎么办 学校更名了盖章怎么办 工商注册资金没有交怎么办 住公司宿舍怎么办居住证 住在公司宿舍怎么办居住证 滴滴没有的车型怎么办 假的租房合同怎么办 代注册公司被骗怎么办 公司跨区迁址怎么办 公司搬走注册地怎么办 注册公司没有房产证怎么办 公司不运营了怎么办 公司注销了账户怎么办 租户不变更地址怎么办 营业执照忘审了怎么办