2015-04-05 16 views
1

代碼的用途:驗證來自用戶的輸入字符串。如果用戶輸入他的姓名,存儲爲'n',則輸入「James」,然後輸入「Validated!」。被展示。 (單獨的HTML表單負責輸入字符串)爲什麼String.quals()方法在JSTL Core標記<c:if>內工作?

儘管沒有任何錯誤,但標記內的測試失敗,並且不管輸入字符串是否爲「James」,都不顯示消息。

<body> 

    <% String n = (String)request.getParameter("n"); 
      String t = "James"; 
    %> 

    Message <!-- Default message displayed to show that HTML body is read. --> 

    <c:if test="${t.equals(n)}"> 
     <c:out value="Validated!"/> 
    </c:if> 

</body> 

如果我與真正的替換花括號內的測試條件,如果條件傳球和消息「驗證」!被展示。

爲什麼equals()方法不能在JSTL標籤內工作?

回答

3
  1. 您沒有將變量保存到範圍。 你需要這樣做才能讓EL看到你的變量。

保存變量的請求範圍

<c:set var="n" value="${param.n}" scope="request"/> 
<c:set var="t" value="James" scope="request"/> 
  • 您嘗試使用EL表達式標籤什麼是不正確的內部Java代碼。
  • 在某些情況下,它會工作,但它仍然不正確,因爲它是絕對的還原劑! EL已經被設計成能夠寫出這樣的東西,最簡單最容易。

    您需要使用EL的eq運算符而不是Java的.equals()

    更改您這樣的代碼:

    <c:if test="${t eq n}"> 
        <c:out value="Validated!"/> 
    </c:if> 
    

    附:您的JSP文件包含錯誤練習的腳本。

    會更好地爲您分離邏輯和視圖描述here

    +0

    爲了比較兩個字符串是否相似,我相信Java中的equals()方法而不是使用==運算符。據我所知,==運算符比較兩個操作數(變量)是否指向同一個對象。我錯了嗎? – 2015-04-05 10:35:25

    +0

    我認爲eq轉化爲==所以我的問題仍然有效。任何情況下,你能告訴我如何比較兩個字符串在標籤內是否有相同的值? – 2015-04-05 10:59:19

    +0

    @ user3111418如果我在EL世界中沒有記錯,你假設基本類型不存在(甚至Beans通常使用包裝類型,比如'Integer'而不是原始的'int'來允許* unset *狀態,這是通過使用null) '=='相當於代表'equals'方法的'eq'。 – Pshemo 2015-04-05 11:00:46

    1

    可以以這種方式使用正常==比較操作:

    <c:if test="${t == n}"> 
        <c:out value="Validated!"/> 
    </c:if> 
    

    如果需要比較兩個字符串值,而不是對象的屬性,你可以這樣做:

    <c:if test="${t == 'Any string can be here'}"> 
        <c:out value="Validated!"/> 
    </c:if> 
    
    +0

    'n'是可變的,不是字符串:) – WildDev 2015-04-05 10:10:32

    +0

    對不起,你是對的。我會編輯我的答案。 – hamed 2015-04-05 10:11:20

    +0

    如果我們需要比較字符串值而不是它們是否指向同一個對象,那麼您有什麼建議? – 2015-04-05 11:00:33

    相關問題