gpt4 book ai didi

jsf - 当 JSF 2 的 View 中存在元数据转换器时,为什么 JSTL-JSF2 无法正常工作

转载 作者:行者123 更新时间:2023-12-02 00:21:25 25 4
gpt4 key购买 nike

只有当我在 JSF View 中删除 JSTL 代码时,按钮才会调用操作方法,我知道这是一个生命周期,但我不明白原因/问题。我喜欢 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,我会在下面显示。 View 呈现良好,因为消息未响应但按钮从不调用操作方法和 View 重新加载。

      <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 在 View 的构建期间运行(当要填充 JSF 组件树时),而 JSF 在 View 的渲染期间运行component tree(当要生成HTML输出时)。你可以这样想象:JSTL先从上到下运行,然后把结果交给JSF,JSF再从上到下运行。”

例如,我在 dinamyc 数据表中理解这一点,但在这种情况下则不然。因为 JSTL 渲染 View 是 mensajeRepetido 在 JSF 树中退出,但按钮不调用该方法。但是 View 重新加载和 mensajeRepetido 由转换器再次退出。

亲切的问候。

最佳答案

您的问题是因为您将 JSTL 属性绑定(bind)到 View 范围 托管 bean 属性。这仅在部分状态保存关闭时有效。启用部分状态保存(默认情况下)后,JSTL 属性获得它自己的 View 作用域 bean 的第二个 实例(所有属性都设置为默认值!),而不是存储在 JSF View 中的实例状态并被 JSF 组件使用。

只需使用 JSF 组件的 rendered 属性而不是通常的方式,并且仅使用 JSTL 来控制 View 的构建,而不是控制 View 的呈现。

<h:form rendered="#{not msgUsuario.mensajeRespondido.respondido}">
...
<h:form>
<h:panelGroup rendered="#{msgUsuario.mensajeRespondido.respondido}">
<h:outputText value="MESSAGE RESPONSED" />
</h:panelGroup>

另见:

关于jsf - 当 JSF 2 的 View 中存在元数据转换器时,为什么 JSTL-JSF2 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10758085/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com