在jsf中使用hidden不像在传统jsp中使用那样直接,无法给inputHidden 组件赋值
<h:inputHidden value="#{EquipmentBB.equipment.createUserId}"/>
只能将值保存到页面然后再提及回去,没法改变hidden的值。如果想在页面中给EquipmentBB.equipment.createUserId设置个特定的值或者将别的表达式赋值给该hidden都是是无法实现的。
我们想到的办法是扩展hidden组件,增加属性。
<wf:inputHidden value="#{equipment.createUserId}" hiddenValue="#{equipment.createOrg+22}">
通过hiddenValue属性给hidden赋值, hiddenValue="#{30}"也可以。让hiddenValue属性在更新值模型阶段起作用,前几个阶段不用管。
代码如下,重写updateModel方法即可。只关注黑体部分,其余都是从父类拷贝的。
public class ProcessInputHidden extends HtmlInputHidden{
@Override
public void updateModel(FacesContext context) {
if (context == null) {
throw new NullPointerException();
}
if (!isValid() || !isLocalValueSet()) {
return;
}
ValueExpression ve = getValueExpression("value");
ValueExpression hnve = getValueExpression("hiddenValue");
if (ve != null) {
try {
if (hnve != null) {
ve.setValue(context.getELContext(), hnve.getValue(context
.getELContext()));
} else {
ve.setValue(context.getELContext(), getLocalValue());
}
setValue(null);
setLocalValueSet(false);
return;
} catch (ELException e) {
String messageStr = e.getMessage();
Throwable result = e.getCause();
while (null != result
&& result.getClass()
.isAssignableFrom(ELException.class)) {
messageStr = result.getMessage();
result = result.getCause();
}
FacesMessage message;
// if (null == messageStr) {
// message = MessageFactory.getMessage(context,
// UPDATE_MESSAGE_ID, MessageFactory.getLabel(context,
// this));
// } else {
// message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
// messageStr, messageStr);
// }
// context.addMessage(getClientId(context), message);
setValid(false);
} catch (IllegalArgumentException e) {
// FacesMessage message = MessageFactory.getMessage(context,
// UPDATE_MESSAGE_ID, MessageFactory.getLabel(context,
// this));
// context.addMessage(getClientId(context), null);
setValid(false);
} catch (Exception e) {
// FacesMessage message = MessageFactory.getMessage(context,
// UPDATE_MESSAGE_ID, MessageFactory.getLabel(context,
// this));
// context.addMessage(getClientId(context), message);
setValid(false);
}
}
}
在设置值模型前先看看有没有hiddenValue属性,如果有就将hiddenValue的值设置进去即可。
如果使用了faceslet页面上直接加hiddenValue属性即可,不需要要给tag增加对应属性。
注:尽量将hidden放到其他输入域组件的后面,这样如果hiddenValue关联的是其他输入域就能取得正确的值了。