导航
页面之间的导航是通过forwards, redirects 及设置页面模板的路径来实现的 。
Forward
为了迁移到另一个页面, 可以通过使用Servlet的RequestDispatcher来设置Page的forward属性.
例如通过路径index.htm来迁移到另一个页面。
/**
* @see Page#onPost()
*/
public void onPost() {
// Process form post
..
setForward("index.htm");
}
上述代码将调用一个新的映射为路径index.htm的page类。
Note: 当一个请求被定位到另一个页面时, 此时, 位于第二个页面的控件仍未被执行。
这样可以防止混乱和bug。
如:位于第二个页面的一个表单试图提交来自第一个页面的post请求。
传递迁移参数
当你迁移到另一个页面时, 请求参数将被保存。这是一个使用request来传递状态信息的简单方式。
例如你可以通过增加一个用户自定义对象来作为请求参数用于在迁移后的页面上来显示该对象。
public boolean onViewClick() {
Long id = viewLink.getValueLong();
Customer customer = CustomerDAO.findByPK(id);
// Set the customer object as a request parameter
getContext().setRequestAttribute("customer", customer);
setForward("view-customer.htm");
return false;
}
上面的代码片段用于迁移到view-customer.htm
<html>
<head>
<title>Customer Details</title>
</head>
<body>
<h1>Customer Details</h1>
<pre>
Full Name: $customer.fullName
Email: $customer.email
Telephone: $customer.telephone
</pre>
</body>
</html>
请求属性被自动地添加到Velocity 上下文对象中, 所以在后面的页面模板中请求参数也是可用是。
Page Forwarding
Page Forwarding是页面间传递信息的另一种方式。 在这种情况下, 你使用 createPage() 来创建
迁移用的页面并在Page类中直接设置属性。最后, 你将此Page设置为你将要迁移的页面。例如
public boolean onEditClick() {
Long id = viewLink.getValueLong();
Customer customer = CustomerDAO.findByPK(id);
// Create a new EditPage instance based on the specified path
EditPage editPage = (EditPage) getContext().createPage("/edit-customer.htm");
editPage.setCustomer(customer);
setForward(editPage);
return false;
}
当用createPage()方法建立一个Page时, 应确保你的页面路径以“/”字符开始。
如果Page的路径唯一, 你也可以使用对应的class来指定目标page。(尽管有些特殊,但有时也可能
会存在多个路径对应一个相同的class, 在这种情况下, 如果你调用Context.createPage ()将会抛
出一个异常, 因为Click不能决定该使用哪个路径)
使用这个技术,如上的代码可以修改为:
public boolean onEditClick() {
Long id = viewLink.getValueLong();
Customer customer = CustomerDAO.findByPK(id);
// Create a new EditPage instance based on its class
EditPage editPage = (EditPage) getContext().createPage(EditPage.class);
editPage.setCustomer(customer);
setForward(editPage);
return false;
}
这种Page forwarding 技术可以提供编译期安全并能让你摆脱代码指定路径的繁琐。