Click framework 的 Page类(四)

本文介绍了两种网页导航方法:TemplatePath和Redirect,并讨论了如何在重定向过程中传递参数。此外,还介绍了Click框架中的页面模板设计,展示了如何通过定义基于Page的模板类来简化HTML代码的维护。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[b]Template Path[/b]

跳转到新页面的另一种可选方法是设置要被呈现的页面模板的路径。 使用这种方式需确保模板
呈现前, 模板所需要的任何东西都必须创建完毕。

我们的改进过的例子如下:

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 提供了例子。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值