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

How to pass request parameter via h:commandLink

我的 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);
}

当我点击按钮时它工作正常(我有一个全局消息,其中包含信息 class 和点击按钮后 Fine show 一词)但是当我点击 commanLink 时实际上并没有调用操作它将我重定向到页面: http://localhost:8080/project_name/resources/restreint/Mur.xhtml 没有请求参数。

然后我面临一个 HTTP 状态 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 的评论:

I think the filter block the request as i mentioned when the filter is not there everything work fine but i don't know why !!

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

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

过滤器:

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

OP 假定此参数不能为 null,因为他正在传递参数

操作:

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 中让 Filter 接收这个参数。