专栏首页面朝大海春暖花开SringBoot整合velocity及常用语法

SringBoot整合velocity及常用语法

项目地址:https://github.com/chywx/springboot-velocity

背景

由于公司业务面向的是非洲市场 那边有些国家智能机并未普及,像乌干达地区还是以功能机为主 为了支持功能机,需要新创一个wap网站用于支持功能机(天哪!)

技术选型

由于功能机试不支持js的,前端使用vue不现实,只能通过模板的形式 可以使用jsp,freemarker,Thymeleaf等引擎,但最终选型velocity模板(老大用过罢了) 后端使用springboot

项目简单架构

springboot整合velocity

版本选择

选择spring-boot-starter-velocity,高版本的springboot不支持,只能选用低版本的1.4.7

pom.xml添加依赖

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-velocity</artifactId>
    </dependency>

application.properties添加配置

server.port=2828
spring.velocity.cache=false
spring.velocity.charset=UTF-8
spring.velocity.check-template-location=true
spring.velocity.content-type=text/html
spring.velocity.enabled=true
spring.velocity.prefix=/templates/
spring.velocity.suffix=.vm

controller器层添加demo测试

@Controller
@RequestMapping("/velocity")
public class TestController {

    // demo测试
    @RequestMapping("/demo")
    public String demo1(Map map) {
        map.put("message", "这是测试的内容。。。");
        map.put("time", System.currentTimeMillis());
        return "index";
    }
}

templates文件夹下新家index.vm

<html>
<body>
    $!{message}
    $!{time}
</body>
</html>

访问index页面

http://localhost:2828/velocity/demo ok,最简单的springboot整合velocity完毕

日期时间处理

如何将时间戳自定义时间格式呢

1. 添加toolbox.xml

内容如下

<?xml version="1.0" encoding="UTF-8"?>
<toolbox>
  <tool>
    <key>DateTool</key>
    <scope>application</scope>
    <class>org.apache.velocity.tools.generic.DateTool</class>
  </tool>
</toolbox>

当然,如果需要处理数字啥的,也可以引入一个tool即可

2. 指定toolbox.xml的位置

application.properties添加spring.velocity.toolbox-config-location=/toolbox.xml

3. 在vm页面中使用

<h1>日期处理</h1>
处理前:$time
<br>
处理后:$!DateTool.format($!time)

统一异常页面处理

新建VelocityExceptionHander

@ControllerAdvice
public class VelocityExceptionHander {

    @ExceptionHandler(value = Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public String exceptionHandler(Exception e, HttpServletRequest request) {
        System.out.println("未知异常!原因是:" + e);
        request.setAttribute("msg", e);
        return "500";
    }
}

新建500.vm模板页面

<html>
<body>
error
<br>
    $!msg
</body>
</html>

之后如果出现异常,会跳转到500页面。

最后总结下常用的基础语法标签

    // velocity常用语法汇总
    @RequestMapping("/allDemo")
    public String demo3(Map map) {
        map.put("amount", 100);
        map.put("msg", "dahai");
        map.put("sex", "man");
        putString(map);
        putSportList(map);
        map.put("time", System.currentTimeMillis());
        return "allDemo";
    }

    private void putSportList(Map map) {
        List<Sport> sportList = new ArrayList<Sport>() {{
            add(new Sport(1, "Football"));
            add(new Sport(2, "Basketball"));
            add(new Sport(3, "tennis"));
            add(new Sport(4, "rugby"));
            add(new Sport(5, "cricket"));
        }};
        map.put("sportList", sportList);
        Map<Integer, Sport> sportMap = sportList.stream().collect(Collectors.toMap(Sport::getId, s -> s));
        map.put("sportMap", sportMap);
    }

    private void putString(Map map) {
        List<String> strings = new ArrayList<>();
        strings.add("a");
        strings.add("b");
        strings.add("c");
        map.put("strings", strings);
    }

vm模板页面

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title>velocity test</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>

<h1>字符串类型</h1>
    $!msg

<h1>if标签</h1>
    #if($!sex == 'man')
    男
    #else
    女
    #end

<h1>set操作(定义变量)</h1>
    #set($hw = 'ok')
    $hw

<h1>普通for循环</h1>
    #foreach($!s in $!strings)
        $s &nbsp;
    #end

<h1>对象for循环</h1>
    #foreach($!sport in $!sportList)
        $!sport.name &nbsp;
    #end

<h1>map for循环</h1>
    #foreach($!sp in $!sportMap.keySet())
        $sp &nbsp; $!sportMap.get($sp).name &nbsp;<br>
    #end

<h1>日期处理</h1>

处理前:$time
<br>
处理后:$!DateTool.format($!time)

<h1>计算加减乘除</h1>

    #set($jia = $amount + 10)
+10= $jia   <br>
    #set($jian = $amount - 10)
-10= $jian  <br>
    #set($cheng = $amount * 10)
×10= $cheng <br>
    #set($chu = $amount / 10)
÷10= $chu   <br>


</body>
</html>

ok,完毕!重新温馨下熟悉而又陌生的前后端不分离(服务端渲染)的工程,؏؏☝ᖗ乛◡乛ᖘ☝؏؏

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • rsync实现服务器之间同步目录文件

    需求:将192.168.1.10的/opt/vue/index.html文件 和 /opt/vue/static目录同步到远程192.168.1.130的/op...

    陈灬大灬海
  • java浅拷贝和深拷贝(基础也是很重要的)

    对于的github基础代码https://github.com/chywx/JavaSE

    陈灬大灬海
  • springMVC整合freemarker遇到的问题 maven

    <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</art...

    陈灬大灬海
  • python 多维数组的排序

    这几天写php程序,发现php里有一个array_multisort()函数十分好用,可以轻松对多维数组进行排序,查了查python的相关资料,视乎没有一个比较...

    py3study
  • iOS - Swift UISearchController的取消按钮

    LinXunFeng
  • 诈骗者在网上偷你钱的10种方式

    从互联网诞生开始,网络犯罪一直是骗子利润丰厚的生意。尽管我们在安全性方面取得了进步,例如生物识别技术,以及如区块链之类的更有希望的安全技术成为趋势,但是道高一尺...

    用户1196457
  • HTTP/2 最新漏洞,直指 Kubernetes!

    近日,Netflix、Google 及 CERT/CC 披露了 HTTP/2 相关的 8 个安全漏洞,就连用来打造 Kubernetes 的 Go 语言也受到其...

    Java技术栈
  • 【智驾深谈】无人驾驶不出三年就会上路的 5 大原因

    【新智元导读】汽车投资公司 Andreessen Horowitz 合伙人 Chris Dixon 展望未来无人驾驶市场前景,他认为不出两年无人驾驶汽车就会上路...

    新智元
  • 设计模式--策略模式的思考

    策略模式是一种简单的设计模式,但是其在业务开发中是一种非常有用的设计模式.举个例子,当你的业务需要针对不同的场景(可以简单理解为枚举类),执行不同的策略时那么使...

    屈定
  • 高质量编码-轨迹管理平台(表设计)

    设计了4个表,User,Fleed,Locator,Coordinate分别表示用户,轨迹服务,设备管理,历史轨迹。

    MiaoGIS

扫码关注云+社区

领取腾讯云代金券