「Java Web」主页静态化的实现
一个站点的主页一般不会频繁变动,而大多数用户在訪问站点时不过浏览一下主页(未登陆)。然后就离开了。对于这类訪问请求。假设每次都要通过查询数据库来显示主页的话,显然会给server带来多余的压力。
这时候我们能够将主页静态化。在减轻数据库server压力的同一时候又能大大提高主页高訪问速度。
对于Java来说,如今有非常多框架但是实现主页的静态化。事实上这并不难。我们也能够自己手动实现。
思路例如以下:
首先编写一个小程序模拟浏览器向webserver发送GET请求。得到主页的HTML代码后,将其保存到文件里。
然后写一个过滤器拦截訪问请求。一旦发现訪问的是主页。那么就直接将保存好的静态HTML文件返回给client。这样就避开了框架(如 Spring MVC),更避开了数据库查询。假设主页内容发生了变化,我们能够再执行一下小程序以得到最新的主页HTML代码。
编写HTTPclient程序模拟浏览器
/**
* 向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 例如以下:
<dependencies>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.3.4</version>
</dependency> </dependencies>
运行一下该程序,就会得到 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();
}
}
<!-- 静态主页的路径 -->
<context-param>
<param-name>HOME_PAGE_PATH</param-name>
<param-value>/home/whf/workspace-sts/codeschool/home.html</param-value>
</context-param>
「Java Web」主页静态化的实现的更多相关文章
- Web缓存和静态化
Web缓存和静态化 目录 Web缓存基础... 1 什么是Web缓存... 1 Web缓存的类型... 1 为何要使用Web缓存... 1 重验证... 1 更新... 2 浏览器缓存... 2 工作 ...
- 「Java基本功」一文读懂Java内部类的用法和原理
内部类初探 一.什么是内部类? 内部类是指在一个外部类的内部再定义一个类.内部类作为外部类的一个成员,并且依附于外部类而存在的.内部类可为静态,可用protected和private修饰(而外部类只能 ...
- java web指定主页
正常情况下主页是在web.xml里面配置欢迎页面,可以加个过滤器重定向就可以: public void doFilter(ServletRequest req, ServletResponse res ...
- JAVA常用设计模式(静态化调用和实例化调用的区别,编辑可见 )
用newInstance()与用new是区别的,区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新类,且newInstance()只能调用无参构造函数. 最大的区别在于内存.静态方法 ...
- Java web App 部署静态文件
以 Tomcat 为例子,静态文件,如 html, css, js ,无需编译,所以只需要把文件复制到 Tomcat/webapps 目录下面某个子目录,便可以了. 例子: 1. 在 Tomcat/w ...
- loj#2510. 「AHOI / HNOI2018」道路 记忆化,dp
题目链接 https://loj.ac/problem/2510 思路 f[i][a][b]表示到i时,公路个数a,铁路个数b 记忆化 复杂度=状态数=\(nlog^2n\) 代码 #include ...
- java web 开发实战经典(一)
一.jsp三种Scriptlet(脚本小程序) 1.<% %> :定义局部变量.编写语句等. <% String str = "hello world!";// ...
- 「Java面试题/知识点精华集」20000+字的Java基础知识篇(2020最新版) !
本文已经收录进我的 79K Star 的 Java 开源项目 JavaGuide:https://github.com/Snailclimb/JavaGuide (「Java学习+面试指南」一份涵盖大 ...
- Freemarker 之 Java静态化 实例一
Freemarker是一种强大的web端模板技术,在当前Web开发中,SEO和客户端浏览速度尤为重要,其中将网页静态化是一个很好的解决方案.下面介绍Java中web开发结合Freemarker来实现静 ...
随机推荐
- [Javascript] Closure Cove, Common mistake
They’ve got a problem with their existing code, which tries to use a closure. Check it out: function ...
- Java 强引用、 软引用、 弱引用、虚引用
1.对象的强.软.弱和虚引用 在JDK 1.2曾经的版本号中.若一个对象不被不论什么变量引用,那么程序就无法再使用这个对象. 也就是说,仅仅有对象处于可触及(reachable)状态.程序才干使 ...
- 基于XMPP 协议的开发 android
设计过一款基于开源的XMPP即时通信协议的软件.採用C/S协议,通过GPRS无线网络用TCP协议到server.以架设开源的Openfire server作为即时通讯平台 系统主要由下面部分组成:一是 ...
- Linux清理磁盘空间
1.首先确定是否是磁盘满了 命令: df -h 参数说明: -a:列出所有的文件系统,包括系统特有的/proc等文件系统 -k:以KB的容量显示各文件系统 -m:以MB的容量显示各文件系统 -h: ...
- UIScrollView 图片循环滚动
1:假如有6个图片:那个,Scrollview的大小加 7 个图片的大小 2: //ImageScrollView; UIScrollView *imageScroll = [[UIScrollVie ...
- iOS键盘高度自适应(中英文输入)
一:添加通知监测键盘高度变化 [self keyBoardAutoSize]; 二:动态改变高度 #pragma mark keyboard height auto /* NSNotification ...
- 简单分页查询(web基础学习笔记十三)
一.建立资源文件和工具类 1.1 .database.properties jdbc.driver_class=oracle.jdbc.driver.OracleDriver jdbc.connect ...
- kafka delete topic
Don't think it is supported yet. Take a look at this JIRA tracking Delete Topic. For delete manually ...
- java面试第十七天
5.0新特性: 泛型: 泛型的形式: <E> <E extends 类型> <E extends Numner&comparator> 类名&接口 ...
- Python 迭代dict的value
迭代dict的value 1:values() 2:itervalues() 3:for key in Di: print (Di[key]) 我们已经了解了dict对象本身就是可迭代对象, ...