4
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<td colspan="1" width="100">
<c:choose>
  <c:when>
  </c:when>

  <c:when>
  </c:when>

  <c:when>
    <c:choose>
       <c:when></c:when><c:otherwise><c:when></c:when></c:otherwise>
    </c:choose>
  </c:when>

  <c:otherwise>
  </c:otherwise>
</c:choose>
</td>

このように、choose内にchooseをネストすることに制限はありますか?

編集:JSPコンパイラは、別の<c:when> </ c:when>を別の場所に配置すると、終了タグがないと文句を言い続けます。

4

4 に答える 4

5

私の知る限り、エラーがあります:

<c:when>
    <c:choose>
        <c:when></c:when><c:otherwise><c:when></c:when></c:otherwise>
    </c:choose>
</c:when>

次のようにする必要があります。

<c:when>
    <c:choose>
        <c:when></c:when>
        <c:otherwise></c:otherwise>
    </c:choose>
</c:when>

when タグを直接ネストすることはできません。そのためには、別の choose タグが必要です。

<c:when>
    <c:choose>
        <c:when></c:when>
        <c:otherwise>
            <c:choose>
                <c:when></c:when>
            </c:choose>
        </c:otherwise>
    </c:choose>
</c:when>
于 2014-03-28T11:46:06.330 に答える
2

JSP は Java に変換され、このようにカスタム タグごとに関数が作成されます。

private boolean _jspx_meth_c_005fwhen_005f0(javax.servlet.jsp.tagext.JspTag _jspx_th_c_005fchoose_005f0, javax.servlet.jsp.PageContext _jspx_page_context)
      throws java.lang.Throwable {
javax.servlet.jsp.PageContext pageContext = _jspx_page_context;
javax.servlet.jsp.JspWriter out = _jspx_page_context.getOut();
//  c:when
org.apache.taglibs.standard.tag.rt.core.WhenTag _jspx_th_c_005fwhen_005f0 = (org.apache.taglibs.standard.tag.rt.core.WhenTag) _005fjspx_005ftagPool_005fc_005fwhen_0026_005ftest.get(org.apache.taglibs.standard.tag.rt.core.WhenTag.class);
_jspx_th_c_005fwhen_005f0.setPageContext(_jspx_page_context);
_jspx_th_c_005fwhen_005f0.setParent((javax.servlet.jsp.tagext.Tag) _jspx_th_c_005fchoose_005f0);
// /index1.jsp(4,2) name = test type = boolean reqTime = true required = true fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
_jspx_th_c_005fwhen_005f0.setTest(((java.lang.Boolean) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${true}", java.lang.Boolean.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null, false)).booleanValue());
int _jspx_eval_c_005fwhen_005f0 = _jspx_th_c_005fwhen_005f0.doStartTag();
if (_jspx_eval_c_005fwhen_005f0 != javax.servlet.jsp.tagext.Tag.SKIP_BODY) {
  do {
    out.write("\r\n");
    out.write("  ");
    int evalDoAfterBody = _jspx_th_c_005fwhen_005f0.doAfterBody();
    if (evalDoAfterBody != javax.servlet.jsp.tagext.BodyTag.EVAL_BODY_AGAIN)
      break;
  } while (true);
}
if (_jspx_th_c_005fwhen_005f0.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
  _005fjspx_005ftagPool_005fc_005fwhen_0026_005ftest.reuse(_jspx_th_c_005fwhen_005f0);
  return true;
}
_005fjspx_005ftagPool_005fc_005fwhen_0026_005ftest.reuse(_jspx_th_c_005fwhen_005f0);
return false;
}

関数をネストすると、関数スタック レベルが増加します。デフォルトでは、JVM は適切なスタック サイズを持っているため、問題が発生するはずです。

于 2012-06-27T06:05:37.800 に答える
1

最終的には、スタックスペースが不足する可能性があります。それ以外の場合はありません。

于 2012-06-26T21:38:03.810 に答える
1

常識と可読性は、遭遇する可能性のある最も近い限界です。このコードに何か問題がありますか?

于 2012-06-26T21:38:44.777 に答える