如何快速启动一个Java Web编程框架
- 格式:docx
- 大小:23.07 KB
- 文档页数:11
如何快速启动一个Java Web编程框架RSF,不像其他的Java Web框架,主要侧重于标记和网页设计师的作用。
网页设计师不会被框架产生的标记而限制,也不是被迫围绕内嵌代码或是伪代码来设计。
模板是纯粹的XHTML不需要框架知识来创建或是维护。
这个创建了完全分离的显示和Java代码隐藏。
网页设计师和开发者可以独立工作,而且不需要协调他们的工作,这个你将在示例程序中看到。
RSF目的在于用零服务器环境创建一个框架,这样可以通过在循环的最后扔掉组件树来节省宝贵的服务器资源。
这个有别于很多常见的Java框架,例如JSF,凭借框架执行的第一个动作来恢复使用从先前要求中出现的组件树。
Session状态是以此来减小较低利用的服务器资源。
RSF目的是通过遵循一个严格的POST->GET重定向以便保留所有的GET请求幂等来遵循在服务器上的正确而有效的浏览器行为。
这样,POST纯粹是用来发送数据到服务器上的,而GET是用来返回数据到浏览器上的。
这个可以解决很多问题,就是其他框架所面对的浏览器返回钮行为或是深层链接问题。
Recipe List Application为了演示这些RSF核心组件的主要目的,我们来构建一个非常简单的recipe list应用程序。
这个程序将创建一个项目列表,通过允许用户通过网络形式添加更多的项目。
这个简单的任务将展示很多的功能包括:模板建设,链接行为,简单的国际化和表格粘贴。
为了开始这个简单的程序,首先你需要为RSF准备好一个环境。
RSF的wiki网站有一个很棒的指导来安装RSF Development Environment,但是不在本文的讨论之内。
一旦完成安装,你可以通过在程序中创建XHTML模板来开始程序了。
如上述所提到的,这些都是纯粹的XHTML模板,用它们唯一所关心的外观所建立的。
对于这个简单的程序,要有两页,所以你需要创建两个XHTML模板:recipelist.html< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""/TR/xhtml1/DTD/xhtml1-transitional.dtd">< html xmlns:rsf="/rsf" xmlns="/1999/xhtml" lang="en" xml:lang="en"> < head>< meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> < title rsf:id="msg=title">Recipe List< /title>< link href="../css/styles.css" type="text/css" rel="stylesheet" media="all"/> < /head>< body>< h1 rsf:id="msg=header">Recipe List< /h1>< ul rsf:id="message-for:*" style="margin:0px;">< li>Message for user here< /li>< /ul>< h4 rsf:id="current_count">There are currently {0} item(s).< /h4>< ul>< li rsf:id="current_items:">< span rsf:id="row_item">An Item< /span>< /li>< /ul>< a rsf:id="add_item">Add an Item< /a>< /body>< /html>itemForm.html< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""/TR/xhtml1/DTD/xhtml1-transitional.dtd">< html xmlns:rsf="/rsf" xmlns="/1999/xhtml" lang="en" xml:lang="en"> < head>< meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> < title rsf:id="msg=title">Recipe List< /title>< link href="../css/styles.css" type="text/css" rel="stylesheet" media="all"/> < /head>< body>< h1 rsf:id="msg=header">Recipe List< /h1>< ul rsf:id="message-for:*" style="margin:0px;">< li>Message for user here< /li>< /ul>< form rsf:id="form">< fieldset>< legend rsf:id="msg=form_legend">Add an Item to the List< /legend>< ol>< li>< label rsf:id="msg=label_item">Item:< /label>< input type="text" rsf:id="item" />< /li>< /ol>< div class="buttonwrap">< input type="submit" rsf:id="submit" value="Submit" />< /div>< /fieldset>< /form>< /body>< /html>正如以上所看到的,这些是几乎完全有效的XHTML文件,除了额外的一个单一属性,rsf:id=""。
这个是RSF在模板中所代表的唯一机制。
事实上,这些模板可以在任何网页浏览器(是忽略额外属性的浏览器)中看到并且可以被验证。
任何在模板中的文本或是其他的特性包括rsf:id属性将通过RSF被覆盖,所以模板可以包含如你所希望的"假数据"。
这是极其有益的,通过允许假内容的存在,让设计者与开发者对标记结构的意图进行沟通。
恰当的rsf:id值列表是唯一的契约可以让设计者和开发者必须互相维持。
只要相同的ID以语义上相同的方法来运用,这个想法就会工作。
rsf:id标签指定一个ID让RSF rendering engine有地方连线它的数据。
带有冒号(:)的ID使用是一个特殊的协议就是告诉rendering engine这个XHTML节点可能会重复。
为了支持国际化,另一个特殊的标签协议是用于直接将文本从一个标准的Java属性组合中提取出来。
这个使得开发者通过简单定义一个特殊的rsf:id="msg=property_key"直接连线rsf:id到一个properties bundle key 。
对于这个应用程序,所有的页面文本都被拖动到以下的属性捆绑中。
messages.propertiestitle = Recipe Listheader = Recipe Listform_legend = Add an Item to the Listlabel_item = Item:current_items_count = There are currently {0} item(s).一旦你开始使用这些模板,你必须为每一个模板创建一个Component Producer。
在RSF中的一个component producer是一种机制让Java中组件树可以在其中构建。
每一个producer执行ViewComponentProducer接口并且有一个相应的ViewID,可以与模板的文件名相匹配。
重载方法fillComponents是组件树构建的地方,用以在模板中符合rsf:ids。
参数UIContainer tofill作为组件树(这里可以添加所有的组件)的一个父元素。
producer将为recipe list的项目构建组件树,如下:RecipeListProducer...public class RecipeListProducer implements ViewComponentProducer, DefaultView {public static String VIEW_ID = "recipelist";public String getViewID() {return VIEW_ID;}private RecipeListService service;public void setService(RecipeListService service) {this.service = service;}public void fillComponents(UIContainer tofill, ViewParameters viewparams, ComponentChecker checker) {//Build Recipe ListList< String> items = service.getItems();UIMessage.make(tofill, "current_count", "current_items_count", new Object[] {items.size()});for (String item : items){//Create a new < li> elementUIBranchContainer row = UIBranchContainer.make(tofill, "current_items:");UIOutput.make(row, "row_item", item);}//Create Link to Add Item FormUIInternalLink.make(tofill, "add_item", new SimpleViewParameters(ItemFormProducer.VIEW_ID));}}有了这个producer,一些主要的概念被采用了,还有一些RSF的内置组件。