使用Freemarker 实现JSP页面的静态化

2023-11-16

 

使用Freemarker 静态化网页

一、原理

 Freemarker 生成静态页面,首先需要使用自己定义的模板页面,这个模板页面可以是最最普通的html,也可以是嵌套freemarker中的 取值表达式, 标签或者自定义标签等等,然后后台读取这个模板页面,解析其中的标签完成相对应的操作, 然后采用键值对的方式传递参数替换模板中的的取值表达式,做完之后 根据配置的路径生成一个新的html页面, 以达到静态化访问的目的。

二、Freemaker提供的标签

Freemarker提供了很多有用 常用的标签,具体可以分为三个部分:Freemarker标签都是类似Html标签,不同的是它是为了与HTML标记区分,用#开始。例如<#标签名称>;${value} 表示输出变量名的内容 ;注释:包含在<#--和-->(而不是<!--和-->)之间;

三、Freemaker实现网页静态化DEMO

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

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

复制代码

Body.ftl

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

<html>  

  <head>  

    <title>用户列表</title>  

      

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

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

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

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

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

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

    <!--  

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

    -->  

   

  </head>  

    

  <body>  

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

  <hr/>  

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

  <table border="1">  

    <tr>  

        <td>用户名</td>  

        <td>年龄</td>  

        <td>生日</td>  

        <td>id</td>  

        <td>操作</td>  

    </tr>  

    <#list users as user>  

        <tr>  

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

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

            <td>  

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

            </td>  

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

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

        </tr>  

    </#list>  

      

  </table>  

<hr/>  

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

  </body>  

</html>  

Footer.ftl

${f.des}<br/> 

Header.ftl

company:${h.companyName}<br/>  

address:${h.address}<br/>  

它们对于的实体类分别是:

User.java

package com.cys.jsptohtml.schema;

 

import java.util.Date;  

 

public class User {  

      

    private Integer id;  

  

    private String name ;  

      

    private int age;  

      

    private Date birthday;  

  

    public String getName() {  

        return name;  

    }  

  

    public void setName(String name) {  

        this.name = name;  

    }  

  

    public int getAge() {  

        return age;  

    }  

  

    public void setAge(int age) {  

        this.age = age;  

    }  

  

    public Date getBirthday() {  

        return birthday;  

    }  

  

    public void setBirthday(Date birthday) {  

        this.birthday = birthday;  

    }  

  

      

    public Integer getId() {  

        return id;  

    }  

  

    public void setId(Integer id) {  

        this.id = id;  

    }  

  

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

        super();  

        this.name = name;  

        this.age = age;  

        this.birthday = birthday;  

        this.id = id;  

    }  

  

    public User() {  

        super();  

    }  

      

      

}  

Header.java

package com.cys.jsptohtml.schema;

 

 

public class Header {  

  

    private String companyName;  

      

    private String address;  

  

    public String getCompanyName() {  

        return companyName;  

    }  

  

    public void setCompanyName(String companyName) {  

        this.companyName = companyName;  

    }  

  

    public String getAddress() {  

        return address;  

    }  

  

    public void setAddress(String address) {  

        this.address = address;  

    }        

}  

Footer.java

package com.cys.jsptohtml.schema;

 

 

public class Header {  

  

    private String companyName;  

      

    private String address;  

  

    public String getCompanyName() {  

        return companyName;  

    }  

  

    public void setCompanyName(String companyName) {  

        this.companyName = companyName;  

    }  

  

    public String getAddress() {  

        return address;  

    }  

  

    public void setAddress(String address) {  

        this.address = address;  

    }   

}  

对应的Service有(在Service中模仿了数据库操作):

UserService.java:

package com.cys.jsptohtml.service;

 

import java.util.ArrayList;

import java.util.Date;

import java.util.List;

 

import com.cys.jsptohtml.schema.User;

 

public class UserService {  

  

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

      

    static{  

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

            User u = new User(i,"cys"+i,i+10,new Date());  

            users.add(u);  

        }  

    }  

      

    public static List<User> getUsers(){  

        return users;  

    }  

      

    public static void delete(int index){  

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

            User u = users.get(i);  

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

                users.remove(u);  

                //users.remove(index);  

            }  

        }  

    }  

}   

HeaderService.java

package com.cys.jsptohtml.service;

 

import com.cys.jsptohtml.schema.Header;

 

public class HeaderService {  

  

    private static Header h = new Header();  

      

    static{  

        h.setAddress("中关村东路");  

        h.setCompanyName("中科软");  

    }  

      

