java – jsf中的SelectBooleanCheckbox
发布时间:2020-05-24 01:28:26 所属栏目: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 <h:form id="main-form" onsubmit="return getSelectedCheckBoxes()">
<h:commandLink styleClass="news-link" action="#{controller.list}"
value="#{messages['body.news']}" />
>>
<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? (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
