论坛首页 Java企业应用论坛

一个Java的Restful服务框架,支持JPA、JAAS、分布式资源对象

浏览 30460 次
该帖已经被评为精华帖
作者 正文
   发表时间: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]
  • 通过@ProduceMime显示声明所限定支持的内容表述方式,如果没有声明,系统会根据用户端的请求类型返回系统内置的(html/json/xml/javabean/text)表述形式,用户可以很方便的通过实现ResponseWriter接口来增加新的表述形式,并通过ResponseWriterRegister的registResponseWriter来注册。
  • 	@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
    0 请登录后投票
       发表时间:2008-07-31  
    ^_^希望在提供简单的模式处理一些通常的需求之外,能够提供更多的灵活性以控制可能稍微比较“变态”的需求
    0 请登录后投票
       发表时间:2008-07-31  
    ayufox 写道
    如果我需要的多个表述都需要需要特定的处理页面(譬如对于html结果的表述和xml结果的表述),如上该如何设置?

    不支持对不同表述提供不同页面模板来渲染,我个人认为这个使用场景不多。

    ayufox 写道

    另外
    1)支持Accept-Launguage否?譬如我可能希望根据浏览器的语言返回特定的语言的表述。
    2)支持手工处理缓存证实否?譬如对于一些条件GET请求,我可能不希望返回一个大结果集以浪费带宽,而仅仅是
    返回一个304 Not Modified

    1. 也不支持Accept-Launguage,这个功能可以在模板中通过多语言标签来实现。
    2. 支持手工处理缓存这个可以实现。

    0 请登录后投票
       发表时间:2008-07-31  
    cnoss 写道
    ayufox 写道
    如果我需要的多个表述都需要需要特定的处理页面(譬如对于html结果的表述和xml结果的表述),如上该如何设置?

    不支持对不同表述提供不同页面模板来渲染,我个人认为这个使用场景不多。

    呵,这个场合景对现在我面向的需求来说确实很现实的,对于浏览器的请求,返回html表述,而对于程序性的调用(API),希望返回的是XML结果(我希望用更好的方式来展示我的XML,而不是默认规则生成的XML)
    0 请登录后投票
       发表时间:2008-07-31  
    ayufox 写道
    ^_^希望在提供简单的模式处理一些通常的需求之外,能够提供更多的灵活性以控制可能稍微比较“变态”的需求


    非常感谢你的支持与建议,一个人考虑的问题始终有限,而且在实际应用场景下,我们会碰到许多不可预见的问题。

    BTW,我明天再回答你的问题,今天女儿眇着要睡觉。
    0 请登录后投票
       发表时间:2008-07-31  
    @PageFlow在实现的时候,是否可以考虑这样子:只指定后缀部分,前缀部分根据MimeType来决定,譬如配置
    @PageFlow(
    success = @PageInfo(url = "/contacts.vm"))
    对于html表述,是/html/contacts.vm,对于XML,则是/xml/contacts.vm
    0 请登录后投票
       发表时间:2008-07-31  
    cnoss 写道
    ayufox 写道
    ^_^希望在提供简单的模式处理一些通常的需求之外,能够提供更多的灵活性以控制可能稍微比较“变态”的需求


    非常感谢你的支持与建议,一个人考虑的问题始终有限,而且在实际应用场景下,我们会碰到许多不可预见的问题。

    BTW,我明天再回答你的问题,今天女儿眇着要睡觉。


     
    0 请登录后投票
       发表时间:2008-09-08  
    各位好,有一阵没有更新JRest4Guice了,最近做了一些调整:

    1. 将rest从核心应用中分离了出来 (重构)
    2. 增加了Struts2的插件,可以脱离JRest4Guice,在struts2中使用除了rest功能之外的所有功能(jpa、事务、权限、拦截器等)(新增)
    3. 优化了事务的声明,允许声明在类上,不用在每个方法都去声明 (增强)
    4. 增加了对自定义拦截器的支持(新增)
    5. 优化了BaseEntityManager的注入方式,不再需要通过init方式来由用户构造 (增强)
    6. 增强了对View部分处理,根据模板的扩展名自动选择渲染引擎,并增加了重定向的支持 (增强)
    7. 支持Hibernate validator(新增)
    8. 完善了demo,增加了非AJAX环境下的使用案例(新增)


    代码片段:

    @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));
    	}
    }
    
    9 请登录后投票
       发表时间:2008-09-13  
    非常感谢 CTE 团队的杰出贡献 JRest4Guice 已经将 CTE 作为缺省模板引擎。
    0 请登录后投票
       发表时间: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);
    	}
    }
    
    0 请登录后投票
    论坛首页 Java企业应用版

    跳转论坛:
    Global site tag (gtag.js) - Google Analytics