| Denny's profileJava DreamsBlogLists | Help |
|
|
March 09 @Persist 解释a) @Persist("client")
b) @Persist("client:page") c) @Persist("client:app") a) is the same as b). If you use b) for a property x for page Foo, then you can get back the property only if the navigation is Foo => Foo. If the navigation is Foo => Bar => Foo, then it will be lost when Bar is invoked. In contrast, if you use c), then it will be maintained all the way. client 跟 session是一样的效果只是实现的方式不一样, 一个是存在cookie或url中另一个是存在http session中。 client:page session:page 仅在当前页面有用, 假如转到其他页面 这个属性值就失效了。 client:app session:app 对于整个application都有效, 转到其他页面再转回来的话这个值仍然存在。如果我们想让他失效怎么办呢?你可以调用这个方法cycle.forgetPage("YourPageName"). March 07 Tapestry 显示图片what you're doing is trying to use a @Insert component to insert a blob
in your page. It will never work like that since Tapestry will actually try
to display the string representation of your blob (if you call
personImage.toString() you'll get exactly that "oracle.sql.BLOB@1176e8a").
You need something a bit more sophisticated. I've done exactly what you're
trying to do so I'll explain it to you. I won't past all my code since it's
very application-specific.
First you need to create a service that will produce the image contents, so
create a class for that. Something like this:
public class ImageService implements IEngineService {
public ILink getLink(boolean isPost, Object parameters) {
Object personId = parameterArray[0];
Map serviceParameters = new HashMap();
serviceParameters.put(ServiceConstants.SERVICE, getName());
serviceParameters.put(ServiceConstants.PARAMETER, new Object[] {
personId });
return linkFactory.constructLink(this, isPost, serviceParameters,
true);
}
public String getName() {
return "personImage";
}
public void service(IRequestCycle cycle) throws IOException {
// here you have to set the appropriate content type
// I'm assuming it's a jpeg image.
ContentType contentType = new ContentType("image/jpeg");
OutputStream outputStream = webResponse.getOutputStream(contentType);
Object[] parameters = linkFactory.extractListenerParameters(cycle);
Integer personId = (Integer) parameters[0];
// you have the ID, so here you do whatever you have to do
// to fetch the person object
Person person = whatever...
// then you have to write the image contents to the output stream.
int length = person.personImage.length();
outputStream.write(person.personImage.getBytes(0,length));
outputStream.close();
}
}
On the html page you'll have to use an img tag with the source being the
service you just created:
<img jwcid="@Any" src="ognl:imageLink"/>
On the component's java class you'll need something like:
// This is the hivemind service being injected
@InjectObject("service:ImageService")
public abstract IEngineService getProductImageService();
public String getImageLink() {
Object[] parameters = new Object[1];
// I'm assuming there is a "person" variable in page
// with the person object you want to display.
parameters[0] = person.personID;
return getProductImageService().getLink(false,
parameters).getAbsoluteURL();
}
... next you'll also have to tell hivemind about the service in your
hivemodule.xml
<service-point id="ImageService"
interface="org.apache.tapestry.engine.IEngineService">
<invoke-factory>
<construct class="my.package.ImageService">
<set-object property="linkFactory"
value="infrastructure:linkFactory"/>
</construct>
</invoke-factory>
</service-point>
<contribution configuration-id="tapestry.services.FactoryServices">
<service name="personImage" object="service:ImageService"/>
</contribution>
That's more or less how I did it. I think that's about it, but if I forgot
anything I guess the docs can fill in.
DenisMarch 02 Tapestry Table 组件的强大(分页查询时只fetch当前页的数据)。Tapestry Table组件提供了分页的功能, 但是以前以为它只能是一次性的吧所有元素都fetch出来,然后把这些元素交给Table去处理。错了。 其实Tapetry的Table组件太强大了, 它已经把这个问题考虑了。只fetch当前页的数据。 在getCurrentPageRows 方法中我们可以通过ITableColumn objSortColumn 去进行排序(当有需要排序时这个参数不为null), bSortOrder 为是升序还是降序排列。我们可以通过objSortColumn得到需要排序的字段, bSortOrder 是按种方式排序, 我们就可以构造SQL语句,把排序的工作交给数据库, 然后得到一个排好序的List, 然后在截取这个List中当前页的值就行了。 |
|
|