prependId="false" 중단이 있는 UI 양식
저는 그 사실에 숨겨진 생각에 대해 질문이 있습니다. 그것은 단지UIForm
속성을 받았습니다.prependId
. 특성이 에 지정되지 않은 이유는 무엇입니까?NamingContainer
인터페이스? 는 호환성을 위한 하도록 하고 .이제 당신은 그것이 하위 호환성 때문이라고 말할 것입니다. 하지만 저는 호환성을 깨고 그 인터페이스를 구현하는 사용자들이 prependId에 대한 메소드도 구현하도록 하고 싶습니다.
에 내 .UIForm
구성 요소는 파손된다는 것입니다.findComponent()
만약 내가 사용한다면 나는 기대할 것입니다.prependId
, 그 다음에NamingContainer
렌더링뿐만 아니라 구성 요소 트리에서 구성 요소를 검색하려는 경우에도 동작이 변경됩니다.
간단한 예는 다음과 같습니다.
<h:form id="test" prependId="false">
<h:panelGroup id="group"/>
</h:form>
이제 패널 그룹 구성 요소를 가져오려면 문자열을 전달해야 합니다."group"
방법대로findComponent()
, 아무 것도 못 찾겠어요, 전 사용해야 해요."test:group"
대신.
그것의 구체적인 문제는, 아약스를 사용할 때와prependId="false"
및이 컨테이너 지정에 신경 ajax 태그는 특성 업데이트 및 프로세스에서 값이 이름 지정 컨테이너를 중요하게 생각합니다.사용할 때가 좀 이상하네요.prependId="false"
내가 전체 ID나 경로를 지정해야 한다는 것을. 하지만 알겠어요.
<h:form id="test" prependId="false">
<h:panelGroup id="group"/>
</h:form>
<h:form id="test1" prependId="false">
<h:commandButton value="go">
<f:ajax render="test:group"/>
</h:commandButton>
</h:form>
이 코드는 문제없이 렌더링되지만 패널 그룹을 찾을 수 없기 때문에 업데이트되지 않습니다.PartialViewContext
ID만 포함합니다."group"
renderIds의 요소로 사용됩니다.예상되는 일인지는 모르겠지만, 아마 그럴 거예요. 하지만 코드를 모르겠어요.이제 우리는 그 방법이findComponent()
매개 변수로 전달된 식을 다음과 같이 하여 구성 요소를 찾을 수 없습니다."group"
그 방법이 기대하는 곳에서"test:group"
구성 요소를 찾습니다.
한가지 해결책은 자신의 것을 쓰는 것입니다.findComponent()
그게 제가 이 문제를 해결하기 위해 선택한 방법입니다.이 방법에서 나는 다음과 같은 구성요소를 취급합니다.NamingContainer
prependId 속성이 일반적인 것처럼 false로 설정되어 있습니다.UIComponent
. 나는 모든 사람들을 위해 그렇게 해야 할 것입니다.UIComponent
prependId 속성을 제공하는 것은 나쁜 일입니다.성찰은 유형에 대한 정적인 정의를 벗어나는 데 도움이 되겠지만 여전히 진정한 해결책은 아닙니다.
다른 방법은 prependId 특성을 에 도입하는 것입니다.NamingContainer
인터페이스 및 동작 변경findComponent()
위와 같이 작업할 수 있습니다.
마지막으로 제안된 해결책은 id 전체를 전달하기 위해 ax 태그의 동작을 변경하는 것입니다. 그러나 이것은 ax 문제만 해결할 것이고 뒤에 있는 프로그래밍 문제는 해결하지 못할 것입니다.findComponent()
실행.
그것에 대해 어떻게 생각하고 대체 왜 그렇게 시행되고 있는 것입니까?제가 처음으로 이런 문제를 겪었을 순 없지만 관련 주제를 찾지 못했다고요?!
UIComponent#findComponent()
에 의해 행해진 바와 같이<f:ajax render>
사용할 때 실패<h:form prependId="false">
. 이 문제는 알려진 것으로 "수정하지 않음": JSF 사양 문제 573입니다.
나의 겸손한 의견으로는, 그들은 결코 추가하지 말았어야 했습니다.prependId
에 귀속시키다UIForm
JSF 1.2 시대에.그것은 단지 유지하기 위해 행해진 것입니다.j_security_check
JSF 입력 구성 요소가 포함된 JSF 양식을 사용하고 싶은 사용자가 행복합니다(j_security_check
정확한 입력 필드 이름이 필요합니다.j_username
그리고.j_password
구성으로 수정할 수 없습니다.그러나 그들은 JSF 1.2 동안 계속 사용할 수 있는 또 다른 개선점이 있다는 것을 정확히 인지하지 못했습니다.<form>
에 집착하는 대신에<h:form>
. 그리고 CSS/jQuery 순수주의자들은 학대를 시작합니다.prependId="false"
구분자를 벗어나는 것을 피하기 위해:
그들이 잘 선택하지 못한 CSS 셀렉터에서.
사용하지 말 것prependId="false"
.. .
위해서j_security_check
, 쓰임새만<form>
또는 새로운 서블릿 3.0.HttpServletRequest#login()
. j_security_check를 사용하여 Java EE/JSF에서 사용자 인증 수행을 참조하십시오.
CSS 셀렉터의 경우 ID 셀렉터가 꼭 필요한 경우(따라서 재사용 가능한 클래스 셀렉터가 아닌 경우), 관심 있는 구성요소를 일반 HTML로 랩핑하기만 하면 됩니다.<div>
아니면<span>
.
참고 항목:
- jQuery를 사용하여 JSF 구성요소를 선택하는 방법은?
- 콜론 ":"로 JSF 생성 HTML 요소 ID를 CSS 셀렉터에서 사용하는 방법은?
- 기본적으로 JSF는 웹 표준의 CSS 부분과 호환되지 않는 사용 불가 ID를 생성합니다.
언급URL : https://stackoverflow.com/questions/7415230/uiform-with-prependid-false-breaks-fajax-render
'programing' 카테고리의 다른 글
Tymeleaf의 각 연산자에 대해 (0) | 2023.10.25 |
---|---|
양식 컨트롤을 제외한 Excel 워크시트의 모든 도형 삭제 (0) | 2023.10.25 |
종속성 주입이란? (0) | 2023.10.25 |
jQuery에서 목록을 선택하는 옵션을 추가하는 방법 (0) | 2023.10.25 |
SQL 열 이름이 올바른지 확인합니다. (0) | 2023.10.25 |