<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    iamhuzl

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      1 隨筆 :: 13 文章 :: 21 評論 :: 0 Trackbacks
    Grails小技巧
    一、Controlller中params
    Controlller中params是grails框架中的GrailsParameterMap類,繼承自TypeConvertingMap,而不是一個簡單的Map,
    除了支持普通的Map方法以外,還有其他幾個方法非常有用
    	Integer int(String name);
    	Long long(String name);
    	Double double(String name);
    	Short(String name);
    	List list(String name);
    

    若需要得到數值類型的參數就非常方便了
    	int max= params.int("max")?:10;
    


    二、分頁
    其實使用Grails做分頁功能是最easy的事情,因為Domain類的Criteria的list方法返回的結果就是帶有分頁所用信息的PagedResultList類
    Domain的動態方法會檢查是否調用的是list方法,若是則會使用Hibernate Criteria.setProjection(Projections.rowCount())方法,根據條件查詢總數。想深入了解可以看看HibernateCriteriaBuilder.java源碼。
    public class HibernatePluginSupport {
    	private static addQueryMethods(GrailsDomainClass dc, GrailsApplication application, ApplicationContext ctx) {
    		...;
    		metaClass.static.createCriteria = {-> new HibernateCriteriaBuilder(domainClassType, sessionFactory)}
    		...;
    
    	}
    }
    //groovy 動態機制
    public class HibernateCriteriaBuilder {
    	public Object invokeMethod(String name, Object obj){
    		createCriteriaInstance();
    
    		// 檢查分頁參數,一個參數是Map,包含分頁參數
    		if(name.equals(LIST_CALL) && args.length == 2) {
    			paginationEnabledList = true;
    			orderEntries = new ArrayList<Order>();
    			invokeClosureNode(args[1]);
    		} else {
    			invokeClosureNode(args[0]);
    		}
    		...
    		if(paginationEnabledList) {
    			this.criteria.setFirstResult(0);
    			this.criteria.setMaxResults(Integer.MAX_VALUE);
    			this.criteria.setProjection(Projections.rowCount());
    			int totalCount = ((Integer)this.criteria.uniqueResult()).intValue();
    
    			// Drop the projection, add settings for the pagination parameters,
    			// and then execute the query.
    			this.criteria.setProjection(null);
    			for(Iterator<Order> it = orderEntries.iterator();it.hasNext();){
    				this.criteria.addOrder(it.next());
    			}
    			this.criteria.setResultTransformer(CriteriaSpecification.ROOT_ENTITY);
    			GrailsHibernateUtil.populateArgumentsForCriteria(targetClass, this.criteria, (Map)args[0]);
    			PagedResultList pagedRes = new PagedResultList(this.criteria.list());
    
    			// Updated the paged results with the total number of records
    			// calculated previously.
    			pagedRes.setTotalCount(totalCount);
    			result = pagedRes;
    		}
    
    	}
    }
    
    

    PagedResultList類除了實現List接口外,添加了totalCount屬性即記錄總數,然后view層max和offset參數來控制分頁就可以了,非常的方便
            //params已有order、sort、max、offset的分頁排序信息
            params.max = Math.min(params.int('max') ?: 15, 100)
            def criteria = CellPhoneModel.createCriteria();
            def pageList = criteria.list(params, {
              if(params['factory.id'])
                factory {
                  eq("id",params.long('factory.id'))
                }
              if(params.keyword)
                like("abbreviateName","%${params.keyword}%")
             });
    	 
    


    等有空再說說Grails Security結合Named URL Mappings功能簡化Requestmap配置的問題

    已有 3 人發表留言,猛擊->>這里<<-參與討論


    ITeye推薦



    posted on 2010-04-15 11:31 溫水青蛙 閱讀(1027) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲无砖砖区免费| 九九精品免费视频| 亚洲av无码一区二区三区四区| 日日噜噜噜噜夜夜爽亚洲精品 | 在线观看亚洲免费| 久久aⅴ免费观看| a级毛片免费观看网站| 亚洲人成网站免费播放| 精品亚洲A∨无码一区二区三区| 亚洲精品无码专区2| 国产在线观看免费完整版中文版 | 国产亚洲成av人片在线观看| 免费在线观看污网站| 在线播放高清国语自产拍免费| 7x7x7x免费在线观看| 99在线视频免费| 免费看男人j放进女人j免费看| 一级成人生活片免费看| 国产一区二区三区亚洲综合| 亚洲另类无码专区丝袜| 国产亚洲精品bv在线观看| 亚洲国产精品人久久电影| 无码久久精品国产亚洲Av影片 | a毛片全部免费播放| 国产福利免费视频| 国产成人无码精品久久久久免费| 免费无码AV一区二区| 激情小说亚洲色图| 自拍偷自拍亚洲精品偷一| 亚洲AV色无码乱码在线观看| 亚洲熟女综合色一区二区三区| 亚洲国产综合精品中文第一| 亚洲字幕AV一区二区三区四区| 亚洲免费在线视频播放| 亚洲va乱码一区二区三区| 久久精品国产99国产精品亚洲| 亚洲av无码一区二区三区观看| 国产成人亚洲精品狼色在线| 毛片a级毛片免费播放下载| 无码国产精品一区二区免费式影视 | 国产在线观看免费av站|