使用Java开发定制标记库遇到的小问题——<body-content>

      最近在开发定制标记库时遇到了一个问题,当tld文件中把<body-content>设置为JSP时,服务器总是报错。

……specifies an invalid body-content (JSP) for a SimpleTag.

网上查找的资料很多不全面,如实查阅了《JSP程序设计》(O'Really公司 第三版)加上自己的思考,把原因搞清楚了。

      要将定制动作开发为Java类,需要使用一组类和接口,这在JSP规范中成为标记扩展机制。实现一个定制动作行为的类成为标记处理器。该类实际上是一个bean,其中包括与定制动作元素属性相对应的性质设置方法。而且这样一卦标记处理器类必须实现标记扩展机制所定义的4个Java接口之一。

      通常标记处理器分为两种:简单标记处理器和传统标记处理器。

      简单标记处理器需要实现SimpleTag接口,或继承SimpleTagSupport类。

      传统标记处理器需要实现其他三个接口,即Tag,IterationTag和BodyTag。Tag接口定义了对于所有标记处理器所需实现的方法。IterationTag接口拓展了Tag接口,并增加了迭代处理动作元素体所需的一些方法。BodyTag接口则扩展了IterationTag接口,并增加了对动作元素体计算结果提供访问方法。

      其中简单标记处理器是JSP2.0新引入的(不是指功能简单,而是相比传统标记处理器用起来简单,实际上功能非常强大)。我认为它的出现是因为EL和JSTL的引用,使得在JSP编程中几乎不需要使用脚本元素了,当然,这也是JSP所提倡的。了解了这个背景,就不难理解为什么<body-content>设置为JSP时会报错,因为我的标记处理器的实现是通过继承SimpleTagSupport来实现的。通过SimpleTag接口实现的标记处理器与<body-content>JSP</body-content>是不相容的。否则也就有悖于JSP2.0所提倡的减少JSP界面中的脚本元素。如果就是要使用<body-content>JSP</body-content>这种设置,那标记处理器只能通过实现传统标记处理器提供的三个接口来实现,当然这也是不提倡的。


在此,介绍一下<body-content>属性。<body-content>属性对于JSP2.0来说是必要属性,其值有四种:

empty:动作体为空

JSP:体包含JSP元素,如EL表达式,标准或定制动作以及脚本元素

scriptless:可以包含EL表达式和动作,但不能含有脚本元素

tagdependent:体中可以包含看似为JSP元素的内容,但是容器不对其进行计算(当体中的内容与JSP元素产生混淆时采用这个,不常用)

下面简单介绍各种属性的用法,即显示区别:

1.empty

<body-content>empty</body-content>
<my:date date="${now}"/>
2013-10-13

2.scriptless
<body-content>scriptless</body-content>
  <body>
    <jsp:useBean id="catalog" class="liangchao.bean.chap10.CatalogBean"></jsp:useBean>
    <my:forEachOption items="${catalog.productList}" var="product">
    	 ${product.name }:${product.price }<br/>
    </my:forEachOption>
  </body>
Thinking in Java:108.5
JSP Programming:58.5
Core Java:99.5



3.tagdependent

<body-content>tagdependent</body-content>
  <body>
    <jsp:useBean id="catalog" class="liangchao.bean.chap10.CatalogBean"></jsp:useBean>
    <my:forEachOption items="${catalog.productList}" var="product">
    	 ${product.name }:${product.price }<br/>
    </my:forEachOption>
  </body>
${product.name }:${product.price }
${product.name }:${product.price }
${product.name }:${product.price }



  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
首先,我们需要创建一个Java类,并添加以下代码: ```java import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class HappyCompSciServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html><body>"); out.println("<h1>快乐计科人</h1>"); out.println("</body></html>"); } } ``` 这个类继承了HttpServlet类,并覆盖了doGet()方法。在doGet()方法中,我们设置了响应的内容类型为"text/html",并使用PrintWriter对象输出HTML标记和文本。 接下来,在项目的web.xml文件中添加以下配置: ```xml <servlet> <servlet-name>HappyCompSciServlet</servlet-name> <servlet-class>HappyCompSciServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HappyCompSciServlet</servlet-name> <url-pattern>/happycompscipage</url-pattern> </servlet-mapping> ``` 这个配置将我们刚才创建的Java类映射到URL路径"/happycompscipage"上。 最后,在浏览器中访问"http://localhost:8080/yourprojectname/happycompscipage"(其中yourprojectname是你的项目名称),就可以看到显示“快乐计科人”的页面了!
最新发布
03-23
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值