侯燕玫
摘要:为了方便用户使用,多数网站都采用了页面导航。而在JSF2.0中,为了方便进行页面导航,增加了RESTful导航的内容,这很大程度的改善了JSF框架。该文着重介绍了JSF2.0中的RESTful导航方式,并对其导航处理进行了分析。
关键词:导航;重定向;表述性状态转移
中图分类号:TP311文献标识码:A文章编号:1009-3044(2012)07-1546-02
Exploring the RESTful Navigation Way in JSF2.0
HOU Yan-mei
(Dept. of Information,Capital University of Economic and Business, Beijing 100070, China)
Abstract: In order to facilitate the user use, many web sites are adopting page navigation. And in JSF2.0, in order to facilitate assessment page navigation, increased the RESTful navigation elements, which greatly improved the JSF framework. This paper introduces the RESTful navigation way in JSF2.0, and analyzed the navigation processing.
Key words: navigation; redirection; RESTful
2009年基于组件的框架的JSF2.0正式发布了,伴随而来的是更简单的操作,更完美的整合,更规范的标准,以及对更多技术的支持等等。而在这种种变化中,不难发现Web页面导航也在发生着巨大的变化。导航最原始的定义是通过绑定到超媒体信息上的超链接在页面间跳转的动作。而在今天网络信息爆炸的情况下,导航的作用已不能局限于页面间的跳转,还包括程序信息的传递和转移。JSF提供了多种导航方式,尤其是新发布的JSF2.0,其更加丰富了页面导航方式的种类。而在多种导航方式中最引起人们注意的还是RESTful的导航方式。
默认情况下,JSF应用程序像服务器产生一系列的POST请求。每一个POST请求包含格式化的数据。这对于需要用户输入信息的应用程序是很有意义的。但是我们知道,在许多程序中,我们并不需要输入任何信息,只是通过简单的单击超级链接或是按钮来实现页面间的跳转。还有另外重要的一点,为了通过重访URL能够返回到同一页面,相应的链接都应该是可标示的,所有的页面都是缓存的。但是,POST请求在标示或者缓存上是无效的,这为创建高效的网页造成了很大的阻碍。
1 RESTful简介
为了解决这个问题,JSF2.0提出了一种被称为REST(Representational State Transfer)的风格的设计理念,它倡导页面应该像HTTP事先预想的那样工作。查找应该使用GET请求。PUT,POST和DELETE请求应该用来创建、修改和删除。
GET请求用来查找信息,如http://myserver.com/animals?kind=fish,这即是一种RESTful。但是GET请求不能用来更新信息。如为动物增加一个新的种类就是不恰当的。GET请求应该是等幂的。简单的说就是指第二次提出请求与第一次提出应该是没有什么不同的。但对于动物来说提出两次请求就是增加两种动物。这也说明在一个大的应用程序中,POST请求在上下文是非常恰当的。因此,RESTful网页需要共享部分POST请求,仅仅依靠GET请求是不可能完成全部任务的。
一般的,JSF对于产生或是使用URL并没有一个标准的机制,但是从JSF2.0开始,RESTful支持GET请求。我们将在下面的段落中详细介绍。
2 RESTful中的GET请求
2.1视图参数
http://myserver.com/ animals?kind=fish语句中,动物的种类名称kind被作为查询参数。当服务器端收到该请求时,参数值被转换为相应的bean值,这就是使用视图参数的目的。
在页面的顶端加上如下标签:
处理请求时,种类kind的值被传递给animals类的setCurrentKind()方法。
JSF页面可以有很多视图参数。和其他请求参数一样,视图参数可以被转换和验证。
2.2 GET请求链接
使用h:commandButton和h:commandLink标记会产生POST请求,为了使用户能够用GET请求进行导航,需要通过使用h:button或是h:link标记在页面添加发送GET请求的按钮或是链接。
对于这些请求,需要控制目的视图ID和查询参数。目的视图ID由outcome属性确定,而其属性值可以是一个固定值,如:
或者也可以选择提供一个值表达式:
此时,getOutcome()方法被激活并一定会产生一个结果字符串。结果字符串以普通方式放入到导航处理中,产生目标视图ID。
GET请求链接中的outcome属性在页面呈现之前被计算,链接被嵌入到页面中。
2.3指定请求参数
在大多数情况下,向服务器发送一个请求而没有任何请求参数是没有什么意义的。如果没有请求参数,服务器就得不到上下文数据,也无法根据上下文数据为客户创建“个性化”的响应。
GET请求链接的参数来源于:
1)结果字符串
2)视图参数
3)嵌入在f:param标签中
当结果字符串作为请求参数时,导航处理器从目标视图ID结果中取下原始参数并将其计算后的结果添加为新的参数。如:
示例中,导航处理首先会从取下outcome的参数index?q=1,将其计算。由于JSF中规定:
1)如果outcome属性值没有文件扩展名,附加上当前视图的扩展名。
2)如果outcome属性值不是以/开头,首先考虑当前视图的路径。
这里,我们假设当前视图扩展名为.xhtml,则计算的结果为/index.xhtml?q=1,将其添加为目标视图ID的新的outcome的值。
当outcome属性的值是复合参数时,要使用分隔符&。如:
GET请求的参数也可以由视图参数提供,对于查询语句中包含的参数,可以简单的添加一条语句:
这样即可实现一个页面的所有视图参数成功传递到另一个页面,这一点也是RESTful应用中的普遍要求。
当下一个页面所需要的参数与当前页面参数并不完全一致时,JSF提供了f:param标签,它可以覆盖这些视图参数。如:
这样新设置的quizBean.currentProblem + 1的值便替代了上一个页面中提供的q的取值。
2.4重定向链接
JSF可以实现重定向到新的视图。JSF发送HTTP重定向到客户端。重定向响应告诉客户端下一个页面使用哪个URL。之后客户端产生GET请求获得相应的URL。即:一个重定向链接,也是一个GET请求。有语句如:
该语句表示其实现重定向的同时,还可以传递所有的视图参数到下一个页面。但是因为重定向语句中不能使用f:param标签,所以我们可以在相应的XML配置文件中指定导航规则,使用include-view-params属性和嵌入式的view-param标签:
因为重定向允许浏览器更新地址,一般作为书签的页面可以使用redirect元素。
3结束语
对于简单的应用程序,不需要使用导航规则。命令按钮和链接可以返回简单的结果来指定下一次呈现的页面,然而,如果有更复杂的需求,使用JSF框架是必需的工具,使用恰当的导航规则是必要的。
而在多种导航方式中,RESTful导航将信息显示在地址栏中,尽管对于有些信息内容这样是不安全的,但这样使用get请求的页面能够一个单独的可标示的标签加到收藏夹中,而在JSF中POST请求的页面是不可以这样的。
同时,注意到GET请求链接中的outcome属性是在页面呈现之前就已经被计算,并且链接已被嵌入到页面中。利用这个特点,可以便捷高效的实现页面间的跳转,尤其是当一个页面到另一个页面的跳转是必然结果时。如在很多类型的网站中,用户想要更好的使用网站都要进行登录操作,用户登录后是要显示网站首页的,这时在登录成功页面嵌入自动跳转到首页的链接,这样登录后的即可快速显示首页内容。当网页内容较多需要分页显示时,可以在“下一页”的链接中采用GET请求,这样可以直接将下一页的内容嵌入到当前页中,将内容整合在一起,可以保持用户阅读的流畅性。
参考文献:
[1]吴庆涛,王成良. ASP.NET2.0的Web页面导航方式比较与选择[J].电脑知识与技术:学术交流, 2007,3(14).
[2] Geary D,Horstmann C.JavaSever Faces核心编程[M].北京:电子工业出版社,2005.
[3]杨俊生,唐琳.JSP開发技术[M].北京:清华大学出版社,2011.
[4]缪勇.JSP网络开发逐步深入[M].北京:清华大学出版社,2010.