1. package cn.ubibi.jettyboot.demotest.controller.render;
  2.  
  3. import cn.ubibi.jettyboot.framework.commons.StringUtils;
    import cn.ubibi.jettyboot.framework.commons.SystemUtils;
    import cn.ubibi.jettyboot.framework.rest.ifs.ResponseRender;
    import org.thymeleaf.TemplateEngine;
    import org.thymeleaf.context.WebContext;
    import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;
    import org.thymeleaf.templateresolver.FileTemplateResolver;
    import org.thymeleaf.templateresolver.ITemplateResolver;
  4.  
  5. import javax.servlet.ServletContext;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.File;
    import java.io.IOException;
    import java.lang.management.ManagementFactory;
    import java.lang.reflect.Field;
    import java.net.URL;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
  6.  
  7. public class PageRender implements ResponseRender {
  8.  
  9. private static TemplateEngine templateEngine = null;
  10.  
  11. static {
    init();
    }
  12.  
  13. public static void init() {
    if (templateEngine == null) {
    templateEngine = new TemplateEngine();
    templateEngine.setTemplateResolver(getTemplateResolver());
    }
    }
  14.  
  15. private static ITemplateResolver getTemplateResolver() {
    if (SystemUtils.isMavenDevMode()) {
    return getFileTemplateResolver();
    }
    return getClassLoaderTemplateResolver();
    }
  16.  
  17. private static FileTemplateResolver getFileTemplateResolver() {
  18.  
  19. URL classLoaderResource = PageRender.class.getClassLoader().getResource("");
    String classPath = StringUtils.appendIfNotEnd(classLoaderResource.getPath(), File.separator);
    String srcResPath = classPath + ("../../src/main/resources".replace("/", File.separator));
  20.  
  21. FileTemplateResolver templateResolver = new FileTemplateResolver();
  22.  
  23. templateResolver.setSuffix(".html");
    templateResolver.setPrefix(srcResPath + "/templates/");
    templateResolver.setCacheTTLMs(3600000L);
    templateResolver.setCacheable(false);
    return templateResolver;
    }
  24.  
  25. private static ClassLoaderTemplateResolver getClassLoaderTemplateResolver() {
  26.  
  27. ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver(PageRender.class.getClassLoader());
  28.  
  29. templateResolver.setSuffix(".html");
    templateResolver.setPrefix("/templates/");
    templateResolver.setCacheTTLMs(3600000L);
    templateResolver.setCacheable(true);
  30.  
  31. return templateResolver;
    }
  32.  
  33. private static Map<String, Object> objectToMap(Object obj) {
    if (obj == null) {
    return null;
    }
  34.  
  35. if (obj instanceof Map) {
    return (Map<String, Object>) obj;
    }
  36.  
  37. Map<String, Object> map = new HashMap<String, Object>();
  38.  
  39. Field[] declaredFields = obj.getClass().getDeclaredFields();
    for (Field field : declaredFields) {
    field.setAccessible(true);
    try {
    map.put(field.getName(), field.get(obj));
    } catch (IllegalAccessException e) {
    e.printStackTrace();
    }
    }
  40.  
  41. return map;
    }
  42.  
  43. private String template;
    private Object pageData;
  44.  
  45. public PageRender(String template, Object pageData) {
    this.pageData = pageData;
    this.template = template;
    }
  46.  
  47. @Override
    public void doRender(HttpServletRequest request, HttpServletResponse response) throws IOException {
  48.  
  49. ServletContext servletContext = request.getServletContext();
    WebContext ctx = new WebContext(request, response, servletContext, request.getLocale());
  50.  
  51. Map<String, Object> variables = objectToMap(this.pageData);
    ctx.setVariables(variables);
  52.  
  53. response.setCharacterEncoding("utf-8");
    templateEngine.process(this.template, ctx, response.getWriter());
    }
  54.  
  55. }

