<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)  編輯  收藏

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


    網站導航:
     
    主站蜘蛛池模板: 国产精品福利片免费看| 美女免费视频一区二区三区| 毛片a级三毛片免费播放| 91福利免费视频| 亚洲国产日韩一区高清在线 | 国产99视频免费精品是看6| 亚洲天堂2017无码中文| 天天看免费高清影视| 国产青草亚洲香蕉精品久久| 亚洲福利精品电影在线观看| WWW国产成人免费观看视频| 亚洲中文字幕久久精品无码APP| 中文字幕在线免费看| 免费无码不卡视频在线观看| 亚洲AV无码专区国产乱码不卡| 国产极品美女高潮抽搐免费网站| 亚洲av综合日韩| 2048亚洲精品国产| 鲁丝片一区二区三区免费| 亚洲专区先锋影音| 日韩吃奶摸下AA片免费观看 | 亚洲视频中文字幕在线| 国产免费的野战视频| 亚洲伊人久久综合影院| 99视频在线观看免费| 亚洲理论片中文字幕电影| 青青青青青青久久久免费观看| 一边摸一边爽一边叫床免费视频| 国产亚洲精久久久久久无码77777| 日韩av无码免费播放| 亚洲av日韩av综合| 亚洲国产成人乱码精品女人久久久不卡 | 亚洲视频在线免费| 亚洲男人天堂2017| 青草草在线视频永久免费| 久久九九久精品国产免费直播| 亚洲欧洲日本精品| a级日本高清免费看| 91亚洲国产成人久久精品网址| 国产一级一片免费播放| 久久精品成人免费看|