2015-12-07 40 views
1

我有一個自制的標籤庫,我在JSP中使用。我的contains-tag出現問題。如何在我的自定義JSP標記中傳遞整數值作爲參數?

這是一個通用的contains-check,它接受一個列表和一個對象,並執行一個簡單的檢查,如果該列表包含該對象。但是,當列表包含整數值時,我遇到了問題。

這是我如何調用標籤:

<custom:contains object="1" list="${sessionScope.USER.userProfiles}"/> 

,這裏是Java類將調用:

public class ContainsTag extends SimpleTagSupport{ 
    private List<Object> list; 
    private Object object; 

    public void setList(List<Object> list) { 
     this.list = list; 
    } 

    public void setObject(Object object) { 
     this.object = object; 
    } 

    @Override 
    public void doTag() throws JspException, IOException {  

     boolean result; 
     try { 
      if(list == null || object == null){ 
       result = false; 
      } 
      else{ 
       result = list.contains(object); 
      } 

      getJspContext().getOut().print(result); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      // stop page from loading further by throwing SkipPageException 
      throw new SkipPageException("Exception in checking if " + list 
        + " contains " + object); 
     } 
    } 
} 

打印線報表顯示,即使對象打印1,並且列表打印[1],結果是false。由於該標籤適用於其他類型的對象(字符串等),這使我得出的結論是,對象是一個字符串值,因此在整數列表中找不到。我無法將對象轉換爲整數,因爲我的標記不再是通用的。

有沒有辦法指定參數是EL中的整數值?我需要製作另一個標籤ContainsInteger嗎?還是有其他解決方案來解決這個問題嗎?

UPDATE:

設置對象值"${1}"而不是"1",沒有什麼區別...

+0

」 ......更正式地說,返回true當且僅當此列表包含至少一個元素e(O == NULLé== NULL:o.equals(E ))。「在你的情況下,這永遠不會是真的,因爲1被視爲字符串,並且(我猜)你的List的成員是整數。所以要麼你應該使用一些[泛型](https://docs.oracle.com/javase/tutorial/java/generics/why.html)或使用字符串列表。 – Fildor

+0

你是說沒有辦法將值作爲數字整數傳遞?目前我正在研究如果反射可以用於類型值,如果它們不是相同的類型。但是,如果我可以指定該值應該是數字,那麼它會更加簡單和乾淨。 – KjetilNordin

+0

這就是爲什麼我建議泛型。不要使用'Object',而是使用T作爲類型。我認爲應該可以將1作爲數字1來處理,如果允許列表實際上是整數列表而不是對象。如果可能的話。我沒有太多的JSTL經驗...... – Fildor

回答

1

object="1"不會起作用,因爲它代表了一種String

String string1 = "1"; 
Integer integer1 = new Integer(1); 
System.out.println(string1.equals(integer1)); // false 

object="${1}"不會起作用,因爲在默認情況下EL基於整數號碼Long

Long long1 = new Long(1L); 
Integer integer1 = new Integer(1); 
System.out.println(long1.equals(integer1)); // false 

一個爲您解決問題的方法是使用一個List<Long>代替List<Integer>,或讓自定義標籤比較雙手toString()結果來代替。

String string1 = "1"; 
Integer integer1 = new Integer(1); 
System.out.println(string1.toString().equals(integer1.toString())); // true 
Long long1 = new Long(1L); 
Integer integer1 = new Integer(1); 
System.out.println(long1.toString().equals(integer1.toString())); // true 
+0

非常感謝你的回答。儘管它沒有特別說明,但我在指定參數是整數值的行之間閱讀是不可能的。 感謝您澄清,EL默認也很長。使用long而不是整數列表的建議是有道理的,但它對我來說似乎很骯髒。我的整數值甚至可能永遠不會是兩位數字,並且爲此使用長整數,這讓我感覺內部都是錯誤的。我會考慮升級到servlet 3.0/EL 2.2,使用反射來進行類型轉換,和/或爲containsInteger創建一個新的特定標籤。但非常感謝! – KjetilNordin

+0

如果'1'是像'$ {someBean.userProfile}'這樣的一個基於整數的bean屬性而不是硬編碼的值,它就會工作。你沒有在任何地方說明具體的功能要求,但如果我做了一個有教育的猜測,我認爲你最終需要枚舉。 – BalusC

+0

嗯。我的用戶配置文件是基於數據庫的。如果我提取它們,並將它們傳遞給sessionScoped全局應用程序數據,我可以從那裏獲取相關的整數值。這將是一個好方法。枚舉可能也是一個好主意,但在我目前的層面上,我很難在這種情況下使用枚舉。我認爲我會盡快讓這項工作變得非常好,乾淨!你很棒。 (讓我知道你是否需要跳傘課程,這對於聾啞人來說是一項完美的運動) – KjetilNordin

相關問題