java web 静态_「Java Web」主页静态化的实现
一個站點的主頁一般不會頻繁變動,而大多數用戶在訪問站點時不過瀏覽一下主頁(未登陸)。然后就離開了。對于這類訪問請求。假設每次都要通過查詢數據庫來顯示主頁的話,顯然會給server帶來多余的壓力。
這時候我們能夠將主頁靜態化。在減輕數據庫server壓力的同一時候又能大大提高主頁高訪問速度。
對于Java來說,如今有非常多框架但是實現主頁的靜態化。事實上這并不難。我們也能夠自己手動實現。
思路例如以下:
首先編寫一個小程序模擬瀏覽器向webserver發送GET請求。得到主頁的HTML代碼后,將其保存到文件里。
然后寫一個過濾器攔截訪問請求。一旦發現訪問的是主頁。那么就直接將保存好的靜態HTML文件返回給client。這樣就避開了框架(如 Spring MVC),更避開了數據庫查詢。假設主頁內容發生了變化,我們能夠再執行一下小程序以得到最新的主頁HTML代碼。
編寫HTTPclient程序模擬瀏覽器
這里我使用 apache 的 HttpClient 庫編寫這個小程序。例如以下例。我們通過向 http://locahost:8080/codeschool/ 發送GET請求來得到server返回的HTML代碼:
/**
* 向localhost:8080發送GET請求,獲取返回的HTML代碼并保存到文件里
* @author whf
*
*/
public class Client {
public static void main(String[] args) throws Exception {
CloseableHttpClient httpclient = HttpClients.createDefault();
try {
HttpGet httpGet = new HttpGet("http://127.0.0.1:8080/codeschool");
CloseableHttpResponse response = httpclient.execute(httpGet);
try {
System.out.println(response.getStatusLine());
HttpEntity entity = response.getEntity();
// entity封裝了server返回的數據
String html = EntityUtils.toString(entity);
// 將HTML代碼寫入到文件里
saveContent(html, "/home/whf/workspace-sts/codeschool/home.html");
EntityUtils.consume(entity);
} finally {
response.close();
}
} finally {
httpclient.close();
}
}
/**
* 將HTML寫入到指定文件里
*
* @param html
* @param path 文件路徑
* @throws IOException
*/
private static void saveContent(String html, String path) throws IOException {
FileOutputStream fos = new FileOutputStream(path);
BufferedOutputStream bos = new BufferedOutputStream(fos);
bos.write(html.getBytes());
bos.close();
}
}
所需的 dependency 例如以下:
org.apache.httpcomponents
httpclient
4.3.4
運行一下該程序,就會得到 home.html 文件。
編寫過濾器
編寫一個 url-pattern 為 /* 的 Filter 過濾器,一旦發現用戶訪問的是主頁,則直接返回上面生成的 home.html 文件,關閉輸出流。代碼例如以下:
public class SecureFilter implements Filter {
private static final Logger logger = LoggerFactory
.getLogger(SecureFilter.class);
private ServletContext ctx;
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 防止中文亂碼
request.setCharacterEncoding("UTF-8");
HttpServletRequest req = (HttpServletRequest) request;
String path = req.getRequestURI();
// 請求的是資源。跳過
if (true == path.startsWith("/codeschool/resources")) {
chain.doFilter(request, response);
return;
}
// 用戶未登陸
// 用戶訪問主頁
// 返回靜態頁面
if (path.equals("/codeschool/") || path.equals("/")) {
writeStaticHomePage(req, (HttpServletResponse) response);
return;
}
chain.doFilter(request, response);
}
/**
* 將靜態主頁返回給client
*
* @param req
* @param resp
* @throws IOException
*/
private void writeStaticHomePage(HttpServletRequest req,
HttpServletResponse resp) throws IOException {
// 返回靜態化頁面
// 得到home.html路徑
String pagePath = (String) ctx.getInitParameter("HOME_PAGE_PATH");
if (logger.isDebugEnabled()) {
logger.debug("主頁靜態頁面路徑:{}", pagePath);
}
// 將homt.html返回給client
ServletOutputStream out = resp.getOutputStream();
FileInputStream pageInStream = new FileInputStream(pagePath);
BufferedInputStream bufInStream = new BufferedInputStream(pageInStream);
byte[] buf = new byte[2048];
int len = 0;
while ((len = bufInStream.read(buf)) != -1) {
out.write(buf, 0, len);
}
bufInStream.close();
out.close();
}
@Override
public void init(FilterConfig cfg) throws ServletException {
this.ctx = cfg.getServletContext();
}
}
能夠在web.xml里配置 home.html 的路徑:
HOME_PAGE_PATH
/home/whf/workspace-sts/codeschool/home.html
這樣在我們在訪問主頁的時候就能明顯感覺到速度大大加快。
總結
以上是生活随笔為你收集整理的java web 静态_「Java Web」主页静态化的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 根据时间范围自动算间隔_Jav
- 下一篇: java从端口获取数据库_Java之通过