从jQuery提交表单给出了javax.faces.application.ViewExpiredException:viewId:/ - 查看/无法恢复

时间:2012-02-13 00:24:58

标签: jquery jsf

我有一个JSF 1.2页面,其中有单选按钮可以选择2个选项之一。我有一个jQuery函数来提交表单并改变操作,但是给出了这个错误。

javax.servlet.ServletException: viewId:/buildVehicle.jsf - View /buildVehicle.jsf could not be restored.
root cause 
javax.faces.application.ViewExpiredException: viewId:/buildVehicle.jsf - View /buildVehicle.jsf could not be restored.
com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:189)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)

这是jQuery函数,它提交了在请求参数中进行一些更改来呈现相同的视图:

var make = $('input:radio[name=selectMake]:checked').val(); //returns NI/IN     
$("form#buildVehicleForm").attr("action", "/buildVehicle/buildVehicle.jsf?action=initTrim&make=" + make);
$('form#buildVehicleForm').submit();

在JSF页面中,我使用简单的HTML单选按钮。我无法将其更改为JSF <h:selectOneRadio>组件,因为提供给我的HTML代码,转换为JSF代码并不容易。

<div class="filedItem margin-10px floatLeft">   
    <input type="radio" id="id1" name="selectMake" onchange="changeMake()" value="N"  />                       
</div>
<div class="filedItem margin-10px floatLeft">
<input type="radio" id="id2"  name="selectMake" onchange="changeMake()" value="I"  />
</div>

1 个答案:

答案 0 :(得分:0)

你正在完全围绕JSF工作。这不会起作用。 JSF要求POST请求引用视图状态,该状态是由名为javax.faces.ViewState的隐藏字段标识的普通JSF表单。如果您想完全控制HTML,那么您应该使用简单的JSP / Servlet或基于动作的MVC框架(如Spring MVC),而不是使用托管bean的JSF页面。

关于您认为这是解决方案的真实问题,

  

在JSF页面中,我使用简单的HTML单选按钮。我无法将其更改为JSF <h:selectOneRadio>组件,因为提供给我的HTML代码,转换为JSF代码并不容易。

在这种情况下,Tomahawk's <t:selectOneRadio>组件可能非常有用。该组件附加了layout spread属性,可让您使用<t:radio>在所需标记中的任何位置放置单选按钮,而不会以<table>结尾JSF标准<h:selectOneRadio>组件。

E.g。

<t:selectOneRadio id="foo" value="#{bean.foo}" layout="spread">
    <f:selectItems value="#{bean.foos}" />
</t:selectOneRadio>
...
<div class="filedItem margin-10px floatLeft">
    <t:radio for="foo" index="0" />
</div>
<div class="filedItem margin-10px floatLeft">
    <t:radio for="foo" index="1" />
</div>
...

(顺便说一句,你的CSS课程有点可疑,我建议也可以这样做,但这是一个完全独立的主题)