在编写符合XML的JSP时,很难根据输入生成不同的HTML标记(例如,在<table>
中输出不同的标记时)。
标准解决方案是使用if
或choose
标记,但在HTML标记内共享代码会成为问题。 E.g。
<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提供<xsl:element>
标记,允许您使用标准XML语法构建标记及其属性。 JSP中的任何标记库中都有这样的标记吗?
答案 0 :(得分: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="<th>%" /></c:when>
<c:when test="${i.tag = 'td'}"><c:out value="<td>%" /></c:when>
</c:choose>
<!-- 100 lines of code -->
<c:choose>
<c:when test="${i.tag = 'th'}"><c:out value="</th>%" /></c:when>
<c:when test="${i.tag = 'td'}"><c:out value="</td>%" /></c:when>
</c:choose>
答案 1 :(得分: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}
答案 2 :(得分:0)
没有。 JSP需要在构建树时知道标记。这使得JSP的操作更加健壮
但是,您可以通过将重复代码分解为单独的JSP文件并将其包含在内来解决重复代码,具体取决于您使用的JSP的实现。
或者,您可以创建一个包含100行代码的JSP标记。这样做可能不值得。
最后,您可以使用th
上的样式而不是使用td
和td
来使td
看起来像th
。这会使元素看起来像
<td style="${i.tag == 'th' ? '' : 'font-style: bold; text-align: center;'}">
100 lines of code
</td>
我知道我的风格不是很正确,但您可以使用styleClass
代替并在CSS中使用它。