- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
主题具有“某种程度”的原因是因为我在 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>
<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
在处理表单提交期间。这可以通过多种方式实现:
将其添加为 <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'
包含句点或表示另一个变量时才有用)
通过 <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>
如果您已经在使用 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/
我是一名优秀的程序员,十分优秀!