使用freemarker實現下拉列表
只對下拉列表項進行構建,到底為什麼不進行整體構建,只不過是某些js庫定位元素的原因。
資料庫建表語句:
--下拉列表T_LIST_ITEM
CREATE TABLE IF NOT EXISTS T_LIST_ITEM(
LI_ID INTEGER NOT NULL AUTO_INCREMENT COMMENT 'ID',
ORG_ID int(4) COMMENT '使用部門ID',
LI_INDEX INT(4) NOT NULL COMMENT '輸入域排序索引',
WEB_COM_NAME varchar(15) NOT NULL COMMENT '輸入元件名',
OPT_LABEL varchar(50) NULL COMMENT '輸入標籤',
OPT_VALUE varchar(50) NULL COMMENT '輸入值',
OPT_DET_VALUE varchar(100) NULL COMMENT '詳細輸入值',
PRIMARY KEY (LI_ID)
)
使用檢索語句:
<sql-query name="GetCommonItems">
<![CDATA[
SELECT
A.LI_INDEX, A.OPT_LABEL, A.OPT_VALUE
FROM T_LIST_ITEM A
WHERE A.WEB_COM_NAME=:webComName
ORDER BY A.LI_INDEX
]]>
</sql-query>
DAO模型呼叫:
public List getCommonItems(String webComName) {
Query query=getSession().getNamedQuery("GetCommonItems");
query.setParameter("webComName",webComName);
return query.list();
}
freemarker-->templates(defaultItems.ftl)內容
<#list items as item>
<option value="${item[2]}" <#if defaultValue=="${item[2]}">selected</#if> >${item[1]}</option>
</#list>
freemarker解析類:
public class DynaListItems {
private static TListItemDAO listItemDAO;
public void setTListItemDAO(TListItemDAO listItemDAO) {
DynaListItems.listItemDAO = listItemDAO;
}
private static String defValueTemplate = "defaultItems.ftl";
public static String getDefValueItems(String webComName,String defValue){
try {
Configuration cfg = FreemarkerManager.getConfiguration();
Template template = cfg.getTemplate(defValueTemplate);
List tmp=listItemDAO.getCommonItems(webComName);
//最終輸出的位置
Writer out = new StringWriter();
//資料模型
Map rootMap = new HashMap();
rootMap.put("items",tmp );
rootMap.put("defaultValue",defValue );
//模版引擎解釋模版
template.process(rootMap, out);
return out.toString();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
使用之前要註冊函式,使用tld檔案註冊,主要程式碼如下:
<function>
<name>getDefValueItems</name>
<function-class>com.web.views.DynaListItems</function-class>
<function-signature>java.lang.String getDefValueItems(java.lang.String,java.lang.String)</function-signature>
</function>
jsp頁面呼叫:第二個引數就是保留預設值。
<select name="statu">
${edwin:getDefValueItems("CDDocStatu",CDDocManageForm.statu)}
</select>
以後使用就可以很簡單地在頁面使用三行程式碼搞定一個下拉列表了。如果沒有特殊需求完全可以變成一行程式碼。