Jsp 自定义标签以错误的顺序替换为 html 内容

Posted

技术标签:

【中文标题】Jsp 自定义标签以错误的顺序替换为 html 内容【英文标题】:Jsp custom tags get replaced with html content in wrong order 【发布时间】:2014-01-11 00:20:38 【问题描述】:

我在上一堂课中了解到,jsp的自定义标签在评估自定义标签后会被替换为html内容。

但是将这个概念付诸实践,我遇到了以下问题。 我在 jsp 中有 3 个 div ,其中 2 个是静态的,中间 div 中有一个自定义标签。所以中间div的自定义标签生成的html内容只能在中间div替换。

但是,输出提示了其他内容,如果代码有问题,或者问题开始时使用的语句需要修改,请指出。

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;



总结问题:

    在哪里(在转换代码(html 代码)放置位置的上下文中)jsp 自定义标记代码放置在最终的 html 文件中。 如果我想在自定义标签的基础上更新中间 div,我需要在我当前的当前 jsp 代码中修改什么。

任何建议/解释都将受到高度赞赏。

【问题讨论】:

问题可能出在标签本身。我的猜测是它直接写入响应输出流或写入器,绕过 JSP 写入器,它会做一些缓冲。要确认并提出修复建议,请发布代码。旁注:为什么使用会话范围将当前行存储在迭代中?这就是页面范围的用途。 @JBNizet 您在Side Note 中提出的观点是正确的,我需要使用他们的页面范围。另请参阅问题中的编辑,我已经发布了 AddRowTag 的代码。 【参考方案1】:

标签不应直接写入响应。通过这样做,它绕过了 JspWriter,它也写入响应但缓冲其输出。

替换

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

通过

pageContext.getOut().print(htmlContent);

【讨论】:

以上是关于Jsp 自定义标签以错误的顺序替换为 html 内容的主要内容,如果未能解决你的问题,请参考以下文章

自定义标签

JavaWeb基础—JSP自定义标签入门

自定义jsp标签

JSP系列:JSP进阶-自定义JSP标签

JSP自定义标签开发入门

JSP自定义标签开发入门《转》