控制动态servlet图形处理(2)

2008-02-23 09:40:59来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

编写定制 JSP 标记


既然明白了 Web 服务器是如何处理 JSP 页面请求的,那么让我们研究一下如何实现定制 JSP 标记。注:JSP 标记既来自标准库(如 Java Standard Template Library,JSTL),也来自您自己编写的库(也称为定制标记)。通常,定制标记处理特殊的问题领域。对本文而言,我们在处理如何管理图像。目前,Java 2 Extended Edition(J2EE)V1.2 和 V1.3 使用 JSP 规范 V1.2。在写作本文的时候,Sun 已经发布了 JSP 规范 V2.0。这个新规范并未对实现定制标记的方法进行重大更改。

通过 taglib 伪指令,可以将标准和定制标记库导入 JSP 页面,如下所示:

<%@ taglib uri='imagesizer.tld' prefix='util' %>


这个伪指令指定了标记库描述符文件的位置,这里指定的是 imagesizer.tld,还指定了在页面中使用它时的前缀,这里指定的是 util。如前面的标记示例所示,将标记与其前缀及其名称一起使用:

<util:imagesizer src="images/LazyDog.jpg"/>


标记库描述符告诉 Web 容器哪些标记是可用的,以及它们如何发挥作用。清单 1 显示了这样一个示例。文件使用了 XML 格式,并且易于读取,而应用程序开发平台 — 如 IBM WebSphere Studio Application Developer(Application Developer)可以帮助您填充字段,并且验证文件。最重要的信息是 tag 元素:它定义了定制 JSP 标记的名称和实现标记的 Java 类。它还显示了标记接受的任何属性和主体内容。

清单 1. 标记库描述符(Tag Library Descriptor,TLD)摘录

<taglib >

  <tlibversion> 1.0 </tlibversion>

  <jspversion> 1.1 </jspversion>

  <tag>

    <name>imagesizer</name>

    <tagclass>tags.ImageSizerTag</tagclass>

    <bodycontent>empty</bodycontent>

    <attribute>

      <name>src</name>

      <required>required</required>

    </attribute>

    <attribute>

      <name>alt</name>

    </attribute>

    <attribute>

      <name>quality</name>

    </attribute>

  </tag>

</taglib>



在这个示例中,tag 有三个属性,其中只有 src 属性是必需的。可选的 alt 属性模拟 HTML 的 img alt 属性。作为练习,您可以扩展该 JSP 标记以包含其它可选的 img 属性。(大约有 12 种这些属性。)最后,实现提供了一个可选的 quality 属性,以使页面编写人员可以控制已重新调整大小的图像的颗粒度和大小。
编写定制 JSP 标记的下一步是实现标记的 Java 代码。在本文中,标记 imagesizer 是在 tags.ImageSizerTag Java 类中实现的。大多数 J2EE 定制标记支持都位于 javax.Servlet.jsp.tagext 包中。imagesizer 类继承了标准的 TagSupport,后者实现不带主体的标记。TagSupport 的子代类是 BodyTagSupport,它也实现标记,并且带有主体。这两个类际迪至?Tag 接口,其中,当第一次读取标记以及当 Web 容器完全读取标记后再次读取标记时,会调用 doStartTag 和 doEndTag 方法。ImageSizer 标记只实现了 doEndTag,因为一旦所有属性信息都可用时,它需要起作用。

在 TagSupport 类中,PageContext 类提供了对有关 JSP 页面的重要信息的访问。例如,PageContext 提供了对 HttpRequest 和 HttpResponse 对象的访问。这些对象对于读取表单值和写响应是至关重要的。如果您希望跟踪用户的首选项,并且将表单值从一个页面传递到另一个页面,该请求还提供了对 HttpSession 的访问。PageContext 还提供了对 ServletContext 的访问,后者有助于您查找 servlet 的路径、名称和其它信息。在 ImageSizer 代码中(如清单 2 所示),有许多对 PageContext 对象及其提供信息的引用。图 3 显示了这些类的关系。就象任何标准类图一样,实心框代表类,而虚线框代表接口。用从派生的类或接口到其父类或接口的一条线来表示继承。

清单 2. ImageSizerTag doEndTag 实现

// Implement the tag once the complete tag has been read.

public int doEndTag() throws JspException {

  // Move request data to session.

  int outputSize = 0;

  String sizeVal = request.getParameter( REQUESTSIZEKEY );

  if ( sizeVal != null ) {

    session.setAttribute( REQUESTSIZEKEY, sizeVal );

    sizeVal = (String) session.getAttribute( REQUESTSIZEKEY );

    if ( sizeVal != null ) {

      outputSize = Integer.parseInt( sizeVal );

    }

  }

  // Get specified image locally.

  String contextPath = getContextPath( request );

  Image image = Toolkit.getDefaultToolkit().getImage(contextPath   src );

  ImageSizer.waitForImage( image );

  int imageWidth = image.getWidth( null );

  int imageHeight = image.getHeight( null );

  if (( imageWidth > 0 ) && ( imageHeight > 0 )) {

    if (( outputSize > 0 ) && ( outputSize != imageWidth )) {

      // Convert image to new size.

      Image outputImage = ImageSizer.setSize( image, outputSize, -1 );

      ImageSizer.waitForImage( outputImage );

      int outputWidth = outputImage.getWidth( null );

      int outputHeight = outputImage.getHeight( null );

      if ( outputWidth > 0 && outputHeight > 0 ) {

        // Change image file name to xxxx.size.jpg

        String originalSrc = src;

        int lastDot = src.lastIndexOf( '.' );

        if ( lastDot > -1 ) {

          src = src.substring( 0, lastDot   1 );

        }

        setSrc( src   outputSize   ".jpg" );



        // Write new size image to JPEG file.

        File file = new File( contextPath   src );

        if ( !file.exists() ) {

          out.println( "" );

          FileOutputStream fos = new FileOutputStream( contextPath   src );

          ImageSizer.encodeJPEG( fos, outputImage, quality );

          fos.close( ) ;

        }

        imageWidth = outputWidth;

        imageHeight = outputHeight;

      }

    } // if outputSize

  } // if image found



  // Produce output tag.

  out.print( "<img src=\""   src   "\"" );

  // Add alt text, if any

  if ((alt != null ) && ( alt.length() > 0 )) {

    out.print( " alt=\""   alt   "\"" );

  }



  // Add proper width, height.

  out.print( " width=\""   imageWidth   "\" height=\""  

    imageHeight   "\"" );

  out.println( ">" );



  return EVAL_PAGE;

} // doEndTag
			   
			   

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:JSTL改进JSP来简化网页的实现过程(1)

下一篇:JSTL改进JSP来简化网页的实现过程(2)