public class PageRender implements ResponseRender的更多相关文章

  1. Android对象类系列化public class User implements Parcelable

    package com.gaojinhua.android.activitymsg; import android.os.Parcel; import android.os.Parcelable; / ...

  2. (1)编写一个接口ShapePara,要求: 接口中的方法: int getArea():获得图形的面积。int getCircumference():获得图形的周长 (2)编写一个圆类Circle,要求:圆类Circle实现接口ShapePara。 该类包含有成员变量: radius:public 修饰的double类型radius,表示圆的半径。 x:private修饰的double型变量x,

    package com.hanqi.test; //创建接口 public interface ShapePara { //获取面积的方法 double getArea(); //获取周长的方法 do ...

  3. JAVA中extends 与implements区别

    JAVA中extends 与implements有啥区别?1. 在类的声明中,通过关键字extends来创建一个类的子类.一个类通过关键字implements声明自己使用一个或者多个接口.extend ...

  4. (1)定义一个接口CanFly,描述会飞的方法public void fly(); (2)分别定义类飞机和鸟,实现CanFly接口。 (3)定义一个测试类,测试飞机和鸟,在main方法中创建飞机对象和鸟对象, 再定义一个makeFly()方法,其中让会飞的事物飞。并在main方法中调用该方法, 让飞机和鸟起飞。

    package b; public interface CanFly { public void fly(); } package b; public class FeiJi implements C ...

  5. (1)定义一个接口Compute含有一个方法int computer(int n,int m); (2)设计四个类分别实现此接口,完成+-*/运算 (3)设计一个类UseCompute,含有方法: public void useCom(Compute com, int one, int two) (4)设计一个测试类

    package b; public interface Computer { int computer(int n,int m); } package b; public class Jia impl ...

  6. 利用接口做参数,写个计算器,能完成+-*/运算 (1)定义一个接口Compute含有一个方法int computer(int n,int m); (2)设计四个类分别实现此接口,完成+-*/运算 (3)设计一个类UseCompute,含有方法: public void useCom(Compute com, int one, int two) 此方法要求能够:1.用传递过来的对象调用compute

    package com.homework5; public interface Compute { //声明抽象方法 int computer(int n,int m); } package com. ...

  7. 1.(1)编写一个接口ShapePara,要求: 接口中的方法: double getArea():获得图形的面积。double getCircumference():获得图形的周长 (2)编写一个圆类Circle,要求:圆类Circle实现接口ShapePara。 该类包含有成员变量: radius:public 修饰的double类型radius,表示圆的半径。 x:private修饰的dou

    package jiekou1; public interface ShapePara { //定义常量PI final double PI=3.14; //定义抽象方法 //获得图形面积 doubl ...

  8. class ResultServletContextListener implements ServletContextListener

    package com.management.spring; import java.io.BufferedReader; import java.io.IOException; import jav ...

  9. 抽象(abstract)升级版变接口(interface) 继承(extends)升级版叫实现(implements) 升级版啊升级版 接口可以多继承

    Client --------------------------------------------------- public class Client{ public static void m ...

随机推荐

  1. c函数创建文件和路径

    bool NewFileName(const char* filename) { size_t len; < (len = strlen(filename))) { char* tmpbuf, ...

  2. Spring Boot + Spring Cloud 实现权限管理系统(解决跨域问题)

    什么是跨域? 同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源. 同源策略是浏览器安全的基石. 如果一个请求地址里面的协议.域名和端口号都相同,就属于同源. ...

  3. 为DBNavigator的按钮加中文

    转自:http://hi.baidu.com/debiansir/item/0699f5b6bb4d99f063388e71 /*Delphi中数据库控件DBNavigator使用起来不错,但是按钮上 ...

  4. R语言安装xlsx包,读入excel表格

    开学的时候,男神给了数据(.xlsx格式)让用R语言分析分析,作为编程小白,读了一天都没读近R,更别提如何分析了. 现在小伙伴们都喜欢读txt 和csv格式的,好多xlsx的表格读不进R,将xlsx格 ...

  5. js 异常判断

    /** * 预处理response * @param rep */ function validateRep(rep) { try{ if(rep.status==false){ layer.open ...

  6. 5.Fiddler模拟弱网限速方法

    原理:Fiddler的模拟限速是在客户端请求前来自定义限速的逻辑,此逻辑是通过延迟发送数据或接收的数据的时间来限制网络的下载速度和上传速度,从而达到限速的效果. 算法:那么我们的算法就是 1000/下 ...

  7. C# 流水号生成器开发

    前言 本文将使用一个Nuget公开的组件技术来实现一个流水号生成器,提供了一些简单的API,来方便的实现一个通用的流水号. 在visual studio 中的NuGet管理器中可以下载安装,也可以直接 ...

  8. 第k大元素

    在数组中找到第k大的元素 样例 给出数组[9,3,2,4,8],第三大的元素是4 给出数组 [1,2,3,4,5],第一大的元素是5,第二大的元素是4,第三大的元素是3,以此类推 注意 你可以交换数组 ...

  9. 开源中国/码云 README.md上传图片的爬坑记录

    整理代码,将电脑中长期没有用过的代码放到码云上托管,给项目录制gif动画,在写项目README.md时使用,结果在上传图片时一直出问题,现记录下最后解决方法: 1. 最初直接将录制好的图片放入到img ...

  10. Angular4.0引入第三方框架,eg: bootstrap、jquery

    最近学习angular4.0,在练习是需要使用jquery和bootstrap.但是查阅了,大多数都是angular2的方法,或者是angular4.0的方法但是不准确.花了一些时间终于捣腾出来了,把 ...