为此你不能绕过 Javascript。基本上你需要让 Javascript 将请求提交到服务器端。在 HTML 中<select>
元素(由 JSF 生成h:selectOneMenu
)你最好使用onchange
属性为此。每当用户更改元素的值时,您附加到此事件的任何 JS 都会被调用。
<h:selectOneMenu onchange="this.form.submit();">
或者如果你懒得写,这个简写也是正确的:
<h:selectOneMenu onchange="submit()">
这将结合第一个下一个 HTML 提交表单input type="submit"
同一表单内的元素(由 JSF 生成)h:commandButton
).
<h:form>
<h:selectOneMenu value="#{bean.page}" onchange="submit()" required="true">
<f:selectItem itemLabel="Select page.." />
<f:selectItems value="#{bean.pages}" />
</h:selectOneMenu>
<h:commandButton value="submit" action="#{bean.submit}" />
<h:commandButton value="other" action="#{bean.other}" /> <!-- won't be submitted -->
</h:form>
您需要在操作方法中编写逻辑,该逻辑会导致导航操作,如定义的那样faces-config.xml
进行。例子:
public String submit() {
return this.page;
}
如果你这样做not想要使用commandButton
,那么你也可以继续滥用valueChangeListener
:
<h:form>
<h:selectOneMenu value="#{bean.page}" onchange="submit()"
valueChangeListener="#{bean.change}" required="true">
<f:selectItem itemLabel="Select page.." />
<f:selectItems value="#{bean.pages}" />
</h:selectOneMenu>
</h:form>
在 bean 中,您将拥有:
public void change(ValueChangeEvent event) {
String page = (String) event.getNewValue(); // Must however be the exact page URL. E.g. "contact.jsf".
FacesContext.getCurrentInstance().getExternalContext().redirect(page);
}
或者,如果您已经拥有所需的 URLf:selectItem
value,那么你也可以只使用 JS 而没有 bean 操作:
<h:selectOneMenu value="#{bean.page}"
onchange="window.location = this.options[this.selectedIndex].value">
<f:selectItem itemLabel="Select page.." />
<f:selectItem itemLabel="home" itemValue="home.jsf" />
<f:selectItem itemLabel="faq" itemValue="faq.jsf" />
<f:selectItem itemLabel="contact" itemValue="contact.jsf" />
</h:selectOneMenu>