JSP 문서 (JSPX)가있는 요소에 조건부 속성을 설정하십시오.
문제
HTML 양식에서는 값으로 "비활성화 된"속성을 정의하여 버튼을 비활성화 할 수 있습니다.
<button name="btn1" disabled="disabled">Hello</button>
버튼을 활성화하려면 비활성화 된 속성을 설정할 수있는 정의 된 값이 없으므로 버튼을 활성화 할 수있는 정의 값이 없으므로 속성이 존재하지 않아야합니다.
이로 인해 JSP 문서 (JSPX)를 사용할 때 버튼을 활성화 / 비활성화하려면 문제가 발생합니다. JSP 문서는 잘 구성된 XML 문서 여야하므로 다음과 같은 것이 합법적이지 않기 때문에이 속성을 포함하여 조건부를 포함하는 방법을 볼 수 없습니다.
<button name="btn1" <%= (isDisabled) ? "disabled" : "" %/> >Hello</button>
원하는 효과를 얻기 위해 JSTL IF 태그를 사용하여 태그를 두 번 복제 할 수 있지만, 특정 경우에는 버튼에 15 개가 넘는 속성 (AJAX에 대한 많은 JavaScript 이벤트 핸들러 속성)이 있습니다. JSP는 매우 지저분합니다.
JSP의 가독성을 희생하지 않고이 문제를 어떻게 해결할 수 있습니까? 출력 DOM을 조작하여 부모에게 속성을 추가 할 수있는 사용자 정의 태그가 있습니까?
해결책
동적 속성이있는 사용자 정의 JSP 태그를 사용합니다. 당신은 이것을 사용합니다 :
<util:element elementName="button" name="btn1" disabled="$(isDisabled ? 'disabled' : '')"/>
기본적 으로이 태그는 ElementName이있는 XML 요소를 생성하고 모든 속성을 태그에 넣지 만 빈 것들을 건너 뜁니다.
태그 자체는 구현하기가 매우 쉽고 내 구현의 길이는 44 줄입니다.
다른 팁
당신은 사용할 수 있습니다 <jsp:text>
유효한 XML을 사용 하여이 문제를 해결하기위한 태그 :
<jsp:text><![CDATA[<button name="btn1"]]></jsp:text>
<c:if test="${isDisabled}"> disabled="disabled"</c:if>
>
Hello!
<jsp:text><![CDATA[</button>]]></jsp:text>
이것은 분명히 다른 솔루션보다 더 장점입니다. 그러나 그것은입니다 완전히 독립적 인: 사용자 정의 태그가 필요하지 않습니다. 또한, 그것 쉽게 비늘 필요한만큼의 속성에.
@Alex 3 배 운영자를 사용하는 훌륭한 솔루션. 나는 당신 덕분에 조건의 결과를 변경 한 내 예제 중 일부를 추가합니다. 사실이라면 속성을 작성합니다. 그렇지 않으면 아무것도 쓰지 않습니다.
목록을 채우고 사용 된 값을 선택하려면 C : IF를 피하십시오.
<select id="selectLang" name="selectLang" >
<c:forEach var="language" items="${alLanguages}" >
<option value="${language.id}" ${language.code == usedLanguage ? 'selected' : ''} >${language.description}</option>
</c:forEach>
C를 피하는 데 라디오 시작 버튼을 확인하려면 : if :
<input type="radio" id="id0" value="0" name="radio" ${modelVar == 0 ? 'checked' : ''} />
<input type="radio" id="id1" value="1" name="radio" ${modelVar == 1 ? 'checked' : ''} />
<input type="radio" id="id2" value="2" name="radio" ${modelVar == 2 ? 'checked' : ''} />
나는 이것에 대한 마지막 게시물 이후로 어느 정도 통과 된 것 같지만, 나는 똑같은 문제에 반대했다. <select><option selected="selected">
태그, 즉 선택한 옵션을 동적으로 선언합니다. 그 것을 해결하기 위해 나는 맞춤형 tagx를 만들었습니다. 세부 사항을 다른 세부 사항에 게시했습니다 여기서 답하십시오
나는 좋은 지름길이 없다는 결론에 도달했다. EL 및 JSP 표현식은 XML 요소 속성 (및 신체 함량) 내에 만 존재할 수 있습니다. 따라서 다음을 수행해야합니다.
<c:choose>
<c:when test="${isDisabled}"><button name="btn1" disabled="disabled">Hello</button></c:when>
<c:otherwise><button name="btn1">Hello</button></c:otherwise>
</c:choose>
Scriptlet 표기법 사용은 JSP 문서 (.jspx)에서 작동하지 않습니다.
자동에 대해 읽습니다 JSP에서 JSPX 변환기로 나는 만났다 <jsp:element>
그리고 <jsp:attribute>
태그. 내가 올바르게 이해한다면 당신은
<jsp:element name="button">
<jsp:attribute name="someAttribute">value</jsp:attribute>
</jsp:element>
JSP 엔진 출력이 있습니다
<button someAttribute="value"/>
또는 그런 것. 위의 페이지에서 지적 된 유일한 문제는 조건부 구성과 잘 어울리지 않는 것입니다. 컨버터의 저자는 일부 도우미 태그를 만드는 데 도움이되었으며, 이는 소스 코드를 다운로드 할 수 있습니다. 도움이되기를 바랍니다.
태그 라이브러리 (.TAGX)를 만든 다음 스크립트 렛 태그를 사용하십시오.
보다 http://code.google.com/p/jatl/wiki/jspexample
<?xml version="1.0" encoding="UTF-8" ?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1">
<jsp:directive.page import="com.googlecode.jatl.Html"/>
<jsp:directive.page import="com.evocatus.product.data.AttributeValue"/>
<jsp:directive.page import="com.evocatus.domain.Product"/>
<jsp:scriptlet>
//<![CDATA[
final Product p = (Product) request.getAttribute("product");
new Html(out) {{
for (AttributeValue v : p.summaryAttributeValues()) {
p();
strong().text(v.getLabel()).end();
text(": " + v.getValue());
endAll();
}
}};
//]]>
</jsp:scriptlet>
</jsp:root>
네, 이것은 속임수입니다 ... 그러나 그것은 일을 끝냅니다. 또한 이런 식으로 나무 구조에 대해 정말로 불쾌한 복잡한 재귀를 할 수 있습니다.
또한 블로그와 GIST.github에 여러 개의 Tagx 라이브러리를 사용하는 다른 솔루션을 게시했습니다. http://adamgent.com/post/8083703288/conditionally-set-an-attrube-on-an-element-with-jspx
< %= blah %> 구문은 JSP 문서에 필요한 합법적 인 XML이 아닙니다. 두 가지 옵션이 있습니다.
- 교체 <%= (isdisabled)? "비활성화": "" %>u003Cjsp.expression> (isdisabled)? "장애가 있는" : ""u003C/jsp.expression>
- 코어 taglib 및 el을 사용하십시오 (isdisabled가 페이지 범위에 넣어야 함) :
<c:choose> <c:when test="${isDisabled}">"disabled"</c:when> <c:otherwise>""</c:otherwise> </c:choose>
도움이되기를 바랍니다 :)
나는 방금 같은 문제로 어려움을 겪고 있습니다. 나는 사용을 시도했다 <jsp:attribute name="disabled"/>
내부에 <c:if>
, 그러나 컴파일러는 비활성화 속성을 c:if
실패하는 요소. 그러나 나는 이것이 작동한다는 것을 발견했다 (stripes:submit
줄무늬로 제출되는 유형의 버튼을 만드는 요소) :
<stripes:submit name="process" value="Hello">
<jsp:attribute name="disabled">
<c:if test="${x == 0}">disabled</disabled>
</jsp:attribute>
</stripes:submit>
그것은 것 같습니다 jsp:attribute
신체에 공백 만 포함되어 있으면 속성을 전혀 만들지 않으므로 disabled="disabled"
아니면 전혀 아무것도 없습니다.
이것은 일종의 taglib를 사용하여 버튼을 생성하는 경우에만 작동하며 태그 요소는 비활성화 된 속성 (기본 HTML 요소로 전달)을 지원해야합니다. 당신은 사용할 수 없습니다 jsp:attribute
원시 HTML 요소에 속성을 추가합니다.
나는 실제로 JSP를 사용하지 않습니다 (그리고 한 번 대답 한 다음 "유효한 XML에 의한 필수"를 이해했을 때 삭제했습니다). 내가 생각해 낼 수있는 가장 깨끗한 것은 다음과 같습니다.
<% if (isDisabled) { %>
<button name="btn1" disabled="disabled">Hello</button>
<% } else { %>
<button name="btn1">Hello</button>
<% } %>