GAE/J¤Çsmartgwt¤òÍøÍѤ¹¤ëÊýË¡
GAE/J¤Çsmartgwt¤ò¤½¤Î¤Þ¤ÞÍøÍѤ·¤¿¾ì¹ç¡¢¥Õ¥¡¥¤¥ë¿ôÀ©¸Â¤Ë¤«¤«¤Ã¤¿¤ê¤¹¤ë¤Î¤ÇZIP¤Ë¸Ç¤á¤ÆServlet¤ÇÊÖ¤¹¤è¤¦¤Ë¤¹¤ë¡£
¸µ¥Í¥¿¤Ï¤É¤³¤«¤Î¥µ¥¤¥È¤«¤é¼è¤Ã¤ÆÍ褿¤â¤Î¤À¤±¤É¹â®²½¤Î°Ù¤Ëmemcache¤È¥¯¥é¥¤¥¢¥ó¥È¤Î¥¥ã¥Ã¥·¥å¤¬¸ú¤¯¤è¤¦¤ÊÊýË¡¤ò¼è¤Ã¤Æ¤¤¤Þ¤¹¡£
- smartgwt¤¬ºîÀ®¤¹¤ëÀÅŪ¥Õ¥¡¥¤¥ë¤òZIP¤Ç¸Ç¤á¤ë
- ZIP¤«¤é¥ê¥½¡¼¥¹¤òÊÖ¤¹Servlet¤òÇÛÃÖ¤¹¤ë
smartgwt¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤ÆºîÀ®¤µ¤ì¤ësc¥Ç¥£¥ì¥¯¥È¥ê¡Ê/war/*/sc¡Ë¤òZIP¤Ç°µ½Ì¤·¤Æ¡¢warľ²¼¤ËÇÛÃÖ¤¹¤ë¡£
¥½¡¼¥¹¤Ï²¼µ¤Î´¶¤¸¡£
¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡öÉôʬ¤Ë¤Ï¡¢GWT¤Î¥¨¥ó¥È¥ê¥Ý¥¤¥ó¥È̾¡Ê/war/*/sc¤Î*¤Î¤È¤³¤í¡Ë¤òÆþ¤ì¤ë¡£
¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ä¥¨¥é¡¼¥Ï¥ó¥É¥ê¥ó¥°¤ÏŬÅö¤Ê¤Î¤Ç¡¢Ä¾¤·¤Æ²¼¤µ¤¤¡£
package hogepackage;import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Calendar; import java.util.Collections; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import javax.cache.Cache; import javax.cache.CacheException; import javax.cache.CacheFactory; import javax.cache.CacheManager; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.google.appengine.repackaged.org.apache.commons.logging.Log; import com.google.appengine.repackaged.org.apache.commons.logging.LogFactory;
public class ScServlet extends HttpServlet { private static final long serialVersionUID = 8039195338253452464L; private static final int LAST_MODIFIED = 0; private static final Log log = LogFactory.getLog(ScServlet.class);
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
// Á°²ó¹¹¿·Æü¤ò¼èÆÀ if (req.getDateHeader("If-Modified-Since") == LAST_MODIFIED) { // ¹¹¿·¤¬¤Ê¤±¤ì¤Ð304(NOT MODIFIED)¤òÊÖ¤¹ resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED); return; }
// HTTP¥Ø¥Ã¥À¡¼¤òÀßÄê Calendar cal = Calendar.getInstance(); cal.add(Calendar.YEAR, 1); resp.setHeader("Cache-Control", "public, maxtime=1209600"); resp.setDateHeader("Expires", cal.getTimeInMillis()); resp.setDateHeader("Last-Modified", LAST_MODIFIED);
// ¥ê¥½¡¼¥¹¤Î¥Ñ¥¹¼èÆÀ String requestedURI = req.getRequestURI().replaceFirst("¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö", "");
// Ƭ¤Î/¤Ï¼è¤ë requestedURI = requestedURI.substring(1);
// ¥¥ã¥Ã¥·¥å¤«¤éÃͤò¼èÆÀ Cache cache = null; try { CacheFactory cacheFactory = CacheManager.getInstance().getCacheFactory(); cache = cacheFactory.createCache(Collections.emptyMap());
if (cache.containsKey(requestedURI)) { byte[] cachedContent = (byte[]) cache.get(requestedURI); OutputStream out = resp.getOutputStream(); for (int i = 0; i < cachedContent.length; i++) { out.write(cachedContent[i]); } return; } } catch (CacheException e) { log.error("¥¥ã¥Ã¥·¥å¥¨¥é¡¼", e); }
// ¥ê¥½¡¼¥¹¤òõ¤·ÊÖ¤¹ ZipInputStream in = new ZipInputStream(new FileInputStream("sc.zip")); ZipEntry entry; while ((entry = in.getNextEntry()) != null) { if (requestedURI.equals(entry.getName())) { OutputStream out = resp.getOutputStream(); ByteArrayOutputStream bytes = new ByteArrayOutputStream();
byte[] buf = new byte[1024]; int len; while ((len = in.read(buf)) > 0) { out.write(buf, 0, len); bytes.write(buf, 0, len); } byte[] b = bytes.toByteArray(); cache.put(requestedURI, b);
in.close(); out.close(); bytes.close(); return; } } } }
smartgwt¤Î¥ê¥½¡¼¥¹¤Ø¤Î¥¢¥¯¥»¥¹¤òServlet¤Ç¼õ¤±¤ë¤è¤¦ÀßÄê¡£
¤Þ¤¿¤â¤ä¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡öÉôʬ¤Ë¤Ï¡¢GWT¤Î¥¨¥ó¥È¥ê¥Ý¥¤¥ó¥È̾¡Ê/war/*/sc¤Î*¤Î¤È¤³¤í¡Ë¤òÆþ¤ì¤ë¡£
<servlet> <servlet-name>scServlet</servlet-name> <servlet-class>hogepackage.ScServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>scServlet</servlet-name> <url-pattern>/¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö/*</url-pattern> </servlet-mapping>
¿ʬ¡¢¾åµ¤Ç¤¤¤±¤ë¤Ï¤º¡£
¤®¤ã¤Õ¤ó¡ª
¥³¥á¥ó¥È
TrackBack URL : http://www.xi-cholo.com/modules/wordpress/wp-trackback.php/730
¤³¤ÎÅê¹Æ¤Ë¤Ï¡¢¤Þ¤À¥³¥á¥ó¥È¤¬ÉÕ¤¤¤Æ¤¤¤Þ¤»¤ó

