2010-02-04 8 views
0

:Struts 태그 속성은 어떻게 작동합니까? 이 코드에서

<html:text property="txtItem5" disabled="disTxtItem5"> 

내가 "txtItem5"는 getTxtItem5 (에서 제공하는 ActionForm의에서) 볼 수 있지만, "disTxtItem5"다른 문자열에 대한 프로젝트를 검색하는 것은 겉으로는 원격으로 관련 아무것도 알 수 없다, 그러나 명확하게 어떻게 든 프레임 워크는이 문자열에서 부울을 가져오고 있으며 이는 분명히 현재의 이해보다 복잡하다는 것을 의미합니다.

누군가이 표현식을 평가하는 방법에 대한 좋은 설명을 주거나 하나의 방향으로 나를 가리킬 수 있습니까?

답변

2

편집 : 원본 답변 (아래 참조)에서 나는 Struts가 변환을 관리한다고 말했지만 잘못되었습니다. Struts의 소스를 꺼내서 살펴 보았으므로 정확히 무엇이 진행되고 있는지 기억하지 못했습니다. 변환은 서버에 의해 이루어진 것으로 밝혀졌습니다. JSP는 실행 전에 서블릿으로 변환되며 여기서는 논리적이 아닌 값에 false가 사용됩니다.

<html:text property="nr" disabled="BlaBla" /> 

(전혀 안 함) 다음과 같은 HTML로 변환되었다 :

<input type="text" name="nr" value="123"> 

이 서블릿에서 일어난

예를 들어, 나는 다음과 같은 태그를 사용했다. 다음은 위의 태그에 대한 서블릿의 내용입니다.

// html:text 
    org.apache.struts.taglib.html.TextTag _jspx_th_html_005ftext_005f0 = (org.apache.struts.taglib.html.TextTag) _005fjspx_005ftagPool_005fhtml_005ftext_005fproperty_005fdisabled_005fnobody.get(org.apache.struts.taglib.html.TextTag.class); 
    _jspx_th_html_005ftext_005f0.setPageContext(_jspx_page_context); 
    _jspx_th_html_005ftext_005f0.setParent((javax.servlet.jsp.tagext.Tag) _jspx_th_html_005fform_005f0); 
    _jspx_th_html_005ftext_005f0.setProperty("nr"); 
    _jspx_th_html_005ftext_005f0.setDisabled(false); 
    int _jspx_eval_html_005ftext_005f0 = _jspx_th_html_005ftext_005f0.doStartTag(); 

볼 수 있듯이 비활성화 된 값은 false로 직접 생성됩니다. 좀 더 (I Tomcat을 사용) 재스퍼 컴파일러로 파고했고, 나는 다음과 같은 코드로의 변환을 담당하는 org.apache.jasper.compiler.JspUtil 클래스이라고 생각 :

public static boolean booleanValue(String s) { 
    boolean b = false; 
    if (s != null) { 
    if (s.equalsIgnoreCase("yes")) { 
     b = true; 
    } else { 
     b = Boolean.valueOf(s).booleanValue(); 
    } 
    } 
    return b; 
} 

거짓에

public static Boolean valueOf(String s) { 
    return toBoolean(s) ? TRUE : FALSE; 
} 

private static boolean toBoolean(String name) { 
    return ((name != null) && name.equalsIgnoreCase("true")); 
} 

이 방법 BlaBla 결과 : 나는 장애인 분야에서 BlaBla을 삽입하기 때문에이 다음 않는 Boolean.valueOf(s).booleanValue();에 폴백합니다.

ORIG :다음은 원래 응답 이었지만 올바르지 않습니다. 내가 설명했던 것은 사실 요청 매개 변수가 액션 폼에 묶여있을 때 무슨 일이 일어나는가였습니다.

disabled 속성은 부울 유형이므로 부울로 매핑되는 값만 수신해야합니다. disTxtItem5이 부울로 매핑되지 않기 때문에 disabled="disTxtItem5"은 ConversionException을 발생시킵니다. 스트럿츠는 아무것도하지 않고 false를 설정 예외를 기록하고 실패하면 내가 기억하지 않는

String stringValue = value.toString(); 
if (stringValue.equalsIgnoreCase("yes") || 
    stringValue.equalsIgnoreCase("y") || 
    stringValue.equalsIgnoreCase("true") || 
    stringValue.equalsIgnoreCase("on") || 
    stringValue.equalsIgnoreCase("1")) { 
    return (Boolean.TRUE); 
} else if (stringValue.equalsIgnoreCase("no") || 
    stringValue.equalsIgnoreCase("n") || 
    stringValue.equalsIgnoreCase("false") || 
    stringValue.equalsIgnoreCase("off") || 
    stringValue.equalsIgnoreCase("0")) { 
    return (Boolean.FALSE); 
} else if (useDefault) { 
    return (defaultValue); 
} else { 
    throw new ConversionException(stringValue); 
} 

이 시점에서 다음과 같은 코드로,

Struts는 변환을 위해 CommonBeanUtils를 사용하므로 BooleanConverter가 사용됩니다 매개 변수의 값 또는 예외가 전파됩니다 (Struts : D를 사용한 이후로 오랜 시간이 걸렸지 만, 거짓으로 설정하고 계속한다고 생각하는 경향이 있습니다).

로그는 무시되는 경우에도 예외를 지적해야합니다.로커를 org.apache.commons.beanutils 또는 org.apache.struts으로 설정하면 변환 오류가 표시됩니다.

+0

나는 왜 어떤 것이 작동했는지 또는 작동하지 않는지에 관해 몇 가지 다른 질문을했으며, 이것으로 모두 답변을 얻었습니다. 믿어지지 않는 정도로 도움이된다, 고맙다. –