1. 程式人生 > >FreeMarker自定義TemplateDirectiveModel之重複提交&下拉列表

FreeMarker自定義TemplateDirectiveModel之重複提交&下拉列表

重複提交標籤

public class AvoidRepeatSubmitTag implements TemplateDirectiveModel {
    public AvoidRepeatSubmitTag() {
    }

    public void execute(Environment env, Map map, TemplateModel[] model, TemplateDirectiveBody body) throws TemplateException, IOException {
        HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
        String tokenName = UUID.randomUUID().toString();
        String tokenValue = tokenName + ","
+ UUID.randomUUID().toString(); WebUtils.setSessionAttribute(request, tokenName, tokenValue); request.setAttribute("tokenName", tokenName); Object id = map.get("id"); Writer out = env.getOut(); if(id != null) { out.write("<input type=\'hidden\' id=\'"
+ id + "\' name =\'token\' value=\'" + tokenValue + "\'/>"); } else { out.write("<input type=\'hidden\' name=\'token\' value=\'" + tokenValue + "\'/>"); } body.render(out); } }

下拉列表

public class ShowDictTemplate implements TemplateDirectiveModel {
private Map<String, Class> mappingClazz; private static final Logger LOGGER = LoggerFactory.getLogger(ShowDictTemplate.class); private Map<String, IDictDataLoader> dataLoaderMap; public ShowDictTemplate() { } public void execute(Environment environment, Map map, TemplateModel[] templateModels, TemplateDirectiveBody templateDirectiveBody) throws TemplateException, IOException { String dictType = MapUtils.getString(map, "dictType"); String dictKey = MapUtils.getString(map, "dictKey"); String opt1 = MapUtils.getString(map, "opt1"); String selectValue = MapUtils.getString(map, "selectValue"); if(LOGGER.isDebugEnabled()) { LOGGER.debug("showDictTemplate, dictType:{},dictKey:{}", dictType, dictKey); } if(StringUtils.equals(dictType, "EMNU")) { String[] list = StringUtils.split(dictKey, "\\."); if(list == null || list.length != 2) { LOGGER.error("SHOW DICT dictKey format error.key:{}", dictKey); return; } Class builder = (Class)this.mappingClazz.get(list[0]); String menuClazzName = builder.getName() + "." + list[1]; try { Class e = ClassUtils.getClass(menuClazzName); List list1 = SelectUtils.makeList(e); if(StringUtils.isNotEmpty(selectValue)) { list1 = this.filterShowSelectValue(list1, selectValue); } else { list1 = this.filterNoShowList(list1); } if(StringUtils.isNotEmpty(opt1)) { list1 = this.filterOptShowList(list1, opt1); } DefaultObjectWrapperBuilder builder1 = new DefaultObjectWrapperBuilder(Configuration.VERSION_2_3_19); environment.setVariable("dictList", builder1.build().wrap(list1)); } catch (ClassNotFoundException var15) { var15.printStackTrace(); } } else if(this.dataLoaderMap.get(dictType) != null) { List list2 = ((IDictDataLoader)this.dataLoaderMap.get(dictType)).loadDataList(dictKey); if(StringUtils.isNotEmpty(selectValue)) { list2 = this.filterShowSelectValue(list2, selectValue); } DefaultObjectWrapperBuilder builder2 = new DefaultObjectWrapperBuilder(Configuration.VERSION_2_3_19); environment.setVariable("dictList", builder2.build().wrap(list2)); } if(templateDirectiveBody != null) { templateDirectiveBody.render(environment.getOut()); } } private List<LabelValue> filterNoShowList(List<LabelValue> list) { ArrayList result = new ArrayList(); Iterator var3 = list.iterator(); while(var3.hasNext()) { LabelValue lv = (LabelValue)var3.next(); if(lv.isListFlag()) { result.add(lv); } } return result; } private List<LabelValue> filterOptShowList(List<LabelValue> list, String opt) { return (List)list.stream().filter((lv) -> { return opt.equals(lv.getOpt1()); }).collect(Collectors.toList()); } private List<LabelValue> filterShowSelectValue(List<LabelValue> list, String value) { ArrayList result = new ArrayList(); Iterator var4 = list.iterator(); while(var4.hasNext()) { LabelValue lv = (LabelValue)var4.next(); if(StringUtils.equalsIgnoreCase(value, lv.getValue())) { result.add(lv); } } return result; } public void setDataLoaderMap(Map<String, IDictDataLoader> dataLoaderMap) { this.dataLoaderMap = dataLoaderMap; } public void setMappingClazz(Map<String, Class> mappingClazz) { this.mappingClazz = mappingClazz; } }

相關推薦

FreeMarker定義TemplateDirectiveModel重複提交&列表

