JSP:包括性能,模块化,备选方案和最佳实践,第96

这是一个后续的“JSP的开销,包括”问题如下:

http://stackoverflow.com/questions/1479218/jsp-performance-using-jspinclude

在我们的应用程序,开发人员'模块化'JSP片段通过大量使用的“JSP:包括”表示“通用”JSP代码整个应用程序重复。

优点

亲的情况如下:

  • 这是DRY--我们定义JSP片段一次。 这是一个很大的帮助,当你需要改变一些html和不需要查找/替换/搜索/销毁。
  • 这也很容易遵循:你清楚地传递参数。 当您编辑“包括页面,你知道你在说什么”,即对一些“全局变量”中的“包括/调用页面宣布。

缺点

  • 附加要求的性能开销

问题

所以作为后续:

  • 多大的性能开销做了'的jsp:包括“承担? 这不是明显的从Tomcat的代码(虽然你看它做了一大堆比会内联调用更多)。 此外,在分析的软件,我从没requestDispatcher.include()或调用()方法显示为热点。
  • 可能有人指出在何处正是在于大部分的开销? (在Y类的方法,即X),还是它只是所有的“小东西”(例如,设置属性或对象的创建和随后的GC),与每个请求会发生什么?
  • 有什么办法? (AFAIK @include和jsp:包括什么吗?)
  • (愚蠢的奖金问题)为什么不能servlet引擎“包括”在JSP在编译的时候,也就是像“内联宏与参数”,使我们的开发人员可以得到的明确性“的jsp:包括”和“的效果进行@包括'。

我想知道的,而最后一个问题。 我使用的代码生成工具在过去的生活,从来没有完全理解的缺乏,包括JSP片段选项。

对于读者的利益,我包括Tomcat的'applicationDispatcher.invoke()方法(Tomcat的5.5。抱歉,如果它的日期)。 为了清楚起见,我已经修剪了异常处理。

提前致谢

private void invoke(ServletRequest request, ServletResponse response, State state) throws IOException, ServletException { // Checking to see if the context classloader is the current context // classloader. If it's not, we're saving it, and setting the context // classloader to the Context classloader ClassLoader oldCCL = Thread.currentThread().getContextClassLoader(); ClassLoader contextClassLoader = context.getLoader().getClassLoader(); if (oldCCL != contextClassLoader) { Thread.currentThread().setContextClassLoader(contextClassLoader); } else { oldCCL = null; } // Initialize local variables we may need HttpServletResponse hresponse = (HttpServletResponse) response; Servlet servlet = null; IOException ioException = null; ServletException servletException = null; RuntimeException runtimeException = null; boolean unavailable = false; // Check for the servlet being marked unavailable if (wrapper.isUnavailable()) { wrapper.getLogger().warn( sm.getString("applicationDispatcher.isUnavailable", wrapper.getName())); long available = wrapper.getAvailable(); if ((available > 0L) && (available < Long.MAX_VALUE)) hresponse.setDateHeader("Retry-After", available); hresponse.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE, sm .getString("applicationDispatcher.isUnavailable", wrapper .getName())); unavailable = true; } // Allocate a servlet instance to process this request try { if (!unavailable) { servlet = wrapper.allocate(); } } ...exception handling here.... // Get the FilterChain Here ApplicationFilterFactory factory = ApplicationFilterFactory.getInstance(); ApplicationFilterChain filterChain = factory.createFilterChain(request, wrapper,servlet); // Call the service() method for the allocated servlet instance try { String jspFile = wrapper.getJspFile(); if (jspFile != null) request.setAttribute(Globals.JSP_FILE_ATTR, jspFile); else request.removeAttribute(Globals.JSP_FILE_ATTR); support.fireInstanceEvent(InstanceEvent.BEFORE_DISPATCH_EVENT, servlet, request, response); // for includes/forwards if ((servlet != null) && (filterChain != null)) { filterChain.doFilter(request, response); } // Servlet Service Method is called by the FilterChain request.removeAttribute(Globals.JSP_FILE_ATTR); support.fireInstanceEvent(InstanceEvent.AFTER_DISPATCH_EVENT, servlet, request, response); } ...exception handling here.... // Release the filter chain (if any) for this request try { if (filterChain != null) filterChain.release(); } ...exception handling here.... // Deallocate the allocated servlet instance try { if (servlet != null) { wrapper.deallocate(servlet); } } ...exception handling here.... // Reset the old context class loader if (oldCCL != null) Thread.currentThread().setContextClassLoader(oldCCL); // Unwrap request/response if needed // See Bugzilla 30949 unwrapRequest(state); unwrapResponse(state); // Rethrow an exception if one was thrown by the invoked servlet if (ioException != null) throw ioException; if (servletException != null) throw servletException; if (runtimeException != null) throw runtimeException; }

--------------解决方案-------------

如果你已经成型的应用程序,那么你真的已经回答了你自己的问题-如果有使用没有可测量的性能损失<jsp:include> ,那么它是不值得担心。 在内部,Tomcat会建立一个新HttpServletRequest和相关格宾斯,但它可能是足够聪明,做保持轻巧。 这个教训是,不要假设有一个与功能X中的性能问题,直到你真正看到它。

一个很好的替代<jsp:include>是JSP 2.0的标记文件。 这允许你封装可重复使用的内容,例如用<jsp:include>但与该片段明确定义的接口,并不会产生开销(无论多小,可能是) <jsp:include> 。 我更喜欢他们,我认为这是一个更好的方法。

(奖金答)有一个包括机制,内联<%@ include file="x.jsp" %> 这执行包含的内容的编译时内联。 你必须要小心的那一个,不过,因为如果你改变的内容x.jsp在运行时,“主机”页面将不会被重新编译。

分类:java的 时间:2015-03-14 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.762 (s). 10 q(s)