gpt4 book ai didi

jsf-2 - h :commandButton is not working once I wrap it in a

转载 作者:行者123 更新时间:2023-12-05 00:01:51 25 4
gpt4 key购买 nike

主题具有“某种程度”的原因是因为我在 JSF 2.2 中有一个示例,其中我使用命令按钮并调用 bean 函数两次(取决于 url)。它基本上是相同的代码,仅在一个示例中执行。

这是代码下方的“错误”描述代码:

用户bean

@ManagedBean
@RequestScoped
public class User {

private String name;
private String surname;
private int age;
private int id;

public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}

public String getSurname() {
return surname;
}
public void setSurname(String surname) {
this.surname = surname;
}

public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}

public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}

public User(String name, String surname, int age, int id) {
super();
this.name = name;
this.surname = surname;
this.age = age;
this.id = id;
}

public User(){}

}

UsersBean bean :

@ManagedBean
@SessionScoped
public class UsersBean {

private List<User> listOfUsers = new ArrayList<User>();
private String passedParameter;

public UsersBean() {
listOfUsers.add(new User("Tywin", "Lannister", 60, 1));
listOfUsers.add(new User("Tyrion", "Lannister", 30, 2));
listOfUsers.add(new User("Jaime", "Lannister", 31, 3));
listOfUsers.add(new User("Cercei", "Lannister", 29, 4));
listOfUsers.add(new User("John", "Snow", 31, 5));
}

public List<User> getAll() {

System.out.println("getAall is called.");
return listOfUsers;
}

public User getDetails() {
passedParameter = (String) FacesContext.getCurrentInstance()
.getExternalContext().getRequestParameterMap().get("userID");
int id = Integer.parseInt(passedParameter);
User selected = null;
for (User u : listOfUsers) {
if (u.getId() == id) {
selected = u;
}
}
return selected;
}

public String addUser(User u) {
System.out.println("addUser is called.");
if (u.getId() != 0) {
for (User edit : listOfUsers) {
if (edit.getId() == u.getId()) {
System.out.println("Found it!");
edit.setAge(u.getAge());
edit.setName(u.getName());
edit.setSurname(u.getSurname());
}
}

} else {
u.setId(listOfUsers.size() + 1);
listOfUsers.add(u);
}

return "";
}
}

用户.xhtml:

    <f:view>
<!-- http://stackoverflow.com/questions/8083469/method-must-have-signature-string-method-etc-but-has-signature-void -->
<h:dataTable value="#{usersBean.all}" var="u">

<h:column>
<f:facet name="header">
User ID
</f:facet>
#{u.id}
</h:column>

<h:column>
<f:facet name="header">
Name
</f:facet>
#{u.name}
</h:column>

<h:column>
<f:facet name="header">
Details
</f:facet>

<h:link outcome="users" value="edit user">
<f:param name="userID" value="#{u.id}"></f:param>
<f:param name="action" value="edit"></f:param>
</h:link>

&nbsp;

<h:link outcome="usersDetails" value="get details">
<f:param name="userID" value="#{u.id}"></f:param>
</h:link>
</h:column>

</h:dataTable>

<h:panelGroup rendered="#{param['action'] == 'edit'}">
<h1>Edit!</h1>
<h:form>
<ui:param name="editUser" value="#{usersBean.details}"></ui:param>
<h:outputText value="Name"></h:outputText>
<h:inputText value="#{editUser.name}"></h:inputText> <br />

<h:outputText value="Surname"></h:outputText>
<h:inputText value="#{editUser.surname}"></h:inputText> <br />

<h:outputText value="Age"></h:outputText>
<h:inputText value="#{editUser.age}"></h:inputText> <br />

<h:commandButton action="#{usersBean.addUser(editUser)}" value="Edit" type="submit"> </h:commandButton>
</h:form>
</h:panelGroup>

<h:panelGroup rendered="#{empty param['action']}">
<h1>Add!</h1>
<h:form>
<h:outputText value="Name"></h:outputText>
<h:inputText value="#{user.name}"></h:inputText>
<h:outputText value="Surname"></h:outputText>
<h:inputText value="#{user.surname}"></h:inputText>
<h:outputText value="Age"></h:outputText>
<h:inputText value="#{user.age}"></h:inputText>
<h:commandButton action="#{usersBean.addUser(user)}" value="Add" type="submit"></h:commandButton>
</h:form>
</h:panelGroup>

</f:view>

好的,所以,一切正常。 usersBean.addUser 添加用户。如果我为 ID 添加另一个 inputText 并输入现有 ID,则相应的函数会更新值。因此,addUser 函数按预期工作。

问题在于

<h:panelGroup rendered="#{param['action'] == 'edit'}">

如您在上面的 xhtml 中所见,代码基本相同,唯一不同的是我填写了所选用户的数据。这行得通,我将适当的数据输入到输入字段中,但是当我更改它们并单击“编辑”时,没有任何反应。函数没有被调用!而在添加的情况下,该函数被调用并且它起作用。在编辑的情况下似乎没有定义任何操作,它只重新加载页面(提交)而没有实际操作 addUser。

这是怎么引起的,我该如何解决?

最佳答案

是因为#{param['action'] == 'edit'}没评价true在处理表单提交过程中,因此 <h:panelGroup>在处理表单提交期间基本上不会呈现,包括 <h:commandButton>坐在里面。即表单提交没有将该参数传递回 JSF。这样 JSF 就不会看到 <h:commandButton>因此永远无法解码和排队其 Action 事件。您需要确保所有 rendered条件在处理表单提交期间的评估与在显示表单期间的评估相同(这是 JSF 防止篡改/黑客请求的一部分,否则最终用户将能够执行未呈现的命令按钮,如仅限管理员的按钮)。

因此,您基本上还需要在回发期间保留该参数,以便 rendered表达式仍然计算 true在处理表单提交期间。这可以通过多种方式实现:

  1. 将其添加为 <f:param><h:commandButton>里面相关性:

    <h:commandButton action="#{usersBean.addUser(editUser)}" value="Edit" type="submit">
    <f:param name="action" value="#{param.action}" />
    </h:commandButton>

    (注意:param['action']param.action 是等效的;这些括号仅在 'action' 包含句点或表示另一个变量时才有用)

  2. 通过 <f:viewParam> 将其设置为 bean 属性.要求是 bean 需要在 View 范围内或更广泛。你已经在 session 范围内了,这没关系(but which is IMO way too broad, but that aside):

    <f:metadata>
    <f:viewParam name="action" value="#{usersBean.action}" />
    </f:metadata>
    ...
    <h:panelGroup rendered="#{usersBean.action}">
    ...
    </h:panelGroup>
  3. 如果您已经在使用 JSF 实用程序库 OmniFaces , 使用它的 <o:form>而不是 <h:form>这使您能够提交到当前请求 URI 而不是当前 JSF View ID。这样 GET 请求字符串将自动保留,您不需要复制粘贴 <f:param>在#1 中的所有命令按钮上:

    <o:form useRequestURI="true">
    ...
    </o:form>

另见:

关于jsf-2 - h :commandButton is not working once I wrap it in a <h:panelGroup rendered>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23742141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com