【问题标题】:JSF commandButtons action value seems to be ignored - redirects to frontpageJSF commandButtons 操作值似乎被忽略 - 重定向到首页
【发布时间】: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>

【问题讨论】:

  • 您是否尝试将其放入 &lt;h:form&gt; 而不是 &lt;form&gt;
  • 您不需要发布指向 WAR 文件的链接。没有人会下载它。只需在问题中直接发布相关代码(就像您所做的那样)。
  • 不要在标题中加上“SOLVED”。这是没有意义的。 Stack Overflow 不是讨论论坛。这是一个问答网站。只需将最有帮助的答案标记为已接受即可。然后问题将在列表中显示为黄色而不是白色的答案计数。此外,Stack Overflow 搜索功能能够以这种方式区分已接受(“已解决”)的问题和未接受(“未解决”)的问题。

标签: jsf navigation command action redirect


【解决方案1】:

正如每本不错的 JSF 书籍/教程中所示,您应该使用 &lt;h:form&gt; 而不是 &lt;form&gt;

<h:form>
    <h:commandButton value="Back" action="index" />
</h:form>
<h: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>
</h:form>

另请参阅

【讨论】:

  • 嘿嘿嘿...我打败了你,虽然我没有足够的信心真正让它成为一个答案
  • @Lucas:描述的症状肯定证实了这一点。
  • 加入 h:form 解决了这个问题。谢谢!我是一名培训程序员,主要学习java。我有 1 位老师、2 位同学和 1 位经验丰富的程序员在看这个,但没有人能告诉我出了什么问题。习惯于 Eclipse 编译错误 JSF 感觉很不宽容。 Kinda 把这个留在这里,期望一些巫毒代码是必要的。谜团解开了。如果缺少的 h 标签应该排除它,我很惊讶该按钮实际上做了一些事情。这可能就是为什么我和其他人花这么多时间在别处寻找问题的原因。需要做一些阅读。
  • 不客气。由于您是新来的,请不要忘记在回答(最)有助于解决问题时将其标记为已接受。另见meta.stackexchange.com/questions/5234/…至于你看到的症状;该按钮呈现一个简单的&lt;input type="submit"&gt;。纯 HTML &lt;form&gt; 默认提交到当前页面。但是没有&lt;h:form&gt; JSF 找不到实际按下的按钮,所以它的动作将被忽略。
猜你喜欢
  • 1970-01-01
  • 2021-10-28
  • 2016-09-30
  • 2012-03-11
  • 1970-01-01
  • 1970-01-01
  • 2012-07-26
  • 2017-12-05
  • 2012-03-08
相关资源
最近更新 更多