Tapestry4.1.x中内置dojo实现ajax功能,不用写任何的javascript就可以实现,
具体步骤如下。
1、用Shell组件包含进dojo,Shell组件会自动配置dojo包。
<html jwcid="@Shell" title="Basic Ajax Page">
<body jwcid="@Body">

    <p>Basic javascript inclusion sample.</p>

</body>
</html>

2、使用updateComponents参数
这个参数已经在很多组件里实现,加上这个参数就可以实现ajax了,例如组件
DirectLink, LinkSubmit, Form, ImageSubmit and Submit,你只要告诉它要
更新哪些部分或者组件就可以了,jwcid="time@Insert"这种取id为time,你也
可以将你需要更新的部分使用Any组件包含起来,例如
<div jwcid="ajax@Any">update me</div>
,同样这时的Id为ajax,而且你可以
更新多个,例如updateComponents="time,ajax"。
<html jwcid="@Shell" title="Basic Ajax Page">
<body jwcid="@Body">

<p>Basic javascript inclusion sample.</p>

<p><a jwcid="@DirectLink" listener="listener:onRefreshTime" updateComponents="time">Refresh time</a>.</p>

<div jwcid="time@Insert" value="ognl:time" renderTag="true" />

</body>
</html>

3、普通的Tapestry Page类
public abstract BasicAjax extends BasePage {

    public abstract void setTime(Date time);

    public void onRefreshTime()
    {
        setTime(new java.util.Date());
    }
}


没了,已经可以运行了。

修订:修改了listener函数名称,谢谢8楼。
评论
wobu20 2007-09-11
原因找到了...在页面类那边,
原代码是:
public abstract void setNum(Integer num);

改为:
public abstract void setNum(int num);


