【发布时间】:2011-11-08 16:20:56
【问题描述】:
我在 JSF 2.0 中有一个带有 actionvalue 的 commandButton,我想在 bean 中调用一个方法,否则什么也不做。但是,当我单击它时,它会重定向到上一页。
这是在 java 1.7 中使用 glassfish 3.1.1 编写的。
这里是commandButton 所在的welcome.xhtml 文件的代码(showDetails),但还有许多其他文件,所以我提供了一个WAR 文件的链接,以便可以检查所有内容。如果我将 action 属性更改为指向不存在的方法,我将不会收到错误,我将再次被重定向到首页。
程序从 index.html 文件启动。导入后记得左键点击项目,进入properties>project facets,勾选JavaServerFaces 2.0
相关代码:
welcome.xhtml
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<h:head>
<title>Insert title here</title>
</h:head>
<h:body>
<h3>#{userBean.user.name}</h3>
<hr />
<form>
<h:commandButton value="Back" action="index" />
</form>
<form>
<h:commandButton value="Show details" action="#{userBean.changeRenderDetails}" />
<h:panelGrid rendered="#{userBean.renderDetails}" columns="2">
<h:outputText value="Brugernavn:" /> #{userBean.user.name}
<h:outputText value="Password:" /> #{userBean.user.password}
</h:panelGrid>
</form>
</h:body>
</html>
用户豆
package model;
import java.io.Serializable;
import javax.enterprise.context.SessionScoped;
import javax.inject.Inject;
import javax.inject.Named;
@Named("userBean")
// or @ManagedBean(name="user")
@SessionScoped
public class UserBean implements Serializable {
// Oprettes når en bean oprettes
private User user = new User("", "");
@Inject
// Det nuværende service objekt initialiseres automatisk
private Service service;
public String validateUser() {
return service.validateUser(user);
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
//Lektion 10 - opg1
private boolean renderDetails;
public void changeRenderDetails(){
setRenderDetails(!isRenderDetails());
}
public boolean isRenderDetails() {
return renderDetails;
}
public void setRenderDetails(boolean renderDetails) {
this.renderDetails = renderDetails;
}
}
和用户类
package model;
public class User {
private String name;
private String password;
public User(String name, String password) {
super();
this.name = name;
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
导航规则,这些都与重定向到 index.html 的按钮无关:
<?xml version="1.0" encoding="UTF-8"?>
<faces-config
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee /web-facesconfig_2_0.xsd"
version="2.0">
<navigation-rule>
<from-view-id>/index.xhtml</from-view-id>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/welcome.xhtml</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>failure</from-outcome>
<to-view-id>/error.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
</faces-config>
【问题讨论】:
-
您是否尝试将其放入
<h:form>而不是<form> -
您不需要发布指向 WAR 文件的链接。没有人会下载它。只需在问题中直接发布相关代码(就像您所做的那样)。
-
不要在标题中加上“SOLVED”。这是没有意义的。 Stack Overflow 不是讨论论坛。这是一个问答网站。只需将最有帮助的答案标记为已接受即可。然后问题将在列表中显示为黄色而不是白色的答案计数。此外,Stack Overflow 搜索功能能够以这种方式区分已接受(“已解决”)的问题和未接受(“未解决”)的问题。
标签: jsf navigation command action redirect