[b]Template Path[/b]
跳转到新页面的另一种可选方法是设置要被呈现的页面模板的路径。 使用这种方式需确保模板
呈现前, 模板所需要的任何东西都必须创建完毕。
我们的改进过的例子如下:
Node: customer 对象是如何传递到模板中的。 当你迁移到另一个页面时, 这种使用Page
model的方法是不合法的 , 因为在第二个Page对象被创建前, 第一个Page对象已被销毁, 任何model值都已被丢失。
[b]Redirect[/b]
Redirects是页面间导航的另一种方式,参考HttpServletResponse.sendRedirect(location)
获得更详细的资料。
redirects 所做的最大的事情是它在用户浏览器里提供了一个准确的URL,该URL用于匹配将要
呈现的页面。
redirects 的缺点是: 当请求一个页面时, 用户浏览器会创建一个往返的通信通道。 这样做
不仅耗费时间, 而且所有page和request信息将被丢失。
一个重定向到 logout.htm 的例子如下:
如果重定向位置以“/”字符串开头, 将会在重定向位置的前面加上程序上下文的路径。
例如: 当一个部署到上下文为mycorp的程序调用setRedirect("/customer/details.htm") 时,
将会把请求重定向到“"/mycorp/customer/details.htm”。
你也可以通过目标Page的class来获取重定向的路径。 例如:
当使用这种重定向方法时, 需确保目标Page class对应唯一的一个路径。
使用重定向到一个简单方式是在redirect 方法中直接指定要重定向的Page class。 例如:
[b]Redirect Parameter Passing[/b]
你可以使用URL 请求参数在重定向的页面间传递信息。 ClickServlet 会使用 HttpServletResponse.encodeRedirectURL
自动地编码URL。
在这个例子中, 用户点击一个OK按钮来确认一次支付。 onOkClick()按钮处理器获得支付
交易id, 然后使用此经过URL编码的id重定向到 trans-complete.htm。
对应trans-complete.htm 的Page类可以通过请求参数transId来获得此次交易id。
[b]Post Redirect[/b]
上面的参数传递例子也是一个Post 重定向例子。Post重定向对防止用户通过点击刷新按钮来
提交表单是非常重要的。
[b]Page Templating[/b]
Click支持Page Templating, 它可以帮助你在你个web程序中建议一个标准的试图并能
大大减少你需要维护的html代码量。
为了实现模板功能, 定义了一个基于Page的框架模板。 该基于Page的模板类覆写了Page的 getTemplate()
方法, 放回框架模板的路径。 例如:
BorderedPage 模板border.htm:
其它页面使用Velocity的 #parse指令将它们的上下文添加到此模板中,$path的值会自动地被ClickServlet
添加到VelocityContext 中。
如下提供了一个例子:
[quote]<page path="home.htm" classname="Home"/> [/quote]
Home页面的内容home.htm
当Homepage 接到一个请求时(home.htm), Velocity会将 border.htm 和home.htm融合在一起并返回。
Note :Home page定义一个被border.htm模板引用的title模型的方式。
使用相同的方式也支持Jsp模板, 请参考Click Examples 提供了例子。
跳转到新页面的另一种可选方法是设置要被呈现的页面模板的路径。 使用这种方式需确保模板
呈现前, 模板所需要的任何东西都必须创建完毕。
我们的改进过的例子如下:
public boolean onViewClick() {
Long id = viewLink.getValueLong();
Customer customer = CustomerDAO.findByPK(id);
addModel("customer", customer);
// Set the Page's path to a new value
setPath("view-customer.htm");
return false;
}
Node: customer 对象是如何传递到模板中的。 当你迁移到另一个页面时, 这种使用Page
model的方法是不合法的 , 因为在第二个Page对象被创建前, 第一个Page对象已被销毁, 任何model值都已被丢失。
[b]Redirect[/b]
Redirects是页面间导航的另一种方式,参考HttpServletResponse.sendRedirect(location)
获得更详细的资料。
redirects 所做的最大的事情是它在用户浏览器里提供了一个准确的URL,该URL用于匹配将要
呈现的页面。
redirects 的缺点是: 当请求一个页面时, 用户浏览器会创建一个往返的通信通道。 这样做
不仅耗费时间, 而且所有page和request信息将被丢失。
一个重定向到 logout.htm 的例子如下:
public boolean onLogoutClick() {
setRedirect("/logout.htm");
return false;
}
如果重定向位置以“/”字符串开头, 将会在重定向位置的前面加上程序上下文的路径。
例如: 当一个部署到上下文为mycorp的程序调用setRedirect("/customer/details.htm") 时,
将会把请求重定向到“"/mycorp/customer/details.htm”。
你也可以通过目标Page的class来获取重定向的路径。 例如:
public boolean onLogoutClick() {
String path = getContext().getPagePath(Logout.class);
setRedirect(path);
return false;
}
当使用这种重定向方法时, 需确保目标Page class对应唯一的一个路径。
使用重定向到一个简单方式是在redirect 方法中直接指定要重定向的Page class。 例如:
public boolean onLogoutClick() {
setRedirect(Logout.class);
return false;
}
[b]Redirect Parameter Passing[/b]
你可以使用URL 请求参数在重定向的页面间传递信息。 ClickServlet 会使用 HttpServletResponse.encodeRedirectURL
自动地编码URL。
在这个例子中, 用户点击一个OK按钮来确认一次支付。 onOkClick()按钮处理器获得支付
交易id, 然后使用此经过URL编码的id重定向到 trans-complete.htm。
public class Payment extends Page {
..
public boolean onOkClick() {
if (form.isValid()) {
// Process payment
..
// Get transaction id
Long transId = OrderDAO.purchase(order);
setRedirect("trans-complete.htm?transId=" + transId);
return false;
}
return true;
}
}
对应trans-complete.htm 的Page类可以通过请求参数transId来获得此次交易id。
public class TransComplete extends Page {
/**
* @see Page#onInit()
*/
public void onInit() {
String transId = getContext().getRequest().getParameter("transId");
if (transId != null) {
// Get order details
Order order = OrderDAO.findOrderByPK(new Long(transId));
if (order != null) {
addModel("order", order);
}
}
}
}
[b]Post Redirect[/b]
上面的参数传递例子也是一个Post 重定向例子。Post重定向对防止用户通过点击刷新按钮来
提交表单是非常重要的。
[b]Page Templating[/b]
Click支持Page Templating, 它可以帮助你在你个web程序中建议一个标准的试图并能
大大减少你需要维护的html代码量。
为了实现模板功能, 定义了一个基于Page的框架模板。 该基于Page的模板类覆写了Page的 getTemplate()
方法, 放回框架模板的路径。 例如:
public class BorderedPage extends Page {
/**
* @see Page#getTemplate()
*/
public String getTemplate() {
return "/border.htm";
}
}
BorderedPage 模板border.htm:
<html>
<head>
<title>$title</title>
<link rel="stylesheet" type="text/css" href="style.css" title="Style"/>
</head>
<body>
<h2 class="title">$title</h2>
#parse($path)
</body>
</html>
其它页面使用Velocity的 #parse指令将它们的上下文添加到此模板中,$path的值会自动地被ClickServlet
添加到VelocityContext 中。
如下提供了一个例子:
[quote]<page path="home.htm" classname="Home"/> [/quote]
public class Home extends BorderedPage {
public String title = "Home";
}
Home页面的内容home.htm
<b>Welcome</b> to Home page your starting point for the application.
当Homepage 接到一个请求时(home.htm), Velocity会将 border.htm 和home.htm融合在一起并返回。
<html>
<head>
<title>Home</title>
<link rel="stylesheet" type="text/css" href="style.css" title="Style"/>
</head>
<body>
<h2 class="title">Home</h2>
<b>Welcome</b> to Home page your application starting point.
</body>
</html>
Note :Home page定义一个被border.htm模板引用的title模型的方式。
使用相同的方式也支持Jsp模板, 请参考Click Examples 提供了例子。