Skip to Main Content

Java EE (Java Enterprise Edition) General Discussion

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Side Effects using a UIInput to determine whether a component is rendered

843844Jan 4 2008
Hi,

I'm trying to use the value of a UIInput component to decide whether or not to render another component and am getting some strange side effects. When the hidden component is re-rendered after being hidden, the selected value is not displayed. This does not happen if I copy the value of a ValueChangeEvent and then use that as my return value. Any idea what is going on here? Switching the commented out line in getControllerValue in BackingBean.java should demonstrate the issue.

Thanks,
Pierce

index.jsp
<?xml version="1.0" encoding="UTF-8" ?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:h="http://java.sun.com/jsf/html"
	version="2.0">
	<jsp:directive.page contentType="text/html; charset=UTF-8" />
	<f:view>
		<html>
		<head>
		<title>test</title>
		</head>
		<body>
		<h:form id="testForm">
			<h:panelGrid columns="2" columnClasses="labelColumn, inputColumn">
				<!-- controlling input -->
				<h:outputLabel value="Controller:"></h:outputLabel>
				<h:selectOneMenu id="controller"
					binding="#{backingBean.controller}"
					valueChangeListener="#{backingBean.changeController}"
					immediate="true" onchange="submit()" required="true">
					<f:selectItems value="#{backingBean.controllerItems}" />
				</h:selectOneMenu>
 
				<!-- controlled input -->
				<h:outputLabel for="hideme" value="Input to hide:"
					rendered="#{(backingBean.controllerValue != 1) and (backingBean.controllerValue != 5)}"></h:outputLabel>
				<h:selectOneRadio id="hideme" value="#{backingBean.hideme}"
					required="true"
					rendered="#{(backingBean.controllerValue != 1) and (backingBean.controllerValue != 5)}"
					>
					<f:selectItems value="#{backingBean.hidemeItems}" />
				</h:selectOneRadio>
			</h:panelGrid>
		</h:form>
		</body>
		</html>
	</f:view>
</jsp:root>
BackingBean.java
package test;

import java.util.LinkedList;
import java.util.List;

import javax.faces.component.UIInput;
import javax.faces.component.html.HtmlSelectOneMenu;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;

public class BackingBean {

	private UIInput controller = new HtmlSelectOneMenu();
	private Integer hideme = 2;
	private Integer copiedValue;
	
	private List<SelectItem> controllerItems = new LinkedList<SelectItem>();
    private List<SelectItem> hidemeItems = new LinkedList<SelectItem>();
    
    public BackingBean(){
    	controller.setValue("3");
    	controller.setSubmittedValue("3");
    	copiedValue = 3;
    	
    	controllerItems.add(new SelectItem(1, "Controller 1"));
    	controllerItems.add(new SelectItem(2, "Controller 2"));
    	controllerItems.add(new SelectItem(3, "Controller 3"));
    	controllerItems.add(new SelectItem(4, "Controller 4"));
    	controllerItems.add(new SelectItem(5, "Controller 5"));
    	
    	hidemeItems.add(new SelectItem(1, "Hide Me 1"));
    	hidemeItems.add(new SelectItem(2, "Hide Me 2"));
    	hidemeItems.add(new SelectItem(3, "Hide Me 3"));
    }

	public UIInput getController() {
		return controller;
	}

	public void setController(UIInput controller) {
		this.controller = controller;
	}

	public Integer getHideme() {
		return hideme;
	}

	public void setHideme(Integer hideme) {
		this.hideme = hideme;
	}

	public List<SelectItem> getControllerItems() {
		return controllerItems;
	}

	public List<SelectItem> getHidemeItems() {
		return hidemeItems;
	}
	
	/*
	 * Value change listener
	 */
	public void changeController(ValueChangeEvent e){
		System.out.println((String)e.getNewValue());
		copiedValue = Integer.parseInt((String)e.getNewValue());
	}
	
	/*
	 * Helper
	 */
	public Integer getControllerValue(){
        // why does the following line not work?
	//	return Integer.parseInt((String)controller.getValue());
		return copiedValue;
	}
}
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Feb 1 2008
Added on Jan 4 2008
0 comments
100 views