2009-12-14 5 views
39

모든 언어의 드롭 다운 목록을 만들고 있습니다. 목록의 기본 언어 선택은 사용자가 추가 한 정보에 의해 결정됩니다 : EL 표현식 언어의 두 객체 변수를 비교하는 방법은 무엇입니까?

<select> 
    <c:forEach items="${languages}" var="lang"> 
     <c:choose> 
      <c:when test="${lang}.equals(${pageLang})"> 
       <option value="${lang}" selected>${lang}</option> 
      </c:when> 
      <c:otherwise> 
       <option value="${lang}">${lang}</option> 
      </c:otherwise> 
     </c:choose> 
    </c:forEach> 
</select> 

.equals

은 EL에 존재 나타나지 않습니다. 여기를 보시면 필자가 직접 함수를 작성한 다음 가져 와서 사용하는 것이 좋습니다. 이것이이 페이지를위한 작은 것 중 하나이기 때문에 저는 이것을 위해서만 라이브러리를 만드는 것을 시작하고 싶지는 않습니다. 서블릿이이 추가 정보를 가지고 돌아올 수있는 특수 객체를 만들기 시작하기를 원하지 않습니다.

내가 할 수있는 유일한 일은 언어 문자열이 아닌 서블릿에서 전체 옵션 행에 대한 실제 HTML을 반환하는 것입니다.하지만 추악한 표정이되어 더 우아한 해결책이되기를 바랍니다.

EL에서 두 개의 문자열을 비교하는 가장 빠른 계획은 무엇입니까? 내가 바로 당신을 얻을 있지만, 가장 간단한 방법이 될 경우

The J2EE 1.4 Tutorial

답변

99

Expression Language에서 == 또는 eq 연산자를 사용하면 개체 값을 비교할 수 있습니다. 뒤에 그들은 실제로 Object#equals()을 사용할 것입니다. 현재 EL 2.1 버전에서 표준 getter (및 setter) 메소드 (다른 EL2.2에서는 가능할 수 있음) 이외의 다른 시그니처를 가진 메소드를 호출 할 수 없기 때문에이 방법은 그렇게 수행됩니다.

그래서

<c:when test="${lang}.equals(${pageLang})"> 

과 같이 작성해야하는 특정 라인은 동등

<c:when test="${lang == pageLang}"> 

또는

<c:when test="${lang eq pageLang}"> 

모두 (전체 표현식이 {} 내부에 있습니다) 개략적으로 해석되는 장면 뒤에있다. 당신이 일정 String 값을 비교하려는 경우의

jspContext.findAttribute("lang").equals(jspContext.findAttribute("pageLang")) 

는, 당신은 그것을

<c:when test="${lang == 'en'}"> 

또는, 동등하게 약

으로 해석 장면 뒤에

<c:when test="${lang eq 'en'}"> 

을 인용 할 필요가

jspContext.findAttribute("lang").equals("en") 
+1

'test = "$ {lang eq 'en'}"도 사용할 수 있다고 가정합니다. 거기에'eq'가 보이지만, 문자열 상수는 아닙니다. 그냥 확실히, 나는 종종 JSTL/표현 언어를 자주 사용하지 않는다. – SuckerForMayhem

+1

@Sucker :'eq'는'=='의 별칭이다. 둘 다 똑같습니다. [EL in operators] (http://docs.oracle.com/javaee/6/tutorial/doc/bnaik.html)도 참조하십시오. – BalusC

+0

그것은 1 문자 문자열 비교 경우를 제외하고 작동합니다. 그런 다음 를 사용하십시오 (큰 따옴표는 간단하게 교체하십시오). http://struts.apache.org/release/2.0.x/docs/why-wont -the-if-tag-evaluate-a-one-char-string.html – exoddus

2

확실하지 뭔가 같은 :

<c:if test="${languageBean.locale == 'en'"> 
    <f:selectItems value="#{customerBean.selectableCommands_limited_en}" /> 
</c:if> 

그냥 빨리 복사 및 내 응용 프로그램에서 붙여 ...

HTH

+0

안녕하세요 . 문자열을 '상수'문자열과 비교한다고 생각하십니까? languageBean.locale == 'en'? 반면 두 변수를 비교하고 있으므로 '=='는 포인터를 비교할 때 작동하지 않습니다. 고마워, CJ –

+0

네 말이 맞아. 약간의 스냅 샷이었습니다. – KB22

+0

하지만 사실, BalusC는 '=='이 올바른 연산자라는 것을 설명하고 실제로 사용할 수 있습니다. –