2012-01-23 44 views
2

繼以下RequestParam value in spring MVC to be case insensitive之後,我在我的方法中添加了HttpServletRequest參數。但是,我添加了將近20個IF條件以具有完整的不區分大小寫的URL。HttpServletRequest參數lowecase

這是完全痛苦和醜陋的編碼方式,我知道。我要求任何人提供一個驚人的解決方案。

我需要有一個不區分大小寫的請求參數。正在發送的請求參數是orgID。這個參數將以不同的方式出現。說OrgidoRgidorGidorgID .......等等,對

我不能直接這樣做,因爲request.getParamter ("orgID")。爲此,我添加了許多條件。 :-(正如我所說的,完全醜陋編碼

回答

2

雖然這個概念是錯誤的(這是不好讓在不同情況下PARAMS)下面的代碼片段工作:

String getCaseInsensitiveParameter(HttpServletRequest request){ 
Map params = request.getParameterMap(); 
    Iterator i = params.keySet().iterator(); 
    while (i.hasNext()) 
     { 
     String key = (String) i.next(); 
     String value = ((String[]) params.get(key))[ 0 ]; 
     if ("orgid".equals(key.toLowerCase()) { 
      return value; 
     } 
     } 
return null; 
} 
+2

或者,您可以使用「」.equalsIgnoreCase()來讓正則表達式測試不會產生明確創建小寫副本的代價... – Ajax

+0

@Ajax:我同意。 – Arun

1

你可以有一個Spring MVC的處理程序攔截器(org.springframework.web.servlet Interface HandlerInterceptor),其採取的參數名稱和「轉換」是一個規範的名稱

喜歡的東西:。如果請求中的參數名稱以「id」結尾,無論哪種情況(除了完全「Id」),都需要參數,將其複製並添加到名稱「xxxId」下。

然後您只需要請檢查規範化的表單fin請求方法。

@請參閱:有關Handler攔截器的快速介紹: this blog關注的最後一個代碼塊是一個改進的想法,這是行不通的

2
private String getCaseInsensitiveOrgIdParameter(HttpServletRequest request) { 
    for (Map.Entry<String, String[]> entry : request.getParameterMap().entrySet()) { 
     String paramName = entry.getKey(); 
     if ("orgid".equals(paramName.toLowerCase()) { 
      return entry.getValue()[0]; 
     } 
    } 
    return null; 
} 

但我還是我的姿勢站:發送此參數的其他應用程序應該是固定的那些。如果參數是orgId,則應發送orgId。不是orGid或其他任何東西。如果他們懶惰(或愚蠢)足以發送orGid而不是orgId,則不保證他們不會發送ogrId。那麼你會怎麼做?

+0

非常感謝JB。很好的解決方案。它的工作。現在來問你的問題//如果他們懶惰(或愚蠢)足以發送orGid而不是orgId,則不保證他們不會發送ogrId。那麼你會怎麼做?我會把文件從我的公司逃走。已經設計有點奇怪,我個人覺得 – Arun

+1

正如我上面提到的,使用「」.equalsIgnoreCase()而不是顯式創建.toLowerCase()副本。 – Ajax

0

您應該使用equalsIgnoreCase方法:

public String getRequestParameter(HttpServletRequest request, String parameter){ 
    for (Map.Entry<String, String[]> entry : request.getParameterMap().entrySet()) { 
     if(entry.getKey().equalsIgnoreCase(parameter)){ 
      return entry.getValue()[0]; 
     } 
    } 
    return null; 
} 

或如果您有請求作爲實例變量:

public String getRequestParameter(String parameter){ 
    for (Map.Entry<String, String[]> entry : request.getParameterMap().entrySet()) { 
     if(entry.getKey().equalsIgnoreCase(parameter)){ 
      return entry.getValue()[0]; 
     } 
    } 
    return null; 
} 
0

我的解決方案n:只需創建一個新的params地圖對象,並使用小寫鍵填充它。然後使用這個params地圖而不是orignal對象。然後你可以要求小寫鍵。我做了這樣的(使用Apache Wicket的PageParameters類):

Map paramsOriginal = request.getParameterMap(); 
PageParameters paramsNew = new PageParameters(); 
Iterator<String> i = paramsOriginal.keySet().iterator(); 
while(i.hasNext()) { 
    String key = (String) i.next(); 
    String value = ((String[]) paramsOriginal.get(key))[0]; 
    //lowercase the key 
    paramsNew.put(key.toLowerCase(), value); 
} 

//request the value of a lowercased key 
String orgid = paramsNew.getString("orgid"); 
0

如果你有機會到Java 8:

request.getParameterMap().stream() 
    .collect(Collectors.toMap(e -> e.getKey().toLowerCase(), e.getValue())) 
    .get("orgID"); 
相關問題