该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2008-07-31
cnoss 写道 ayufox 写道 看了LZ的DEMO程序,问两个问题:
1.从下面配置来看,看起来似乎不支持内容协商以支持一种资源有多种表述的情形? 如果支持,是如何支持的? @PageFlow( success = @PageInfo(url = "/template/contacts.vm",render=ViewRenderType.VELOCITY), error = @PageInfo(url = "/template/error.vm",render=ViewRenderType.VELOCITY)) 2.没有看到能手工控制HTTP缓存的迹象,支持否? [list=1] @Get @Path("/contacts") @PageFlow( success = @PageInfo(url = "/template/contacts.vm",render=ViewRenderType.VELOCITY), error = @PageInfo(url = "/template/error.vm",render=ViewRenderType.VELOCITY)) @ProduceMime({MimeType.MIME_OF_JAVABEAN,MimeType.MIME_OF_JSON,MimeType.MIME_OF_TEXT_HTML}) public Page<Contact> listContacts(int pageIndex, int pageSize) { return this.domain.listContacts(pageIndex, pageSize); } [/list] 如果我需要的多个表述都需要需要特定的处理页面(譬如对于html结果的表述和xml结果的表述),如上该如何设置? 另外 1)支持Accept-Launguage否?譬如我可能希望根据浏览器的语言返回特定的语言的表述。 2)支持手工处理缓存证实否?譬如对于一些条件GET请求,我可能不希望返回一个大结果集以浪费带宽,而仅仅是 返回一个304 Not Modified |
|
返回顶楼 | |
发表时间:2008-07-31
^_^希望在提供简单的模式处理一些通常的需求之外,能够提供更多的灵活性以控制可能稍微比较“变态”的需求
|
|
返回顶楼 | |
发表时间:2008-07-31
ayufox 写道 如果我需要的多个表述都需要需要特定的处理页面(譬如对于html结果的表述和xml结果的表述),如上该如何设置?
不支持对不同表述提供不同页面模板来渲染,我个人认为这个使用场景不多。 ayufox 写道 另外 1)支持Accept-Launguage否?譬如我可能希望根据浏览器的语言返回特定的语言的表述。 2)支持手工处理缓存证实否?譬如对于一些条件GET请求,我可能不希望返回一个大结果集以浪费带宽,而仅仅是 返回一个304 Not Modified
|
|
返回顶楼 | |
发表时间:2008-07-31
cnoss 写道 ayufox 写道 如果我需要的多个表述都需要需要特定的处理页面(譬如对于html结果的表述和xml结果的表述),如上该如何设置?
不支持对不同表述提供不同页面模板来渲染,我个人认为这个使用场景不多。 呵,这个场合景对现在我面向的需求来说确实很现实的,对于浏览器的请求,返回html表述,而对于程序性的调用(API),希望返回的是XML结果(我希望用更好的方式来展示我的XML,而不是默认规则生成的XML) |
|
返回顶楼 | |
发表时间:2008-07-31
ayufox 写道 ^_^希望在提供简单的模式处理一些通常的需求之外,能够提供更多的灵活性以控制可能稍微比较“变态”的需求
非常感谢你的支持与建议,一个人考虑的问题始终有限,而且在实际应用场景下,我们会碰到许多不可预见的问题。 BTW,我明天再回答你的问题,今天女儿眇着要睡觉。 |
|
返回顶楼 | |
发表时间:2008-07-31
@PageFlow在实现的时候,是否可以考虑这样子:只指定后缀部分,前缀部分根据MimeType来决定,譬如配置
@PageFlow( success = @PageInfo(url = "/contacts.vm")) 对于html表述,是/html/contacts.vm,对于XML,则是/xml/contacts.vm |
|
返回顶楼 | |
发表时间:2008-07-31
cnoss 写道 ayufox 写道 ^_^希望在提供简单的模式处理一些通常的需求之外,能够提供更多的灵活性以控制可能稍微比较“变态”的需求
非常感谢你的支持与建议,一个人考虑的问题始终有限,而且在实际应用场景下,我们会碰到许多不可预见的问题。 BTW,我明天再回答你的问题,今天女儿眇着要睡觉。 |
|
返回顶楼 | |
发表时间:2008-09-08
各位好,有一阵没有更新JRest4Guice了,最近做了一些调整:
代码片段: @Transactional//事务支持,缺省为TransactionalType.REQUIRED,可以在方法中覆写 @Interceptors({//自定义的拦截器(类级别的,作用于所有的方法,可以在方法中覆写) @Interceptor(TestInterceptor.class), @Interceptor(LogInterceptor.class) }) public class ContactService{ //注入实体管理器 @Inject private BaseEntityManager<String, Contact> entityManager; @Transactional(type=TransactionalType.READOLNY)//覆盖类级别的事务类型为只读 @Interceptor(ListContactsInterceptor.class)//覆盖类级别的拦截器 public Page<Contact> listContacts(int pageIndex, int pageSize) throws RuntimeException { return this.entityManager.pageByNamedQuery("list", new Pagination(pageIndex, pageSize)); } } |
|
返回顶楼 | |
发表时间:2008-09-13
|
|
返回顶楼 | |
发表时间:2008-10-09
最新动态,新增加对IBatis的支持!!!
在支持xml配置方式的基础上增加了对annotation的支持,用户可以根据自己的喜好来选择或者两种方式并存。 详情:http://www.rest4g.org/viewthread.php?tid=12&extra=page%3D1 示例代码: @IbatisDao @SuppressWarnings("unchecked") @Transactional @ResultMap(id = "accountResultMap", result = { @Result(property = "id", column = "id"), @Result(property = "firstName", column = "firstName"), @Result(property = "lastName", column = "lastName"), @Result(property = "emailAddress", column = "emailAddress") }, resultClass = Account.class) @Cachemodel(id = "account-cache", flushInterval = "24", flushOnExecute = { "insertAccount", "updateAccount", "deleteAccount" }, type = "LRU", property = { @Property(name = "size", value = "100") }) public class AccountService { @Inject private SqlMapClient sqlMapper; @Select(id = "selectAllAccounts", sql = "select * from ACCOUNT", resltMap = "accountResultMap", cacheModel = "account-cache") @Transactional(type = TransactionalType.READOLNY) public List<Account> findAll() throws SQLException { return sqlMapper.queryForList("selectAllAccounts"); } @Select(sql = "select id ,firstName,lastName,emailAddress from " + "ACCOUNT where id = #id#") @Transactional(type = TransactionalType.READOLNY) public Account getAccountById(int id) throws SQLException { return (Account) sqlMapper.queryForObject("getAccountById", id); } @Insert(id = "insertAccount", sql = "insert into ACCOUNT (id,firstName," + "lastName,emailAddress) values (#id#, #firstName#, #lastName#, " + "#emailAddress#)") public void createAccount(Account account) throws SQLException { sqlMapper.insert("insertAccount", account); } @Update(sql = "update ACCOUNT set firstName = #firstName#,lastName = " + "#lastName#,emailAddress = #emailAddress# where id = #id#") public void updateAccount(Account account) throws SQLException { sqlMapper.update("updateAccount", account); } @Delete(id = "deleteAccount", sql = "delete from ACCOUNT where id = #id#") public void deleteAccount(int id) throws SQLException { sqlMapper.delete("deleteAccount", id); } @Select(id = "queryAccounts", sql = "select * from ACCOUNT " + "<dynamic prepend=\"where\">" + " <isNotNull prepend=\"and\" property=\"firstName\">" + " firstName = #firstName#" + " </isNotNull>" + " <isNotNull prepend=\"and\" property=\"lastName\">" + " lastName = #lastName#" + " </isNotNull>" + " <isNotNull prepend=\"and\" property=\"emailAddress\">" + " emailAddress = #emailAddress#" + " </isNotNull>" + "</dynamic> " + "order by lastName", resltMap = "accountResultMap", cacheModel = "account-cache") @Transactional(type = TransactionalType.READOLNY) /** * 动态SQL查询 */ public List<Account> queryAccounts(Account account) throws SQLException { return sqlMapper.queryForList("queryAccounts",account); } } |
|
返回顶楼 | |