【问题标题】:JSF inputText inside foreach doesn't workforeach 中的 JSF inputText 不起作用
【发布时间】: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。我尝试在 &lt;c:forEach&gt; 中使用 varStatus 并写了如下内容:

<h:inputText value="#{commentController.getComments(request.getParameter('item_id'))[loop.index].text}">

在哪里 varStatus="loop",但它没有帮助。 也许我用错了,我不知道。请帮忙。如果有必要,我会添加我的代码的其他部分。

【问题讨论】:

  • 是一个循环,您在其中放置了一个
    (除其他外),这似乎没有意义。该代码正在尝试创建多个表单(在循环内),但我认为您不希望这样。另外,为什么这行#{commentController.getComments(request.getParameter('item_id'))}。您尚未发布 CommentController,但我认为可能有更简单的方法来获取对列表的引用。
  • 您认为问题出在控制器上吗?我应该发布它的代码吗? @dsp_user
  • 是的,发布代码,正如我所说,在 中放置
    是不寻常的。
  • 我重写了页面并添加了控制器的代码@dsp_user
  • 你为什么期望得到一个新的bean?您正在使用旧 ID (request.getParameter('item_id')) 调用 getComments

标签: jsf foreach jstl


【解决方案1】:

您已将 c:foreach 的 var 参数设置为与请求范围内的 Comments 托管 bean 相同的名称。因此,我建议的第一件事是从您的 Comment 类中删除托管 bean 注释;根据您提供的代码,没有理由让它成为一个。

【讨论】:

    猜你喜欢
    • 2014-11-02
    • 2013-02-13
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    相关资源
    最近更新 更多