如果在onclick事件中有一个javascript方法,commandButton没有正确设置f:param

时间:2013-05-19 14:27:41

标签: jsf-2 xhtml onclick html-rendering

在两个JSF视图之间xhtmls(都有视图范围的后台bean)我想在用户单击链接或按钮时传递参数。如果我有一个属性onclick与JavaScript函数打开另一个页面(在此页面中我想使用第一页中设置的参数)到commandButton或commandLink我得到f:param属性为{{1如果我没有onclick属性,我就对了\'currentAccess\':\'3\',\'gridNo\':\'5\', 如果我有:

'currentAccess':'3','gridNo':'5',

HTML呈现如下:

<h:commandButton action="#{statisticsBean.showAccessIncorectAnswers()}" target="_blank"
    value="#{strings.whatHaveDoDoneWrong}" rendered="#{o.date != '-' and o.answerNoWrong != 0}">
    <f:param name="currentAccess" value="#{o.currentAccess}"/>      
    <f:param name="gridNo" value="#{o.noGrid}"/>
    <f:param name="gridCategory" value="#{o.category}"/>
</h:commandButton>

这很好,我可以访问参数(f:viewpara或FacesContext,我使用最后一个像<input type="submit" name="j_idt73:0:j_idt74:j_idt77" value="Ce ai gresit" onclick="mojarra.jsfcljs(document.getElementById('j_idt73:0:j_idt74'),{'j_idt73:0:j_idt74:j_idt77':'j_idt73:0:j_idt74:j_idt77','currentAccess':'1','gridNo':'5','gridCategory':'Drept Procesual Civil'},'');return false" />

BUT 如果我有:

FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("currentAccess")

在onclick事件中使用JavaScript函数我得到渲染:

<h:commandButton action="#{statisticsBean.showAccessIncorectAnswers()}" target="_blank"
    onclick="confirmGridStatistics('#{strings.doYouWantToSeeTheWrongAnswersInAccessNo} #{o.currentAccess} #{strings.fromDate} #{o.date}?');"
    value="#{strings.whatHaveDoDoneWrong}" rendered="#{o.date != '-' and o.answerNoWrong != 0}">
        <f:param name="currentAccess" value="#{o.currentAccess}"/>
        <f:param name="gridNo" value="#{o.noGrid}"/>
        <f:param name="gridCategory" value="#{o.category}"/>
</h:commandButton>

并且在第二个视图支持bean中,我得到了<input type="submit" name="j_idt73:2:j_idt74:j_idt77" value="Ce ai gresit" onclick="jsf.util.chain(this,event,'confirmGridStatistics(\'Vrei sa vezi raspunsurile gresite in accessul 3 din data de 16-05-2013?\');','mojarra.jsfcljs(document.getElementById(\'j_idt73:2:j_idt74\'),{\'j_idt73:2:j_idt74:j_idt77\':\'j_idt73:2:j_idt74:j_idt77\',\'currentAccess\':\'3\',\'gridNo\':\'5\',\'gridCategory\':\'Drept Procesual Civil\'},\'\')');return false" /> 来自FacesContext的参数。那是为什么?

更新 我以为

动作方法中的

null可以解决它。但事实并非如此,它给了我一个FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().put("currentAccess", access);

我不知道为什么会这样。

1 个答案:

答案 0 :(得分:0)

我已经用黑客解决了我的问题。我仍然不知道为什么用参数描述的问题。

我的解决方案(我知道这是一个黑客攻击):

  • JavaScipt函数和其他东西打开了我的第二个视图(我想传递参数)
  • 所以我把参数(我想要传递)放到JavaScipt函数

    <h:commandButton action="#{statisticsBean.showAccessIncorectAnswers()}" target="_blank"
        onclick="confirmGridStatistics('#{strings.doYouWantToSeeTheWrongAnswersInAccessNo} #{o.currentAccess} #{strings.fromDate} #{o.date}?'
        , '#{o.currentAccess}', '#{o.noGrid}', '#{o.category}');"
    value="#{strings.whatHaveDoDoneWrong}" rendered="#{o.date != '-' and o.answerNoWrong != 0}"/>
    

,第二个查看请求网址如http://myserver:port/access.xhtml?currentAccess=34&noGrid=3&category=category

并在第二个视图支持bean中,我使用

访问参数
HttpServletRequest request = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
String currentAccess= request.getParameter("currentAccess");

<强> STILL 如果有人知道为什么最初的问题我会很感激它分享。 谢谢。