我正在使用netbeans 7.2和primefaces 3.4。我已经创建了一个数据库,来自数据库的实体类和来自实体类的jsf页面。我现在正在尝试设置一个页面,显示一个数据表,其中包含来自其中一个数据库的信息 - Userdetails - (完成),当单击一行时,打开一个对话框,添加一堆预设选项,可以在将用户添加到另一个表之前进行编辑。
但是我无法从所选行中获取信息。我已经尽可能地清理了代码并将其限制在相关部分 - 如果有任何需要添加或取出的话,请告诉我。
我已经在这个问题上看了一些答案,我无法让他们为我工作。我在行选择方法上尝试了commandbutton方法和ajax。
package jsf;
// LOTS OF IMPORTS
@ManagedBean(name = "userdetailsController")
//@ViewScoped
@SessionScoped
public class UserdetailsController implements Serializable {
//DECLARATIONS eg private Userdetails selectedElement;
public UserdetailsController() {
}
// BUNCH OF PREGENERATED CODE OMITTED
public Userdetails getSelected() {
if (current == null) {
current = new Userdetails();
selectedItemIndex = -1;
}
return current;
}
public String create() {
try {
getFacade().create(current);
JsfUtil.addSuccessMessage(ResourceBundle.getBundle("resources/Bundle").getString("UserdetailsCreated"));
return prepareCreate();
} catch (Exception e) {
JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("resources/Bundle").getString("PersistenceErrorOccured"));
return null;
}
}
public void setSelectedElement(Userdetails selectedElement) {
this.selectedElement = selectedElement;
}
public Userdetails getSelectedElement() {
return selectedElement;
}
//COLUMN MODEL STUFF THAT WORKS FINE HERE
}
xhtml的东西
<p:dataTable var="userdetails" value="#{userdetailsController.elements}"
rowKey="#{userdetails.userid}"
scrollable="true" scrollRows="10" scrollHeight="150"
resizableColumns="true"
selection="#{userdetailsController.selectedElement}"
draggableColumns="true" selectionMode="single" paginator="true"
widgetVar="userdetails" id="elementsTable">
<p:ajax event="rowSelect"
update=":datatableForm:display" />
<p:columns value="#{userdetailsController.columns}" var="column" columnIndexVar="colIndex" sortBy="#{userdetails[column.property]}" filterBy="#{userdetails[column.property]}">
<f:facet name="header">
#{column.header}
</f:facet>
#{userdetails[column.property]}
</p:columns>
<f:facet name="footer">
<p:commandButton id="addDlgBtn" value="Add this user?" update=":datatableForm:display" oncomplete="addUser.show()"/>
</f:facet>
</p:dataTable>
</p:fieldset>
这就是数据表的限制方式,对话框看起来像这样,但还有更多选项:
<p:dialog id="dlgAdd" header="Adding users" widgetVar="addUser">
<p:panelGrid id="display" columns="2" cellpadding="4">
<h:outputLabel value="#{bundle.CreateConnectiontableLabel_userid}" for="userid"/>
<h:outputText value="#{userdetailsController.selected.userid}" title="#{bundle.CreateConnectiontableTitle_userid}"/>
<h:outputLabel value="#{bundle.CreateConnectiontableLabel_username}" for="username"/>
<h:outputText value="#{userdetailsController.selected.username}" title="#{bundle.CreateConnectiontableTitle_username}"/>
<h:outputLabel value="#{bundle.CreateConnectiontableLabel_infovalue}" for="infovalue"/>
<h:inputText value="1" title="#{bundle.CreateConnectiontableTitle_infovalue}"/>
</p:panelGrid>
<p:commandButton id="addbtn" value="Add the User." update=":datatableForm"
actionListener="#{connectiontableController.create}"
onclick="addUser.close()"/>
</p:dialog>
但是,当我单击“添加”按钮时,我不会从selectedElement获取这些预设,即#{userdetailsController.selected.username}变为空白。当我点击Adduser时,我收到以下错误(使用完整的Stacktrace):
编辑:以下只是我愚蠢,我会尽快尝试其他建议,但这只是需要适当的ID。糟糕。警告:StandardWrapperValve [Faces Servlet]:PWC1406: servlet Faces Servlet的Servlet.service()引发了异常 javax.el.PropertyNotWritableException:/securedadmin/adminsetup.xhtml @ 146,110 value =&#34;&#34;:设置操作的非法语法 com.sun.faces.facelets.el.TagValueExpression.setValue(TagValueExpression.java:136) 在javax.faces.component.UIInput.updateModel(UIInput.java:818)at javax.faces.component.UIInput.processUpdates(UIInput.java:735)at javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1242) 在 javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1242) 在 org.primefaces.component.dialog.Dialog.processUpdates(Dialog.java:366) 在javax.faces.component.UIForm.processUpdates(UIForm.java:281)at javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1242) 在 javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1242) 在 org.primefaces.component.layout.Layout.processUpdates(Layout.java:252) 在 javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1242) 在 javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1242) 在 javax.faces.component.UIViewRoot.processUpdates(UIViewRoot.java:1231) 在 com.sun.faces.lifecycle.UpdateModelValuesPhase.execute(UpdateModelValuesPhase.java:78) 在com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) 在javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) 在 org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655) 在 org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161) 在 org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231) 在 com.sun.enterprise.v3.services.impl.ContainerMapper $ AdapterCallable.call(ContainerMapper.java:317) 在 com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195) 在 com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860) 在 com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757) 在 com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056) 在 com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229) 在 com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) 在 com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) 在 com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) 在 com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) 在 com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) 在 com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) 在com.sun.grizzly.ContextTask.run(ContextTask.java:71)at com.sun.grizzly.util.AbstractThreadPool $ Worker.doWork(AbstractThreadPool.java:532) 在 com.sun.grizzly.util.AbstractThreadPool $ Worker.run(AbstractThreadPool.java:513) 在java.lang.Thread.run(Thread.java:662)
我也被告知他们每个人:
警告:无法在视图中找到ID为userid的组件。
感谢。
答案 0 :(得分:3)
javax.el.PropertyNotWritableException: /securedadmin/adminsetup.xhtml @146,110 value="": Illegal Syntax for Set Operation
at com.sun.faces.facelets.el.TagValueExpression.setValue(TagValueExpression.java:136)
at javax.faces.component.UIInput.updateModel(UIInput.java:818)
...
在第146行,您/securedadmin/adminsetup.xhtml
的字符110
<h:inputText value="" />
这是不对的。正如异常消息所说的那样,无法对此执行setter方法操作。
删除value=""
<h:inputText />
或使用getter / setter将其绑定到bean属性,如此
<h:inputText value="#{bean.value}" />
这是在一篇理智的JSF教程的第1章中解释的。我建议通过一个。
答案 1 :(得分:1)
首先我看到了这一部分:
onclick="addUser.close()"
我用hide()没关闭。
另外我在这里看不到,但是你的对话框和数据表是否是单独的形式?你也可以使用ViewScoped。
还有一件事。在datatable中,您将所选行分配给userdetailsController.selectedElement,并在对话框中使用userdetailsController.selected。做同样的事。