我收到以下错误: 无法为操作“#{medcontroller.getMedGeneric}”找到与 from-view-id“/index.xhtml”匹配的导航案例,结果为“javax.faces.model.ListDataModel@7a652236”
我是 jsf 新手,对于解决这个错误我真的一无所知。我有一个包含以下代码的 ManagedBean:
MedController.java
@ManagedBean(name = "medcontroller")
@SessionScoped
public class MedController implements Serializable {
int startId;
String gName;
int endId;
DataModel medNames;
//DataModel medGeneric;
MedicineHelper helper;
private int recordCount = 1000;
private int pageSize = 10;
private Medicine current;
private int selectedItemIndex;
public MedController() {
helper = new MedicineHelper();
startId = 1;
endId = 10;
}
public MedController(int startId, int endId) {
helper = new MedicineHelper();
this.startId = startId;
this.endId = endId;
}
public Medicine getSelected() {
if (current == null) {
current = new Medicine();
selectedItemIndex = -1;
}
return current;
}
public DataModel getMedNames() {
if (medNames == null) {
medNames = new ListDataModel(helper.getMedNames(startId, endId));
}
return medNames;
}
public String getgName()
{
return gName;
}
public void setgName(String gName)
{
this.gName = gName;
}
public DataModel getMedGeneric() {
if (medNames == null) {
medNames= new ListDataModel(helper.getMedGeneric(gName));
}
return medNames;
}
void recreateModel() {
medNames = null;
}
public boolean isHasNextPage() {
if (endId + pageSize <= recordCount) {
return true;
}
return false;
}
public boolean isHasPreviousPage() {
if (startId-pageSize > 0) {
return true;
}
return false;
}
public String next() {
startId = endId+1;
endId = endId + pageSize;
recreateModel();
return "index";
}
public String previous() {
startId = startId - pageSize;
endId = endId - pageSize;
recreateModel();
return "index";
}
public int getPageSize() {
return pageSize;
}
public String prepareView(){
current = (Medicine) getMedNames().getRowData();
return "browse";
}
public String prepareList(){
recreateModel();
return "index";
}
}
这是我的 JSF 文件
index.xhtml
<ui:define name="body">
<h:form styleClass="jsfcrud_list_form">
<h:commandLink action="#{medcontroller.previous}" value="Previous #{medcontroller.pageSize}" rendered="#{medcontroller.hasPreviousPage}"/>
<h:commandLink action="#{medcontroller.next}" value="Next #{medcontroller.pageSize}" rendered="#{medcontroller.hasNextPage}"/>
<h:dataTable value="#{medcontroller.medNames}" var="item" border="1" cellpadding="15" cellspacing="10" rowClasses="jsfcrud_odd_row,jsfcrud_even_row" rules="all" style="border:solid 1px">
<h:column>
<f:facet name="header">
<h:outputText value="BrandName"/>
</f:facet>
<h:outputText value="#{item.brandName}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Generic"/>
</f:facet>
<h:outputText value="#{item.generic}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value=" "/>
</f:facet>
<h:commandLink action="#{medcontroller.prepareView}" value="View"/>
</h:column>
</h:dataTable>
<h:inputText value="#{medcontroller.gName}" />
<h:commandButton value="Submit" action="#{medcontroller.getMedGeneric}" />
</h:form>
</ui:define>
请帮我解决这个错误。 另外,我没有 faces-config.xml 文件。我正在使用带有 jsf 和 hibernate 框架的 netbeans ide 7.1.2 Web 应用程序。
提前谢谢您。
最佳答案
<h:commandButton action>
必须指向一个调用某些业务逻辑并返回 void
的方法或String
代表您想要(重新)显示的目标页面。然而你返回了整个 ListDataModel
这对于 JSF 导航处理程序没有任何意义,因此会出现此错误。
类似这样的事情应该做:
public String getMedGeneric(){
// Do your business logic here.
return "someViewId";
}
这将导航至someViewId.xhtml
。但是,如果您打算坚持相同的 View ,只需让它返回 void
(或 null
),它将重新显示相同的 View 。
public void getMedGeneric(){
// Do your business logic here.
}
顺便说一下,在操作方法名称前加上 get
确实是一个糟糕的命名约定。 。这很令人困惑,并且使您的代码无法 self 记录。而是将其命名为loadMedGeneric()
或者。我只是猜测,因为您没有告诉任何具体的功能要求,所以该按钮到底应该做什么。
关于jsf - 无法为操作 : JSF 找到 from-view-id '/index.xhtml' 的匹配导航案例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18427338/