    public static void update(String address,String companyName){  

        h.setAddress(address);  

        h.setCompanyName(companyName);  

    }  

      

    public static Header getHeader(){  

        return h;  

    }  

}  

FooterService.java

package com.cys.jsptohtml.service;

 

import com.cys.jsptohtml.schema.Footer;

 

 

 

public class FooterService {  

  

    private static Footer f = new Footer();  

    static{  

        f.setDes("这是底部");  

    }  

      

    public static void update(String des){  

        f.setDes(des);  

    }  

      

    public static Footer gerFooter(){  

        return f;  

    }  

}  

Servlet操作:

DelUser.java

package com.cys.jsptohtml.servlet;

 

import java.io.File;

import java.io.FileOutputStream;

import java.io.FilenameFilter;

import java.io.IOException;

import java.io.OutputStreamWriter;

import java.io.Writer;

import java.util.UUID;

 

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

import com.cys.jsptohtml.service.UserService;

import com.cys.jsptohtml.util.ProcessClient;

  

/** 

 * @author cys 

 **/  

@SuppressWarnings("serial")

public class DelUser extends HttpServlet {  

  

      

    public void doGet(HttpServletRequest request, HttpServletResponse response)  

            throws ServletException, IOException {  

            this.doPost(request, response);  

    }  

  

    //删除用户  

    public void doPost(HttpServletRequest request, HttpServletResponse response)  

            throws ServletException, IOException {  

         System.out.println("Del dopost");

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

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

          

        //生成html的位置  

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

        //文件名字  

        String indexFileName = "index.html";  

          

        //删除原来的文件  

        delOldHtml(dirPath,indexFileName);  

          

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

        UUID uuid = UUID.randomUUID();  

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

        ProcessClient.processBody(out, "body.ftl");

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

    }  

      

    /** 

     * 删除原来的html文件 

     * @param htmlDir 

     * @param htmlName 

     */  

    private void delOldHtml(String htmlDir,String htmlName){  

        File path = new File(htmlDir);  

        String[] indexfileList = path.list(new FilenameFilter(){

 

public boolean accept(File dir, String name) {

return name.endsWith(".html");

}

        

        });  

        if(indexfileList.length>0){  

            for(String f:indexfileList){  

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

                delf.delete();  

            }  

        }  

    }  

  

}

JspToHtmlServlet.java

package com.cys.jsptohtml.servlet;

 

import java.io.File;

import java.io.FileOutputStream;

import java.io.FilenameFilter;

import java.io.IOException;

import java.io.OutputStreamWriter;

import java.io.Writer;

 

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

import com.cys.jsptohtml.util.ProcessClient;

 

public class JspToHtmlServlet extends HttpServlet{

 

private static final long serialVersionUID = 1L;

 

public JspToHtmlServlet() {  

        super();  

    }  

 

    public void doGet(HttpServletRequest request,HttpServletResponse response)  

            throws ServletException, IOException {  

     System.out.println("doget");

        this.doPost(request, response);  

    }  

  

      

public void doPost(HttpServletRequest request, 

HttpServletResponse response)  

            throws ServletException, IOException {  

     System.out.println("doPost");

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

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

        File path = new File(dirPath);  

        // 生成的文件的名字

        String indexFileName = "index.html";  

        /**

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

 */  

        String[] indexfileList = path.list(new FilenameFilter(){

 

public boolean accept(File dir, String name) {

return name.endsWith(".html");

}

        });

        System.out.println(indexfileList);

        if(indexfileList.length<=0){  

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

            // 生成html文件

            ProcessClient.processBody(out,"body.ftl");  

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

        }else{  

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

        }  

 

 

}

}

Login.java(该类用于测试环境,与静态化无关)

package com.cys.jsptohtml.servlet;

 

import java.io.IOException;

 

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

public class Login extends HttpServlet{

    private static final long serialVersionUID = 7474850489594438527L;  

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        doPost(request, response);

    }

 

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        request.setCharacterEncoding("UTF-8");  

        response.setContentType("text/html;charset=utf-8");

        

        String action = request.getParameter("action");  

        if("login_input".equals(action)) {  

            request.getRequestDispatcher("login.jsp").forward(request , response);  

        } else if("login".equals(action)) {  

            String name = request.getParameter("name");  

            String password = request.getParameter("password");  

              

            System.out.println("name->" + name + ",password->" + password);

        }

    }

 

}

Jsp页面:

Index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

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

<title>Insert title here</title>

</head>

