Java – selectboolean checkbox in JSF

Hi, I'm new to JSF. I have such a problem On my page, I have a list of news, and each news has a check box (we can select this check box and delete the checked News) It works well But after deleting, I return to my page and press F5. Then my application thinks it has checked the deleted check box and deleted it For example, I have this:

Press the delete button and have:

Press F5 and I see this:

So my deletion method is as follows:

Map<Integer,Boolean> allCheck@R_335_2419@es = newsForm.getCheck@R_335_2419@es();
Set<Integer> check@R_335_2419@es = newsForm.getCheck@R_335_2419@es().keySet();
Set<Integer> checkedCheck@R_335_2419@es = new HashSet<>();
for(Integer id : check@R_335_2419@es){
    boolean value = allCheck@R_335_2419@es.get(id);
    if(value){
        checkedCheck@R_335_2419@es.add(id);
    }
}
if (checkedCheck@R_335_2419@es.size() != 0) {
    newsDao.deleteNewsById(checkedCheck@R_335_2419@es.toArray());
} else {
    Integer[] delete = { newsForm.getNews().getId() };
    newsDao.deleteNewsById(delete);
}
newsForm.setNewsList(newsDao.getNewsList());
return list() + REDIERCT;

On my page I use selectBooleanCheck@R_335_2419 @:

<h:selectBooleanCheck@R_335_2419@ id="check@R_335_2419@" 
                            value="#{newsForm.check@R_335_2419@es[news.id]}" />

So when I press F5 my map < < integer, Boolean >, I don't understand why allCheck@R_335_2419 @ES has some elements with a value of true After each deletion, I will recreate the map < < integer, Boolean > allCheck@R_335_2419 @es

UPDATE news. xhtml

<h:form id="main-form" onsubmit="return getSelectedCheck@R_335_2419@es()">
                <h:commandLink styleClass="news-link" action="#{controller.list}"
                    value="#{messages['body.news']}" />
                &gt;&gt;
                <h:outputText value="#{messages['body.news.titles.list']}" />
                <br />
                <ui:repeat id="repeat" var="news" value="#{newsForm.newsList}">
                    <div id="news-table">
                        <div id="news-list-title">
                            <h:outputText value="#{messages['body.news.title']}" />
                            <h:outputText style="margin-left:10px;" value="#{news.newsTitle}" />
                        </div>
                        <div id="news-list-date">
                            <h:outputText value="#{news.newsDate}">
                                <f:convertDateTime pattern="dd/MM/yyyy" />
                            </h:outputText>
                        </div>
                        <div id="news-list-brief">
                            <h:outputText value="#{news.brief}" />
                        </div>
                    </div>
                    <div id="links-style-area">
                        <h:commandLink action="#{controller.view(news.id)}"
                            value="#{messages['body.label.view']}" />
                        <h:commandLink action="#{controller.edit(news.id)}"
                            value="#{messages['body.label.edit']}" />
                        <h:selectBooleanCheck@R_335_2419@ id="check@R_335_2419@" 
                            value="#{newsForm.check@R_335_2419@es[news.id]}" />
                    </div>
                </ui:repeat>
                <p id="button-style"> 
                    <h:commandButton styleClass="button" action="#{controller.delete}"
                        onclick="clicked = 'deleteList'"
                        value="#{messages['body.button.delete']}"
                        rendered="#{not(empty newsForm.newsList)}" />
                </p>

                <h:outputText id="check@R_335_2419@-error"
                    value="#{messages['error.error.delete.list']}"
                    styleClass="errorMessage" />
            </h:form>

NewsForm bean:

@ManagedBean(name="newsForm")
@SessionScoped
public class NewsBean implements Serializable{
    private static final long serialVersionUID = 1L;
    private News news;
    private List<News> newsList;
    private Map<Integer,Boolean> check@R_335_2419@es = new HashMap<>();

    public NewsBean(){}

    public News getNews() {
        return news;
    }
    public void setNews(News news) {
        this.news = news;
    }

    public List<News> getNewsList() {
        return newsList;
    }
    public void setNewsList(List<News> newsList) {
        this.newsList = newsList;
    }

    public Map<Integer,Boolean> getCheck@R_335_2419@es() {
        return check@R_335_2419@es;
    }

