วิธีใช้ตัวเลือก if-else ใน JSTL


คำตอบ:


521

ใช่ แต่มันเป็นเรื่องไร้สาระเหมือนนรกเช่น

<c:choose>
  <c:when test="${condition1}">
    ...
  </c:when>
  <c:when test="${condition2}">
    ...
  </c:when>
  <c:otherwise>
    ...
  </c:otherwise>
</c:choose>

5
นอกเหนือจากแท็กตัวห่อ (เลือก) ฉันไม่เห็นว่านี่เป็นสิ่งที่ละเอียดยิ่งกว่า / elseif / else อย่างไร แท็กที่ห่อหุ้มหนึ่งแทบจะไม่ถือว่า 'clunky as hell' ใช่ไหม
Steven Benitez

19
@Steven: เป็นลักษณะ XML ของมัน มีจำนวนอักขระในสำเร็จรูปมากกว่าในตรรกะจริง
skaffman

2
อาโอเค. สามารถตั้งค่าเดียวกันสำหรับ<c:if/>ตอนนั้นเช่นกัน
Steven Benitez

15
ฉันรู้ว่าฉันมาสายไปงานเลี้ยง<c:otherwise>นิดหน่อยแต่ดูเหมือน verbose เล็กน้อยใช่มั้ย?
andronikus

6
เริ่มต้นตรรกะการทำรังด้วยการเยื้องที่เหมาะสมและ clunky เนื่องจากนรกจะดูเหมือนเป็นคำอธิบายที่มากเกินไป
Adam Tolley

105

นอกจากคำตอบ skaffman แล้วง่าย ๆ ถ้าคุณสามารถใช้ตัวดำเนินการประกอบได้เช่นนี้

<c:set value="34" var="num"/>
<c:out value="${num % 2 eq 0 ? 'even': 'odd'}"/>

6
นี่เป็นคำตอบที่ดี แต่เป็นสถานการณ์ที่มีประโยชน์มาก
Mike LP

47

ไม่มีถ้า - อื่นเพียงถ้า

<c:if test="${user.age ge 40}">
 You are over the hill.
</c:if>

คุณสามารถเลือกใช้เมื่อ:

<c:choose>
  <c:when test="${a boolean expr}">
    do something
  </c:when>
  <c:when test="${another boolean expr}">
    do something else
  </c:when>
  <c:otherwise>
    do this when nothing else is true
  </c:otherwise>
</c:choose>

สวัสดี @iwxfer ลิงก์ด้านบนของคุณไม่สามารถใช้งานได้ในขณะนี้โปรดอัปเดตหากคุณสามารถทำคะแนนได้ดีโปรดลบออกอย่างอื่น
Ajay2707

25

ฉันทำได้โดยใช้แท็กสองแท็กถ้าคิดว่าฉันจะเพิ่มคำตอบในกรณีที่บุคคลอื่นใช้:

<c:if test="${condition}">
  ...
</c:if>
<c:if test="${!condition}">
  ...
</c:if>

ในขณะที่ในทางเทคนิคไม่ได้เป็นif-elseต่อพฤติกรรมที่เหมือนกันและหลีกเลี่ยงวิธี clunky ของการใช้chooseแท็กดังนั้นขึ้นอยู่กับความซับซ้อนของความต้องการของคุณคือสิ่งนี้อาจจะดีกว่า


1
พิจารณากรณีที่เงื่อนไขเป็นสิ่งที่ซับซ้อนและน่าเกลียดเช่น $ {ไม่ใช่ param.age gt 42 และ someOtherVar eq 'foobar'} คุณจะต้องเก็บเงื่อนไขไว้ในตัวแปรบูลีนชั่วคราวเพื่อให้คุณสามารถทำ! เงื่อนไขหรือเขียนส่วนกลับของเงื่อนไขนั้น ทั้งน่าเกลียด ไวยากรณ์ "อย่างอื่น" เป็นสิ่งที่ตรงกันข้ามกับการรับประกัน
matt burns

3
อันที่จริงเงื่อนไขที่ซับซ้อนอาจต้องการตัวแปรท้องถิ่นหรือการเขียนผกผัน แต่ตัวเลือกทั้งสองนั้นยังคงใช้งานได้ ฉันชี้แจงว่ามันจะขึ้นอยู่กับความซับซ้อนของความต้องการว่าวิธีนี้จะดีกว่าchooseแท็กหรือไม่
jonk

2
ฉันเห็นด้วยกับสิ่งนี้ หากคุณมีเพียงคนเดียวก็มีมาร์กอัปที่น้อยกว่าโดยใช้ c:
select

1
มีประโยชน์เพิ่มเติมอีกอย่างหนึ่งของการมี <c: if test = "$ {condition} == true"> และ <c: if test = "$ {condition == false}"> เมื่อตัวแปรนั้นเป็นโมฆะ (ไม่ได้กำหนดค่าเริ่มต้น) จะไม่มีการดำเนินการสาขาใดซึ่งเป็นสิ่งที่ดี หากคุณไปกับ <c: เลือก> และ <c: เมื่อ> สาขาที่ผิดจะถูกดำเนินการเมื่อตัวแปรนั้นเป็นโมฆะ
Steve Stilson

3

คุณต้องใช้รหัสนี้:

กับ <%@ taglib prefix="c" uri="http://www.springframework.org/tags/form"%>

และ

<c:select>
            <option value="RCV"
                ${records[0].getDirection() == 'RCV' ? 'selected="true"' : ''}>
                <spring:message code="dropdown.Incoming" text="dropdown.Incoming" />
            </option>
            <option value="SND"
                ${records[0].getDirection() == 'SND'? 'selected="true"' : ''}>
                <spring:message code="dropdown.Outgoing" text="dropdown.Outgoing" />
            </option>
        </c:select>

-1

นี่เป็นวิธีการที่ดีและมีประสิทธิภาพตามการคาดการณ์ความซับซ้อนของเวลา เมื่อมันจะได้รับสภาพที่แท้จริงมันจะไม่ตรวจสอบอื่น ๆ หลังจากนี้ ในหลาย ๆ ถ้ามันจะตรวจสอบแต่ละและเงื่อนไข

   <c:choose>
      <c:when test="${condtion1}">
        do something condtion1
      </c:when>
      <c:when test="${condtion2}">
        do something condtion2
      </c:when>
      ......
      ......
      ...... 
      .......

      <c:when test="${condtionN}">
        do something condtionn N
      </c:when>


      <c:otherwise>
        do this w
      </c:otherwise>
    </c:choose>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.