Как передать параметр запроса через 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";
}
}
второй имеет команду Button:
<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 Status 500:java.lang.NumberFormatException: null из-за фильтра в моем приложении, который требует параметр запроса, и там, где его нет, все работает отлично!!
Вот единственный фильтр, обратите внимание, что ConnexionUtilisateurBean является SessionScoped Bean
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);
}
}
заранее спасибо
РЕДАКТИРОВАТЬ: ИЗ OP комментарии:
Я думаю, что фильтр блокирует запрос, как я уже говорил, когда фильтра нет, все работает нормально, но я не знаю, почему!!
1 ответ
У OP были проблемы, когда его фильтр был включен. Исключение 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 для фильтра, чтобы получить этот параметр.