springmvc整合freemarker以及前端的一些坑

2023-11-09

一、SpringMVC整合freemarker配置
     1、引入相关jar包:

  
  
[html] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <dependency>  
  2.     <groupId>org.freemarker</groupId>  
  3.     <artifactId>freemarker</artifactId>  
  4.     <version>2.3.19</version>  
  5. </dependency  
2、添加freemarker配置bean和视图解析器
[html]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. <bean id="freemarkerConfig"  class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">  
  2.     <propertynamepropertyname="templateLoaderPath" value="/WEB-INF/view/" />  
  3.     <propertynamepropertyname="defaultEncoding" value="utf-8" />  
  4.     <propertynamepropertyname="freemarkerSettings">  
  5.     <props>  
  6.         <prop key="template_update_delay">10</prop>  
  7.         <prop key="locale">zh_CN</prop>  
  8.         <prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>  
  9.         <prop key="date_format">yyyy-MM-dd</prop>  
  10.         <prop key="number_format">#.##</prop>  
  11.         <prop key="classic_compatible">true</prop>  
  12.         <prop key="template_exception_handler">com.xxx.web.exception.FreeMarkerExceptionHandler</prop>  
  13.     </props>  
  14.     </property>  
  15. </bean>  
  16.   
  17. <bean id="viewResolver"  class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">  
  18.     <propertynamepropertyname="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"></property>  
  19.     <propertynamepropertyname="suffix" value=".ftl" />  
  20.     <propertynamepropertyname="contentType" value="text/html;charset=utf-8" />  
  21.     <propertynamepropertyname="exposeRequestAttributes" value="true" />  
  22.     <propertynamepropertyname="exposeSessionAttributes" value="true" />  
  23.     <propertynamepropertyname="exposeSpringMacroHelpers" value="true" />  
  24.     <propertynamepropertyname="requestContextAttribute" value="request" />  
  25. </bean>  


二、使用freemarker踩的一些坑
     1、关于null值:freemarker对于null值得校验很严格,如果出现null值,而在页面中不进行判断,则会发生异常,通常情况下判断方式有两种:
    (1)在页面中使用${prop??}进行判断,或使用${prop?""},若为空则显示“”
    (2)可使用配置classic_compatible=true,此种方式只能判断一层,如user.prop为null,显示为空,若user为空,则仍会发生异常。目前的这种情况可使用第一种方式,或者手动创建一个空的对象,保证外层对象不为null即可。
    2、freemaker遍历List:
        <#list userlist as user></#list>
    3、freemarker遍历Map:
        <#list userMap?keys as userKey>
               key:${userKey}
                value:${userMap[userKey]}
        </#if>
    4、在freemarker页面中使用request对象:配置requestContextAttribute=request,即可使用request,如: 
<#assign webroot=request.getContextPath()>
 
    5、freemarker自定义拦截异常:
         新建类  
FreeMarkerExceptionHandler
   
   
[java] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class FreeMarkerExceptionHandlerimplements TemplateExceptionHandler {  
  2.     private static Logger logger = LoggerFactory.getLogger(FreeMarkerExceptionHandler.class);  
  3.     @Override  
  4.     public void handleTemplateException(TemplateException te, Environment env, Writer out) throws TemplateException {  
  5.         logger.warn("freemarker handleTemplateException",te);  
  6.         throw new ViewException("freemarker error",te);  
  7.     }  
  8. }  
配置:
template_exception_handler=xxxx.
FreeMarkerExceptionHandler
在web.xml中配置:

    
    
[html] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <error-page>  
  2.     <exception-type>com.xxx.web.exception.ViewException</exception-type>  
  3.     <location>/error</location>  
  4. </error-page>  
6、freemarker定义变量:<#assign name="xxx">,使用:${name}即可
7、freemarker引入其他页面:<#include "xx.ftl">
8、table的td内容自动换行:<td style="word-break:break-all"> 
9、p标签内容换行:<p style="word-wrap:break-word"></p>
10、实现格式化显示:定义时间显示格式:<#setting datetime_format="yyyy-MM-dd HH:mm:ss"/>
        使用:${serviceInfo.createTime?number_to_datetime}
