//加载自定义标签,主要是在html的模班页面使用,在freemarkerUtil中的initCfg()方法中
freemarkerCfg.setSharedVariable("demo", new DemoDirective());
//客服
freemarkerCfg.setSharedVariable("custList", new CustServiceDirective());
public class CustServiceDirective extends BaseDirective implements TemplateDirectiveModel{ private StoreCustServiceService storeCustServiceService; public CustServiceDirective(){ init("storeCustServiceService");//主要是用于调用service中的逻辑处理方法 } @Override public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException { StoreCustService storeCustService=new StoreCustService(); String traAgId = getParam(params, "traAgId");//获取参数的操作 if (traAgId != null) { storeCustService.setTraAgId(Integer.parseInt(traAgId)); } String status= getParam(params, "status"); if(status!=null){ storeCustService.setStatus(Integer.parseInt(status)); } Writer out=env.getOut(); if(body!=null){ //设置循环变量 if(loopVars !=null && loopVars.length>0){ List custList=storeCustServiceService.findCustList(storeCustService," sequence ", "true".equals(getParam(params,"cache"))?true:false);//获取到需要的list if(custList!=null && custList.size()>0){//循环输出 for (int i = 0; i<custList.size(); i++) { loopVars[0]=new BeanModel(custList.get(i), new BeansWrapper()); if(loopVars.length>1){ loopVars[1]=new SimpleNumber(i); } body.render(out); } } } } } }
继承的BaseDirective的写法
/** * <p> * Description: 自定义标签共同的功能 * </p> */ public class BaseDirective extends Base { /** * 获得参数 * * @param params * @param name * @return */ public String getParam(Map params, String name) { String value = ""; if (params.get(name) != null && params.get(name).toString().length() > 0) { value = params.get(name).toString(); } return value; } /** * 获得参数并传递默认值 * * @param params * @param name * @param defaultValue * @return */ public String getParam(Map params, String name, String defaultValue) { String value = defaultValue; if (params.get(name) != null && params.get(name).toString().length() > 0) { value = params.get(name).toString(); } return value; } /** * 获得int参数并传递默认值 * * @param params * @param name * @param defaultValue * @return */ public int getParamInt(Map params, String name, int defaultValue) { int value = defaultValue; if (params.get(name) != null && params.get(name).toString().length() > 0) { try { value = Integer.parseInt(params.get(name).toString()); } catch (Exception e) { } } return value; } /** * 获得数据 * * @param params * @param name * @return * @throws TemplateModelException */ public String getData(Environment env, String name) throws TemplateModelException { String value = ""; if (env.getDataModel().get(name) != null && env.getDataModel().get(name).toString().length() > 0) { value = env.getDataModel().get(name).toString(); } return value; } /** * 获得数据并传递默认值 * * @param params * @param name * @param defaultValue * @return * @throws TemplateModelException */ public String getData(Environment env, String name, String defaultValue) throws TemplateModelException { String value = defaultValue; if (env.getDataModel().get(name) != null && env.getDataModel().get(name).toString().length() > 0) { value = env.getDataModel().get(name).toString(); } return value; } }
在html页面的应用
<@custList traAgId="${traAgId}" status="1";cuList>//status是参数,cuList是循环变量 <li> <#if cuList.gender??> <#if cuList.gender== 1> <div class="avatar"><img width="65" height="66" src="../img/ta/men_100X100.jpg"></div> <#elseif cuList.gender== 2> <div class="avatar"><img width="65" height="66" src="../img/ta/woman_100X100.jpg"></div> </#if> </#if> <p class="s14">${cuList.realName}</p> <div class="i_onlinecs_btnc c_b"> <a href="tencent://message/?uin=${cuList.qq}&site=www.xx.com&menu=yes" target="_blank" rel="nofollow"> <img src="http://wpa.qq.com/pa?p=1:${cuList.qq}:4" border="0" align="bottom" class="pic"></a> </div> </li> </@custList>
还有一种循环方法
if(body!=null){ //设置循环变量 if(loopVars !=null && loopVars.length>0){ List<TravelAgency> travelList=travelAgencyService.find(travelAgency, order,limit); loopVars[0]=new ArrayModel(travelList.toArray(), new BeansWrapper()); body.render(out); } }
在html中就是,这种写法能判断是否有值,可以针对这个做处理
<@travelList cityCode="${cityCode}" limit="0,10";traList> <#if traList?exists && traList?size != 0> <#list traList as trList> <dl> <dd><a href="${contextPath}www/store.do?traAgCode=${trList.traAgCode?default('')}">${trList.companyInfo.companyName!""}</a></dd> </dl> </#list> <#else> <dl> <dd>暂时没有旅行社添加!</dd> </dl> </#if> </@travelList>
还有一种多参数的做法
//多个循环变量的情况以及涉及到freemarker的分页做法 public class TailPageDirective extends BaseDirective implements TemplateDirectiveModel{ public TailPageDirective(){ init("tailProService"); } @Override public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException { if(body!=null){ //设置循环变量 if(loopVars !=null && loopVars.length>0){ String orderby=getParam(params, "orderby"," used desc"); //显示数量 int row=getParamInt(params, "row", 10);//给参数的默认值 //标题长度 int titleLen=getParamInt(params, "titleLen",0); //当前第几页 int page=getParamInt(params, "page", 1); String action=getParam(params, "action"); HashMap<String, String> paramMap=new HashMap<String, String>(); if(tailPromotion==null){ tailPromotion=new TailPromotion(); } String cityCode = getParam(params, "cityCode"); if (StringUtil.isNotEmpty(cityCode)) { tailPromotion.setDepartCityCode(cityCode); } tailPromotion.setTrStatus(0); tailPromotion.setStatus(Byte.valueOf("3")); String transportMeans=getParam(params, "transportMeans");//获取的是标签内传递的参数 //env.getDataModel().get("transportMeans")获取的是地址栏中的参数 if(env.getDataModel().get("transportMeans")!=null && env.getDataModel().get("transportMeans").toString()!=""){ transportMeans=env.getDataModel().get("transportMeans").toString(); tailPromotion.setTransportMeans(transportMeans); paramMap.put("transportMeans", transportMeans); action=action+"&transportMeans="+transportMeans; }else if(StringUtils.isNotEmpty(transportMeans)){ tailPromotion.setTransportMeans(transportMeans); paramMap.put("transportMeans", transportMeans); action=action+"&transportMeans="+transportMeans; } //升降序的做法 String order =" sequence "; String sequence=getParam(params, "sequence"); if(env.getDataModel().get("sequence")!=null && env.getDataModel().get("sequence").toString()!=""){ sequence =env.getDataModel().get("sequence").toString(); if("1".equals(sequence)){ order=" lowest_price desc "; }else if("2".equals(sequence)){ order=" lowest_price "; } paramMap.put("sequence", sequence); action=action+"&sequence="+sequence; }else if(StringUtils.isNotEmpty(sequence)){ if("1".equals(sequence)){ order=" lowest_price desc "; }else if("2".equals(sequence)){ order=" lowest_price "; } paramMap.put("sequence", sequence); action=action+"&sequence="+sequence; } int count=tailProService.countByExample(tailPromotion); FreemarkerPager pager=new FreemarkerPager();//分页的做法 pager.setCurrPage(page); pager.setTotalCount(count); pager.setPageSize(row); pager.setAction(action); paramMap.put("tcount", String.valueOf(count)); pager.setParams(paramMap); List<TailPromotion> trpList=tailProService.findTP(tailPromotion,orderby,page, row); //这个是ajax的做法 TreeMap<Integer, Integer> daysMap=new TreeMap<Integer, Integer>();//旅游天数 HashMap trPropertyMap=new HashMap();//团的属性 TreeMap<Integer, String> priceMap=new TreeMap<Integer, String>();//价格 if(trpList!=null && trpList.size()>0){ for(int i=0;i<trpList.size();i++){ Integer day=trpList.get(i).getTourDays(); if(day!=null && day!=0){ daysMap.put(day,day); } Byte trPro=trpList.get(i).getTrProperty(); if(trPro!=null){ trPropertyMap.put(trPro, trPro); } Integer lowPrice=trpList.get(i).getLowestPrice(); if(lowPrice!=null && lowPrice!=0){ if(lowPrice<100){ priceMap.put(100, "100元以下"); }else if(lowPrice>100 && lowPrice<=300){ priceMap.put(300, "100-300元"); }else if(lowPrice>300 && lowPrice<=500){ priceMap.put(500, "300-500元"); } } } } //搜索条件 放到map里面 Map<String,Map> sMap=new HashMap<String,Map>(); sMap.put("daysMap", daysMap); sMap.put("trPropertyMap", trPropertyMap); sMap.put("priceMap", priceMap); if(loopVars.length==1){ loopVars[0]=new MapModel(sMap,new BeansWrapper()); }else if(loopVars.length==3){ loopVars[0]=new ArrayModel(trpList.toArray(),new BeansWrapper()); loopVars[1]=new BeanModel(pager,new BeansWrapper()); loopVars[2]=new MapModel(sMap,new BeansWrapper()); } body.render(env.getOut()); } } } }
在html页面中
<@tailPage row='10' page='${page!1}' istheme='0' proType="1" cityCode="${cityCode?if_exists}" action='${contextPath}zhoubian.do?cityCode=${cityCode}&cityName=${cityName}&templetPath=index_zb_wd_so.html' ;trpList,pager,sMap><!-- 含有多个循环变量的--> <!-- 搜索区 --> <div class="dec_box"> <#if sMap.get('daysMap')?size != 0> <#assign daysMap = sMap.get('daysMap')> <dl> <dt>行程天数:</dt> <dd> <#list daysMap.keySet() as key> <a href="${contextPath}zhoubian.do?cityCode=${cityCode}&cityName=${cityName}&templetPath=index_zb_wd_so.html&days=${key}<#if (price??)>&price=${price}</#if><#if (topicLabels??)>&topicLabels=${topicLabels}</#if><#if (sequence??)>&sequence=${sequence}</#if><#if (ptaNames??)>&ptaNames=${ptaNames}</#if><#if (trProperty?? && trProperty!='')>&trProperty=${trProperty}</#if><#if (transportMeans?? && transportMeans!='')>&transportMeans=${transportMeans}</#if>" class="<#if ((days!'') == key?string)>active</#if>" >${key}日游</a> </#list> </dd> </dl> </#if> <#if sMap.get('priceMap')?size != 0> <#assign priceMap = sMap.get('priceMap')> <dl> <dt>价格范围:</dt> <dd> <#list priceMap.keySet() as key> <a href="${contextPath}zhoubian.do?cityCode=${cityCode}&cityName=${cityName}&templetPath=index_zb_wd_so.html&price=${key?c}<#if (days??)>&days=${days}</#if><#if (topicLabels??)>&topicLabels=${topicLabels}</#if><#if (sequence??)>&sequence=${sequence}</#if><#if (ptaNames??)>&ptaNames=${ptaNames}</#if><#if (trProperty?? && trProperty!='')>&trProperty=${trProperty}</#if><#if (transportMeans?? && transportMeans!='')>&transportMeans=${transportMeans}</#if>" class="<#if ((price!'') == key?c)>active</#if>" >${priceMap.get(key)}</a> </#list> </dd> </dl> </#if> </div> </div> <div class="search_sum"> <strong class="s18 c_c">${cityName?if_exists}<#if (ptaNames??)>到${ptaNames}旅游 </#if> <#if (days??)>${days}日游</#if></strong> 共找到 <strong id="tCount" class="c_o"></strong> 条线路</div> </div> <div class="d_wrap selfclear"> <div class="d_r"> <div class="d_m dec_m"> <!-- 搜索结果 --> <div class="dec_box selfclear"> <div class="search_sort"> <span class="active">默认排序</span> <span> <a href="${contextPath}zhoubian.do?cityCode=${cityCode}&cityName=${cityName}&templetPath=index_zb_wd_so.html&sequence=1<#if (topicLabels??)>&topicLabels=${topicLabels}</#if><#if (days??)>&days=${days}</#if><#if (price??)>&price=${price}</#if><#if (sequence??)>&sequence=${sequence}</#if><#if (ptaNames??)>&ptaNames=${ptaNames}</#if><#if (trProperty?? && trProperty!='')>&trProperty=${trProperty}</#if><#if (transportMeans?? && transportMeans!='')>&transportMeans=${transportMeans}</#if>">价格 <em class="icon_sort up"></em></a> <a href="${contextPath}zhoubian.do?cityCode=${cityCode}&cityName=${cityName}&templetPath=index_zb_wd_so.html&sequence=2<#if (topicLabels??)>&topicLabels=${topicLabels}</#if><#if (days??)>&days=${days}</#if><#if (price??)>&price=${price}</#if><#if (sequence??)>&sequence=${sequence}</#if><#if (ptaNames??)>&ptaNames=${ptaNames}</#if><#if (trProperty?? && trProperty!='')>&trProperty=${trProperty}</#if><#if (transportMeans?? && transportMeans!='')>&transportMeans=${transportMeans}</#if>">价格<em class="icon_sort down"></em></a> </span> <form name="form1" method="post" action="" > <script type="text/javascript"> function form1Submit(){ var action="${contextPath}zhoubian.do?cityCode=${cityCode}&cityName=${cityName}&templetPath=index_zb_wd_so.html&sequence=1<#if (topicLabels??)>&topicLabels=${topicLabels}</#if><#if (days??)>&days=${days}</#if><#if (price??)>&price=${price}</#if><#if (sequence??)>&sequence=${sequence}</#if><#if (ptaNames??)>&ptaNames=${ptaNames}</#if>"; var trProperty=$.trim($("#trProperty").val()); if(trProperty!=''){ action=action+"&trProperty="+trProperty; }else{} var transportMeans=$.trim($("#transportMeans").val()); if(transportMeans!=''){ action=action+"&transportMeans="+transportMeans; }else{} form1.action=action; form1.submit(); } </script> <span> <select name="trProperty" id="trProperty" onchange="javascript:form1Submit();"> <option value=''>出游方式</option> <option value='1' <#if ((trProperty!'') == '1')>selected="selected"</#if> >跟团游</option> <option value='2' <#if ((trProperty!'') == '2')>selected="selected"</#if> >自由行</option> <option value='3' <#if ((trProperty!'') == '3')>selected="selected"</#if> >自驾游</option> <option value='4' <#if ((trProperty!'') == '4')>selected="selected"</#if> >独立包团</option> </select> </span> <span> <select name="transportMeans" id="transportMeans" onchange="javascript:form1Submit();"> <option value=''>交通工具</option> <option value="飞机" <#if ((transportMeans!'') == '飞机')>selected="selected"</#if>>飞机</option> <option value="火车" <#if ((transportMeans!'') == '火车')>selected="selected"</#if>>火车</option> <option value="汽车" <#if ((transportMeans!'') == '汽车')>selected="selected"</#if>>汽车</option> <option value="轮船" <#if ((transportMeans!'') == '轮船')>selected="selected"</#if>>轮船</option> <option value="动车" <#if ((transportMeans!'') == '动车')>selected="selected"</#if>>动车</option> <option value="高铁" <#if ((transportMeans!'') == '高铁')>selected="selected"</#if>>高铁</option> </select> </span> </form> </div> <div class="search_c" style="display:block"> <#list trpList as tour> <div class="search_route_c"> <div class="g_pic"><a href="${tour.url!''}" target="_blank"><img src="${tour.picturePath!'/img/ta/whitelogo.jpg'}"></a></div> <div class="search_route_op"> ¥<strong class="s24 c_c">${tour.lowestPrice!''}</strong>起 <a href="${tour.url!''}" target="_blank"><div class="search_c_goto">去看看</div></a> </div> <h3><a href="${tour.url!''}" target="_blank" class="c_c">${tour.trName!''}</a></h3> <p><span class="c_lgray">行程概览: </span><span class="c_o">${tour.passedTourAttrNames!'暂无行程'}</span></p> <p><span class="c_lgray">往返交通: </span><span class="dec_mr">${tour.transportMeans!''}</span><span class="c_lgray">服务承诺:</span> <#if (tour.extracomsuption??)> <span class="c_g"> <#if (tour.extracomsuption == 1)> 无购物无自费 <#elseif (tour.extracomsuption == 2)> 无购物有自费 <#elseif (tour.extracomsuption == 3)> 有购物无自费 <#elseif (tour.extracomsuption == 4)> 有购物有自费 </#if> </span> </#if> </p> <p>${tour.companyName!''}</p> </div> </#list> </div> <div class="search_c"> <div class="g_loading"></div> </div> </div> <div class="g_page"> ${pager.formPageStr} </div> </div> </@tailPage>