现在的位置: 首页 > 综合 > 正文

cetia4 1.1文档- 2.5 RenderContext

2014年02月05日 ⁄ 综合 ⁄ 共 2443字 ⁄ 字号 评论关闭

在前面的例子中所有的render方法都有一个类型为RenderContext的参数。上面曾经说过这是一个接口定义了访问requestresponseconfig对象的一般方法(seesion对象可以从request对象中获取,context引用可以从cofig对象获取)。这样的机制可以使框架可以用在REST servletnon-Rest portlet的环境,使用同样的方法而不是jsf api。最简单的方式,RenderContext实现了普通servlet的相关功能的薄facade接口,如下图所示:

 

但是RenderContext实现的不止这些,他还有自己特有的功能。他还提取了一些不同于传统web应用和web service应用的功能。这两种模式的主要区别在于,传统的web模式是由状态的,浏览器打开一个session,让后用户开始交互,如果有要求的话,会存储和检索session范围的数据(但是一些web开发方法更倾向于不使用session数据以提高扩展性伸缩性)。而在web service模式中,由框架实现的,交互也是无状态的,session的访问是不允许的,但是访问包装的对象是可能的。

 RenderContext的下面的方法在http参数下工作:

public String getParameter( String param )

public Map<String,String[]> getParameterMap()

第一个函数可以得到单个的参数,第二个函数可以得到所用的参数,可以使用这种方法来手工的映射表单数据到对象。Framework也实现了自动映射功能,这些内容将来后面的章节讨论。

 

web框架中一个很有用的功能就是请求级别,会话级和application级别的attribute管理。RenderRequest也提供了很便利的方法来获取各个级别的属性。

 

public Object getRequestAttribute( String key )

public Object getSessionAttribute( String key )

public Object getContextAttribute( String key )

 

正如我以前所说的,在无状态的web service环境中,访问session是不允许的;调用getSessionAttribute() 和调用getRequestAttribute()是一样的.这种行为第一次开来很奇怪,但是它增强控制器代码的重用,可以在有状态的传统web请求中和无状态的web service中使用同一种方法。同样,在jsp中的EL表达式也可以在多个域中查找对象,可以现在request级别查找,之后在session中查找。 框架的这种设计理念的在很多的应用中可能很小或者可以忽略不计。但是必须关注它,因为它可以导致使人沮丧的惊奇。

 

但是,某些开发者可能对这种行为感到很不适宜,但是幸运消息的是这些功能可以轻易的被回避。这些将在后面的章节解释。

上述的方法有他们对应的setter方法:

public void setRequestAttribute( String key, Object value )

public void setSessionAttribute( String key, Object value )

public void setContextAttribute( String key, Object value )

各个作用域的删除属性的方法如下:

Finally, removal methods for each scope are also implemented:

public void removeRequestAttribute( String key )

public void removeSessionAttribute( String key )

public void removeContextAttribute( String key )

The following code shows a typical example showing the usage of some of these

methods.

下面展示了使用这些方法的典型例子:

public String render( RenderContext context )

{

SearchFilter filter = ( SearchFilter )

context.getSessionAttribute( "topics_filter" );

if( filter == null )

{

filter = new SearchFilter();

context.setSessionAttribute( "topics_filter", filter );

}

List topics = getTopics( filter );

context.setRequestAttribute( "topics", topics );

return "display_topics";

}

 

如果上面的代码运行在一个典型的web请求,那么session属性"topics_filter"   request 属性 "topics" 将被设置.但是如果上面代码运行在web service 请求,那么"topics_filter" "topics" a都被设置在request级别。在这种情况下,第一次调用 getSessionAttribute()将会返回一个null值,因为service是无状态的,没有先前的东西存贮在session中。

同样的使用Configuration object 对象提供的getConfiguration()接口来访问初始的参数;但是这个方法比正常的servlet API灵活,我们将在Configuration t一节详细讨论细节.另一方面,访问Servlet API接口的方法将在下一节谈论。一些有用的方法也会提供。想了解完整的参考,请查看Javadoc文档关于RenderContext接口和他的扩展类的介绍。

 

抱歉!评论已关闭.