Mat*_*yas 5 java jsf glassfish cdi view-scope
<h:form ...
<p:dataTable value="#{myBean.list}" var="data" ...
<p:column ...
<h:commandButton action="#{controller.method(data.id)}" />
</p:column>
</p:dataTable>
</h:form>
Run Code Online (Sandbox Code Playgroud)
@ApplicationScoped
public class Controller {
public String method(final Long dataId) {
/* Do business */
return URL_WITH_REDIRECT;
}
}
Run Code Online (Sandbox Code Playgroud)
(使用此处@ViewScoped描述的CDI注释)
@ApplicationScoped
public class Producer {
@Named @ViewScoped @Producer
public MyBean getMyBean() {
final MyBean bean = new MyBean();
bean.list = new ArrayList<Data>(); // where Data has a Long id field
/* Do business and populate list */
return bean;
}
}
Run Code Online (Sandbox Code Playgroud)
GET 这页纸
POST编辑到服务器@ViewScoped按预期使用beancontroller.method调用data.id并访问1.1生成的beanStringGET 下一页 ...简而言之:单击时,将id复制到数据表外部,然后单击提交按钮.
在h:commandButton表格栏的内部添加了:
onclick="$('input[id*=selectedDataId]').val('#{data.id}'); $('button[id*=callMethod]').trigger('click');"
Run Code Online (Sandbox Code Playgroud)
在桌子外面:
<h:inputHidden id="{selectedDataId}"binding="#{selectedDataId}"/>
<p:commandButton type="submit"
id="callMethod"
label="Hidden button"
action="#{controller.method(selectedDataId.value)}"/>
Run Code Online (Sandbox Code Playgroud)
最后它可以工作,但我无法弄清楚导致第一个和基本方法重新初始化视图范围bean的原因.查看堆栈跟踪(见下文),似乎正在重建行.
有没有人有解释,也许需要注意这个问题?
其中:getPipelinecheckSearchResults是检索返回表的列表的调用,这会导致生成器被调用

我已经阅读了以下文章/ SO问题,但没有更好地理解为什么上述(第一)解决方案的工作原理.
每次我在dataTable中单击commandButton时都会重新创建ViewScoped bean
为什么@PostConstruct回调每次都会触发,即使bean是@ViewScoped?JSF
如何将选定的行传递给dataTable中的commandLink?
http://balusc.blogspot.de/2010/06/benefits-and-pitfalls-of-viewscoped.html
我找到了 jsf/primefaces/ee-api/glassfish 等的一些来源来调试行为,所以这里是答案:
component:controller.method)datatabledatatable根据@ViewScopedbean生成行controller.method调用后,@ViewScoped所datatable依赖的bean将被重新生成(当然还有它的所有依赖项)测试:在2.1.7JSF 版本中。查看 的来源2.1.19,我预计那里会有相同的行为。
对于那些在孤独的夏夜大声哭泣并问:“为什么? ”的人
POST发送到服务器APPLICATION_INVOCATION
rowEvent & clickEventUIViewRoot:794javax.faces.UIDataorg.primefaces.component.datatable.DataTable支持的祖父母p:datatable开始处理事件@UIData.broadcast(FacesEvent)
broadcast方法首先保存最后选择的行的索引rowEventclickEvent给孩子UIComponent,在我们的例子中分派给Button
ActionListener.processAction(ActionEvent)
controller.method它返回一个重定向String,事情开始走下坡路redirectString由一个处理NavigationHandler
ViewMap所有bean 。如果我们仔细想想,这是合乎逻辑的,因为我们正在走出去。@ViewScoped179UIData.broadcast哪个
302)4.3.1@ViewScoped重新生成表所需的 bean 的地方。结束
虽然我还没有测试过,但我期望有相同的行为,,,,,h:datatable等等。简而言之,每个子类化并且不提供感知方法的组件。p:accordionPanelp:carouselp:galleriap:dataGridUIDataredirectbroadcast
| 归档时间: |
|
| 查看次数: |
1771 次 |
| 最近记录: |