如何通过h:commandLink传递请求参数

时间:2015-12-29 20:21:03

标签: jsf parameter-passing commandlink http-request-parameters

我的xhtml页面中有两个表单,第一个包含一个调用ManagedBean方法的commandLink:

<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 由于我的应用程序中的过滤器需要一个请求参数,过滤器不存在,一切正常!! < / p>

这是唯一的过滤器,请注意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 个答案:

答案 0 :(得分:0)

只要他的过滤器启用,OP就会出现问题。每当他这样做时就抛出了一个java.lang.NumberFormatException异常。

当请求参数为null或为空或不是数字时,对过滤器的仔细检查会发现可能的NumberFormatException。

过滤器:

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

OP假设这个param不能为null,因为他正在传递参数

ACTION:

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}" />

结束编辑 在他的违规commandLink中,过滤器接收此参数。