假设一个例子。我有以下界面:
public interface DataSource<T> {
Future<T> fetch();
}
此数据源可以执行异步数据提取。我们在JSP中使用数据源有以下标记:
<html>
<d:fetch from="${orderDS}" var="orders">
<c:foreach in="${orders}" var="order">
<div class="order">
<c:out value="${order.title}" />
</div>
</c:foreach>
</d:fetch>
</html>
那么,我想要什么?我希望JSP渲染引擎两次调用我的自定义标记(在此示例中为FetchTag)。在第一次调用时,FetchTag将执行DataSource.fetch()调用并将Future保存为对象字段。在第二次调用时,FetchTag会执行Future.get()调用,并将被阻止,直到数据可用。
有没有办法做这样的事情?
答案 0 :(得分:3)
我认为更好的设计不会尝试改变JSP渲染。将所有数据库代码放在它所属的服务器端,并使用AJAX调用从服务器端组件获取该数据。
一般来说,我发现在自定义标记库中嵌入东西是个坏主意。 JSTL和/或Spring标记库就是我所需要的。如果我觉得我的UI需要做更多的事情,我会错误地思考它。
对于JS禁用的客户端,我只是让他们对数据进行往返,而不是尝试在后台进行。给他们一个选择:等待或打开JS。