重複提交標籤 public class AvoidRepeatSubmitTag implements TemplateDirectiveModel { public AvoidRepeatSubmitTag() { } public

定義JSP防重複提交標籤

package com.hhwy.tag; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.TagSupport; imp

定義註解 防止重複提交

定義註解 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.a

freemarker 定義TemplateDirectiveModel

在採用FreeMarker做前臺檢視模板的情況下,我們可以通過<#include>標籤和自定義巨集來解決很多重複性工作。 一個簡單的FreeMarker巨集: <#macro sayHello name="">     hello ${name

微信小程式定義抽屜選單(從出)例項 —— 微信小程式實戰系列(7)

微信提供了動畫api,就是下面這個 通過使用這個建立動畫的api,可以做出很多特效出來 下面介紹一個抽屜選單的案例 實現程式碼: wxml: <!--button--> &l

定義微信小程式選擇框元件

預覽效果圖:↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ======================================================== 首先要新建一個元件 1.在想要的位置上新建一個目錄 2.在該目錄中 右鍵 → 新建一個Comp

Android定義控制元件——ListView的重新整理與上載入

1.簡介        無疑,在Android開發中,ListView是使用非常頻繁的控制元件之一,ListView提供一個列表的容易,允許我們以列表的形式將資料展示到介面上,但是Google給我們提供的原生ListView的控制元件,雖然在功能上很強大,但是在使用者體

定義View(ListView)重新整理

下拉重新整理的操作流程: 1.使用者手指在ListView頁面按下並下拉 2.出現一個提示View在listView頂部 3.listView內容更新,頂部view顯示後隱藏 具體實現步驟 建立繼承Listview的RefreshListView,並新增頂部提示vi

PullRefresh(定義控制元件,ListView,重新整理,載入更多)

PullRefresh 效果展示 Usage 一.layout <!--直接在佈局中申明控制元件--> <RelativeLayout xmlns:andr

定義ViewGroup繼承FrameLayout 實現重新整理功能

程式碼不多,註釋也不多,因為比較簡單 效果圖 貼程式碼 activity_refresh_head.xml  (下拉重新整理的載入框) <?xml version="1.0" encoding="utf-8"?> <LinearLayout x

Qt編寫定義控制元件52-顏色

一、前言 這個控制元件寫了很久了,元老級別的控制元件之一,開發之初主要是自己的好幾個專案要用到,比如提供一個顏色下拉框設定對應的曲

Android學習listView顯示列表(2)(SimpleAdapter介面卡)

                     ListView顯示下拉列表(2)(SimpleAdapter介面卡) 上一篇文章我大概介紹了listView的主要功能以及用ArrayAdapter陣列介面卡實現純文字的下拉列表。但是在現實生活中,純文字的使用率不是很高,更多的

Ajax應用級聯列表

在實際專案中經常用到列表聯動,比如省份、城市、區域三級聯動,這裡簡要以二級聯動來進行演示,思路很簡單: 1、程式進入後首先呼叫獲取省份方法getProvince,使用Ajax向伺服器請求省份資料。 2、回撥函式獲取到省份資料後,將資料載入到省份下拉列表中。 3、使用第一個省

定義控制元件:treelistCombox 列表

先來一張效果圖 下面是treelistcombox原始碼 using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; us

Android定義View(重新整理+側滑刪除)

以前專案中用到了一個放qq的側滑刪除的效果,結果github上一搜就copy了一個,不得不說大神們寫的真心牛逼,那個時候呢看到一個東西能用就可以了,也不管怎麼實現的,現在反過來一看,原來自定義還可以這麼玩,當然,前面專案中也因此出現了一個bug,就是我使用的是P

Java定義方法轉換前端提交的json字符串為JsonObject對象

eid test 提交 rac quest https std bject app 前端提交json字符串格式數據,Java後端通過自定義方法接收json字符串數據並轉換為JsonObject對象,代碼如下放到RequestData.Java類中: public stat

Qt定義按鈕及不同狀態圖片的切換

q自定義窗體、任意形狀的窗體、qt自定義按鈕 好久沒有使用Qt了,最近在做窗體時做了一個自定義的鈕銨,剛開始是想通過修改其MASK和ICON的 方式來實現。確發現效果總是不太如意,如是幹脆自已定義了一個XPushButton。也將其實現方式記錄發 布出來。以方便日後自已使用和給有相應問題的朋友一個小小的

HTML5定義屬性data-

表現 logs nbsp null dex att html5 mov 對象 HTML5 增加了一項新功能是 自定義數據屬性 ,也就是 data-* 自定義屬性。在HTML5中我們可以使用以 data- 為前綴來設置我們需要的自定義屬性,來進行一些數據的存放。當然高級瀏覽

定義驗證這能輸入數字(包括小數 負數 )

key 多個 class script 數字 是否 pre blur 如果 <script type="text/javascript"> function onlyNumber(obj){ //得到第一個字符是否為負號

dedecms定義模型獨立模型在首頁、列表頁、內容調用內容

兩個 定義 blog typeid 註意 lists lis curl lds dedecms關於自定義模型(獨立模型)的首頁、列表頁、內容怎麽調用?在後臺自定義模型(獨立模型)的建立及自定義字段的添加比較簡單,需要註意兩點: (1)如果某個字段需要在前臺列表頁顯示,則在前