Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get request parameter values in JSF

Tags:

java

jsf

I have a <odc:tabbedPanel/> component. Inside this I have a page in the <odc:bfPanel/> component. I want to access a value (of a inputtext or radiobutton) from the page in the <odc:bfPanel/> in my <odc:tabbedPanel/> managed bean class. Please guide me as to how do I go about this. Please note here that I do not want to use the session here. I want it in request only. I have tried the below options but they didn't work for me.

option one

String value = (String) ctx.getExternalContext()
                        .getRequestParameterValuesMap()
                        .get("managedbean.property");

option two

String value = (String) ctx.getExternalContext()
                         .getRequestParameterValuesMap()
                         .get("property");

option three

HttpServletRequest req = (HttpServletRequest) FacesContext.getCurrentInstance()
                         .getExternalContext().getRequest();
System.out.println(req.getParameter("property"));

option four

Map requestMap = FacesContext.getCurrentInstance() 
                         .getExternalContext().getRequestHeaderValuesMap(); 
String msgId = (String) requestMap.get("property"); 
System.out.println(msgId);

option five

HttpServletRequestWrapper r = new HttpServletRequestWrapper(req);
String value1 = r.getParameter("managedbean.property");

i want the value not in the jsp's managed bean ... but i want it in some another managed bean. here i have pages inside a page(as i had mentioned its a tabbed panel). now i want the value in the managed bean of the outer tab –

like image 318
user265950 Avatar asked Jul 28 '10 09:07

user265950


2 Answers

Let first explain why the options you tried did not work:

Option 1 and 2 are invalid because it returns values(!!) as a String[], not a single value as String.

Option 3 should work if the parameter was there. But this is not a nice JSF-ish way.

Option 4 is invalid because the parameters are not set in the request header.

Option 5 is invalid because it simply makes no sense. You're only adding an extra abstract layer in between which in fact doesn't change anything here.


The JSF-ish way would be the using ExternalContext#getRequestParameterMap():

Map<String, String> parameterMap = (Map<String, String>) externalContext.getRequestParameterMap();
String param = parameterMap.get("paramName");

As to why option 3 does not work is likely because the parameter name is not what you think/expect it is. JSF namely prepends (woodstocks) client ID's based on parent UINamingContainer components in the view tree. Rightclick the generated HTML output of the JSF page in your webbrowser and choose View Source. Examine the name of the generated <input> element of interest. Use that name instead as parameter name.


That said, this is after all a workaround not a solution. But we can't reasonably suggest the real solution since the functional requirement and the code you have are not fully clear. You normally bind the input elements to a backing bean. If you're actually inside a different backing bean, then you can also just access that backing bean from inside the backing bean and then in turn access the input value bound with it. See Injecting Managed Beans in each other for an how to.

like image 111
BalusC Avatar answered Nov 19 '22 08:11

BalusC


The fact that your controls are inside IBM ODC panels is not relevant.

Usually, you would bind the input control to a managed bean value.

Bean definition:

<managed-bean>
  <managed-bean-name>demo</managed-bean-name>
  <managed-bean-class>foo.MyManagedBean</managed-bean-class>
  <managed-bean-scope>request</managed-bean-scope>
</managed-bean>

View tags:

<!-- needs to be inside a form control -->
<h:inputText value="#{demo.foo}" />
<h:commandButton value="Click Me" action="#{demo.invokeMe}" />

Bean:

package foo;
public class MyManagedBean {
  private String foo;
  public String getFoo() { return foo; }
  public void setFoo(String foo) { this.foo = foo; }

  public String invokeMe() {
    System.out.println(foo);
    return null; //no navigation
  }
}

If you wanted to bind your input control to a different bean to the one with the application logic, you can use property injection to refer to the other bean.

<managed-bean>
  <managed-bean-name>demo</managed-bean-name>
  <managed-bean-class>foo.MyManagedBean</managed-bean-class>
  <managed-bean-scope>request</managed-bean-scope>
  <managed-property>
    <property-name>propName</property-name>
    <value>#{someExpression}</value>
  </managed-property>
</managed-bean>

You can look stuff up directly via the context, or use the expression classes to resolve stuff via code, but this is a cleaner approach.

like image 2
McDowell Avatar answered Nov 19 '22 07:11

McDowell