9
回答
有没有实现页面静态化(非伪静态)简单的方法
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   
有没有实现页面静态化(非伪静态)简单的方法,比如说使用什么工具,配置或加注解一下即可
举报
共有9个答案 最后回答: 3年前

有的,我学PHP的,但是我觉得流程差不多。

首选,你得写个URL重写规则,第一次访问那个链接的时候,静态文件是不存在的,这时候你要转发到你的JSP去,由JSP读取相应内容写入静态文本(文件名为请求的文件名)

举个例子

/news/1.html

第一次访问,news目录下是没有1.html这个文件的,这时候需要转发到jsp,JSP接收到请求之后,去数据库查找ID为1的记录,将结果与html模版整合之后写入news目录下的1.html,下次请求,由于文件存在就会直接显示静态网页了

--- 共有 1 条评论 ---
eechen主要是PHP可以非常方便地通过ob_start(), ob_end_flush(), ob_get_content(),file_put_contents()这些函数快速生成HTML到指定目录,就不知道Java怎么搞了. 3年前 回复

引用来自“闲.大赋”的评论

整个页面静态化? 可以输出流成为文件而不是网络io就可以生成静态文件了。

比如说,一篇文章,这篇文章是不经常动的,所以需要在第一次访问这个页面(http://xxxxx/post_{postid}.html)的时候顺带生成本地文件,当第二次及以后访问的时候,就不需要数据库生成了。 

有没有现有的工具,需要自己实现么?

这是模板工具的事儿吧,jsp也是会缓存的,freemarker和velocity应该也有这功能,thymeleaf是有的,我已经用了!

谢谢各位。

突然想到了一个思路,nginx是可以缓存的,nginx做方向代理,直接在nginx上配置即可。

感觉让它管理比自己写工具生成文件靠谱。

nginx处理最佳,用Java处理也可,可你段我以前写的代码

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Locale;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import freemarker.ext.servlet.FreemarkerServlet;
import freemarker.template.Configuration;
import freemarker.template.Template;
@WebServlet(
		urlPatterns = {"*.tpl"}, // 需要定义Freemarker解析的页面后缀类型
		asyncSupported = false, 
		loadOnStartup = 0, 
		name = "templateController", 
		displayName = "TemplateController", 
		initParams = {
			@WebInitParam(name = "TemplatePath", value = "/"),
			@WebInitParam(name = "NoCache", value = "false"),//定义是否缓存
			@WebInitParam(name = "ContentType", value = "text/html; charset=UTF-8"),// 定义内容类型 
			@WebInitParam(name = "template_update_delay", value = "0"), // 开发环境中可设置为0
			@WebInitParam(name = "default_encoding", value = "UTF-8"),
			@WebInitParam(name = "number_format", value = "0.##")
		} 
)
public class TemplateController extends FreemarkerServlet {
	private static final long serialVersionUID = 1L;
	/**
	 * 生成HTML静态页
	 * @param context
	 * @param data
	 * @param templatePath
	 * @param targetHtmlPath
	 */
	public static void crateHTML(ServletContext context,Map<String,Object> data,String templatePath,String targetHtmlPath){
        Configuration freemarkerCfg = new Configuration();
        //加载模版
        freemarkerCfg.setServletContextForTemplateLoading(context, "/");
        freemarkerCfg.setEncoding(Locale.getDefault(), "UTF-8");
        try {
            //指定模版路径
            Template template = freemarkerCfg.getTemplate(templatePath,"UTF-8");
            template.setEncoding("UTF-8");
            //静态页面路径
            String htmlPath = context.getRealPath("")+targetHtmlPath;
            File htmlFile = new File(htmlPath);
            Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(htmlFile), "UTF-8"));
            //处理模版  
            template.process(data, out);
            out.flush();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}



顶部