如何在JSP中包含资源而不增加服务方法的开销



我正在一个使用JSP的高负载项目中工作,该项目在页面上包含大量其他资源(JSP, jspf)。

众所周知,在JSP中有两种使用include的方法:静态- <%@include %>和动态- (或JSTL等效的)

但它们都有缺点。

例如,静态导入可能导致来自主页面的变量名冲突。动态导入在性能上较差。

我想使用一些不会对服务方法造成开销的东西,同时独立于其他代码。

在最狭窄的地方,我们不得不将html代码放在java代码中:

public String getHtml() {
    return “<div class=’entity’>” + … + “</div>”;
}
在JSP中,我们这样做:

<jsp:getProperty name="someEntity" property="html" />

这解决了包含的问题,但这是一种可怕的代码风格,很难重构。

似乎理想的解决方案是编写特殊的标记库,如:

<entitytag>
    <parameter name=’param1’ class=’java.util.String’ />
    <parameter name=’param2’ class=’mypackage.Entity’ />
    <tagbody>
        <div class=’entity’>…</div>
    </tagbody>
</entitytag>

将被翻译成:

static public void entitytag(String param1, Entity param2, JSPWriter out) {
    out.write(“<div class=’entity’>”);
    …
    out.write(“</div>”);
}

在JSP中,这个调用看起来像:

<mylib:entitytag param1=’someString’ param2=’someEntity’ />;

在服务方法中:

MylibClass.entitytag(param1, param2, out);

所以,我的问题是下一个:有没有什么方法可以优雅地完成这样的技巧?也许使用第三方库?

我不认为解决方案是在java中做html。

普通的jstl include就可以了,你认为怎样才能提高性能呢?

第一次查看jsp时,它被转换为java类并编译—包括任何包含和/或导入,所有这些都成为一个类。

所以,大量的包含可能会在第一次查看页面时影响性能,但在那之后,它本质上与调用servlet是一样的。

如果您使用的是tomcat,请向下钻取tomcat/work目录,查看您精心编写的jsp变成了什么。

最新更新