该按钮只在JSF视图中删除JSTL代码时调用action方法,我知道它是生命周期,但我不明白原因/问题。我喜欢comprime因为它发生了这种行为。
查看代码正常
<f:metadata>
<f:viewParam name="idAsociacion" value="#{msgUsuario.asociacion}" converter="#
{asociacionConverter}"
converterMessage="#msg['aplicacion.asociacion.error.converter']}" required="true"
requiredMessage="#{msg['aplicacion.asociacion.error.required']}" />
<f:viewParam name="idMsg" value="#{msgUsuario.mensajeRespondido}" converter="#
{mensajeConverter}" converterMessage="#{msg['aplicacion.mensaje.error.converter']}"
required="true" requiredMessage="#{msg['aplicacion.mensaje.error.required']}" />
</f:metadata>
<ui:decorate template="/WEB-INF/templates/mainUsuario-template.xhtml">
<ui:define name="title">
<h:outputFormat value="#{msg['usuario.escribirMsj.title']}">
<f:param value="#{msgUsuario.asociacion.nombre}" />
</h:outputFormat>
</ui:define>
<ui:param name="descripcionView" value="#{msg['usuario.escribirMsj.descripcion']}" />
<ui:define name="content">
<h:panelGroup layout="block"
id="escribirMensajeContainer"styleClass="escribirMensajeContainer">
<h:form>
<p:panelGrid>
<p:row>
<p:column>
<h:outputLabel for="texto" value="#{msg['usuario.escribirMsj.mensaje']}"
styleClass="labelInput" />
</p:column>
</p:row>
<p:row>
<p:column>
<p:inputTextarea autoResize="true" cols="80" rows="15" id="texto"
maxlength="500" value="#{msgUsuario.texto}">
</p:inputTextarea>
</p:column>
</p:row>
<p:row>
<p:column>
<h:message for="texto" id="messageMensajeError" styleClass="messageError" />
</p:column>
</p:row>
<p:row>
<p:column>
<p:commandButton action="#{msgUsuario.enviar}"
alt="#{msg['usuario.escribirMsj.alt.enviar']}" tabindex="2" title="#
{fn:replace(msg['usuario.escribirMsj.title.enviar'],0,msgUsuario.asociacion.nombre)}"
value="#{msg['usuario.escribirMsj.enviar']}" />
</p:column>
</p:row>
</p:panelGrid>
</h:form>
</h:panelGroup>
</ui:define>
</ui:decorate>
</html>
但是,如果我添加JSTL,我将在下面显示。视图呈现正常,因为消息未响应但按钮从不调用操作方法和视图重新加载。
<c:choose>
<c:when test="#{msgUsuario.mensajeRespondido.respondido==false}">
<h:form>
<p:panelGrid>
<p:row>
<p:column>
<h:outputLabel for="texto" value="#{msg['usuario.escribirMsj.mensaje']}"
styleClass="labelInput" />
</p:column>
</p:row>
<p:row>
<p:column>
<p:inputTextarea autoResize="true" cols="80" rows="15" id="texto"
maxlength="500" value="#{msgUsuario.texto}">
</p:inputTextarea>
</p:column>
</p:row>
<p:row>
<p:column>
<h:message for="texto" id="messageMensajeError" styleClass="messageError" />
</p:column>
</p:row>
<p:row>
<p:column>
<p:commandButton action="#{msgUsuario.enviar}"
alt="#{msg['usuario.escribirMsj.alt.enviar']}" tabindex="2" title="#
{fn:replace(msg['usuario.escribirMsj.title.enviar'],0,msgUsuario.asociacion.nombre)}"
value="#{msg['usuario.escribirMsj.enviar']}" />
</p:column>
</p:row>
</p:panelGrid>
</h:form>
</c:when>
<c:otherwise>
<h:outputText value="MESSAGE RESPONSED" />
</c:otherwise>
</c:choose>
注意:两种情况下转换工作正常。
ManagedBean代码
@ManagedBean(name="msgUsuario")
@ViewScoped
public class EscribirMensajeUsuarioView implements Serializable {
private static final long serialVersionUID = 1L;
private static final Logger logger=Logger.getLogger(EscribirMensajeUsuarioView.class);
private Asociacion asociacion;
private Mensaje mensajeRespondido;
private Usuario usuario;
private String texto;
private boolean usuarioBloqueado;
@ManagedProperty(value="#{mensajeBO}")
private MensajeBO mensajeBo;
@ManagedProperty(value="#{usuarioBO}")
private UsuarioBO usuarioBo;
/* Never invoked with JSTL code in the view */
public String enviar(){
logger.info("EscribirMensajesUsuarioView.enviar");
TipoMensaje tipoMensaje=null;
Mensaje mensaje=this.mensajeRespondido;
.................
.................
.................
}
/* Getters and Setters */
}
我读了这个Balusc的评论
“JSF和JSTL没有按照您对编码的期望同步运行.JSTL在视图的构建期间运行(当要填充JSF组件树时)并且JSF在视图的渲染时间内运行组件树(当生成HTML输出时)。您可以按如下方式将其可视化:JSTL首先从上到下运行,然后将结果移交给JSF,JSF又从上到下再次运行。“
例如,我在dinamyc datatable中理解这一点,但在这种情况下不是这样。因为JSTL渲染得很好,因为 mensajeRepetido 在JSF树中退出,但是按钮没有调用该方法。但是视图重新加载并且 mensajeRepetido 再次由转换器退出。
亲切的问候。
答案 0 :(得分:3)
您的问题是由于您将JSTL属性绑定到视图范围托管bean属性而引起的。这仅在关闭部分状态保存时有效。打开部分状态保存(默认情况下),JSTL属性获取自己的视图范围bean的第二个实例(所有属性都设置为默认值!)而不是存储在JSF视图中的实例状态,并由JSF组件使用。
只需使用JSF组件的rendered
属性,而不是通常的方式,只使用JSTL来控制构建视图,而不是控制视图的呈现。
<h:form rendered="#{not msgUsuario.mensajeRespondido.respondido}">
...
<h:form>
<h:panelGroup rendered="#{msgUsuario.mensajeRespondido.respondido}">
<h:outputText value="MESSAGE RESPONSED" />
</h:panelGroup>