0 Replies Latest reply on Jan 24, 2012 11:19 AM by Artem Goncharov

    Problem with a4j:htmlCommandLink action firing

    Artem Goncharov Newbie

      Hello!

       

      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.