<body>

    <p>用Maven创建web项目,测试Servlet</p>

    <a href="demo?action=login_input">登录(demo?action=login_input)</a>

    <a href="index?action=login_input">静态化</a>

</body>

</html>

Login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

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

<title>Insert title here</title>

</head>

<body>

    <form action="demo?action=login" method="post">  

        Name:<input type="text" name="name" />  

        Password:<input type="password" name="password" />  

              

        <input type="submit" value="登录" />  

    </form>  

</body>

</html>

Web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:javaee="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

  <javaee:display-name>Archetype Created Web Application</javaee:display-name>

  <servlet>

    <javaee:description></javaee:description>

    <javaee:display-name>ServletDemo</javaee:display-name>

    <servlet-name>ServletDemo</servlet-name>

    <servlet-class>com.cys.jsptohtml.servlet.Login</servlet-class>

  </servlet>

  <servlet-mapping>

    <servlet-name>ServletDemo</servlet-name>

    <url-pattern>/demo</url-pattern>

  </servlet-mapping>

  

  <servlet>  

   <servlet-name>Index</servlet-name>  

   <servlet-class>com.cys.jsptohtml.servlet.JspToHtmlServlet</servlet-class>  

   <load-on-startup>3</load-on-startup>

 </servlet>  

  

 <servlet-mapping>  

   <servlet-name>Index</servlet-name>  

   <url-pattern>/index</url-pattern>  

 </servlet-mapping> 

 

  <servlet>  

   <servlet-name>DelUser</servlet-name>  

   <servlet-class>com.cys.jsptohtml.servlet.DelUser</servlet-class>  

   <load-on-startup>3</load-on-startup>

 </servlet>  

  

 <servlet-mapping>  

   <servlet-name>DelUser</servlet-name>  

   <url-pattern>/DelUser.do</url-pattern>  

 </servlet-mapping> 

</web-app>

Util类:

FreeMarkertUtil .java

package com.cys.jsptohtml.util;

import java.io.IOException;

import java.io.Writer;

import java.util.Map;

 

import freemarker.template.Configuration;

import freemarker.template.Template;

import freemarker.template.TemplateException;

 

public class FreeMarkertUtil {

 

public Template getTemplate(String name) {

        try {

            // 通过Freemaker的Configuration读取相应的ftl

            Configuration cfg = new Configuration();

            // 设定去哪里读取相应的ftl模板文件

            cfg.setClassForTemplateLoading(this.getClass(), "ftl");

            // 在模板文件目录中找到名称为name的文件

            Template temp = cfg.getTemplate(name);

            System.out.println(temp.getName());

            return temp;

        } catch (IOException e) {

            e.printStackTrace();

        }

        return null;

    }

    /** 

     * @param templateName 模板名字 

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

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

     */  

    public  void processTemplate(Template template,Map<?,?> root, Writer out){  

        try{  

         System.out.println("processTemplate");

            template.process(root, out);   

            out.flush();     

        } catch (IOException e) {  

            e.printStackTrace();  

        } catch (TemplateException e) {  

            e.printStackTrace();  

        }finally{  

             try {  

                out.close();  

                out=null;  

            } catch (IOException e) {  

                e.printStackTrace();  

            }  

        }  

    }  

}

在该类中加载模板的方式有多种:

void setDirectoryForTemplateLoading(File dir);// 根据全路径加载
void setClassForTemplateLoading(Class cl, String prefix);//根据类的路径加载,prefix为模板前缀

void setServletContextForTemplateLoading(Object servletContext, String path); //根据web上下文

从多地址加载模板

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

...  

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

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

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

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

MultiTemplateLoader mtl = new MultiTemplateLoader(loaders);  

cfg.setTemplateLoader(mtl);  

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

 

ProcessClient .java

 

package com.cys.jsptohtml.util;

 

import java.io.Writer;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

 

import com.cys.jsptohtml.schema.Footer;

import com.cys.jsptohtml.schema.Header;

import com.cys.jsptohtml.schema.User;

import com.cys.jsptohtml.service.FooterService;

import com.cys.jsptohtml.service.HeaderService;

import com.cys.jsptohtml.service.UserService;

 

import freemarker.template.Template;

  

 

  

/** 

 * @author cys  

 **/  

public class ProcessClient {  

 

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

  

    /** 

     * 调用FreeMarkertUtil.java 

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

     * 来生成html文件 

     * @param out 

     */  

