加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – jsf中的SelectBooleanCheckbox

发布时间:2020-12-14 19:34:33 所属栏目:Java 来源:网络整理
导读:嗨,我是JSF的新手,有这样的问题.在我的页面上,我有新闻列表,每个新闻都有复选框(我们可以选中此复选框,然后删除已检查的新闻).这很好用.但是在删除之后我返回到我的页面然后按F5然后我的应用程序认为检查了删除后的复选框并将其删除.例如我有这个: 按删除按
嗨,我是JSF的新手,有这样的问题.在我的页面上,我有新闻列表,每个新闻都有复选框(我们可以选中此复选框,然后删除已检查的新闻).这很好用.但是在删除之后我返回到我的页面然后按F5然后我的应用程序认为检查了删除后的复选框并将其删除.例如我有这个:

按删除按钮,并具有:

按f5,我看到了这个:

所以我的删除方法如下所示:

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

在我的页面我使用selectBooleanCheckbox:

<h:selectBooleanCheckbox id="checkbox" 
                            value="#{newsForm.checkboxes[news.id]}" />

所以当我按下f5我的Map< Integer,Boolean>时,我不明白为什么allCheckboxes有一些值为true的元素.每次删除后我都会重新创建Map< Integer,Boolean> allCheckboxes

UPDATE
news.xhtml

<h:form id="main-form" onsubmit="return getSelectedCheckBoxes()">
                <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:selectBooleanCheckbox id="checkbox" 
                            value="#{newsForm.checkboxes[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="checkbox-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> checkboxes = 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> getCheckboxes() {
        return checkboxes;
    }

    public void setCheckboxes(Map<Integer,Boolean> checkboxes) {
        this.checkboxes = checkboxes;
    }
}

控制器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.setCheckboxes(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> allCheckboxes = newsForm.getCheckboxes();
        Set<Integer> checkboxes = newsForm.getCheckboxes().keySet();
        Set<Integer> checkedCheckboxes = new HashSet<>();
        for(Integer id : checkboxes){
            boolean value = allCheckboxes.get(id);
            if(value){
                checkedCheckboxes.add(id);
            }
        }
        if (checkedCheckboxes.size() != 0) {
            newsDao.deleteNewsById(checkedCheckboxes.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;
    }

}

解决方法

您的具体问题是由于复选框值本质上是请求/视图范围,但您的托管bean是会话范围的,并且您删除后没有清除已选中的复选框值.

您需要将视图范围数据放在视图范围中而不是会话范围中.

@ManagedBean
@ViewScoped

也可以看看:

> How to choose the right bean scope?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读