Problem with a4j:htmlCommandLink action firing
artgonch Jan 24, 2012 11:19 AMHello!
I'am new in RF. And there is my problem. Here is JSP code (the problem code is marked as RED):
<%@ taglib uri="http://richfaces.org/a4j" prefix="a4j" %>
<%@ taglib uri="http://richfaces.org/rich" prefix="rich" %>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core" %>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<f:loadBundle basename="org.conservatory.es.web.backing.resources.article" var="article_var"/>
<html>
<head><title>Просмотр статьи</title></head>
<body>
<f:view>
<%--<rich:modalPanel id="image-view" autosized="true">--%>
<%--<a href="#" onclick="Richfaces.hideModalPanel('image-view');return false">--%>
<%--<h:graphicImage id="image" value="#{viewArticleBean.selectedImageUrl}"--%>
<%--rendered="#{viewArticleBean.selectedImageUrl != null}"/>--%>
<%--</a>--%>
<%--</rich:modalPanel>--%>
<a4j:form>
<%-- Шапка страницы --%>
<f:subview id="page-header">
<jsp:include page="header.jsp"/>
</f:subview>
<%-- Средняя часть --%>
<table width="100%" border="0" cellspacing="10">
<tr>
<%-- Меню --%>
<td width="15%" valign="top">
<f:subview id="page-menu">
<jsp:include page="left-menu.jsp"/>
</f:subview>
</td>
<%-- Контекстно-зависимая часть --%>
<td valign="top">
<center>
<%-- Вернуться к результатам поиска --%>
<a4j:htmlCommandLink action="goto-results">
<h:outputText value="#{article_var.back}"/>
</a4j:htmlCommandLink>
</center>
<br/>
<%-- Отображение статьи. --%>
<%-- Изображения --%>
<rich:simpleTogglePanel label="#{article_var.images_title}"
rendered="#{not empty viewArticleBean.images}"
switchType="client">
<a4j:repeat value="#{viewArticleBean.images}" var="image">
<h:outputLink value="view-image.jsp" target="_blank">
<h:graphicImage value="#{image.fullPathEscise}" alt="#{image.description}"
title="#{image.description}"/>
<f:param name="img_url" value="#{image.fullPath}"/>
<f:param name="img_title" value="#{image.descriptionEncUtf8}"/>
</h:outputLink>
</a4j:repeat>
</rich:simpleTogglePanel>
<%-- Текст статьи --%>
<rich:panel>
<%-- Заголовок статьи--%>
<f:facet name="header">
<h:outputText value="#{viewArticleBean.article.title}" escape="true"/>
</f:facet>
<%-- Текст статьи --%>
<h:outputText value="#{viewArticleBean.articleText}" escape="false"/>
<%--
When is click this link on the web page, the action dows not fire and the browser recieves the same page.
--%>
<br/>
<strong>Персональные ссылки</strong>
<br/>
<a4j:repeat value="#{viewArticleBean.personalLinks}" var="lnk">
<a4j:htmlCommandLink action="#{viewArticleBean.showArticle}">
<h:outputText value="#{lnk.title}"/>
<a4j:actionparam name="selectedArticle" value="#{lnk.articleNum}"
assignTo="#{viewArticleBean.selectedArticleId}"/>
</a4j:htmlCommandLink>
<br/>
</a4j:repeat>
<br/>
<strong>Предметные ссылки</strong>
<br/>
<a4j:repeat value="#{viewArticleBean.subjLinks}" var="lnk">
<a4j:htmlCommandLink action="#{viewArticleBean.showArticle}">
<h:outputText value="#{lnk.title}"/>
<a4j:actionparam name="selectedArticle" value="#{lnk.articleNum}"
assignTo="#{viewArticleBean.selectedArticleId}"/>
</a4j:htmlCommandLink>
<br/>
</a4j:repeat>
</rich:panel>
<%-- Список прикрепленных к статье файлов (архив статьи) --%>
<rich:simpleTogglePanel label="#{article_var.article_archive}"
rendered="#{not empty viewArticleBean.archiveList}"
switchType="client">
<a4j:repeat value="#{viewArticleBean.archiveList}" var="archiveItem">
<h:outputLink value="#{archiveItem.webFileName}">
<h:outputText value="#{archiveItem.ownFileName}"/>
<br/>
</h:outputLink>
</a4j:repeat>
</rich:simpleTogglePanel>
<%-- Возвращение к результатам поиска --%>
<center>
<a4j:htmlCommandLink action="goto-results">
<h:outputText value="#{article_var.back}"/>
</a4j:htmlCommandLink>
</center>
</td>
</tr>
</table>
<%-- Дно страницы --%>
<f:subview id="page-footer">
<jsp:include page="footer.jsp"/>
</f:subview>
</a4j:form>
</f:view>
</body>
</html>
All entries of a4j:hmlCommandLink in this page work fine. But the marked code does not fire action in backing bean. All names in EL are were checked.
Here is the bean code:
package org.conservatory.es.web.backing;
import edu.pgups.ipset.util.SqlUtils;
import javax.faces.context.FacesContext;
import javax.faces.context.ExternalContext;
import java.net.URLEncoder;
import java.sql.Connection;
import java.sql.SQLException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Map;
import java.util.List;
import java.util.Set;
import org.conservatory.es.dao.ArticleArchiveDAO;
import org.conservatory.es.model.ArticleArchiveEntity;
import org.conservatory.webbiblio.common.outputlangprocessor.extension.ExtensionManager;
import org.conservatory.webbiblio.common.outputlangprocessor.FormatProcessor;
import org.conservatory.webbiblio.common.outputlangprocessor.FormatProcessorFactory;
import org.conservatory.es.dao.ArticleDao;
import org.conservatory.es.dao.ImageDao;
import org.conservatory.es.model.ImageEntity;
import org.dom4j.DocumentException;
import artem.marc.*;
/**
* Created by IntelliJ IDEA.
* User: admin
* Date: 24.11.2009
* Time: 18:23:06
* Бин страницы просмотра выюранной статьи.
*/
public class ViewArticleBean {
/**
* Идентификатор выбранной статьи.
*/
private String selectedArticleId;
/**
* Менеджер расширения формата.
*/
private ExtensionManager extensionManager = new ExtensionManager();
/**
* Выбранная статья.
*/
private ExtMarcRecord article;
/**
* Текст статьи.
*/
private String articleText;
/**
* Список прикрепленных к статье изображений.
*/
private List<ImageEntity> images;
/**
* Список прикрепленных к статье файлов (архив)
*/
private List<ArticleArchiveEntity> archiveList;
/**
* URL выбранного изображения.
*/
private String selectedImageUrl;
/**
* Список заголовкой персональных ссылок.
*/
private List<LinkPair> personalLinks;
/**
* Список заголовков статей предметных ссылок
*/
private List<LinkPair> subjLinks;
/**
* Конструктор.
*/
public ViewArticleBean() {
// No-op.
}
/**
* This method should be ccalled from a4j:htmlCommandLink action
*
* @return
*/
public String showArticle() {
Connection conn = null;
final ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
final Map<String, Object> appMap = ec.getApplicationMap();
final Map<String, Object> sessionMap = ec.getSessionMap();
try {
conn = SqlUtils.getConnection("es");
List<ExtMarcRecord> resultList = (List<ExtMarcRecord>) sessionMap.get("result-list");
long id = Long.parseLong(selectedArticleId);
for (ExtMarcRecord mr : resultList) {
if (mr.getId() == id) {
article = mr;
}
}
//
ExtensionManager extensionManager = (ExtensionManager) appMap.get("extension-manager");
FormatProcessor processor = new FormatProcessorFactory().createProcessor(new FileReader((String) appMap.get("article-view-format")), (String) appMap.get("document-base"), null, extensionManager);
StringBuilder buf = processor.processRecord(article);
// Выполнить доп. обработку текста, чтобы заменить символы с кодом 1, на команду HTML
StringBuilder bufProcessed = preprocessFullText(buf);
// Сформировать свойство бина для отображения на веб-странице.
articleText = bufProcessed.toString();
// Загрузка описателей изображений, отнесенных к данной статье.
ImageDao dao = new ImageDao(conn);
images = dao.load(id);
String picturesBaseUrl = (String) appMap.get("pictures-base-url");
for (ImageEntity ie : images) {
ie.setFullPath(picturesBaseUrl + ie.getFullPath());
ie.setFullPathEscise(picturesBaseUrl + ie.getFullPathEscise());
}
// Загрузка списка прикрепленных файлов (архив статьи)
ArticleArchiveDAO adao = new ArticleArchiveDAO(conn);
archiveList = adao.getArchive(id);
String archiveBaseUrl = (String) appMap.get("archive-base-url");
for (ArticleArchiveEntity ae : archiveList) {
ae.setFilename(archiveBaseUrl + ae.getFilename());
}
// Поиск в статье предметных и персональных ссылоук и отображение.
// TODO: выяснить, почему из файла web.xml не попадают нижеследующие парамтры
// String persLinkFldLbl = (String)appMap.get("personal-link-field-label");
// String subjLinkFldLbl = (String)appMap.get("subject-link-field-label");
// String linkSubFldArticleTitle = (String)appMap.get("link-subfield-article-title-label");
// String linkSubFldArticleNum = (String)appMap.get("link-subfield-article-num-label");
// Показ персональных ссылок
// Set<Field> persLinkSet = article.getFieldSet(persLinkFldLbl);
Set<Field> persLinkSet = article.getFieldSet("65");
personalLinks = new ArrayList<LinkPair>(persLinkSet.size());
for (Field f : persLinkSet) {
// SubField sfTitle = f.getSubField(linkSubFldArticleTitle.charAt(0));
SubField sfTitle = f.getSubField('a');
if (sfTitle == null) {
continue;
}
// SubField sfArticleNum = f.getSubField(linkSubFldArticleNum.charAt(0));
SubField sfArticleNum = f.getSubField('b');
if (sfArticleNum == null) {
continue;
}
personalLinks.add(new LinkPair(sfTitle.getData().toString(), sfArticleNum.getData().toString()));
} // for
// Показ предметных ссылок
// Set<Field> subjLinkSet = article.getFieldSet(subjLinkFldLbl);
Set<Field> subjLinkSet = article.getFieldSet("66");
subjLinks = new ArrayList<LinkPair>(subjLinkSet.size());
for (Field f : subjLinkSet) {
// SubField sfTitle = f.getSubField(linkSubFldArticleTitle.charAt(0));
SubField sfTitle = f.getSubField('a');
if (sfTitle == null) {
continue;
}
// SubField sfArticleNum = f.getSubField(linkSubFldArticleNum.charAt(0));
SubField sfArticleNum = f.getSubField('b');
if (sfArticleNum == null) {
continue;
}
subjLinks.add(new LinkPair(sfTitle.getData().toString(), sfArticleNum.getData().toString()));
} // for
// Оторажение страницы
return "show-article";
}
catch (SQLException e) {
ec.log("Ошибка при обращении к БД. Причина: " + e.getMessage(), e);
// TODO: make error message.
return "error";
}
catch (DocumentException ex) {
ec.log("Ошибка при обработке формата. Причина: " + ex.getMessage(), ex);
// TODO: make error message.
return "error";
}
catch (IOException e) {
ec.log("Ошибка ввода-вывода. Причина: " + e.getMessage(), e);
// TODO: make error message.
return "error";
}
finally {
SqlUtils.close(conn);
}
}
/**
* Выполняет просмотр текста статьи и заменяет все символы с кодом 1 на команды html
*
* @param buf
* @return
*/
private StringBuilder preprocessFullText(StringBuilder buf) {
int len = buf.length();
StringBuilder bufProcessed = new StringBuilder(len + 20);
bufProcessed.append("<p align=\"justify\">");
for (int i = 0; i < len; i++) {
char c = buf.charAt(i);
if ((int) c == 1) {
bufProcessed.append("<br/><br/>");
} else {
bufProcessed.append(c);
}
} // for
bufProcessed.append("<p/>");
return bufProcessed;
}
/**
* @return
*/
public String getSelectedArticleId() {
return selectedArticleId;
}
/**
* @param selectedArticleId
*/
public void setSelectedArticleId(String selectedArticleId) {
this.selectedArticleId = selectedArticleId;
}
/**
* @return
*/
public ExtMarcRecord getArticle() {
return article;
}
/**
* @param article
*/
public void setArticle(ExtMarcRecord article) {
this.article = article;
}
/**
* @return
*/
public String getArticleText() {
return articleText;
}
/**
* @param articleText
*/
public void setArticleText(String articleText) {
this.articleText = articleText;
}
/**
* @return
*/
public List<ImageEntity> getImages() {
return images;
}
/**
* @return
*/
public List<ArticleArchiveEntity> getArchiveList() {
return archiveList;
}
/**
* @param archiveList
*/
public void setArchiveList(List<ArticleArchiveEntity> archiveList) {
this.archiveList = archiveList;
}
/**
* @return
*/
public String getSelectedImageUrl() {
return selectedImageUrl;
}
/**
* @param selectedImageUrl
*/
public void setSelectedImageUrl(String selectedImageUrl) {
this.selectedImageUrl = selectedImageUrl;
}
/**
* @return
*/
public List<LinkPair> getPersonalLinks() {
return personalLinks;
}
/**
* @return
*/
public List<LinkPair> getSubjLinks() {
return subjLinks;
}
}
RichFaces version - 3.3.2.
Thanks in advance.