「Java Web」主页静态化的实现
一個(gè)站點(diǎn)的主頁(yè)一般不會(huì)頻繁變動(dòng),而大多數(shù)用戶在訪問(wèn)站點(diǎn)時(shí)不過(guò)瀏覽一下主頁(yè)(未登陸)。然后就離開(kāi)了。對(duì)于這類訪問(wèn)請(qǐng)求。假設(shè)每次都要通過(guò)查詢數(shù)據(jù)庫(kù)來(lái)顯示主頁(yè)的話,顯然會(huì)給server帶來(lái)多余的壓力。
這時(shí)候我們能夠?qū)⒅黜?yè)靜態(tài)化。在減輕數(shù)據(jù)庫(kù)server壓力的同一時(shí)候又能大大提高主頁(yè)高訪問(wèn)速度。
對(duì)于Java來(lái)說(shuō),如今有非常多框架但是實(shí)現(xiàn)主頁(yè)的靜態(tài)化。事實(shí)上這并不難。我們也能夠自己手動(dòng)實(shí)現(xiàn)。
思路例如以下:
首先編寫(xiě)一個(gè)小程序模擬瀏覽器向webserver發(fā)送GET請(qǐng)求。得到主頁(yè)的HTML代碼后,將其保存到文件里。
然后寫(xiě)一個(gè)過(guò)濾器攔截訪問(wèn)請(qǐng)求。一旦發(fā)現(xiàn)訪問(wèn)的是主頁(yè)。那么就直接將保存好的靜態(tài)HTML文件返回給client。這樣就避開(kāi)了框架(如 Spring MVC),更避開(kāi)了數(shù)據(jù)庫(kù)查詢。假設(shè)主頁(yè)內(nèi)容發(fā)生了變化,我們能夠再執(zhí)行一下小程序以得到最新的主頁(yè)HTML代碼。
編寫(xiě)HTTPclient程序模擬瀏覽器
這里我使用 apache 的 HttpClient 庫(kù)編寫(xiě)這個(gè)小程序。例如以下例。我們通過(guò)向 http://locahost:8080/codeschool/ 發(fā)送GET請(qǐng)求來(lái)得到server返回的HTML代碼: /*** 向localhost:8080發(fā)送GET請(qǐng)求,獲取返回的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返回的數(shù)據(jù)String html = EntityUtils.toString(entity);// 將HTML代碼寫(xiě)入到文件里saveContent(html, "/home/whf/workspace-sts/codeschool/home.html");EntityUtils.consume(entity);} finally {response.close();}} finally {httpclient.close();}}/*** 將HTML寫(xiě)入到指定文件里* * @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 例如以下: <dependencies><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.3.4</version></dependency></dependencies>
運(yùn)行一下該程序,就會(huì)得到 home.html 文件。
編寫(xiě)過(guò)濾器
編寫(xiě)一個(gè) url-pattern 為 /* 的 Filter 過(guò)濾器,一旦發(fā)現(xiàn)用戶訪問(wèn)的是主頁(yè),則直接返回上面生成的 home.html 文件,關(guān)閉輸出流。代碼例如以下: public class SecureFilter implements Filter {private static final Logger logger = LoggerFactory.getLogger(SecureFilter.class);private ServletContext ctx;@Overridepublic void destroy() {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {// 防止中文亂碼request.setCharacterEncoding("UTF-8");HttpServletRequest req = (HttpServletRequest) request;String path = req.getRequestURI();// 請(qǐng)求的是資源。跳過(guò)if (true == path.startsWith("/codeschool/resources")) {chain.doFilter(request, response);return;}// 用戶未登陸// 用戶訪問(wèn)主頁(yè)// 返回靜態(tài)頁(yè)面if (path.equals("/codeschool/") || path.equals("/")) {writeStaticHomePage(req, (HttpServletResponse) response);return;}chain.doFilter(request, response);}/*** 將靜態(tài)主頁(yè)返回給client* * @param req* @param resp* @throws IOException*/private void writeStaticHomePage(HttpServletRequest req,HttpServletResponse resp) throws IOException {// 返回靜態(tài)化頁(yè)面// 得到home.html路徑String pagePath = (String) ctx.getInitParameter("HOME_PAGE_PATH");if (logger.isDebugEnabled()) {logger.debug("主頁(yè)靜態(tài)頁(yè)面路徑:{}", pagePath);}// 將homt.html返回給clientServletOutputStream 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();}@Overridepublic void init(FilterConfig cfg) throws ServletException {this.ctx = cfg.getServletContext();}}能夠在web.xml里配置 home.html 的路徑: <!-- 靜態(tài)主頁(yè)的路徑 --><context-param><param-name>HOME_PAGE_PATH</param-name><param-value>/home/whf/workspace-sts/codeschool/home.html</param-value></context-param>
這樣在我們?cè)谠L問(wèn)主頁(yè)的時(shí)候就能明顯感覺(jué)到速度大大加快。
轉(zhuǎn)載于:https://www.cnblogs.com/llguanli/p/6731492.html
與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的「Java Web」主页静态化的实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: nginx location 在配置中的
- 下一篇: Java程序发送邮件