package cn.ubibi.jettyboot.demotest.controller.render;

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; 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; public class PageRender implements ResponseRender { private static TemplateEngine templateEngine = null; static {
init();
} public static void init() {
if (templateEngine == null) {
templateEngine = new TemplateEngine();
templateEngine.setTemplateResolver(getTemplateResolver());
}
} private static ITemplateResolver getTemplateResolver() {
if (SystemUtils.isMavenDevMode()) {
return getFileTemplateResolver();
}
return getClassLoaderTemplateResolver();
} private static FileTemplateResolver getFileTemplateResolver() { URL classLoaderResource = PageRender.class.getClassLoader().getResource("");
String classPath = StringUtils.appendIfNotEnd(classLoaderResource.getPath(), File.separator);
String srcResPath = classPath + ("../../src/main/resources".replace("/", File.separator)); FileTemplateResolver templateResolver = new FileTemplateResolver(); templateResolver.setSuffix(".html");
templateResolver.setPrefix(srcResPath + "/templates/");
templateResolver.setCacheTTLMs(3600000L);
templateResolver.setCacheable(false);
return templateResolver;
} private static ClassLoaderTemplateResolver getClassLoaderTemplateResolver() { ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver(PageRender.class.getClassLoader()); templateResolver.setSuffix(".html");
templateResolver.setPrefix("/templates/");
templateResolver.setCacheTTLMs(3600000L);
templateResolver.setCacheable(true); return templateResolver;
} private static Map<String, Object> objectToMap(Object obj) {
if (obj == null) {
return null;
} if (obj instanceof Map) {
return (Map<String, Object>) obj;
} Map<String, Object> map = new HashMap<String, Object>(); 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();
}
} return map;
} private String template;
private Object pageData; public PageRender(String template, Object pageData) {
this.pageData = pageData;
this.template = template;
} @Override
public void doRender(HttpServletRequest request, HttpServletResponse response) throws IOException { ServletContext servletContext = request.getServletContext();
WebContext ctx = new WebContext(request, response, servletContext, request.getLocale()); Map<String, Object> variables = objectToMap(this.pageData);
ctx.setVariables(variables); response.setCharacterEncoding("utf-8");
templateEngine.process(this.template, ctx, response.getWriter());
} }

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. Configure the Stanford segmenter for NLTK

    >>> from nltk.tokenize.stanford_segmenter import StanfordSegmenter >>> segmenter = ...

  2. The C compiler identification is unknown解决办法

    环境:VS2015,CMake3.12.0. 问题一: 解决办法:下载并安装Windows SDK version 8.1. 问题二: 解决办法:这个问题百度了半天也没找到合适的办法,好多博客都是复制 ...

  3. Centos 7 搭建FTP详细配置步骤方法

    vsftpd的安裝使用: ftp概述:FTP(File Transfer protocol,文件传输协议)是经典的C/S架构的应用层协议,需要有服务端软件,客户端软件两个部共同组成实现文件传输功能. ...

  4. 牛客练习赛23CD

    链接:https://www.nowcoder.com/acm/contest/156/C 来源:牛客网 题目描述 托米完成了1317的上一个任务,十分高兴,可是考验还没有结束 说话间1317给了托米 ...

  5. python中字符串格式化

    username='小黑'age=18high=1.88s2='欢迎%s,年龄是%d,身高是%.2f'%(username,age,high)#%s是通用的,%d就必须传整数,%f就必须是小数,想保留 ...

  6. ios 审核未通过 相机相册权限问题

    苹果提交审核被打回来  附加的说明如下: We noticed that your app requests the user’s consent to access their camera but ...

  7. python爬虫出现的状态码

    1.200 --- 一切正常访问 2.301 --- 重定向新的url,永久性的 3.302 --- 重定向到临时url 4.304 --- 请求的资源未更新 5.400 --- 非法请求 6.401 ...

  8. C# 开发Modbus Rtu客户端 modbus测试Demo,Modbus 串口通信 , 虚拟MODBUS-RTU测试

    前言 本文将使用一个NuGet公开的组件技术来实现一个ModBus RTU的客户端,方便的对Modbus rtu的服务器进行读写,这个服务器可以是电脑端C#设计的,也可以是PLC实现的,也可以是其他任 ...

  9. 关于surface gradient

    [转载请注明出处]http://www.cnblogs.com/mashiqi 2017/06/16 函数定义及前后文详见<Inverse Acoustic and Electromagneti ...

  10. 2java判断素数

    package com.test; import java.math.*;import java.util.Scanner; public class test222 { /** * @param a ...