    public static void processBody(Writer out,String filename){  

        Header h = HeaderService.getHeader();  

        root.put("h", h);  

        Footer f = FooterService.gerFooter();  

        root.put("f", f);  

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

        root.put("users", users);

        FreeMarkertUtil freeMarkertUtil = new FreeMarkertUtil();

        Template template = freeMarkertUtil.getTemplate(filename);

        freeMarkertUtil.processTemplate(template, root, out);

    }  

}

 

Pom.xml(对应的jar包,以及插件):

 

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

  <modelVersion>4.0.0</modelVersion>

  <groupId>com.cys</groupId>

  <artifactId>JspToHtml</artifactId>

  <packaging>war</packaging>

  <version>0.0.1-SNAPSHOT</version>

  <name>JspToHtml Maven Webapp</name>

  <url>http://maven.apache.org</url>

  <dependencies>

    <dependency>

      <groupId>junit</groupId>

      <artifactId>junit</artifactId>

      <version>3.8.1</version>

      <scope>test</scope>

    </dependency>

   <dependency>    

     <groupId>javax.servlet</groupId>    

     <artifactId>servlet-api</artifactId>    

     <version>2.5</version>    

     <scope>provided</scope>    

    </dependency>

    <dependency>

    <groupId>javax.servlet.jsp</groupId>

    <artifactId>jsp-api</artifactId>

    <version>2.1</version>

    <scope>provided</scope>

</dependency>

<dependency>

  <groupId>org.freemarker</groupId>

  <artifactId>freemarker</artifactId>

  <version>2.3.23</version>

</dependency>

  </dependencies>

   <build>

    <finalName>codingdream</finalName>

    <plugins>

      <plugin>

<groupId>org.codehaus.mojo</groupId>

<artifactId>tomcat-maven-plugin</artifactId>

<version>1.1</version>

<configuration>

    <path></path>

    <port>8082</port>

    <uriEncoding>UTF-8</uriEncoding>

    <url>http://localhost:8087/codingdream</url>

    <server>tomcat6</server>

</configuration>

</plugin>

    </plugins>

  </build>

</project>

复制代码

 

四、运行结果

 

 

 maven相关问题请参考:http://www.cnblogs.com/caoyusongnet/p/5150882.html

