[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