嗨,我是jsf的新手,有这样的问题.我有以下代码的起始页:
value="#{messages['body.label.view']}" />
value="#{messages['body.label.edit']}" />
value="#{newsForm.checkBoxes[news.id]}" />
我有2个托管bean,一个是我的控制器bean(用于删除,创建,更新新闻),第二个是用于将有关新闻的信息存储在数据库(newsForm)中.所有bean都具有@SessionScoped批注. Controller bean具有后构造函数,该后构造函数从数据库获取所有新闻并将其设置为newsForm bean.但是,当我启动应用程序时,我看到一个空页面(因为未创建我的Controller bean).但是,当我按下调用控制器bean方法的链接时,我在应用程序控制台中找到了控制器bean创建并处理了后构造函数的过程.
也许我错了,但是我认为当会话创建由jsf创建的所有SessionScoped bean时.
如果我错了,请纠正我,或者提供建议,让我在打开起始页时如何让我的应用显示所有新闻.
更新
我在Controller bean中的构造函数:
@PostConstruct
public void init() {
try {
list();
} catch (NewsManagerException e) {
}
}
列出方法:
public String list() throws NewsManagerException {
newsForm.setNews(new News());
newsForm.setCheckBoxes(new HashMap());
newsForm.setNewsList(newsDao.getNewsList());
setAttribute(PREVIoUS_PAGE,LIST);
return LIST;
}
更新2
这是ControllerBean(与Struts中的Action类类似)
public final class ControllerBean implements Serializable {
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 REDIRECT = "?faces-redirect=true";
private final static Log log = LogFactory.getLog(ControllerBean.class);
private INewsDao newsDao;
private NewsBean newsForm;
public ControllerBean() {
}
@PostConstruct
public void init() {
list();
}
public String list() {
newsForm.setNews(new News());
newsForm.setCheckBoxes(new HashMap());
try {
newsForm.setNewsList(newsDao.getNewsList());
} catch (NewsManagerException e) {
log.error(e);
}
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 sessionMap = FacesContext.getCurrentInstance()
.getExternalContext().getSessionMap();
sessionMap.put(name,value);
}
private String getAttribute(String name) {
Map sessionMap = FacesContext.getCurrentInstance()
.getExternalContext().getSessionMap();
return (String) sessionMap.get(name);
}
public String save() {
int id = newsForm.getNews().getId();
setAttribute(PREVIoUS_PAGE,VIEW);
try {
if (id == 0) {
newsDao.createNews(newsForm.getNews());
return VIEW;
}
newsDao.editNews(newsForm.getNews());
} catch (NewsManagerException e) {
log.error(e);
}
return VIEW;
}
public String edit(int id) {
try {
News news = newsDao.getNewsById(id);
newsForm.setNews(news);
} catch (NewsManagerException e) {
log.error(e);
}
return EDIT;
}
public String view(int id) {
try {
setAttribute(PREVIoUS_PAGE,VIEW);
newsForm.setNews(newsDao.getNewsById(id));
} catch (NewsManagerException e) {
log.error(e);
}
return VIEW;
}
public String cancel() {
String page = getAttribute(PREVIoUS_PAGE);
News news = newsForm.getNews();
try {
if (news.getId() != 0) {
int id = news.getId();
news = newsDao.getNewsById(id);
newsForm.setNews(news);
}
} catch (NewsManagerException e) {
log.error(e);
}
return page;
}
public String delete() {
try {
setAttribute(PREVIoUS_PAGE,LIST);
Map allCheckBoxes = newsForm.getCheckBoxes();
Set checkBoxes = newsForm.getCheckBoxes().keySet();
Set 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());
} catch (NewsManagerException e) {
log.error(e);
}
return list() + REDIRECT;
}
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;
}
}
NewsBean(简单的bean在Struts中充当ActionForm元素)
public final class NewsBean implements Serializable {
private static final long serialVersionUID = 1L;
private News news;
private List newsList;
private Map checkBoxes = new HashMap<>();
public NewsBean() {
}
public News getNews() {
return news;
}
public void setNews(News news) {
this.news = news;
}
public List getNewsList() {
return newsList;
}
public void setNewsList(List newsList) {
this.newsList = newsList;
}
public Map getCheckBoxes() {
return checkBoxes;
}
public void setCheckBoxes(Map checkBoxes) {
this.checkBoxes = checkBoxes;
}
}
制图
controller
com.epam.newsmanagement.beans.ControllerBean
session
newsDao
#{jpaDao}
newsForm
#{newsForm}
newsForm
com.epam.newsmanagement.beans.NewsBean
session