【发布时间】:2017-03-26 10:34:37
【问题描述】:
我学习 JSF,无法在 <h:inputText> 内部的 <c:foreach> 中设置我的 bean 的值
这是我的代码。
JSF 页面:
<h:form>
<c:forEach items="#{commentController.getComments(request.getParameter('item_id'))}" var="comment" varStatus="loop">
<div class="comment">
<span class="user">#{comment.user.name}</span>
<h:outputText value="#{comment.text}" rendered="#{!commentController.editMode}" styleClass="text"/>
<h:panelGroup rendered="#{commentController.editMode}">
<h:inputText value="#{comment.text}"/>
<h:commandButton action="#{commentController.changeComment(comment)}" value="Save">
<f:param name="item_id" value="#{request.getParameter('item_id')}"/>
</h:commandButton>
<h:commandButton immediate="true" action="#{commentController.switchEditMode}" value="Cancel">
<f:param name="item_id" value="#{request.getParameter('item_id')}"/>
</h:commandButton>
</h:panelGroup>
<span class="date">#{comment.date}</span>
<h:panelGroup rendered="#{commentController.isCurrentUsersComment(comment)}">
<h:commandLink rendered="#{!commentController.editMode}" action="#{commentController.switchEditMode}" value="Change comment ">
<f:param name="item_id" value="#{request.getParameter('item_id')}"/>
</h:commandLink>
<h:commandLink rendered="#{!commentController.editMode}" action="#{commentController.deleteComment(comment)}" value="Delete comment"/>
</h:panelGroup>
</div>
</c:forEach>
</h:form>
豆子:
@ManagedBean
@RequestScoped
public class Comment {
private int id;
private User user;
private String text;
private Date date;
private int itemId;
public Comment() {
}
public String getText() {
return text;
}
public Date getDate() {
return date;
}
public void setText(String text) {
this.text = text;
}
public void setDate(Date date) {
this.date = date;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public int getItemId() {
return itemId;
}
public void setItemId(int itemId) {
this.itemId = itemId;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
控制器:
@ManagedBean
@SessionScoped
public class CommentController {
private List<Comment> comments = new ArrayList<>();
private boolean editMode = false;
public CommentController() {
}
public String addComment(Comment comment) {
java.util.Date date = Calendar.getInstance().getTime();
HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
int itemId = Integer.parseInt(request.getParameter("item_id"));
comment.setUser((User)request.getSession().getAttribute("current_user"));
comment.setDate(new Date(date.getYear(), date.getMonth(), date.getDay())); //bug
comment.setItemId(itemId);
DBUtils.addCommentForItem(comment);
return "/pages/item.xhtml?item_id=" + itemId +"&faces-redirect=true";
}
public String changeComment(Comment comment) {
DBUtils.changeCommentForItem(comment);
return switchEditMode();
}
public String deleteComment(Comment comment) {
DBUtils.deleteCommentForItem(comment);
return "/pages/item.xhtml?item_id=" + comment.getItemId() +"&faces-redirect=true";
}
public boolean isCurrentUsersComment(Comment comment) {
HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
User currentUser = (User) request.getSession().getAttribute("current_user");
return currentUser.equals(comment.getUser());
}
public String switchEditMode() {
editMode = !editMode;
HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
int itemId = Integer.parseInt(request.getParameter("item_id"));
return "/pages/item.xhtml?item_id=" + itemId +"&faces-redirect=true";
}
public List<Comment> getComments(int itemId) {
comments = DBUtils.getCommentsForItem(itemId);
return comments;
}
public boolean isEditMode() {
return editMode;
}
}
在按下按钮 'Save' 后,此方法不断获取旧 bean。我尝试在 <c:forEach> 中使用 varStatus 并写了如下内容:
<h:inputText value="#{commentController.getComments(request.getParameter('item_id'))[loop.index].text}">
在哪里 varStatus="loop",但它没有帮助。
也许我用错了,我不知道。请帮忙。如果有必要,我会添加我的代码的其他部分。
【问题讨论】:
-
是一个循环,您在其中放置了一个 -
您认为问题出在控制器上吗?我应该发布它的代码吗? @dsp_user
-
是的,发布代码,正如我所说,在
中放置 -
我重写了页面并添加了控制器的代码@dsp_user
-
你为什么期望得到一个新的bean?您正在使用旧 ID (request.getParameter('item_id')) 调用 getComments