参考:http://freemarker.incubator.apache.org/

  http://blog.csdn.net/ajun_studio/article/details/6932185/

   

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Freemarker 实现JSP页面的静态化 的相关文章

  • Session的生命周期

    以前在学习的时候没怎么注意 今天又回过头来仔细研究研究了一下Session的生命周期 Session存储在服务器端 一般为了防止在服务器的内存中 为了高速存取 Sessinon在用户访问第一次访问服务器时创建 需要注意只有访问JSP Ser
  • Spring mvc整合freemarker详解

    1 什么是FreeMarker FreeMarker是一个模板引擎 一个基于模板生成文本输出的通用工具 使用纯Java编写 FreeMarker被设计用来生成HTML Web页面 特别是基于MVC模式的应用程序 虽然FreeMarker具有
  • Java开发的模板引擎--freemarker

    模板引擎 freemarker 一 基础知识 1 1 模版引擎 1 2 关于freemarker 1 3 常用的java模版引擎 1 4 快速入门 1 4 1 指定了SpringBoot的版本 1 4 2 指定了pom xml文件依赖 1
  • 【SSH网上商城项目实战20】在线支付平台的介绍

    之前已经完成了首页的显示 用户添加购物车 确认订单等功能 下面就是支付功能的开发了 用户确认了订单后会直接跳转到支付页面进行在线支付 在线支付需要第三方的接口 这一节主要介绍一些关于第三方支付的内容 从下一节开始 我们真正开发在线支付模块
  • 以表单形式使用时,accept-charset="UTF-8" 参数不会执行任何操作

    我在表单中使用accept charset utf 8 属性 发现当使用非ascii进行表单发布时 标头在请求标头中具有不同的接受字符集选项 我有什么遗漏的吗 我的表格看起来像这样
  • Freemarker/Velocity - 日期操作

    我对这两个模板引擎有一个相当简单的问题 我正在尝试确定一个未来 过去的日期 从现在开始的固定时间 例如18个月前 或者明天 我知道可以使用velocity freemarker模板中的java日期对象来做到这一点 类似于 date add
  • freemarker 中的数字格式问题 - 在小数后进行舍入

    我正在使用 Freemarker 模板 我有一个十进制值 a 23 65 我只想检索以上值 a 23 6 lt Extract first number after decimal point gt 我使用过 number format e
  • 在 Freemarker 模板中显示 Spring MVC 验证错误

    如果控制器返回绑定错误 我试图在我的 freemarker 模板中显示全局验证错误列表 我可以显示与字段关联的错误 但我想检测特定 bean 中何时发生错误并在页面顶部显示一条消息 我尝试使用下面的示例 但它不产生任何输出 lt sprin
  • 禁用 freemarker 日志

    我正在使用 Struts 2 0 11 2 但我不知道我的应用程序最近发生了什么变化 我收到了大量的 freemarker 日志 DEBUG 13201 freemark template simple hidden ftl en UTF
  • 从日历中删除选定的事件

    我正在使用 JQuery Full Calendar 和 Spring MVC 你好 我做了一个演示 比如that 目标 我需要当用户单击她 他已经插入的事件时 出现一个对话框 并让他 她能够删除该事件或取消 问题 现在 每当用户单击任何一
  • GAE 上的 Struts 2:无法在拦截器内设置会话值

    我正在编写一个 Struts 2 拦截器 在其中检查用户是否有效 如果无效 用户将被重定向到登录页面 但在此之前 我尝试检索用户访问此处的 URL 并将其放入会话变量中 以便在登录完成后我可以将他重定向回那里 但是当我尝试在会话中放入一个值
  • spring security 3.2.0 csrf 令牌在 freemarker 模板中不起作用

    升级到 Spring Security 3 2 0 并配置 xml 后 csrf 令牌不起作用 基本原理 春季4 0 1 春季安全3 2 0 Freemarker 模板语言 步骤1 spring security xml配置
  • 有没有办法做 gsp 部分而不是标签库?

    我喜欢 freemarker 的一件事是 你可以快速创建封装复杂 html 的新宏 使页面更小 更简洁 我是否必须创建标签库才能在 grails 中执行相同的操作 或者是否有一个真正的轻量级语法来实现相同的操作 有一个
  • 在 Netsuite 中,如何在项目履行生成的电子邮件中包含跟踪号码列表?

    我需要从 Netsuite 中的项目履行记录发送自定义 订单已发货 电子邮件 我正在使用 freemarker 制作电子邮件模板 我想在电子邮件中包含与商品配送相关的包裹的追踪号码 我尝试过使用 lt list transaction pa
  • 在Android studio中哪里可以找到自定义模板路径

    在 Android studio 中 我尝试按照以下步骤创建新的 Java 模板 Android Studio gt File gt Edit File Template gt Added New file with java extens
  • 如何将日期时间显示为当地时间,末尾不带时区?

    编辑 由于一些看似混乱的情况 让我澄清一下 如果可能的话 我希望解决方案在 freemarker 中完成 而不是在 java 中完成 我有一个日期时间字符串 如下所示 2019 03 12T16 02 00 02 00我必须以特定的格式来显
  • StringTemplate 和 FreeMarker 之间的主要区别是什么?

    网上似乎充满了 Velocity 和 FreeMarker 之间的比较 而且它们似乎相当等效 但StringTemplate和FreeMarker之间似乎几乎没有可比性 那么 StringTemplate 和 FreeMarker 之间的主
  • Freemarker:从模板文件 (*.ftl) 调用静态 util 方法

    在 Freemarker FTL 文件中 我想调用StringUtils capatilize myString 例如 p You selected selectionString p p StringUtils capatilize se
  • java.lang.NoClassDefFoundError:freemarker/template/TemplateModelException

    尝试打造先进HTML报告使用extentReportsjar 但它抛出以下错误 java lang NoClassDefFoundError freemarker 模板 TemplateModelException Code public
  • 对象集合表单的 Freemarker 语法 (Spring 3 MVC)

    我有一个命令 bean FooList 它有一个属性 它是一个集合 aList of Foo beans 我正在尝试创建一个可以编辑所有内容的表单Foo立刻 我发现了许多如何使用 JSP 执行此操作的示例 但我在将这些示例转换为 Freem

