本周一个工作是写一个测试页面加载时间的程序。一开始根本就没有这个概念,就到网上查了下相关的资料,发现大概有三种方法:
1.Filter实现,利用过滤器来记录时间。
2.JS实现,在页面开始和结束的时候,记录时间,然后进行操作。
3.利用监听器记录时间。比如JDIC组件的监听功能。
不知道有没有更好的方法了,本来想利用java里的net相关东西实现的,看了api好像实现不了。如果大家有更好的思路请交流下。
下面先介绍Filter实现。这个实现完全来自网络。
来自:
http://hi.baidu.com/zhouhuitong/blog/item/d463623da7f7f5e93c6d9766.html
CalcPageLoadingTimeFilter.java
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class CalcPageLoadingTimeFilter implements Filter {
/*
* (non Javadoc)
*
* @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest,
* javax.servlet.ServletResponse, javax.servlet.FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
Log log = LogFactory.getLog(CalcPageLoadingTimeFilter.class);
Date startTime = Calendar.getInstance().getTime();
long startTimeLong = Calendar.getInstance().getTimeInMillis();
String uri = ((HttpServletRequest) request).getRequestURI();
boolean logTime = false;
if (uri.indexOf(".html") > 0) { // 判断pge loading
// time记录条件,这里大家可以根据自己的情况加以改变或者去掉该条件
logTime = true;
}
if (logTime) {
log.info("[TIME-CALC]URI:" + uri);
String formatedTime = formatDate(startTime, "yy.MM.dd HH:mm:ss");
log.info("[TIME-CALC]Start:" + formatedTime);
}
try {
chain.doFilter(request, response);
} finally {
Date endTime = Calendar.getInstance().getTime();
long endTimeLong = Calendar.getInstance().getTimeInMillis();
if (logTime) {
String formatedTime = formatDate(endTime, "yy.MM.dd HH:mm:ss");
log.info("[TIME-CALC]End:" + formatedTime);
log.info("[TIME-CALC]Total:" + (endTimeLong - startTimeLong)
+ "ms. " + (endTimeLong - startTimeLong) / 1000 + "s.");
}
}
}
private static final String formatDate(Date date, String pattern) {
DateFormat df = new SimpleDateFormat(pattern);
return df.format(date);
}
public void init(FilterConfig filterConfig) throws ServletException {
}
public void destroy() {
}
}
把Filter添加到web.xml里面(由于我的web.xml已经添加了一个Filter,web.xml允许添加多个FIlter,请注意他们的添加顺序,粉红色部分即是要添加的Filter)
web.xml
。。。 。。。
<filter>
<filter-name>redirect</filter-name>
<filter-class>org.apache.tapestry.RedirectFilter</filter-class>
</filter>
<!-- Filter -->
<filter>
<filter-name>CalcPageLoadingTimeFilter</filter-name>
<filter-class>com.doone.pcdoctor.test.CalcPageLoadingTimeFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>redirect</filter-name>
<url-pattern>/</url-pattern>
</filter-mapping>
<!-- filter-mapping -->
<filter-mapping>
<filter-name>CalcPageLoadingTimeFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
。。。 。。。
重新启动服务器,则会自动记录日志。
上面的来自网络,自己简单的试验了,可以实现。