Integer类型在页面中是否就取不到值?有点不理解...
wobu20 2007-09-11
<span jwcid="time@Insert" value="ognl:num" inherit-informal-parameters="yes" id="time" renderTag="true">time</span>
这样是么?为什么在一个项目里面这样写可以生成span标签,而另一个却不行?用同样的包,hivemodule、web、application配置几乎相同!一样的代码......
找了很久,还是找不出原因!望大哥再助!:(
jimlaren 2007-09-11
不是一定要放到div里,原理应该是document.getElementbyId之类的函数调用,只要生成的html里有id应该就可以,然后让他根据id找到update的对象,最后利用innerHtml之类的替换,就是ajax那一套。
superwdd 2007-09-11
问题终于都找到了,哈哈

原来 是同伴配置的hivemodule.xml出了问题
wobu20 2007-09-11
谢谢tapestry大哥,可以了!
请问这样写有什么特殊的含义没有?是不是要更新的组件一定要放到div层里面?
tapestry 2007-09-11
<div jwcid="resetNum@Any"><span jwcid="@Insert" value="ognl:num">6</span></div>
wobu20 2007-09-10
将span改成div,情况还是一样...
页面源码为:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- Application: fruit -->
<!-- Page: Test -->
<!-- Generated: Mon Sep 10 20:33:33 CST 2007 -->
<html>
<head>
<meta name="generator" content="Tapestry Application Framework, version 4.1.2" />
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title>test</title>
<script type="text/javascript">djConfig = {"isDebug":true,"baseRelativePath":"/fruit/app?service=asset&path=%2Fdojo-0.4.3%2F","parseWidgets":false,"locale":"zh-cn"} </script>

 <script type="text/javascript" src="/fruit/app?service=asset&path=%2Fdojo-0.4.3%2Fdojo.js"></script>
<script type="text/javascript">
dojo.require("dojo.logging.Logger");
dojo.log.setLevel(dojo.log.getLevel("WARNING"));
</script>
<script type="text/javascript">
dojo.registerModulePath("tapestry", "/fruit/app?service=asset&path=%2Ftapestry%2F");
</script>
<script type="text/javascript" src="/fruit/app?service=asset&path=%2Ftapestry%2Fcore.js"></script>
<script type="text/javascript">
dojo.require("tapestry.namespace");
tapestry.requestEncoding='UTF-8';
</script>
</head> 
<head> 
</head> 

<body id="Body">
 

<p><a id="DirectLink" href="/fruit/app?component=%24DirectLink&page=Test&service=direct&updateParts=resetNum" onclick="return tapestry.linkOnClick(this.href,'DirectLink', false)">Refresh time</a>.</p>  
  

</body> 
</html>
<!-- Render time: ~ 16 ms -->
 


没看到div输出哦...
点击的时候,在控制台那边有输出随机数,事件是有触发的!
tapestry 2007-09-10
<span jwcid="resetNum@Insert" value="ognl:num" renderTag="true"></span>
这个生成的html中你看一下是不是生成了类似
<span id="resetNum">3</span>之类的,我没测试,应该是不会生成的,因为span为tapestry里默认的tag去输出的,你试一试div。
wobu20 2007-09-10
第一次尝试的页面类代码:
import java.util.Random;
import org.apache.tapestry.html.BasePage;   
  
public abstract class Test extends BasePage  
{   
	public abstract Integer getNum();
	
	public abstract void setNum(Integer num);
	
	public void reset(){
		Integer num=new Random().nextInt(10000);
		System.out.println(num);
		setNum(num);
	}
}


html模板
<html jwcid="@Shell" title="test" debugEnabled="true"> 
<head> 
</head> 
<body jwcid="@Body"> 

<p><a jwcid="@DirectLink" listener="listener:reset" updateComponents="resetNum">Refresh time</a>.</p>  
  
<p><span jwcid="resetNum@Insert" value="ognl:num" renderTag="true"></span></p>
</body> 
</html> 


谢谢!
wobu20 2007-09-10
用你的例子修改了一些,出现以下情况:

原原本本(多了个getTime抽象方法)照你的例子运行,点击directLink没有任何反应...
请问楼主,是哪个地方出了问题?
superwdd 2007-09-10
可以是可以了,不过为什么点击后是生成一个"层"盖在网页上?内容和原来一样,只是多了个时间

而且层上有个CLOSE链接 用来关闭层.

怎么会是这个样子?有谁可以帮忙解答下吗?


纠正下楼主的错误

Tapestry Page类
里要添加public abstract Date getTime();

---------------------------------------
public void setTime() |
{ |
setTime(new java.util.Date()); |
} |
---------------------------------------

这个函数名要换掉,不能和 public abstract void setTime(Date time); 一样

会出错的
superwdd 2007-09-09
已经发现是同事Friendly URL 配置错误了
superwdd 2007-09-09
请问,为什么我的运行起来后,浏览器会有 dojo未定义的错误?

生成的dojo的js路径 在浏览器都无法访问 是tapestry路径生成错误了吗?

<script type="text/javascript" src="/assets*/static/dojo-0.4.3/dojo.js"></script>

/assets*/static/dojo-0.4.3/dojo.js 浏览器访问不到,其它的也是
tapestry 2007-07-27
文档在这里
http://tapestry.apache.org/tapestry4.1/usersguide/upgrade4.0.html
还不是很全,我升级的时候忘记做记录了,你copy下项目不停的测试改就行,如果没用到tacos,升级还是挺方便的。
sorphi 2007-07-27
谢谢!
从tapestry 4.0.x升级到4.1.x有什么注意事项么?官方文档中没提到,我不敢贸然升级。
tapestry 2007-07-27
除了你定义调用的方法和需要更新的组件中的取值方法,其他不更新组件的取值方法不执行,render/rewind中无法判断是否ajax请求,我觉得没判断的必要呀,你在你自己的方法里执行逻辑,render方法里处理公共的部分就可以了,控制ajax的执行,这个没考虑过,tapestry使用dojo实现的ajax,或许你看其生成的页面源代码,或者重新实现tapestry组件试试。
sorphi 2007-07-27
我还是那个疑问,t4.1中,如何在page的render/rewind流程中判断是来自于正常的页面渲染呢,还是某个组件的ajax请求?

还有,如何控制某个ajax响应中的script代码块的执行?有时候默认执行script的行为会造成一些麻烦。
发表评论

提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则

您还没有登录,请登录后发表评论