2013-12-22 7 views
2

jsp의 사용자 정의 태그가 사용자 정의 태그 평가 후 html 컨텐츠로 대체된다는 것을 마지막으로 배웠습니다. 하지만이 개념을 실제로 적용하면 다음과 같은 문제에 직면하게됩니다. jsp 안에 3 div가 있고 그 중 2 개가 정적이고 중간 div에 맞춤 태그가 있습니다. 그래서 중간 div의 사용자 정의 태그에 의해 생성 된 html 콘텐츠는 중간 div에서만 대체되어야합니다. 그러나 출력 결과가 다른 것 같습니다. 코드에 문제가 있거나 문제의 시작에 사용 된 문구에 수정이 필요한 부분이 있으면 알려주세요.Jsp 사용자 정의 태그가 잘못된 순서로 html 컨텐츠로 바뀝니다

home.jsp

<div style="height: 80px; background-color: #FFA500;"> 
    <%@ include file="banner.html"%> 
</div> 

<div style="height: 450px;"> 
    <connect:dbConnector user="root" password="" url="jdbc:mysql://localhost/musicstore" scope="session"> 
    </connect:dbConnector> 

     <connect:Query where="select * from musicstore.songs;"> 
      <ui:addTable name="musicList"> 
       <c:forEach var="value" items="${result }"> 
        <c:set scope="session" var="currentRow" value="${value }"></c:set> 
        <ui:addRow data="currentRow" scope="session"> 
        </ui:addRow> 
       </c:forEach> 
      </ui:addTable> 
     </connect:Query> 
</div> 

<div style="height: 80px; background-color: #FFA500;">Footer 
    content</div> 
내가 웹 브라우저에서 볼 수 있습니다

HTML 내용

<table border="1" name=" musicList "> 
    <tr> <td>Tum hi ho</td> 
     <td>Arjit Singh</td> 
     <td>45</td></tr> 
    <tr> <td>Manjha</td> 
     <td>Amit Trivedi</td> 
     <td>30</td></tr> 
    <tr> <td>Ranjhanna</td> 
     <td>A.R Rehman</td> 
     <td>25</td></tr> 
    <tr> <td>Sawar Loon</td> 
     <td>Monali Thankur</td> 
     <td>20</td></tr> 
</table> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<title>Insert title here</title> 
</head> 
<body> 
    <div style="height: 80px; background-color: #FFA500;"> 
<img src="/WEB-INF/resources/music_banner.png" ></img> 
    </div> 

    <div style="height: 450px;"> 

    </div> 

    <div style="height: 80px; background-color: #FFA500;">Footer 
     content</div> 
</body> 
</html> 

AddRowTag.java

public class AddRowTag extends TagSupport { 
     // some getter, setter and other utility methods here. 
@Override 
public int doStartTag() throws JspException { 
    try { 
     System.out.println("AddRowTag--> doStartTag"); 
     Row content = getDataToDisplay(); 
     StringBuilder htmlContent = new StringBuilder(); 

     htmlContent.append(startTableRow); 

     htmlContent.append(startTableData); 
     htmlContent.append(content.getTitle()); 
     htmlContent.append(endableData); 

     htmlContent.append(startTableData); 
     htmlContent.append(content.getArtist()); 
     htmlContent.append(endableData); 

     htmlContent.append(startTableData); 
     htmlContent.append(content.getPrice()); 
     htmlContent.append(endableData); 

     htmlContent.append(endableRow); 

     System.out.println(htmlContent.toString()); 
     pageContext.getResponse().getWriter().print(htmlContent); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return SKIP_BODY; 
} 

} 

문제 요약된다 :

  1. (변환 된 코드 (html 코드)의 배치 위치 컨텍스트에서) jsp 사용자 정의 태그 코드는 최종 html 파일에 있습니다.
  2. 중간 div를 맞춤 태그를 기준으로 업데이트해야하는 경우 내 현재 jsp 코드에서 수정해야하는 내용.

모든 제안/설명은 높이 평가 될 것입니다.

+0

문제는 태그 자체에 아마에 의해

pageContext.getResponse().getWriter().print(htmlContent); 

를 교체합니다. 내 생각 엔 일부 버퍼링을 수행하는 JSP Writer를 우회하여 응답 출력 스트림이나 작성기에 직접 씁니다. 수정 사항을 확인하고 제안하려면 코드를 게시하십시오. 사이드 노트 : 왜 세션 범위를 사용하여 현재 행을 반복으로 저장합니까? 그것이 페이지 범위입니다. –

+0

@JBNizet '사이드 노트'에서 작성한 포인트가 정확합니다. 페이지 범위를 사용해야합니다. 또한 AddRowTag에 대한 코드를 게시 한 질문의 편집을 참조하십시오. –

답변

1

태그는 응답에 직접 쓰면 안됩니다. 이렇게하면 JspWriter가 바이 패스되어 응답에 쓰지만 출력을 버퍼링합니다.

pageContext.getOut().print(htmlContent);