[jboss-user] [JBoss Seam] - Re: form controls with the same property name
schmod54
do-not-reply at jboss.com
Sun Sep 23 08:13:24 EDT 2007
I was a bit ambiguous in my previous posts, because I was mixing examples... also I was wrong about the exact problems I've had with different approaches. So I've made a simplified example that shows what I want to do, and how the different approaches fail. I'm running this in a seam-genned project on seam 2 beta, jboss 4.2.1.GA, but I expect it to behave the same way in other versions. Here is the source:
I have the following in my pages.xml... It's not strictly necessary to run the example though:
<page view-id="/control_loop_test.xhtml">
| <begin-conversation join="true"/>
| </page>
Here is an action bean that assigns facesMessages to form controls inside a loop:
import org.jboss.seam.ScopeType;
| import org.jboss.seam.annotations.In;
| import org.jboss.seam.annotations.Name;
| import org.jboss.seam.annotations.Scope;
| import org.jboss.seam.annotations.datamodel.DataModel;
| import org.jboss.seam.faces.FacesMessages;
|
| import java.util.Arrays;
| import java.util.Collection;
|
| @Name("controlLoop")
| @Scope(ScopeType.CONVERSATION)
| public class ControlLoopAction {
|
| @In
| private FacesMessages facesMessages;
|
| public static class MyEntity {
| private String name;
|
| public String getName() {
| return name;
| }
|
| public void setName(String name) {
| this.name = name;
| }
| }
|
| @DataModel
| private Collection<MyEntity> batchEntities = Arrays.asList(new MyEntity(), new MyEntity());
|
| public Collection<MyEntity> getBatchEntities() {
| return batchEntities;
| }
|
| public String submit(String controlPrefix) {
| for (int i = 0; i < batchEntities.size(); i++)
| facesMessages.addToControlFromResourceBundle(controlPrefix + "Name" + i, "badName" + i);
| return "/control_loop_test.xhtml";
| }
| }
Here is a page that tries a few different ways of inputting data into the action bean.
<?xml version="1.0" encoding="UTF-8"?>
| <!DOCTYPE html
| PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
| "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
| <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
| xmlns:a4j="https://ajax4jsf.dev.java.net/ajax"
| xmlns:c="http://java.sun.com/jsp/jstl/core"
| xmlns:h="http://java.sun.com/jsf/html"
| xmlns:s="http://jboss.com/products/seam/taglib"
| xmlns:ui="http://java.sun.com/jsf/facelets">
| <head>
| <title>Control Loop Test</title>
| </head>
| <body>
| controlLoop: #{controlLoop}<br/>
| global messages: <h:messages globalOnly="true"/><br/>
| hardwired form... this works (at least for h:message anyway) but I really don't want to have to do this for large variable-size forms:
| <h:form id="hardwiredForm">
| Name0:
| <h:inputText id="hardwiredName0" value="#{controlLoop.batchEntities[0].name}"/>
| s:message: <s:message/> h:message: <h:message for="hardwiredName0"/><br/>
| Name1:
| <h:inputText id="hardwiredName1" value="#{controlLoop.batchEntities[1].name}"/>
| s:message: <s:message/> h:message: <h:message for="hardwiredName1"/><br/>
| <h:commandButton value="Submit" action="#{controlLoop.submit('hardwired')}"/>
| </h:form>
| <br/>
| a4j:repeat form... I'm thinking this doesn't work because the id of h:inputText gets resolved when the view is built... see
| <a href="http://www.ninthavenue.com.au/blog/c:foreach-vs-ui:repeat-in-facelets">
| http://www.ninthavenue.com.au/blog/c:foreach-vs-ui:repeat-in-facelets</a>:<br/>
| <h:form id="a4jRepeatForm">
| <a4j:repeat id="mainLoop" value="#{controlLoop.batchEntities}" var="myEntity" rowKeyVar="i">
| Name#{i}:
| <h:inputText id="a4jName#{i}" value="#{myEntity.name}"/>
| s:message: <s:message/> h:message: <h:message for="a4jName#{i}"/><br/>
| </a4j:repeat>
| <h:commandButton value="Submit" action="#{controlLoop.submit('a4j')}"/>
| </h:form>
| <br/>
| ui:repeat form... same problem as a4j:repeat, but I don't want to use ui:repeat anyway because of its known bugs:
| <h:form id="uiRepeatForm">
| <ui:repeat value="#{batchEntities}" var="myEntity">
| Name#{batchEntities.rowIndex}:
| <h:inputText id="uiName#{batchEntities.rowIndex}" value="#{myEntity.name}"/>
| s:message: <s:message/> h:message: <h:message for="uiName#{batchEntities.rowIndex}"/><br/>
| </ui:repeat>
| <h:commandButton value="Submit" action="#{controlLoop.submit('ui')}"/>
| </h:form>
| <br/>
| c:forEach form... maybe this would work if I could get c: tags working... I tried some things I found on the web to get c: tags working, but none of them worked for me:<br/>
| <h:form id="cForEachForm">
| <c:forEach id="mainLoop" value="#{controlLoop.batchEntities}" var="myEntity" varStatus="i">
| Name#{i.index}:
| <h:inputText id="forEachName#{i.index}" value="#{myEntity.name}"/>
| s:message: <s:message/> h:message: <h:message for="forEachName#{i.index}"/><br/>
| </c:forEach>
| <h:commandButton value="Submit" action="#{controlLoop.submit('forEach')}"/>
| </h:form>
|
| </body>
| </html>
If anyone could show me how to get the facesMessages to correctly appear next to the relevant controls within the context of a loop, I'd greatly appreciate it. Thanks.
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4087624#4087624
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4087624
More information about the jboss-user
mailing list