GAE/J¤Çsmartgwt¤ò¤½¤Î¤Þ¤ÞÍøÍѤ·¤¿¾ì¹ç¡¢¥Õ¥¡¥¤¥ë¿ôÀ©¸Â¤Ë¤«¤«¤Ã¤¿¤ê¤¹¤ë¤Î¤ÇZIP¤Ë¸Ç¤á¤ÆServlet¤ÇÊÖ¤¹¤è¤¦¤Ë¤¹¤ë¡£
¸µ¥Í¥¿¤Ï¤É¤³¤«¤Î¥µ¥¤¥È¤«¤é¼è¤Ã¤ÆÍ褿¤â¤Î¤À¤±¤É¹â®²½¤Î°Ù¤Ëmemcache¤È¥¯¥é¥¤¥¢¥ó¥È¤Î¥¥ã¥Ã¥·¥å¤¬¸ú¤¯¤è¤¦¤ÊÊýË¡¤ò¼è¤Ã¤Æ¤¤¤Þ¤¹¡£
- smartgwt¤¬ºîÀ®¤¹¤ëÀÅŪ¥Õ¥¡¥¤¥ë¤òZIP¤Ç¸Ç¤á¤ë
smartgwt¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤ÆºîÀ®¤µ¤ì¤ësc¥Ç¥£¥ì¥¯¥È¥ê¡Ê/war/*/sc¡Ë¤òZIP¤Ç°µ½Ì¤·¤Æ¡¢warľ²¼¤ËÇÛÃÖ¤¹¤ë¡£
- ZIP¤«¤é¥ê¥½¡¼¥¹¤òÊÖ¤¹Servlet¤òÇÛÃÖ¤¹¤ë
¥½¡¼¥¹¤Ï²¼µ¤Î´¶¤¸¡£
¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡öÉôʬ¤Ë¤Ï¡¢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;
}
}
}
}
web.xml¤òÀßÄê
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>
¿ʬ¡¢¾åµ¤Ç¤¤¤±¤ë¤Ï¤º¡£
¤®¤ã¤Õ¤ó¡ª