在前面的例子中所有的render方法都有一个类型为RenderContext的参数。上面曾经说过这是一个接口定义了访问request,response,config对象的一般方法(seesion对象可以从request对象中获取,context引用可以从cofig对象获取)。这样的机制可以使框架可以用在REST servlet和non-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接口和他的扩展类的介绍。