随机推荐

  • 【LInux】基础开发工具的使用

    文章目录 一 Linux的应用市场 yum 1 什么是yum 2 为什么要有yum 3 如何使用yum 3 1 前提条件 3 2 搜索软件 3 3 安装软件 3 4 卸载软件 二 Linux的文本编辑器 vim 1 什么是vim 2 为什么
  • Java中的线程

    一 程序 进程 线程之间的关系 程序 进程和线程是计算机中重要的概念 它们描述了不同层次上的执行和管理方式 程序是指由一系列指令组成的代码文件 它定义了算法和逻辑 用来解决特定的问题 程序本身是静态的 只有在被加载到内存并被操作系统调度执行
  • SSM框架(Spring+SpringMVC+MyBatis)

    SSM Spring SpringMVC MyBatis 框架集由Spring SpringMVC MyBatis三个开源框架整合而成 常作为数据源较简单的web项目的框架 Spring是一个开源框架 Spring是于2003 年兴起的一个
  • 思科CISCO常用命令汇总

    视图模式介绍 1 普通视图router gt 2 特权视图router 在普通模式下输入enable 3 全局视图router config 在特权模式下输入configt 4 接口视图router config if 在全局模式下输入in
  • ASN.1的一些理解

    为什么要有ASN 1这个东西 我们知道 像C Java这种高级语言 对于计算机来说都要转化为二进制代码才能识别和操作 这就涉及到序列化和反序列化这两个概念 将一个对象序列化成二进制代码 就可以保存成文本或者利用网络传输到远程 与序列化相对的
  • 2021-02-23(亚马逊服务存储桶)

    亚马逊云服务器测试情况 需要外网 国际 才能登录 网址 https 956438185477 signin aws amazon com console 国际短信的话 在右上角区域区域选择弗吉尼亚北部 左边选择sms短信服务 视频加速要用到
  • 13.openssl编程——ASN1库

    13 1 ASN1 简介 ANS 1 Abstract Syntax Notation One X 208 是一套灵活的标记语言 他允许定义多种数据类型 从integer bit string 一类的简单类型到结构化类型 如set和sequ
  • LeetCode-链表中倒数第k个节点

    单链表只能从前往后遍历 所以 我们可以先计算出链表长度 倒数第k个节点相当于正数第n k 1个节点 然后我们再从头往后找 找到第n k 1个节点就可以了 while循环版 Definition for singly linked list
  • Semaphore 源码分析

    需要提前了解的知识点 AbstractQueuedSynchronizer 实现原理 类介绍 Semaphore 信号量 是用来控制同时访问特定资源的线程数量 它通过协调各个线程 以保证合理的使用公共资源 比如控制用户的访问量 同一时刻只允
  • cesium+vue-cli安装步骤

    1 依赖node所以先安装node 可从官网下载安装 安装一直下一步最后选安装目录 2 win r输入cmd运行 先输入node v和npm v查看node安装是否正常 我这里node是10 5 0 npm是6 1 0 3 安装vue np
  • Log4net等级说明以及按照不同级别写入多个日志文件

    等级说明 Level级别 DEBUG
  • canvas制作在线画板

    上效果图
  • ubuntu中使用Deb安装VS Code

    01 进入VS Code 下载安装包 网址 https code visualstudio com 02 将Windows系统中下载的deb安装包复制到虚拟机ubuntu中 03 进入虚拟机ubuntu中 通过cd命令进入到deb安装包目录
  • 点云配准注意的地方

    1 法向量是局部坐标系的概念 因此要将点云中心移到原点 再计算法向量 类似于先平移再旋转 而不是先旋转再平移 2 用kdtree时 用近邻点个数 而不是距离 因为点云各个不同 3 变换矩阵的对角线是目标与源点云的相似度 位移为0 x det
  • Unity小地图制作

    Unity小地图制作 方法一 简易版 如果角色有跳跃功能不建议使用 原理 利用一个新的摄像机来制作小地图 步骤 1 先搭建一个简单场景 2 在层级列表先创建一个摄像机 移出其中的Audio Listener组件 一个场景中只能有一个Audi
  • 题目 1054: 二级C语言-计算素数和

    输入两个正整数m和n m
  • 锁消除和锁粗化

    一 锁消除 JIT 及时编译器 对锁的优化 因为正常都是多个线程去竞争同一把锁 但是当前代码中每调用一次m1方法就会创建一个新的对象 也可以理解为每个线程对应了一把新的锁 没有竞争的情况 毫无意义 所以叫锁消除 锁消除 public cla
  • C语言实现数据高低位翻转

    通过指针转换为字节类型 直接交换 include
  • 73. Set Matrix Zeroes

    Given a m x n matrix if an element is 0 set its entire row and column to 0 Do it in place 这题有很多方法 一开始想的是用O m n 的空间 用vect
  • 使用Freemarker 实现JSP页面的静态化

    使用Freemarker 静态化网页 一 原理 Freemarker 生成静态页面 首先需要使用自己定义的模板页面 这个模板页面可以是最最普通的html 也可以是嵌套freemarker中的 取值表达式 标签或者自定义标签等等 然后后台读取