GAE提供了简单实用的API和开发工具,结合已有的开发框架,Java开发人员可以很容易开发出自己的业务应用系统。本文介绍如何对页面进行优化。

GAE即Google App Engine,还不了解什么是Google App Engine的能够阅览一下它的介绍。

Google App Engine功能优化战略:页面功能优化(google移动服务应用优化)  Engine性能优化 第1张

GAE供给了简略有用的API和开发工具,结合已有的开发结构,Java开发人员能够很简略开发出自己的事务运用体系。本次先介绍页面部分的功能优化技巧,只需要进行简略的设置和少数的编码,即可获得不错的功能进步。文中说到的技巧已经在本博客获得验证,从后来的统计数据中能够看到,主页的处理时刻从均匀400ms削减到了均匀26ms,功能进步了15倍!

App Engine功能优化:指定GAE的静态文件装备

在一般的httpd + tomcat的架构中,客户端对图片、css文件以及js文件等静态资源文件,会依据文件的lsat modified特点,尽量只会恳求一次,只有当文件进行了更新之后,才会从头恳求新的文件。

但是在GAE里边,假如你不进行静态文件的设置,默许情况下,是无法享用上面所提的优点的。下面来看看设置的文件/WEB-INF/Appengine-web.xml:

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <appengine-web-appxmlns="http://appengine.google.com/ns/1.0">
  3. <application>yourappid</application>
  4. <version>1</version>
  5. <static-files>
  6. <includepath="/**.jpg"/>
  7. <includepath="/**.png"/>
  8. <includepath="/**.gif"/>
  9. <includepath="/**.ico"/>
  10. <includepath="/**.css"/>
  11. <includepath="/**.js"/>
  12. </static-files>
  13. </appengine-web-app>

进行了上面的设置之后,你的运用能够得到较为显着的功能进步。

App Engine功能优化:运用Memcache服务进行页面缓存

GAE供给了Memcache服务,能够将常常运用到数据暂时存储在Memcache中,能够大大削减恳求的处理时刻,进步页面响应速度。下面供给几个代码比如,运用Servlet Filter技能,能够对常常拜访的页面进行缓存操作。

CacheSingleton.java

  1. packagehover.blog.servlet;
  2. importjavax.cache.Cache;
  3. importjavax.cache.CacheException;
  4. importjavax.cache.CacheFactory;
  5. importjavax.cache.CacheManager;
  6. importjavax.servlet.ServletException;
  7. importjava.util.Map;
  8. /**
  9. *@authorHover
  10. *@version1.0
  11. */
  12. publicclassCacheSingleton{
  13. privatestaticfinalCacheSingletoninstance=newCacheSingleton();
  14. privateCachecache;
  15. privateCacheSingleton(){
  16. }
  17. publicstaticCacheSingletongetInstance(){
  18. returninstance;
  19. }
  20. publicvoidinit(Mapprops)throwsServletException{
  21. try{
  22. CacheFactoryfactory=CacheManager.getInstance().getCacheFactory();
  23. cache=factory.createCache(props);
  24. }catch(CacheExceptione){
  25. thrownewServletException("cacheerror:"+e.getMessage(),e);
  26. }
  27. }
  28. publicCachegetCache(){
  29. returncache;
  30. }
  31. publicvoidclear(){
  32. if(cache!=null){
  33. cache.clear();
  34. }
  35. }
  36. }

因需要在多处当地拜访Cache,因而这儿运用了Singleton形式,能够在不同的Action中拜访同一个Cache实例。

WebCacheFilter

WebCacheFilter.java

  1. packagehover.blog.servlet;
  2. importjavax.cache.Cache;
  3. importjavax.servlet.*;
  4. importjavax.servlet.http.Cookie;
  5. importjavax.servlet.http.HttpServletRequest;
  6. importjavax.servlet.http.HttpServletResponse;
  7. importjava.io.BufferedOutputStream;
  8. importjava.io.ByteArrayOutputStream;
  9. importjava.io.IOException;
  10. importjava.util.Collections;
  11. importjava.util.List;
  12. /**
  13. *@authorHover
  14. *@version1.0
  15. */
  16. @SuppressWarnings("unchecked")
  17. publicclassWebCacheFilterimplementsFilter{
  18. publicstaticfinalStringPAGE_PREFIX="/page";
  19. publicvoidinit(FilterConfigconfig)throwsServletException{
  20. CacheSingleton.getInstance().init(Collections.emptyMap());
  21. }
  22. publicvoiddoFilter(ServletRequestservletRequest,ServletResponseservletResponse,
  23. FilterChainchain)throwsIOException,ServletException{
  24. HttpServletRequestrequest=(HttpServletRequest)servletRequest;
  25. HttpServletResponseresponse=(HttpServletResponse)servletResponse;
  26. Cachecache=CacheSingleton.getInstance().getCache();
  27. if("post".equalsIgnoreCase(request.getMethod())||cache==null){
  28. chain.doFilter(servletRequest,servletResponse);
  29. }else{
  30. StringrequestPath=request.getRequestURI();
  31. StringqueryString=request.getQueryString();
  32. if(queryString!=null&&queryString.length()>0){
  33. requestPath+="?"+queryString;
  34. }
  35. StringcachePath=PAGE_PREFIX+requestPath;
  36. PageInfopage=null;
  37. try{
  38. page=(PageInfo)cache.get(cachePath);
  39. }
  40. catch(Exceptione){
  41. //typemis-match
  42. }
  43. if(page==null){//oncachecontent
  44. ByteArrayOutputStreambyteArrayOutputStream=newByteArrayOutputStream();
  45. GenericResponseWrapperwrapper=newGenericResponseWrapper(response,byteArrayOutputStream);
  46. chain.doFilter(request,wrapper);
  47. wrapper.flush();
  48. page=newPageInfo(wrapper.getStatus(),wrapper.getContentType(),wrapper.getHeaders(),
  49. wrapper.getCookies(),byteArrayOutputStream.toByteArray());
  50. if(page.getStatus()==HttpServletResponse.SC_OK){
  51. cache.put(cachePath,page);
  52. }
  53. }
  54. response.setStatus(page.getStatus());
  55. StringcontentType=page.getContentType();
  56. if(contentType!=null&&contentType.length()>0){
  57. response.setContentType(contentType);
  58. }
  59. for(Cookiecookie:(List)page.getCookies()){
  60. response.addCookie(cookie);
  61. }
  62. for(String[]header:(List)page.getResponseHeaders()){
  63. response.setHeader(header[0],header[1]);
  64. }
  65. response.setContentLength(page.getBody().length);
  66. BufferedOutputStreamout=newBufferedOutputStream(response.getOutputStream());
  67. out.write(page.getBody());
  68. out.flush();
  69. }
  70. }
  71. publicvoiddestroy(){
  72. }
  73. }

在初始化的时分,调用CacheSingleton.init()办法,初始化Memecache的调用接口。

WebCacheFilter只处理HTTP GET恳求,对后台数据的修正、删去、新增等操作,应该运用HTTP POST方法来提交数据。

下面将此Filter所用到的其他辅佐类列在下面:

FilterServletOutputStream.java

  1. packagehover.blog.servlet;
  2. importjavax.servlet.ServletOutputStream;
  3. importjava.io.IOException;
  4. importjava.io.OutputStream;
  5. /**
  6. *@authorHover
转载请说明出处
知优网 » Google App Engine功能优化战略:页面功能优化(google移动服务应用优化)

发表评论

您需要后才能发表评论