精华内容
下载资源
问答
  • 网页静态化

    2012-05-14 15:00:10
    网页静态化的好处:统一网站内容访问路径、隐藏后台的技术实现等。  使用UrlRewriterFilter2.6工具包实现,运行在tomcat下  然后把urlrewrite-2.6.0.jar放到lib目录,把urlrewrite.xml放到WEB-INF目录下。  ...

    网页静态化的好处:统一网站内容访问路径、隐藏后台的技术实现等。

             使用UrlRewriterFilter2.6工具包实现,运行在tomcat下

             然后把urlrewrite-2.6.0.jar放到lib目录,把urlrewrite.xml放到WEB-INF目录下。

             添加urlrewrite的filter到web.xml如下:

            

       <filter>
          <filter-name>UrlRewriteFilter</filter-name>
          <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
          <init-param>
              <param-name>logLevel</param-name>
               <param-value>warning</param-value>
           </init-param>
      </filter>
      <filter-mapping>
            <filter-name>UrlRewriteFilter</filter-name>
            <url-pattern>/*</url-pattern>
      </filter-mapping>
            打开urlrewrite.xml,里面已经有了不少的例子。这此以文章的路径为例

            增加如下配置到urlrewrite.xml文件

    	<rule>
    		<from>^/blog.htm$</from>	
    		<to>/showArticle?articleId=$1</to>
    	</rule>

             servlet配置如下

      <servlet>
      		<servlet-name>showArticle</servlet-name>
      		<servlet-class>com.blog.servlet.ShowArticleServlet</servlet-class>
      </servlet>
      <servlet-mapping>
      		<servlet-name>showArticle</servlet-name>
      		<url-pattern>/showArticle</url-pattern>
      </servlet-mapping>

     

    好了,在地址栏访问 /blog.htm  就等效于访问 /showArticle?articleId=1

    展开全文
  • 动态页面静态化工具直接将网页转换成静态,加快网页浏览速度 动态页面静态化工具使用方法 1、点击并添加新的任务 2、然后直接修改循环时间 3、最后直接点击【启动】就行了 动态页面静态化工具截图
  • FreeMarker网页静态化

    2018-07-29 22:04:31
    1、介绍-FreeMarker是什么  模板引擎:一种基于模板的、用来生成输出文本的通用工具 ... Html页面静态化  代码生成工具  CMS模板引擎  页面栏目动态定制 3、介绍-为什么要用FreeMarker  ...

    1、介绍-FreeMarker是什么

         模板引擎:一种基于模板的、用来生成输出文本的通用工具

         基于Java的开发包和类库

        

    2、介绍-FreeMarker能做什么

         MVC框架中的View层组件

         Html页面静态化

        代码生成工具

        CMS模板引擎

      页面栏目动态定制

    3、介绍-为什么要用FreeMarker

          程序逻辑(Java 程序)和页面设计(FreeMarker模板)分离

          分层清晰,利于分工合作

          主流Web框架良好的集成(struts2,springmvc)

          简单易学、功能强大

          免费开源

    4、FreeMarker优点

         FreeMarker不依赖于Servlet,网络或Web 环境

         FreeMarker一开始就是为MVC设计的,它仅仅专注于展示

         你可以从任意位置加载模板;从类路径下,从数据库中等

         易于定义特设的宏和函数

    5、上面简单介绍一下Freemarker,下面主要是利用Freemarker实习网页静态化的功能。

    通过上面的介绍知道Freemarker是一种基于模板的、用来生成输出文本的通用工具,所以我们必须要定制符合自己业务的模板出来,然后生成的我们得html页面

    Freemarker是通过freemarker.template.Configuration这个对象对模板进行加载的(它也处理创建和缓存预解析模板的工作),然后我们通过getTemplate方法获得你想要的模板,有一点要记住freemarker.template.Configuration在你整个应用必须保证唯一实例。

    5.1、在Configuration 中可以使用下面的方法来方便建立三种模板加载

     

    void setDirectoryForTemplateLoading(File dir);

     

    void setClassForTemplateLoading(Class cl, String prefix);

     

    void setServletContextForTemplateLoading(Object servletContext, String path);

    上述的第一种方法在磁盘的文件系统上设置了一个明确的目录,它确定了从哪里加载模板。不要说可能,File 参数肯定是一个存在的目录。否则,将会抛出异常。
    第二种调用方法使用了一个Class 类型的参数和一个前缀。这是让你来指定什么时候通过相同的机制来加载模板,不过是用Java 的ClassLoader 来加载类。这就意味着传
    入的Class 参数会被用来调用Class.getResource()方法来找到模板。参数prefix是给模板的名称来加前缀的。在实际运行的环境中,类加载机制是首选用来加载模板的方法,因为通常情况下,从类路径下加载文件的这种机制,要比从文件系统的特定目录位置加载安全而且简单。在最终的应用程序中,所有代码都使用.jar 文件打包也是不错的,这样用户就可以直接执行包含所有资源的.jar 文件了。
    第三种调用方式需要Web 应用的上下文和一个基路径作为参数,这个基路径是Web 应用根路径(WEB-INF 目录的上级目录)的相对路径。那么加载器将会从Web 应用目录开
    始加载模板。尽管加载方法对没有打包的.war 文件起作用, 因为它使用了ServletContext.getResource()方法来访问模板,注意这里我们指的是“目录”。如果忽略了第二个参数(或使用了””),那么就可以混合存储静态文件(.html,.jpg 等)和.ftl 文件,只是.ftl 文件可以被送到客户端执行。当然必须在WEB-INF/web.xml中配置一个Servlet 来处理URI 格式为*.ftl 的用户请求,否则客户端无法获取到模板,因此你将会看到Web 服务器给出的秘密提示内容。在站点中不能使用空路径,这将成为一个问题,你应该在WEB-INF 目录下的某个位置存储模板文件,这样模板源文件就不会偶然
    void setDirectoryForTemplateLoading(File dir);
    void setClassForTemplateLoading(Class cl, String prefix);
    void setServletContextForTemplateLoading(Object
    servletContext, String path);
    地被执行到,这种机制对servlet 应用程序来加载模板来说,是非常好用的方式,而且模板可以自动更新而不需重启Web 应用程序,但是对于类加载机制,这样就行不通了。

     

    5.2、从多个位置加载模板

     

    
     
    1. import freemarker.cache.*; // 模板加载器在这个包下

    2. ...

    3. FileTemplateLoader ftl1 = new FileTemplateLoader(new File("/tmp/templates"));

    4. FileTemplateLoader ftl2 = new FileTemplateLoader(new File("/usr/data/templates"));

    5. ClassTemplateLoader ctl = new ClassTemplateLoader(getClass(),"");

    6. TemplateLoader[] loaders = new TemplateLoader[] { ftl1, ftl2,ctl };

    7. MultiTemplateLoader mtl = new MultiTemplateLoader(loaders);

    8. cfg.setTemplateLoader(mtl);

    现在,FreeMarker 将会尝试从/tmp/templates 目录加载模板,如果在这个目录下没有发现请求的模板,它就会继续尝试从/usr/data/templates 目录下加载,如果还是没有发现请求的模板,那么它就会使用类加载器来加载模板。

     

    5.3、封装freemarker用于创建模板和加载模板

     

    
     
    1. package com.ajun.template.utils;

    2.  
    3. import java.io.IOException;

    4. import java.io.Writer;

    5. import java.util.Locale;

    6. import java.util.Map;

    7.  
    8. import javax.servlet.ServletContext;

    9.  
    10. import freemarker.template.Configuration;

    11. import freemarker.template.DefaultObjectWrapper;

    12. import freemarker.template.Template;

    13. import freemarker.template.TemplateException;

    14.  
    15. /**

    16. * @author ajun

    17. * @http://blog.csdn.net/ajun_studio

    18. **/

    19. public class FreeMarkertUtil {

    20.  
    21. private static Configuration config = new Configuration();

    22.  
    23. /**

    24. * @param templateName 模板名字

    25. * @param root 模板根 用于在模板内输出结果集

    26. * @param out 输出对象 具体输出到哪里

    27. */

    28. public static void processTemplate(String templateName, Map<?,?> root, Writer out){

    29. try{

    30. //获得模板

    31. Template template=config.getTemplate(templateName,"utf-8");

    32. //生成文件(这里是我们是生成html)

    33. template.process(root, out);

    34. out.flush();

    35. } catch (IOException e) {

    36. e.printStackTrace();

    37. } catch (TemplateException e) {

    38. e.printStackTrace();

    39. }finally{

    40. try {

    41. out.close();

    42. out=null;

    43. } catch (IOException e) {

    44. e.printStackTrace();

    45. }

    46. }

    47. }

    48. /**

    49. * 初始化模板配置

    50. * @param servletContext javax.servlet.ServletContext

    51. * @param templateDir 模板位置

    52. */

    53. public static void initConfig(ServletContext servletContext,String templateDir){

    54. config.setLocale(Locale.CHINA);

    55. config.setDefaultEncoding("utf-8");

    56. config.setEncoding(Locale.CHINA, "utf-8");

    57. config.setServletContextForTemplateLoading(servletContext, templateDir);

    58. config.setObjectWrapper(new DefaultObjectWrapper());

    59. }

    60. }

     

    5.4、例子介绍

    会用freemarker.jar自己google下载吧。

     

    这个例子中我们会Freemarker生成一个html文件 包括html的头部和尾部,已经body,这三个部分会分别对应三个模板文件,如下:

    在模板内要想输出结果集 可以用类似于EL表达式输出${}

    header.ftl

     

    
     
    1. companyName==>${h.companyName}<br/>

    2. address==>${h.address}<br/>

    footer.ftl

     

     

    
     
    1. des==>${f.des}<br/>

    2.  
    3. <a href="http://localhost/htmlpage/UpdateFooter.do"> 更新Footer </a>


    body.ftl,这个模板include以上两个模板文件

     

     

    
     
    1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

    2. <html>

    3. <head>

    4. <title>用户列表</title>

    5.  
    6. <meta http-equiv="pragma" content="no-cache">

    7. <meta http-equiv="cache-control" content="no-cache">

    8. <meta http-equiv="expires" content="0">

    9. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">

    10. <meta http-equiv="description" content="This is my page">

    11. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

    12. <!--

    13. <link rel="stylesheet" type="text/css" href="styles.css">

    14. -->

    15.  
    16. </head>

    17.  
    18. <body>

    19. <#include "header.ftl" parse=true encoding="utf-8">

    20. <hr/>

    21. <a href="#">用户列表</a><br/>

    22. <table border="1">

    23. <tr>

    24. <td>用户名</td>

    25. <td>年龄</td>

    26. <td>生日</td>

    27. <td>id</td>

    28. <td>操作</td>

    29. </tr>

    30. <#list users as user>

    31. <tr>

    32. <td>${user.name}</td>

    33. <td>${user.age}</td>

    34. <td>

    35. ${user.birthday?string("yyyy-MM-dd HH:mm:ss")}

    36. </td>

    37. <td>${user.id}</td>

    38. <td><a href="http://localhost/htmlpage/DelUser.do?id=${user.id}">删除</a></td>

    39. </tr>

    40. </#list>

    41.  
    42. </table>

    43. <hr/>

    44. <#include "footer.ftl" parse=true encoding="utf-8">

    45. </body>

    46. </html>


    这三个模板对应的三个实体类

     

    Footer.java

     

    
     
    1. package com.ajun.template.bean;

    2.  
    3. /**

    4. * @author ajun

    5. * @http://blog.csdn.net/ajun_studio

    6. **/

    7. public class Footer {

    8.  
    9. private String des;

    10.  
    11. public String getDes() {

    12. return des;

    13. }

    14.  
    15. public void setDes(String des) {

    16. this.des = des;

    17. }

    18.  
    19.  
    20. }


    Header.java

     

     

    
     
    1. package com.ajun.template.bean;

    2. /**

    3. * @author ajun

    4. * @http://blog.csdn.net/ajun_studio

    5. **/

    6. public class Header {

    7.  
    8. private String companyName;

    9.  
    10. private String address;

    11.  
    12. public String getCompanyName() {

    13. return companyName;

    14. }

    15.  
    16. public void setCompanyName(String companyName) {

    17. this.companyName = companyName;

    18. }

    19.  
    20. public String getAddress() {

    21. return address;

    22. }

    23.  
    24. public void setAddress(String address) {

    25. this.address = address;

    26. }

    27.  
    28.  
    29.  
    30. }


    User.java

     

     

    
     
    1. package com.ajun.template.bean;

    2.  
    3. import java.util.Date;

    4.  
    5. public class User {

    6.  
    7. private Integer id;

    8.  
    9. private String name ;

    10.  
    11. private int age;

    12.  
    13. private Date birthday;

    14.  
    15. public String getName() {

    16. return name;

    17. }

    18.  
    19. public void setName(String name) {

    20. this.name = name;

    21. }

    22.  
    23. public int getAge() {

    24. return age;

    25. }

    26.  
    27. public void setAge(int age) {

    28. this.age = age;

    29. }

    30.  
    31. public Date getBirthday() {

    32. return birthday;

    33. }

    34.  
    35. public void setBirthday(Date birthday) {

    36. this.birthday = birthday;

    37. }

    38.  
    39.  
    40. public Integer getId() {

    41. return id;

    42. }

    43.  
    44. public void setId(Integer id) {

    45. this.id = id;

    46. }

    47.  
    48. public User(Integer id,String name, int age, Date birthday) {

    49. super();

    50. this.name = name;

    51. this.age = age;

    52. this.birthday = birthday;

    53. this.id = id;

    54. }

    55.  
    56. public User() {

    57. super();

    58. }

    59.  
    60.  
    61. }


    下面模板一些业务逻辑操作,对这三个实体类

     

     

    
     
    1. package com.ajun.template.service;

    2.  
    3. import com.ajun.template.bean.Footer;

    4. /**

    5. * @author ajun

    6. * @http://blog.csdn.net/ajun_studio

    7. **/

    8. public class FooterService {

    9.  
    10. private static Footer f = new Footer();

    11. static{

    12. f.setDes("北京-廊坊-好公司呢!!!!哇哈哈!!!");

    13. }

    14.  
    15. public static void update(String des){

    16. f.setDes(des);

    17. }

    18.  
    19. public static Footer gerFooter(){

    20. return f;

    21. }

    22. }

     

    
     
    1. package com.ajun.template.service;

    2.  
    3. import com.ajun.template.bean.Header;

    4. /**

    5. * @author ajun

    6. * @http://blog.csdn.net/ajun_studio

    7. **/

    8. public class HeaderService {

    9.  
    10. private static Header h = new Header();

    11.  
    12. static{

    13. h.setAddress("北京朝阳CBD");

    14. h.setCompanyName("上海唐秀!!!");

    15. }

    16.  
    17. public static void update(String address,String companyName){

    18. h.setAddress(address);

    19. h.setCompanyName(companyName);

    20. }

    21.  
    22. public static Header getHeader(){

    23. return h;

    24. }

    25. }

    
     
    1. package com.ajun.template.service;

    2.  
    3. import java.util.ArrayList;

    4. import java.util.Date;

    5. import java.util.List;

    6.  
    7. import com.ajun.template.bean.User;

    8. /**

    9. * @author ajun

    10. * @http://blog.csdn.net/ajun_studio

    11. **/

    12. public class UserService {

    13.  
    14. private static List<User> users = new ArrayList<User>();

    15.  
    16. static{

    17. for(int i=0;i<10;i++){

    18. User u = new User(i,"ajun"+i,i+10,new Date());

    19. users.add(u);

    20. }

    21. }

    22.  
    23. public static List<User> getUsers(){

    24. return users;

    25. }

    26.  
    27. public static void delete(int index){

    28. for(int i=0 ;i<users.size();i++){

    29. User u = users.get(i);

    30. if(u.getId()==index){

    31. users.remove(u);

    32. //users.remove(index);

    33. }

    34. }

    35. }

    36. }


    上面主要是模板你的一些业务和dao层得操作,因此没有涉及数据库的操作,主要是为实验。

     

    生成html对外调用的方法,会用到FreeMarkertUtil这个类 这个类得代码上面已经给出。

     

    
     
    1. package com.ajun.template.client;

    2.  
    3. import java.io.Writer;

    4. import java.util.HashMap;

    5. import java.util.List;

    6. import java.util.Map;

    7.  
    8. import com.ajun.template.bean.Footer;

    9. import com.ajun.template.bean.Header;

    10. import com.ajun.template.bean.User;

    11. import com.ajun.template.service.FooterService;

    12. import com.ajun.template.service.HeaderService;

    13. import com.ajun.template.service.UserService;

    14. import com.ajun.template.utils.FreeMarkertUtil;

    15.  
    16. /**

    17. * @author ajun

    18. * @http://blog.csdn.net/ajun_studio

    19. **/

    20. public class ProcessClient {

    21.  
    22. private static Map<String,Object> root = new HashMap<String,Object>();

    23.  
    24. /**

    25. * 调用FreeMarkertUtil.java

    26. * FreeMarkertUtil.processTemplate("body.ftl", root, out);

    27. * 来生成html文件

    28. * @param out

    29. */

    30. public static void processBody(Writer out){

    31. Header h = HeaderService.getHeader();

    32. root.put("h", h);

    33. Footer f = FooterService.gerFooter();

    34. root.put("f", f);

    35. List<User> users = UserService.getUsers();

    36. root.put("users", users);

    37. FreeMarkertUtil.processTemplate("body.ftl", root, out);

    38. }

    39.  
    40. }

    此时我会提供一个servlet在客户端进行第一次请求的时候 我会调用这个ProcessClient来生成html页面,之后每次访问就可以直接访问html,来做到真正的静态化了

     

     

    
     
    1. package com.ajun.template.servlet;

    2.  
    3. import java.io.File;

    4. import java.io.FileOutputStream;

    5. import java.io.IOException;

    6. import java.io.OutputStreamWriter;

    7. import java.io.Writer;

    8.  
    9. import javax.servlet.ServletConfig;

    10. import javax.servlet.ServletException;

    11. import javax.servlet.http.HttpServlet;

    12. import javax.servlet.http.HttpServletRequest;

    13. import javax.servlet.http.HttpServletResponse;

    14.  
    15. import com.ajun.template.client.ProcessClient;

    16. import com.ajun.template.utils.DirectoryFilter;

    17. import com.ajun.template.utils.FreeMarkertUtil;

    18.  
    19. /**

    20. * @author ajun

    21. * @http://blog.csdn.net/ajun_studio

    22. **/

    23. public class Index extends HttpServlet {

    24.  
    25. private static final long serialVersionUID = 7474850489594438527L;

    26.  
    27. public Index() {

    28. super();

    29. }

    30.  
    31.  
    32. public void doGet(HttpServletRequest request, HttpServletResponse response)

    33. throws ServletException, IOException {

    34.  
    35. this.doPost(request, response);

    36. }

    37.  
    38.  
    39. public void doPost(HttpServletRequest request, HttpServletResponse response)

    40. throws ServletException, IOException {

    41. //html生成之后存放的路径

    42. String dirPath = request.getSession().getServletContext().getRealPath("/templates/html");

    43. File path = new File(dirPath);

    44. //生成的文件的名字

    45. String indexFileName = "index.html";

    46. /**

    47. * 判断是否已经存在该html文件,存在了就直接访问html ,不存在生成html文件

    48. */

    49. String[] indexfileList = path.list(new DirectoryFilter(indexFileName));

    50. if(indexfileList.length<=0){

    51. Writer out = new OutputStreamWriter(new FileOutputStream(dirPath+"/"+indexFileName),"UTF-8");

    52. //生成html文件

    53. ProcessClient.processBody(out);

    54. request.getRequestDispatcher("/templates/html/index.html").forward(request, response);

    55. }else{

    56. request.getRequestDispatcher("/templates/html/"+indexfileList[0]).forward(request, response);

    57. }

    58.  
    59.  
    60. }

    61.  
    62.  
    63.  
    64. /**

    65. * 初始化模板配置,供以后获得模板,在init里加载也主要是为保证Configuration实例唯一

    66. */

    67. public void init(ServletConfig config) throws ServletException {

    68. String templateDir = config.getInitParameter("templateDir");

    69. FreeMarkertUtil.initConfig(config.getServletContext(), templateDir);

    70. }

    71.  
    72.  
    73. }

    web.xml配置

     

     

    
     
    1. <servlet>

    2. <description>This is the description of my J2EE component</description>

    3. <display-name>This is the display name of my J2EE component</display-name>

    4. <servlet-name>Index</servlet-name>

    5. <servlet-class>com.ajun.template.servlet.Index</servlet-class>

    6. <init-param>

    7. <param-name>templateDir</param-name>模板存放位置,是基于app的根目录的

    8. <param-value>/templates</param-value>

    9. </init-param>

    10. <load-on-startup>3</load-on-startup>为了启动的时候初始化模板配置

    11. </servlet>

    12.  
    13. <servlet-mapping>

    14. <servlet-name>Index</servlet-name>

    15. <url-pattern>/Index.do</url-pattern>

    16. </servlet-mapping>


    部署到tomcat上,输入:http://localhost/htmlpage/Index.do

     

    页面效果:

    页面是做好了,但是内容变化了 ,更新怎么办呢,我这里是当列表内容变化之后 ,我是删除原来的html ,利用模板然后重新生成的符合新结果的html页面

    当我删除一条的时候,我会重新生成html页面,但是由于浏览器缓存的原因,即是你删除了,重新生成了新html页面,可是浏览器还是保存原来的页面,不刷新两次是不行的,

    这里我采用的没更新的时候,都会给这个html改个名字,让浏览器去加载最新的,就可以了

    具体的删除操作如下:

     

    
     
    1. package com.ajun.template.servlet;

    2.  
    3. import java.io.File;

    4. import java.io.FileOutputStream;

    5. import java.io.IOException;

    6. import java.io.OutputStreamWriter;

    7. import java.io.Writer;

    8. import java.util.UUID;

    9.  
    10. import javax.servlet.ServletException;

    11. import javax.servlet.http.HttpServlet;

    12. import javax.servlet.http.HttpServletRequest;

    13. import javax.servlet.http.HttpServletResponse;

    14.  
    15. import com.ajun.template.client.ProcessClient;

    16. import com.ajun.template.service.UserService;

    17. import com.ajun.template.utils.DirectoryFilter;

    18. /**

    19. * @author ajun

    20. * @http://blog.csdn.net/ajun_studio

    21. **/

    22. public class DelUser extends HttpServlet {

    23.  
    24.  
    25. public void doGet(HttpServletRequest request, HttpServletResponse response)

    26. throws ServletException, IOException {

    27. this.doPost(request, response);

    28. }

    29.  
    30. //删除用户

    31. public void doPost(HttpServletRequest request, HttpServletResponse response)

    32. throws ServletException, IOException {

    33.  
    34. String id = request.getParameter("id");

    35. UserService.delete(Integer.valueOf(id));

    36.  
    37. //生成html的位置

    38. String dirPath = request.getSession().getServletContext().getRealPath("/templates/html");

    39. //文件名字

    40. String indexFileName = "index.html";

    41.  
    42. //删除原来的文件

    43. delOldHtml(dirPath,indexFileName);

    44.  
    45. //防止浏览器缓存,用于重新生成新的html

    46. UUID uuid = UUID.randomUUID();

    47. Writer out = new OutputStreamWriter(new FileOutputStream(dirPath+"/"+uuid+indexFileName),"UTF-8");

    48. ProcessClient.processBody(out);

    49. response.sendRedirect("templates/html/"+uuid+"index.html");

    50. }

    51.  
    52. /**

    53. * 删除原来的html文件

    54. * @param htmlDir

    55. * @param htmlName

    56. */

    57. private void delOldHtml(String htmlDir,String htmlName){

    58. File path = new File(htmlDir);

    59. String[] indexfileList = path.list(new DirectoryFilter(htmlName));

    60. if(indexfileList.length>=0){

    61. for(String f:indexfileList){

    62. File delf = new File(htmlDir+"/"+f);

    63. delf.delete();

    64. }

    65. }

    66. }

    67.  
    68. }


    通过以上操作,每次更新html,就可以不解决浏览器缓存的问题了。

     

    还有一个工具类需要介绍,就是判断是否已经生成了特定的html文件的java类

     

    
     
    1. package com.ajun.template.utils;

    2.  
    3. import java.io.File;

    4. import java.io.FilenameFilter;

    5. /**

    6. * @author ajun

    7. * @http://blog.csdn.net/ajun_studio

    8. **/

    9. public class DirectoryFilter implements FilenameFilter {

    10.  
    11. String myString;

    12. public DirectoryFilter(String myString)

    13. {

    14. this.myString = myString;

    15. }

    16.  
    17. public boolean accept(File dir,String name)

    18. { //FilenameFilter.accept(File dir, String name)

    19. // 测试指定文件是否应该包含在某一文件列表中。

    20. String f= new File(name).getName();

    21. if(f.contains(myString) || f.equals(myString)){

    22. return true;

    23. }

    24. return false;

    25. }

    26.  
    27. }

     

    到这里整个静态化就完成了,静态化更新机制,是根据你自己项目的业务进行定制的,可以定时生成html文件,也可以需要手动生成。

    项目结构图如下:

     

    记住:网站不是所有的页面都是需要静态化的,主要是一些实时性不是很高的数据页面进行静态化(来提高访问速度),其他都是通过伪静态来实现的,就是重写utl。

    页面静态化不是提高网站性能的唯一途径,还可以利用一些缓存产品来实现。

     

    常用FreeMarker资源

    官网主页:http://www.freemarker.org/

    Eclipse插件JbossTool:http://www.jboss.org/tools/download/

    中文文档:https://sourceforge.net/projects/freemarker/files/chinese-manual/FreeMarker_Manual_zh_CN.pdf/download

    展开全文
  • 定义 Freemarker是一个模板搜索引擎,一个基于模板生成文本输出的工具,采用纯java编写;虽然Freemarker具有一定的编程能力,但是通常还是需要由java...页面静态化 使用模板+数据模型,就能能够实现数据的展示,快速

    定义

    Freemarker是一个模板搜索引擎,一个基于模板生成文本输出的工具,采用纯java编写;虽然Freemarker具有一定的编程能力,但是通常还是需要由java程序提供需要显示的数据。

    核心:模板+数据模型=输出

    在这里插入图片描述

    使用场景及作用

    1. 动态页面

      模板引擎可以让程序实现界面与数据分离,业务代码与逻辑代码的分离,这就提升了开发效率,良好的设计也使得代码复用变得更加容易。在模板中可以专注如果展示数据,而在模板之外,可以更专注要展示哪些数据。

    2. 页面静态化

      使用模板+数据模型,就能能够实现数据的展示,快速将两者进行组合,生成一个完成渲染的静态化html页面。

    3. 代码生成器

      能够根据提前编写好的模板,使用Freemarker提供的指定,配合数据模型,达到生成代码的功能。

    使用

    1. 导入maven依赖

      <dependency>
          <groupId>org.freemarker</groupId>
          <artifactId>freemarker</artifactId>
          <version>2.3.23</version>
      </dependency>
      
    2. 创建模板文件

      模板中一般包含4中元素:

      • 文本:直接输出的部分。
      • 注释:使用<#--注释内容-->注释符号中的数据不会输出。
      • 插值:使用${},表达式,就能够使用数据模型中的对应数据,替换插值表达式中的变量,进行数据输出。
      • FTL指令:Freemarker指令,类似于HTML标记,指令前会加#井号进行区分。

      注意:freemarker模板文件的后缀名可以任意,但是一般使用ftl作为后缀名。

      在本地磁盘创建

      <html>
          <head>
              <meta charset="utf-8">
              <title>Freemarker入门</title>
          </head>
          <body>
              <#--我只是一个注释,我不会有任何输出  -->
              ${name}你好,${message}
          </body>
      </html>
      
    3. 编写java类

      public static void main(String[] args) throws IOException, TemplateException {
      
          /*
              1.设置配置,加载模板
               */
          //创建一个Configuration对象,参数为freemarker的版本号
          Configuration configuration = new Configuration(Configuration.getVersion());
          //配置模板文件所在目录
          configuration.setDirectoryForTemplateLoading(new File("D:/ftl"));
          //设置编码
          configuration.setDefaultEncoding("UTF-8");
          //加载模板文件,注意加载的模板文件名,必须要在配置的目录下
          Template template = configuration.getTemplate("freemarker.ftl");
      
          /*
              2.设置数据模型
               */
          //设置数据模型,注意的是,添加的key要和模板中取数据时所用的key相同
          Map map = new HashMap();
          map.put("name", "张三");
          map.put("message", "哈哈");
      
          /*
              3.将数据模型与模板进行组合输出
               */
      
          //定数据输出的文件,并获取该文件的字符输出流
          FileWriter writer = new FileWriter("D:/ftl/test.html");
          //将模板输出
          template.process(map, writer);
          //关闭流
          writer.close();
      }
      
    4. 注意

      1. freemarker再与spring进行整合,生成静态页面时,如果出现乱码问题,可以使用记事本软件打开静态页面,如果在记事本中出现乱码,那么就需要指定数据库的编码格式。

        jdbc.url=jdbc:mysql://192.168.242.130:3306/hse?characterEncoding=UTF-8&serverTimezone=UTC

      2. 如果记事本中正常显示,但是静态网页本身出现乱码,那么就需要设置使用模板生成页面时的输出流,设置输出流的编码。

        OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(
            new File(outPath + "/" + fileName)), "utf-8");
        template.process(data, writer);
        

        采用OutputStreamWriter字符转换流,该流对象是字符流到字节流的桥梁,使用该流对象的时候指定编码格式为utf-8。

      zhi’ding

    5. assign指令

      • 作用:用于在页面上定义一个变量。

      • 使用:使用${},表达式使用定义的变量

      • 定义简单类型

        <#assign username="不知火舞">
        ${username}
        
      • 定义对象类型

        <#assign student={"user": "王昭君", "age": 19}>
        ${student.user}
        ${student.age}
        
    6. include指令

      • 作用:用于模板文件的嵌套

      • 使用

        <#include "要包含的模板文件名.ftl"/>
        
    7. if指令

      • 作用:用于在模板中进行判断。

        模板文件中

        <#if bl==true>
        	判断为真
        	<#else>
        	判断为假
        </#if>
            
            
        <#if number==1>
        	数值为1
        <#elseif number==2>
        	数值为2
        <#else>
            数值为3
        </#if>
        

        java代码

        Map map = new HashMap();
        map.put("bl", true);
        
      • 注意:也可以在模板文件中使用assign指令,定义变量,用作if指令的判断变量

    8. list指令

      • 作用:用于在模板文件中进行遍历输出

      • 使用:

        模板文件中

        <#list goods as goodsList>
            商品名称:${goods.name}
            商品价格:${goods.price}
        <#list>
        

        java代码中

        //创建一个list对象
        List goodsList=new ArrayList();
        
        //创建map对象,每个map封装一个商品的信息
        Map goods1=new HashMap();
        goods1.put("name", "苹果");
        goods1.put("price", 5.8);
        
        Map goods2=new HashMap();
        goods2.put("name", "香蕉");
        goods2.put("price", 2.5);
        
        Map goods3=new HashMap();
        goods3.put("name", "橘子");
        goods3.put("price", 3.2);
        
        //将每个map对象看做是一个商品对虾,k'm'k'k
        goodsList.add(goods1);
        goodsList.add(goods2);
        goodsList.add(goods3);
        map.put("goodsList", goodsList);
        

      Spring集合firemarker

      1. 导入依赖

        <dependency>
         <groupId>org.freemarker</groupId>
         <artifactId>freemarker</artifactId>
         <version>2.3.23</version>
        </dependency>
        
      2. 编写模板文件,模板文件后缀名以.ftl结尾

      3. 在spring中配置模板文件

        freemarker.properties(指定通过模板文件生成的静态页面的存放路径)

        out_put_path=D:/ideaProjects/health_parent/health_mobile/src/main/webapp/pages
        

        applicationContext-firemarker.xml(在spring初始化的时候,配置firemarker的FreeMarkerConfigurer类对象)

        <bean id="freemarkerConfig"
         class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
         <!--指定模板文件所在目录-->
         <property name="templateLoaderPath" value="/WEB-INF/ftl/" />
         <!--指定字符集-->
         <property name="defaultEncoding" value="UTF-8" />
        </bean>
        <context:property-placeholder location="classpath:freemarker.properties"/>
        
      4. 编写逻辑代码根据模板生成静态页面

        在逻辑代码中进行查询等操作,获取需要的数据,建立数据模型,通过与模板页面的结合进行展示,最终生成模板页面。

      注意

      模板页面还可以结合vue进行使用,页面上使用vue,在js中使用freemarker给数据模型赋值

      模板页面

      <!--页面省略-->
      <script>
          var vue = new Vue({
              el: '#app',
              data: {
                  //${setMealList}是firemarker表达式,而setMealList对象是通过代码模板代码建立的数据模型
                  setmealList: ${setMealList}
              },
          });
      </script>
      </body>
      

      数据还是通过java代码,传递给模板页面,模板页面就能够使用${}表达式进行获取。
      注意:使用freemarker与vue结合的时候,在vue中不能使用对象.属性的方式,否则会报错!

    展开全文
  • FreeMarker网页静态化学习day01 1. 什么是FreeMarker? FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终...

    FreeMarker网页静态化学习day01

    1. 什么是FreeMarker?

    FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据,
    并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。
    它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。

    2. FreeMarker的模式?

    这种方式通常被称为 MVC (模型 视图 控制器) 模式,对于动态网页来说,是一种特别流行的模式。 它帮助从开发人员(Java 程序员)中分离出网页设计师(HTML设计师)。设计师无需面对模板中的复杂逻辑, 在没有程序员来修改或重新编译代码时,也可以修改页面的样式。
    在这里插入图片描述

    3. FreeMarker的入门案例?

    • 1.建立一个Maven工程
    • 2.在pom文件中加入 FreeMarker 的 依赖(Maven厂库)
    • 3.在resource目录下编写 Template 模板文件
      创建名为FreeMarker.ftl的模板文件
    <html>
        <head>
            <meta charset="UTF-8">
            <title>FreeMarkerDemo</title>
        </head>
        <body>
          <#-- 我是一个FreeMarker注释 不会显示在客户端上 -->
          <!-- 我是HTML注释 我会显示在客户端上 -->
          ${name} , 您好! 欢迎使用${productName}
        </body>
    </html>
    
      • 4.在Java目录下编写 如下代码 :
    • `
      public static void main(String[] args) throws IOException, TemplateException {

        // 1. 创建一个配置对象 Configuration.getVersion(): 获取模板的版本
        Configuration configuration = new Configuration(Configuration.getVersion());
      
        // 2. 指定创建模板的目录
        configuration.setDirectoryForTemplateLoading(new File("E:\\Users\\Administrator\\IdeaProjects\\FreeMark_Demo\\src\\main\\resources"));
        // 3. 设置字符集
        configuration.setDefaultEncoding("UTF-8");
        // 4.获取模板对象
        Template template = configuration.getTemplate("FreeMarkerTest.ftl");
        // 5. 创建数据模型(可以是对象 也可以是Map 使用更加灵活 )
        Map map = new HashMap();
        map.put("name","张三");
        map.put("productName","FreeMarker网页静态化技术");
      
        // 6. 创建文件输出流对象
        Writer fileWriter = new FileWriter("D:\\FreeMarker\\page01.html");
        // 7. 输出
        template.process(map,fileWriter);
        // 8. 关闭
        fileWriter.close();
      

      }`

    • 5.点击运行main方法 生成静态html文件

    • 在这里插入图片描述

    • 在这里插入图片描述

    4. FreeMarker的指令的使用?

    • 1.第一个指令 #assgin
       <#-- 第一个指令 assgin 定义简单类型 -->
        <#assign linkName = "王先生">
          <#-- 定义对象类型 -->
        <#assign info = {"mobile":"139-9999-9999","address":"湖北武汉"}>
        联系人:${linkName} <br>
        联系电话:${info.mobile}<br>
        家庭住址:${info.address}<br>
    

    在这里插入图片描述

    • 2.第二个指令 #include
    • 在这里插入图片描述
    • 3.第三个指令 #if
    • 在这里插入图片描述
    • 4.第四个指令 #list 循环输出
      • 1.编写测试数据代码
      • List<Student> list = new ArrayList<Student>(); Student student0 = new Student("张三","男",24, "湖北武汉江夏区"); list.add(student0); Student student1 = new Student("李四","女",20, "湖北武汉洪山区"); list.add(student1); Student student2 = new Student("王五","男",18, "湖北武汉武昌区"); list.add(student2); Student student3 = new Student("赵六","女",36, "湖北武汉东西湖区"); list.add(student3); map.put("list",list);
        在这里插入图片描述
          • 2.在模板文件中使用 #list 输出
            在这里插入图片描述
          • 3.最后在页面的显示的效果
            在这里插入图片描述
    展开全文
  • 如何实现网页静态化

    千次阅读 2018-06-27 13:37:01
    可以使用Freemarker工具实现。2.Freemarker的使用方法 第一步:添加Freemarker的jar包到工程中。 第二步:Freemarker的运行不依赖外部容器,可以在java工程中使用。创建一个测试方法进行测试。 第三步:创建一个....
  • 网页静态化--Freemarker

    2017-11-10 09:44:34
    可以使用freemaker工具生成。   1.2 Freemarker 1.2.1 什么是freemarker FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker与Web容器无关,即在Web运行时,它并不知道Ser
  • 静态化网站工具

    2012-04-04 21:56:56
    可以将动态的网页转成静态页面,有利于搜索引擎收录
  • 将动态首页文件生成相应的静态化首页文件index.html,程序运行需支持asp网页的空间,或iis。 注:本程序只能生成单个网页
  • Freemarker是一种基于模板的、用来生成输出文本的通用工具,所以我们必须要定制符合自己业务的模板出来,然后生成的我们得html页面。 Freemarker是通过freemarker.template.Configuration这个对象对模板进行...
  • freemarker静态化网页

    2016-03-10 17:44:32
    1、介绍-FreeMarker是什么  模板引擎:一种基于模板的、用来生成输出文本的通用工具 ... Html页面静态化  代码生成工具  CMS模板引擎  页面栏目动态定制 3、介绍-为什么要用FreeMa
  • 利用freemarker 静态化网页 1、介绍-FreeMarker是什么  模板引擎:一种基于模板的、用来生成输出文本的通用工具  基于Java的开发包和类库   2、介绍-FreeMarker能做什么  MVC框架中...
  • FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写。FreeMarker被设计用来生成HTMLWeb页面,特别是基于MVC模式的应用程序。 所谓模板,就是一份已经写好了基本内容,有着固定格式的...
  • freemarker 静态化网页

    2012-11-07 19:39:41
     freemarker的作用:  MVC框架中的View层组件  Html页面静态化  代码生成工具  CMS模板引擎   http://blog.csdn.net/ajun_studio/article/details/6932185...
  • 众所周知Gulp.js 是一个自动构建工具,开发者可以使用它在项目开发过程中自动执行...下面这篇文章主要给大家介绍了关于Gulp实现静态网页模块的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 591
精华内容 236
关键字:

网页静态化工具