<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 溫水青蛙 閱讀(1028) 評論(0)  編輯  收藏

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


    網站導航:
     
    主站蜘蛛池模板: 国产精品一区二区三区免费| 亚洲动漫精品无码av天堂| 一级午夜免费视频| 免费毛片在线看片免费丝瓜视频 | 亚洲午夜av影院| 亚洲国产成人片在线观看无码| 日韩在线一区二区三区免费视频| 日韩免费视频观看| 亚洲国产AV一区二区三区四区| 香港特级三A毛片免费观看| 中文字幕免费在线播放| 亚洲人成色7777在线观看不卡| 日亚毛片免费乱码不卡一区| 亚洲精品在线视频| 中文字幕免费在线视频| 婷婷久久久亚洲欧洲日产国码AV| 99在线在线视频免费视频观看 | 中文字幕亚洲一区| 最好免费观看高清在线| 最近的中文字幕大全免费版| 日本亚洲精品色婷婷在线影院 | 国产亚洲AV夜间福利香蕉149| www在线观看播放免费视频日本| 亚洲色欲色欲www在线丝| 一个人免费视频在线观看www | 美女羞羞视频免费网站| 亚洲精品无码日韩国产不卡?V| 国产精品成人免费观看| 精品无码一区二区三区亚洲桃色| 韩国亚洲伊人久久综合影院| 亚洲国产精品无码久久青草 | 久久亚洲2019中文字幕| 亚洲色偷精品一区二区三区| 免费国产人做人视频在线观看| 久久精品国产亚洲AV无码偷窥| 少妇高潮太爽了在线观看免费 | 亚洲综合婷婷久久| 免费黄网在线观看| 亚洲一区精品视频在线| 免费**毛片在线播放直播| 免费观看久久精彩视频|