strange behavior around page parameters
maykell.mflores.uci.cu Aug 21, 2008 8:52 PMHi all, i have a doubt about a behavior that i have seen in Seam and i haven´t answer to it.
I have a little application with a typical list page and a typical detail page, i want the detail page serve to make inserts and updates; in order to this i have to pass the element id as a request parameter from the list page to the detail page, and besides put a page descriptor in the detail page side to catch the id. I did it and everything works ok, but i was surprised when i just for curiosity drop the h:param from the list page and thus no pass anymore the id to the detail page, but in some manner i can´t explain the id still kept on arriving to the detail page.
How can it be possible?
this is my code:
the list page:
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:s="http://jboss.com/products/seam/taglib"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:rich="http://richfaces.org/rich" template="layout/template.xhtml">
<ui:define name="body">
<h:messages globalOnly="true" styleClass="message" />
<rich:panel>
<f:facet name="header">acusadoList</f:facet>
<div class="results"><h:outputText value="No acusado exists"
rendered="#{empty acusadoList.resultList}" /> <h:dataTable
id="acusadoList" var="acusado" value="#{acusadoList.resultList}"
rendered="#{not empty acusadoList.resultList}" cellpadding="2">
<h:column>
<f:facet name="header">CI</f:facet>
#{acusado.id}
</h:column>
<h:column>
<f:facet name="header">Nombre</f:facet>
<s:link id="nombreLink" value="#{acusado.nombre}" view="/registerAcusado.xhtml"/>
</h:column>
<h:column>
<f:facet name="header">Direccion</f:facet>
#{acusado.direccionParticular}
</h:column>
<h:column>
<f:facet name="header">Desc Fisica</f:facet>
#{acusado.descripcionFisica}
</h:column>
</h:dataTable></div>
</rich:panel>
<div class="actionButtons"><s:button id="done"
value="Create acusado" view="/registerAcusado.xhtml" /></div>
</ui:define>
</ui:composition>
the detail page:
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:s="http://jboss.com/products/seam/taglib"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:rich="http://richfaces.org/rich"
xmlns:a="http://richfaces.org/a4j" template="layout/template.xhtml">
<ui:define name="body">
<h:messages globalOnly="true" styleClass="message" />
<h:form id="registerAcusadoActionForm">
<rich:panel>
<f:facet name="header">Registrar Acusado</f:facet>
<s:decorate id="ciDecoration" template="layout/edit.xhtml">
<ui:define name="label">CI</ui:define>
<h:inputText id="name" required="true" value="#{acusado.id}" />
</s:decorate>
<s:decorate id="nombreDecoration" template="layout/edit.xhtml">
<ui:define name="label">Nombre</ui:define>
<h:inputText id="nombre" required="true" value="#{acusado.nombre}" />
</s:decorate>
<s:decorate id="direcionDecorate" template="layout/edit.xhtml">
<ui:define name="label">Direcion</ui:define>
<h:inputText id="direccion" value="#{acusado.direccionParticular}" />
</s:decorate>
<s:decorate id="descFisicaDecorate" template="layout/edit.xhtml">
<ui:define name="label">Descripcion Fisica</ui:define>
<h:inputText id="desc" value="#{acusado.descripcionFisica}"></h:inputText>
</s:decorate>
<div style="clear: both" />
</rich:panel>
<div class="actionButtons"><h:commandButton
id="registerAcusado" value="Registrar Acusado"
action="#{registerAcusadoAction.registerAcusado(acusado)}" /></div>
</h:form>
</ui:define>
</ui:composition>
the page descriptor for the detail page:
<?xml version="1.0" encoding="UTF-8"?>
<page login-required="false">
<param name="nothing" value="#{acusado.id}"/>
<action execute="#{registerAcusadoAction.loadAcusado}"/>
</page>
the code for registerAcusadoAction:
package com.prueba.facade;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.NonUniqueResultException;
import org.jboss.seam.Component;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.annotations.web.RequestParameter;
import org.jboss.seam.log.Log;
import org.jboss.seam.faces.FacesMessages;
import com.prueba.domain.Acusado;
@Name("registerAcusadoAction")
public class RegisterAcusadoAction {
@Logger
private Log log;
@In
FacesMessages facesMessages;
@In
private EntityManager entityManager;
@RequestParameter
String acusadoId;
@In @Out Acusado acusado;
public void registerAcusado(Acusado acusadoLocal) {
entityManager.persist(acusadoLocal);
// implement your business logic here
log.info("registerAcusadoAction.registerAcusado() action called");
facesMessages.add("Acusado Registrado");
}
public void loadAcusado() {
if (acusadoId != null) {
try {
acusado = (Acusado) entityManager.createQuery(
"select r from Acusado r " + "where r.ci = :ci")
.setParameter("ci", acusadoId).getSingleResult();
} catch (NoResultException nre) {
} catch (NonUniqueResultException nure) {
}
}
}
// add additional action methods
}