我正在努力提高Web应用程序的性能。现在,在浏览器上加载Web表单大约需要3-5秒,但有时会在3-20秒之间变化。一旦将Request分派给特定的JSP,我想分解组件所花费的时间。这样我就可以分析它的Web表单问题或服务器配置问题,并相应地采取纠正措施。
我的理解是JSP在第一次在服务器上访问时被编译成类文件,并在后续请求中使用。
将请求分派给JSP时,服务器端会发生什么?有关可能有助于提高性能的硬件配置的任何指导?
答案 0 :(得分:1)
将Request分派给JSP后,后端会发生什么?
JSP页面服务请求作为servlet。因此,生命周期和 JSP页面的许多功能(特别是动态的 方面)由Java Servlet技术决定。
当请求映射到JSP页面时,Web容器首先检查 JSP页面的servlet是否比JSP页面旧。如果 servlet较旧,Web容器将JSP页面转换为 servlet类并编译类。在开发过程中,其中一个 JSP页面优于servlet的优点是构建过程 自动执行。
翻译和编译
在翻译阶段,JSP页面中的每种类型的数据都是 对待不同。静态数据将转换为代码 将数据发送到响应流中。 JSP元素被视为 如下:
- 指令用于控制Web容器如何转换和执行JSP页面。
- 脚本元素被插入到JSP页面的servlet类中。表达式语言表达式作为参数传递给调用 JSP表达式求值程序。
jsp:[set|get]Property
个元素被转换为对JavaBeans组件的方法调用。jsp:[include|forward]
元素将转换为Java Servlet API的调用。jsp:plugin
元素将转换为特定于浏览器的标记,以激活小程序。- 自定义标记转换为对实现自定义标记的标记处理程序的调用。在Application Server中,源代码为 从名为pageName的JSP页面创建的servlet位于以下文件中:
domain-dir/generated/jsp/j2ee-modules/WAR-NAME/pageName_jsp.java
。例如,索引页面的源(名为index.jsp)为 本章开头讨论的日期本地化示例 将被命名为:
domain-dir/generated/jsp/j2ee-modules/date/index_jsp.java
翻译和编译阶段都会产生错误 只有在第一次请求页面时才会观察到。如果 在任一阶段都遇到错误,服务器将返回
JasperException
以及包含JSP页面名称的消息 以及发生错误的行。页面翻译和编译后,JSP页面的 servlet(大部分)遵循所描述的servlet生命周期 在Servlet生命周期中:
1. If an instance of the JSP page’s servlet does not exist, the container: a. Loads the JSP page’s servlet class b. Instantiates an instance of the servlet class c. Initializes the servlet instance by calling the jspInit method 2. The container invokes the `_jspService` method, passing request and response objects. If the container needs to remove the JSP page’s
servlet,它调用
jspDestroy
方法。<强> EXECUTION 强>
您可以使用页面控制各种JSP页面执行参数 指令。有关缓冲输出和指令的指令 处理错误在这里讨论。其他指令包括在内 本章中特定页面创作任务的上下文。
<强> BUFFERING 强>
执行JSP页面时,写入响应对象的输出为 自动缓冲。您可以使用设置缓冲区的大小 以下页面指令:
<%@ page buffer="none|xxxkb" %>
更大的缓冲区允许在任何内容之前写入更多内容 实际上发送回客户端,从而提供JSP页面 更多时间设置适当的状态代码和标题或转发到 另一个网络资源。较小的缓冲区会降低服务器内存负载 并允许客户端更快地开始接收数据。
处理JSP页面错误
执行JSP页面时可能会出现任意数量的异常。至 指定Web容器应将控制转发到错误页面 如果发生异常,请在该处包含以下页面指令 JSP页面的开头:
<%@ page errorPage="file-name" %>
阅读more。
有关可能有助于提升绩效的硬件配置的任何指导?
购买更多内存和更昂贵的芯片,使用SSD硬盘,CDN(内容分发网络)等。
您不会问如何通过编程方式调整性能。尽管如此,我认为link对你有帮助。
答案 1 :(得分:0)
JSP被转换为servlet类并在运行时编译或在部署或打包时预编译(取决于app服务器等)。
取决于你的app / web服务器,你可能有访问日志或其他一些可用的指标来查找servlet / jsp的时间花费。不太聪明但通用的解决方案是使用servlet过滤器来捕获在servlet中花费的时间。
如果它看起来可以接受,那么很可能你生成的html页面渲染有问题。在这个阶段,您需要使用浏览器级开发工具来查看正在进行的操作(chrome,firebug等开发控制台)。