Как передать параметр запроса через h: commandLink

У меня есть две формы на моей странице xhtml, первая включает в себя commandLink, которая вызывает метод ManagedBean:

<h:form prependId="false">
    <h:commandLink action="#{gestionSessionBean.allerAuSecondMur}">
        <p><h:graphicImage library="default" name="#{gestionSessionBean.logoSecondMur}" id="LogoEcole" /></p>
        <p>Mur <h:outputText value="#{gestionSessionBean.nomSecondMur}"/></p>
    </h:commandLink>
</h:form>

Вот метод:

public String allerAuSecondMur() {

    if(id_mur == 1) {
        return "/resources/restreint/Mur.xhtml?faces-redirect=true&id_mur=" + ecole.getId();
    } else {
        return "/resources/restreint/Mur.xhtml?faces-redirect=true&id_mur=1";
    }
}

у второго есть commandButton :

 <h:commandButton class="btn btn-primary btn-sm col-xs-offset-3 col-xs-1" value="Partager" id="BoutonPartager"  action="#{gestionSessionBean.sauvgarderSujet}" />

для метода:

public void sauvgarderSujet() {

   // business stuff
    FacesMessage message = new FacesMessage("Fine");
    FacesContext.getCurrentInstance().addMessage(null,message);
}

когда я нажимаю кнопку, она работает нормально (у меня есть глобальное сообщение с информационным классом и словом Fine show после нажатия кнопки), но когда я нажимаю commanLink, действие не вызывается, на самом деле оно перенаправляет меня на страницу: http://localhost:8080/project_name/resources/restreint/Mur.xhtml без параметр запроса.

Затем я сталкиваюсь с HTTP-статусом 500: java.lang.NumberFormatException: null из-за фильтра в моем приложении, который требует параметр запроса, а там, где фильтра нет, все работает нормально!

Вот единственный фильтр, обратите внимание, что ConnexionUtilisateurBean — это компонент SessionScoped.

  public static final String CONNEXION_UTILISATEUR_BEAN =   "connexionUtilisateurBean";
  public static final String PAGE_ACCUEIL = "/resources/accueil.xhtml";
  public static final String MUR = "/resources/restreint/Mur.xhtml?id_mur=";

 @Override
   public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

    HttpServletRequest request = (HttpServletRequest) servletRequest;
    HttpServletResponse response = (HttpServletResponse) servletResponse;

    HttpSession session = request.getSession();
    UtilisateurDao utilisateurDao = new UtilisateurDao();

    ConnexionUtilisateurBean connexionUtilisateurBean = (ConnexionUtilisateurBean) session.getAttribute(CONNEXION_UTILISATEUR_BEAN);

    Utilisateur utilisateur = connexionUtilisateurBean.getUtilisateur();

    String paramIdMur = request.getParameter("id_mur");
    int paramTdMurInteger = Integer.parseInt(paramIdMur);
    int idEcoleUtilisateur = utilisateur.getEcole().getId();

    boolean problemeAuNiveauIdentifiantMur = (paramTdMurInteger != 1) && paramTdMurInteger != idEcoleUtilisateur;

    if (utilisateurDao.evaluerExistenceUtilisateur(utilisateur.getEmail()) == null) {
        response.sendRedirect(request.getContextPath() + PAGE_ACCUEIL);
    } else if (problemeAuNiveauIdentifiantMur) {
        response.sendRedirect(request.getContextPath() + MUR + 1);
    } else {
        filterChain.doFilter(request, response);
    }
}

заранее спасибо

РЕДАКТИРОВАТЬ: ИЗ комментариев ОП:

Я думаю, что фильтр блокирует запрос, как я уже упоминал, когда фильтра нет, все работает нормально, но я не знаю, почему !!


