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)如果某個字段需要在前臺列表頁顯示,則在前