11、在使用jquery的datatable时,如果页面中存在注释,一定要特别注意,不能直接使用<!-- -->这样的注释,要用<#--<!-- 修改中,审核驳回  可修改 &ndash;&gt;-->,否则注释内容无效,会被datable的搜索功能识别到。暂时还不清楚是谁的原因导致的。

三、bootstrap的一些组件使用说明
    1、datatable的使用:包括显示中文,搜索,排序,分页等:
[javascript]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. //初始化表格  
  2.   
  3. if (!jQuery().dataTable) {  
  4.     return;  
  5. }  
  6.   
  7. // 设置表格属性  
  8. $('#blacklistTable').dataTable({  
  9.     "aoColumns": [//是否需要排序,null:需要,要求和页面显示列数相同  
  10.        null,  
  11.        null,  
  12.        null,  
  13.        null,  
  14.        null,  
  15.        {  
  16.         "bSortable"false,//不参与排序  
  17.         "bSearchable"false,//不参与搜索  
  18.        }  
  19.   
  20.     ],  
  21.     "aLengthMenu": [  
  22.         [5, 15, 20, -1],  
  23.         [5, 15, 20, "所有"// 每页显示记录数,下拉菜单  
  24.     ],  
  25. // set the initial value  
  26.     "iDisplayLength": 5,//每页初始显示记录数  
  27.     "sDom""<'row-fluid'<'span6'l><'span6'f>r>t<'row-fluid'<'span6'i><'span6'p>>",  
  28.     "sPaginationType""bootstrap",  
  29.     "oLanguage": {  
  30.         "sProcessing""处理中...",  
  31.         "sLengthMenu""显示 _MENU_ 项结果",  
  32.         "sZeroRecords""没有匹配结果",  
  33.         "sInfo""显示第 _START_ 至 _END_ 项结果,共 _TOTAL_ 项",  
  34.         "sInfoEmpty""显示第 0 至 0 项结果,共 0 项",  
  35.         "sInfoFiltered""(由 _MAX_ 项结果过滤)",  
  36.         "sInfoPostFix""",  
  37.         "sSearch""搜索:",  
  38.         "sUrl""",  
  39.         "sEmptyTable""表中数据为空",  
  40.         "sLoadingRecords""载入中...",  
  41.         "sInfoThousands"",",  
  42.         "oPaginate": {  
  43.         "sFirst""首页",  
  44.         "sPrevious""上页",  
  45.         "sNext""下页",  
  46.         "sLast""末页"  
  47.     },  
  48.     "oAria": {  
  49.         "sSortAscending"": 以升序排列此列",  
  50.         "sSortDescending"": 以降序排列此列"  
  51.     }  
  52.  },  
  53.     "aaSorting": [//默认排序,第2列降序,从0开始  
  54.         [ 2, "desc" ]  
  55.     ]  
  56. });  


    2、popover显示(信息太长,截取显示,鼠标悬停,显示悬浮框):
data-content:为完整数据,使用<p>标签,加上  
word-wrap:break-word
 ,保证正常换行,否则不会换行。

   
   
[html] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <spanclassspanclass="popovers" data-html="true" data-trigger="hover" data-placement="bottom" data-content="<p style='word-wrap:break-word;'>${desc}</p>">  
  2.     <#if desc?length gt 10>  
  3.         ${desc?substring(0,10)}...<!-- 字符串截取第二种方式:${desc[0..10]} -->  
  4.     <#else>  
  5.         ${desc}  
  6.     </#if>  
  7. </span>  
 
  
3、列表中显示操作下拉菜单:

    
    
[html] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <div class="btn-group" style="margin-bottom: 1px !important;">  
  2.     <a class="btn green" href="#" data-toggle="dropdown">  
  3.         <i class="icon-cogs"></i>操作  
  4.         <i class="icon-angle-down"></i>  
  5.     </a>  
  6.     <ul class="dropdown-menu pull-right">  
  7.         <li><a href="javascript:;" onclick="editBusinessType(${apiBusinessType.id})"><iclassiclass="icon-edit"></i>编辑</a></li>  
  8.        <li><a href="javascript:;" onclick="deleteBusinessType(${apiBusinessType.id})"><iclassiclass="icon-remove"></i>删除</a></li>  
  9.     </ul>  
  10. </div>  
4、表格中,实现列中的内容超出宽度,自动隐藏配置:(可配合popver使用)
table:style="table-layout: fixed"
td :style="text-overflow: ellipsis;white-space: nowrap;overflow: hidden;"
四、第三方组件使用说明
1、alert对象框:使用sweetalert,网址: http://www.dglives.com/demo/sweetalert-master/example/

  
  
[javascript] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. swal({  
  2.    title: "解除失败",  
  3.     confirmButtonText: "关闭",  
  4. })  
2、json格式化显示:参考1号店开放平台中的js实现
使用<pre>标签,添加brush:js样式即可。主要是json的换行以及着色。可参考网站: http://alexgorbatchev.com/SyntaxHighlighter/
JSON格式化参考doc.js,格式化后,调用 SyntaxHighlighter. highlight ();进行高亮显示。
3、js复制内容到粘贴板
    (1) 方法一:使用zeroclipboard:http://zeroclipboard.org/   该方法使用js+flash的方式实现,需要浏览器必须安装flash,否则无法使用,且会造成样式紊乱。
      (2)方法二:使用clipboard:https://github.com/zenorocha/clipboard.js ,该方式使用js的方式实现,如果浏览器版本过低则不支持。

使用示例如下:
html页面内容:
[html]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. <p class="info" id="copy_text"></p>  
  2. <a href="javascript:void(0);" title="" id="a_trigger_copy" class="action-btn" data-clipboard-target="#copy_text" onclick="copyShortLink()">短链接复制</a>  

js代码内容:
[javascript]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. clip = new Clipboard("#a_trigger_copy");//要提前创建对象,不能再点击复制时才创建,否则会导致第一次点击无法复制的问题  
  2. if(window.clipboardData) {  
  3.     //兼容IE浏览器  
  4.     var clipValue = $("#"+valueId).val();  
  5.     window.clipboardData.setData("Text",clipValue);  
  6.     $.alertSuccess("短链接复制成功");  
  7. else {  
  8.     clip.on("success",function(e){  
  9.         e.clearSelection();  
  10.         $.alertSuccess("短链接复制成功");  
  11.     });  
  12.     //对于一些版本较低的浏览器不支持自动复制,使用手动方式复制  
  13.     clip.on('error'function(e) {  
  14.         $.alertError("请使用Ctrl+C手动复制");  
  15.     });  
  16. }  



五:其他
1、反爬虫协议:项目跟路径(webapp)下添加robots.txt文件,内容为:
User-agent: *
Disallow: /
2、防XSS攻击:
添加过滤器:XssFilter:
   
   
[java] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class XssFilter implements Filter {  
  2.    FilterConfig filterConfig = null;  
  3.   
  4.     public void init(FilterConfig filterConfig) throws ServletException {  
  5.         this.filterConfig = filterConfig;  
  6.     }  
  7.   
  8.     public void destroy() {  
  9.         this.filterConfig = null;  
  10.     }  
  11.   
  12.     public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {  
  13.         chain.doFilter(new XssHttpServletRequestWrapper((HttpServletRequest) request), response);  
  14.     }  
  15.   
  16.   
  17. }  
配置web.xml:

   
   
[html] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <filter>  
  2.     <filter-name>defendXssFilter</filter-name>  
  3.     <filter-class>com.yz.open.web.filter.XssFilter</filter-class>  
  4.     <init-param>  
  5.         <param-name>excludedPaths</param-name>  
  6.         <param-value>  
  7.          *.js,*.css,/css/*,/image/*,/js/*,/lib/*  
  8.         </param-value>  
  9.     </init-param>  
  10. </filter>  
  11.   
  12. <filter-mapping>  
  13.     <filter-name>defendXssFilter</filter-name>  
  14.     <url-pattern>/*</url-pattern>  
  15. </filter-mapping>  
六、freemarker的一些其他使用方式

   1、在freemarker中使用layout.extends、layout.put等标签,提高页面重用率,该功能为freemarker提供的自定义标签的实现,此时需要引
入第三方jar包来实现。
    (1)引入依赖:

   
   
[html] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <dependency>  
  2.     <groupId>kr.pe.kwonnam.freemarker</groupId>  
  3.     <artifactId>freemarker-template-inheritance</artifactId>  
  4.     <version>0.4.RELEASE</version>  
  5. </dependency>  
(2)引入配置文件,用于解析extends,block,put标签
[html] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <import resource="classpath:/kr/pe/kwonnam/freemarker/inheritance/freemarker-layout-directives.xml" />  
(3)基础页面:default.ftl(构造页面结构,引入公共css,js,header,footer、menu等公共页面)
[html] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <!DOCTYPE html>  
  2. <html lang="en">  
  3. <head>  
  4.     <meta charset="UTF-8">  
  5.     <meta http-equiv="X-UA-Compatible" content="IE=edge">  
  6.    <@layout.block name="title">  
  7.       <title>TestTitle</title>  
  8.     </@layout.block>  
  9.     <!-- global style start -->  
  10.    <#include "includes/global_css.ftl">  
  11.     <!-- global style end -->  
  12.      
  13.     <!-- custom style start -->  
  14.    <@layout.block name="custom_style">  
  15.    </@layout.block>  
  16.     <!-- custom style end -->  
  17. </head>  
  18. <body>  
  19.    <!-- page content start -->  
  20.    <@layout.block name="page_content">  
  21.    </@layout.block>  
  22.    <!-- page content end -->  
  23.    <#include "includes/global_js.ftl"/>  
  24.    <@layout.block name="custom_script">  
  25.    </@layout.block>  
  26. </body>  
  27. </html>  
(4)实际使用页面:index.ftl(公共css,js等信息已在default.ftl中引入,实际页面只需要引入自己特有的css,js即可)
[html] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <@layout.extends name="default.ftl">  
  2.     <@layout.put block="custom_style">  
  3.         <#-- 页面样式css -->  
  4.         <link rel="stylesheet" href="${webroot}/css/index.min.css">  
  5.     </@layout.put>  
  6.     <@layout.put block="page_content">  
  7.        <#-- 页面内容 -->  
  8.     </@layout.put>  
  9.     <@layout.put block="custom_script">  
  10.         <#-- 页面脚本js -->  
  11.         <script src="${webroot}/js/index.min.js"></script>  
  12.     </@layout.put>  
  13. </@layout.extends>  
点击打开链接
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

springmvc整合freemarker以及前端的一些坑 的相关文章

随机推荐

  • KVM下虚拟机网卡桥接配置

    基本概念 KVM基本概念 KVM 全称是 Kernel based Virtual Machine 是 Linux 下 x86 硬件平台上的全功能虚拟化解决方案 包含一个可加载的内核模块 kvm ko 提供和虚拟化核心架构和处理器规范模块
  • 在安卓手机搭建kali环境,手机变成便携式渗透神器

    kali是著名的黑客专用系统 一般都是直接装在物理机或者虚拟机上 我们可以尝试把kali安装在手机上 把手机打造成一个便携式渗透神器 我们需要下载以下3款软件 1 Termux 终端模拟器 2 AnLinux 里边有各种安装liunx的命令
  • 离散数学期末复习—学习笔记

    主要是看ppt和做课后练习 数理逻辑 1 命题逻辑的基本概念 1 1 命题与连接词 1 2 命题公式及其赋值 1 3 习题 2 命题逻辑等值演算 2 1等值式 基本等值式 16组 24个公式 2 2 析取范式和合取范式 主要是主析取范式和主
  • kettle入门教程

    目录 1 kettle叙述 1 1什么是kettle 1 2kettle工程存储方式 1 3kettle两种设计 1 4kettle的组成 1 5kettle的下载安装 2 kettle教程 2 1转换 2 1 1普通转换 2 1 2执行s
  • html中div hover的用法,CSS: hover选择器的使用详解

    有些时候需要用到mouseover和mouseout这两个鼠标事件 但是写js又比较麻烦 还要添加监听事件 所以能用css解决的东西尽量yongcss解决 这样可以提高性能 下面说一下我对 hover 的了解 之前在学计算机应用的时候 老师
  • Windows端pytorch镜像快速安装【清华源】

    目录 0 说在前面 1 安装Anacoda 1 1 说在前面 1 2 下载 1 3 安装 1 4 记住3条命令 2 安装CUDA 2 1 更新NVIDIA驱动 2 2 下载CUDA 3 安装cudnn 3 1 下载安装 4 安装pytorc
  • MySQL必知必会 学习笔记 第七章 数据过滤

    可用AND操作符给WHERE子句附加条件 SELECT columnName FROM tableName WHERE columnName1 1 AND columnName2 2 OR操作符指示MySQL匹配符合操作符任一端条件的行 S
  • 监听器

    监听器在JavaWeb开发中用得比较多 下面说一下监听器 Listener 在开发中的常见应用 一 统计当前在线人数 在JavaWeb应用开发中 有时候我们需要统计当前在线的用户数 此时就可以使用监听器技术来实现这个功能了 1 packag
  • vue3 在原型上挂载方法

    在vue3 中没有 this 不在是实例化查出来的vue对象 那怎么往原型挂在公用的方法呢 const app createApp App const test gt console log 我是测试函数触发的 return 测试成功 ap
  • nginx第三方模块---nginx-sticky-module的平滑升级

    nginx第三方模块 nginx sticky module的平滑升级 第一步 下载 下载地址 链接 https bitbucket org nginx goodies nginx sticky module ng downloads ta
  • 5个方面详解:AI产品运营必知的软硬件技术

    比算法更难得是算法的思想 比编程工具更难的是编程的思维 比做产品更难的是产品的梦想 本文主要从5个方面 详细阐述AI产品运营必知的软硬件技术 一 AI产品运营对基础关系的安排 1 智能软硬件与软件和硬件 在AI产品里没有纯粹单独的软件和硬件
  • 【SpringBoot应用篇】SpringBoot集成MinIO对象存储服务

    SpringBoot应用篇 SpringBoot集成MinIO对象存储服务 对象存储服务MinIO MinIO简介 MinIO特点 开箱使用 docker安装启动 管理控制台 快速入门 Java 上传文件到minio 配置访问权限 封装Mi
  • 计算机基础知识深入研究系列:定点数与浮点数

    插眼 总结 暂无 自己还没深入研究 留链接供以后参考 深入浅出浮点数 https blog csdn net cppptr article details 573372 硬件中的定点数与浮点数运算与相互转换 https blog csdn
  • Qt 官方资源下载地址

    1 所有Qt版本下载地址 http download qt io archive qt 2 所有Qt Creator下载地址 http download qt io archive qtcreator 3 所有Qt VS开发插件下载地址 h
  • CubeMX——F1和G0系列外部中断回调函数差异

    以前写代码 一些固定的代码总喜欢复制粘贴 然后在G0系列使用外部中断的时候 发现死活触发不了 一路检查了CubeMX的配置以及硬件连接 均发现没问题 然后发现G0系列的外部中断回调函数和F1系列的不一样 以下列举的是配置下降沿触发模式 主要
  • 怎么给input插入一个图片

    html部分
  • 强化学习笔记:连续控制 & 确定策略梯度DPG

    1 离散控制与连续控制 之前的无论是DQN Q learning A2C REINFORCEMENT SARSA什么的 都是针对离散动作空间 不能直接解决连续控制问题 考虑这样一个问题 我们需要控制一只机械手臂 完成某些任务 获取奖励 机械
  • C++生成随机字符串的程序

    include
  • set-cookie失效之坑

    最近做的一个微信公众号项目 打开网页登录的时候就会出现每次请求sessionid不一致的问题 先贴图 session是后台生成的 由于验证码信息是放了在session里面 每次的session不一致 导致没有办法从session里面拿到响应
  • springmvc整合freemarker以及前端的一些坑

    一 SpringMVC整合freemarker配置 1 引入相关jar包 html view plain copy