1

在编写符合 XML 的 JSP 时,很难根据输入生成不同的 HTML 标记(例如在输出 a 中的不同标记时<table>)。

标准的解决方案是使用iforchoose标记,但在 HTML 标记内共享代码成为一个问题。例如

<c:choose>
 <c:when test="${i.tag = 'th'}><th> <!-- 100 lines of code --> </th></c:when>
 <c:when test="${i.tag = 'td'}><td> <!-- 100 lines of code duplicated?! --> </td></c:when>
</c:choose>

XSLT 提供了一个标签,允许您使用标准 XML 语法<xsl:element>构建标签及其属性。JSP中的任何标签库中都有这样的标签吗?

4

3 回答 3

1

你不应该这样做吗?

<c:choose>
 <c:when test="${i.tag = 'th'}"><th></c:when>
 <c:when test="${i.tag = 'td'}"><td></c:when>
</c:choose>
 <!-- 100 lines of code --> 
<c:choose>
 <c:when test="${i.tag = 'th'}"></th></c:when>
 <c:when test="${i.tag = 'td'}"></td></c:when>
</c:choose>


如果您希望您的标记是有效的 XML;使用一个自定义标签来包装您想要避免重复的所有 Java 代码。然后你的标记看起来像

<c:choose>
 <c:when test="${i.tag = 'th'}">
  <th>
   <my:customTag anyAttributes="th-related-values-if-any" ... />
  </th>
 </c:when>
 <c:when test="${i.tag = 'td'}">
  <td>
   <my:customTag anyAttributes="td-related-values-if-any" ... />
  </td>
 </c:when>
</c:choose>


或者,可以使用以下 hack(@Uooo建议)来传递 XML 验证器。

<c:choose>
 <c:when test="${i.tag = 'th'}"><c:out value="&lt;th&gt%" /></c:when>
 <c:when test="${i.tag = 'td'}"><c:out value="&lt;td&gt%" /></c:when>
</c:choose>
 <!-- 100 lines of code --> 
<c:choose>
 <c:when test="${i.tag = 'th'}"><c:out value="&lt;/th&gt%" /></c:when>
 <c:when test="${i.tag = 'td'}"><c:out value="&lt;/td&gt%" /></c:when>
</c:choose>
于 2013-10-16T12:53:31.823 回答
1

您可以创建一个包含“100 行代码”的单独 JSP 并将其包含在内。

将您的替换<!-- 100 lines of code -->为:

<jsp:include page="hundredLines.jsp">
    <jsp:param name="beanParam" value="beanValue"/>
</jsp:include>

在你的hundredLines.jsp

Bean can be used like ${beanParam}
于 2013-10-23T08:45:10.953 回答
0

不,JSP 在构建树时需要知道标签。这使得 JSP 的运行更加健壮

但是,您可以通过将其分解为单独的 JSP 文件并包含它来解决重复的代码,具体取决于您使用的 JSP 的实现。

或者,您可以创建一个包含 100 行代码的 JSP 标记。这样做可能不值得。

最后,您可以不使用thand而是td使用样式td来使td外观看起来像th. 这将使元素看起来像

<td style="${i.tag == 'th' ? '' : 'font-style: bold; text-align: center;'}">
  100 lines of code
</td>

我知道我的样式不太正确,但是您可以改用styleClass它并在您的 CSS 中使用它。

于 2013-10-16T12:55:08.300 回答