person A.Chakroun    schedule 29.12.2015    source источник
comment
без вызова действия трудно поверить, что оно перенаправляет на Mur.xhtml. stackoverflow.com/questions/2118656/ применимы к любому из ваших сценариев?   -  person Mahendran Ayyarsamy Kandiar    schedule 29.12.2015
comment
Я думаю, что фильтр блокирует запрос, как я уже упоминал, когда фильтра нет, все работает нормально, но я не знаю, почему !! .. HTTP-статус 500: java.lang.NumberFormatException: null из-за отсутствия параметра запроса id_mur, что странно, так как он есть в URL-адресе перенаправления !!   -  person A.Chakroun    schedule 29.12.2015
comment
Есть ли причина устанавливать prependId в false? Поместите оператор stdout внутрь метода allerAuSecondMur(), чтобы увидеть, правильно ли он вызывается. Проверьте, оценивается ли единственное условие в этом методе правильное логическое значение или нет, и наличие ecole.getId().   -  person Tiny    schedule 29.12.2015
comment
Причина установки prepenId в false заключается в том, чтобы стилизовать h:graphicImage с использованием предоставленного идентификатора (другими словами, избегать сгенерированного jsf идентификатора)... есть ecole.getId(), и я не понимаю, как я могу проверить, если метод вызывается с помощью стандартного вывода !! можно уточнить пожалуйста..   -  person A.Chakroun    schedule 30.12.2015
comment
Не могли бы вы добавить свой код фильтра в вопрос, пожалуйста?   -  person Mahendran Ayyarsamy Kandiar    schedule 30.12.2015
comment
NumberFormatException может иметь место, потому что paramidMur имеет значение null или пустое или не представляет здесь число --› String paramIdMur = request.getParameter("id_mur"); int paramTdMurInteger = Integer.parseInt(paramIdMur); В вашем фильтре отсутствует множество проверок работоспособности.   -  person Mahendran Ayyarsamy Kandiar    schedule 30.12.2015
comment
Да, и я хочу выяснить, почему, как вы можете видеть, когда нажимается commanLink, я устанавливаю параметр запроса id_mur, так почему его нет, и если мы предполагаем, что действие не вызывается снова, в чем дело, особенно в том, что когда я откладываю фильтр все работает нормально!!..Спасибо, надеюсь, мы найдем решение   -  person A.Chakroun    schedule 30.12.2015
comment
Я не вижу, что вы передаете параметр запроса в свою команду CommandLink. Прочтите mkyong. com/jsf2/ и используйте шаг 2 для передачи параметров запроса. Поскольку вы неправильно передаете параметр запроса в commandLink, в фильтре возникает исключение NumberFormatException, поэтому он работает без фильтра.   -  person Mahendran Ayyarsamy Kandiar    schedule 30.12.2015
comment
вернуть /resources/restreint/Mur.xhtml?faces-redirect=true&id_mur=1; ›››› часть &id_mur=1 должна передавать параметр запроса с именем id_mur и значением 1?!   -  person A.Chakroun    schedule 30.12.2015
comment
@Tiny, где я должен увидеть вывод с помощью stdout ?! я использую Intellijidea 14 и не вижу никаких выходных данных в консоли сервера! .. спасибо за вашу помощь   -  person A.Chakroun    schedule 30.12.2015
comment
Он отображается на терминале сервера (лог сервера), который вы видите при запуске используемого вами сервера.   -  person Tiny    schedule 30.12.2015
comment
Хорошо, я проверю это.. спасибо   -  person A.Chakroun    schedule 30.12.2015
comment
ОП: 'return /resources/restreint/Mur.xhtml?faces-redirect=true&id_mur=1 действует. фильтр заходит до этого а вы сами сказали действие не вызывается. @Tiny Я хочу, чтобы ОП понимала параметр передачи и не учитывала области действия, используемые г-ном Йонгом.   -  person Mahendran Ayyarsamy Kandiar    schedule 30.12.2015
comment
@Mahendran Ayyarsamy Kandiar URL-адрес, с которым работает фильтр перед вызовом действия ManagedBean ?!   -  person A.Chakroun    schedule 30.12.2015
comment
@Mahendran Ayyarsamy Kandiar Большое спасибо, проблема решена, и да, мне нужно было передать параметр в URL-адресе ... Но у меня есть вопрос, на самом деле URL-адрес представления, который содержит commandLink i .../resources /restreint/Mur.xhtml?id_mur=1 так что фильтр работает только с localhost:8080 /project_name/resources/restreint/Mur.xhtml ???   -  person A.Chakroun    schedule 30.12.2015
comment
@A.Chakroun, когда вы нажимаете действие commandLink или commandButton, отправляется запрос POST и вызывается фильтр. Я добавлю это как решение. Если вы хотите, вы можете нажать на зеленую галочку под треугольником вниз   -  person Mahendran Ayyarsamy Kandiar    schedule 30.12.2015


Ответы (1)


У ОП возникали проблемы всякий раз, когда его фильтр был включен. Всякий раз, когда он это делал, возникало исключение java.lang.NumberFormatException.

Более тщательная проверка фильтра выявила возможное исключение NumberFormatException, когда параметр запроса был нулевым, пустым или не был числовым.

ФИЛЬТР:

String paramIdMur = request.getParameter("id_mur");
int paramTdMurInteger = Integer.parseInt(paramIdMur);
int idEcoleUtilisateur = utilisateur.getEcole().getId();

ОП предположил, что этот параметр не может быть нулевым, поскольку он передает параметры в действии.

ДЕЙСТВИЕ:

public String allerAuSecondMur() {

if(id_mur == 1) {
    return "/resources/restreint/Mur.xhtml?faces-redirect=true&id_mur=" + ecole.getId();
} else {
    return "/resources/restreint/Mur.xhtml?faces-redirect=true&id_mur=1";
}

}

Но каждое действие — это POST-запрос, и фильтр срабатывает для его urlPatterns.

Таким образом, OP необходимо передать параметр запроса как

НАЧАТЬ РЕДАКТИРОВАНИЕ:

<f:param name="id_mur" value="{gestionSessionBean.id_mur}" />

END EDIT в его оскорбительной команде CommandLink, чтобы Фильтр получил этот параметр.

person Mahendran Ayyarsamy Kandiar    schedule 29.12.2015
comment
значение = {gestionSessionBean.id_mur} - person A.Chakroun; 30.12.2015