我正在一个使用JSP的高负载项目中工作,该项目在页面上包含大量其他资源(JSP, jspf)。
众所周知,在JSP中有两种使用include的方法:静态- <%@include %>和动态-但它们都有缺点。
例如,静态导入可能导致来自主页面的变量名冲突。动态导入在性能上较差。
我想使用一些不会对服务方法造成开销的东西,同时独立于其他代码。
在最狭窄的地方,我们不得不将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变成了什么。