    public void setCheck@R_335_2419@es(Map<Integer,Boolean> check@R_335_2419@es) {
        this.check@R_335_2419@es = check@R_335_2419@es;
    }
}

Controller bean:

@ManagedBean(name="controller")
@SessionScoped
public class ControllerBean implements Serializable{

    private static final long serialVersionUID = 1L;
    private static final String PREVIoUS_PAGE = "prevIoUsPage";
    private static final String LIST = "news";
    private static final String EDIT = "edit";
    private static final String VIEW = "view";
    private static final String REDIERCT = "?faces-redirect=true";

    @ManagedProperty(value="#{jpaDao}")
    private INewsDao newsDao;
    @ManagedProperty(value="#{newsForm}")
    private NewsBean newsForm;

    public ControllerBean() {
    }

    @postconstruct
    public void init() {
        try {
            list();
        } catch (NewsManagerException e) {
        }
    }

    public String list() throws NewsManagerException {
        newsForm.setNews(new News());
        newsForm.setCheck@R_335_2419@es(new HashMap<Integer,Boolean>());
        newsForm.setNewsList(newsDao.getNewsList());
        setAttribute(PREVIoUS_PAGE,LIST);
        return LIST;
    }

    public String add() {
        News news = new News();
        news.setNewsDate(new Date());
        newsForm.setNews(news);
        return EDIT;
    }

    private void setAttribute(String name,String value) {
        Map<String,Object> sessionMap = FacesContext.getCurrentInstance()
                .getExternalContext().getSessionMap();
        sessionMap.put(name,value);
    }

    private String getAttribute(String name) {
        Map<String,Object> sessionMap = FacesContext.getCurrentInstance()
                .getExternalContext().getSessionMap();
        return (String) sessionMap.get(name);
    }

    public String save() throws NewsManagerException {
        int id = newsForm.getNews().getId();
        setAttribute(PREVIoUS_PAGE,VIEW);
        if (id == 0) {
            newsDao.createNews(newsForm.getNews());
            return VIEW;
        }
        newsDao.editNews(newsForm.getNews());
        return VIEW;
    }

    public String edit(int id) throws NewsManagerException {
        News news = newsDao.getNewsById(id);
        newsForm.setNews(news);
        return EDIT;
    }

    public String view(int id) throws NewsManagerException {
        setAttribute(PREVIoUS_PAGE,VIEW);
        newsForm.setNews(newsDao.getNewsById(id));
        return VIEW;
    }

    public String cancel() throws NewsManagerException {
        String page = getAttribute(PREVIoUS_PAGE);
        News news = newsForm.getNews();
        if (news.getId() != 0) {
            int id = news.getId();
            news = newsDao.getNewsById(id);
            newsForm.setNews(news);
        }
        return page;
    }

    public String delete() throws NewsManagerException,IOException {
        setAttribute(PREVIoUS_PAGE,LIST);
        Map<Integer,Boolean> allCheck@R_335_2419@es = newsForm.getCheck@R_335_2419@es();
        Set<Integer> check@R_335_2419@es = newsForm.getCheck@R_335_2419@es().keySet();
        Set<Integer> checkedCheck@R_335_2419@es = new HashSet<>();
        for(Integer id : check@R_335_2419@es){
            boolean value = allCheck@R_335_2419@es.get(id);
            if(value){
                checkedCheck@R_335_2419@es.add(id);
            }
        }
        if (checkedCheck@R_335_2419@es.size() != 0) {
            newsDao.deleteNewsById(checkedCheck@R_335_2419@es.toArray());
        } else {
            Integer[] delete = { newsForm.getNews().getId() };
            newsDao.deleteNewsById(delete);
        }
        newsForm.setNewsList(newsDao.getNewsList());
        return list() + REDIERCT;
    }

    public INewsDao getNewsDao() {
        return newsDao;
    }

    public void setNewsDao(INewsDao newsDao) {
        this.newsDao = newsDao;
    }

    public NewsBean getNewsForm() {
        return newsForm;
    }

    public void setNewsForm(NewsBean newsForm) {
        this.newsForm = newsForm;
    }

}

Solution

Your specific problem is that the check box value is essentially request / view range, but your managed bean is session range, and you do not clear the selected check box value after deleting it

You need to put the view range data in the view range instead of the session range

@ManagedBean
@ViewScoped

You can also see:

> How to choose the right bean scope?

The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>